angular-google-charts
Version:
A wrapper for the Google Charts library written with Angular
108 lines • 16.8 kB
JavaScript
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { ScriptLoaderService } from '../../services/script-loader.service';
import * as i0 from "@angular/core";
import * as i1 from "../../services/script-loader.service";
export class ChartWrapperComponent {
constructor(element, scriptLoaderService) {
this.element = element;
this.scriptLoaderService = scriptLoaderService;
this.error = new EventEmitter();
this.ready = new EventEmitter();
this.select = new EventEmitter();
this.wrapperReadySubject = new ReplaySubject(1);
this.initialized = false;
}
get chart() {
return this.chartWrapper.getChart();
}
get wrapperReady$() {
return this.wrapperReadySubject.asObservable();
}
get chartWrapper() {
if (!this.wrapper) {
throw new Error('Cannot access the chart wrapper before initialization.');
}
return this.wrapper;
}
set chartWrapper(wrapper) {
this.wrapper = wrapper;
this.drawChart();
}
ngOnInit() {
// We don't need to load any chart packages, the chart wrapper will handle this else for us
this.scriptLoaderService.loadChartPackages().subscribe(() => {
if (!this.specs) {
this.specs = {};
}
const { containerId, container, ...specs } = this.specs;
// Only ever create the wrapper once to allow animations to happen if something changes.
this.wrapper = new google.visualization.ChartWrapper({
...specs,
container: this.element.nativeElement
});
this.registerChartEvents();
this.wrapperReadySubject.next(this.wrapper);
this.drawChart();
this.initialized = true;
});
}
ngOnChanges(changes) {
if (!this.initialized) {
return;
}
if (changes.specs) {
this.updateChart();
this.drawChart();
}
}
updateChart() {
if (!this.specs) {
// When creating the wrapper with empty specs, the google charts library will show an error
// If we don't do this, a javascript error will be thrown, which is not as visible to the user
this.specs = {};
}
// The typing here are not correct. These methods accept `undefined` as well.
// That's why we have to cast to `any`
this.wrapper.setChartType(this.specs.chartType);
this.wrapper.setDataTable(this.specs.dataTable);
this.wrapper.setDataSourceUrl(this.specs.dataSourceUrl);
this.wrapper.setDataSourceUrl(this.specs.dataSourceUrl);
this.wrapper.setQuery(this.specs.query);
this.wrapper.setOptions(this.specs.options);
this.wrapper.setRefreshInterval(this.specs.refreshInterval);
this.wrapper.setView(this.specs.view);
}
drawChart() {
if (this.wrapper) {
this.wrapper.draw();
}
}
registerChartEvents() {
google.visualization.events.removeAllListeners(this.wrapper);
const registerChartEvent = (object, eventName, callback) => {
google.visualization.events.addListener(object, eventName, callback);
};
registerChartEvent(this.wrapper, 'ready', () => this.ready.emit({ chart: this.chart }));
registerChartEvent(this.wrapper, 'error', (error) => this.error.emit(error));
registerChartEvent(this.wrapper, 'select', () => {
const selection = this.chart.getSelection();
this.select.emit({ selection });
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChartWrapperComponent, deps: [{ token: i0.ElementRef }, { token: i1.ScriptLoaderService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ChartWrapperComponent, selector: "chart-wrapper", inputs: { specs: "specs" }, outputs: { error: "error", ready: "ready", select: "select" }, host: { classAttribute: "chart-wrapper" }, exportAs: ["chartWrapper"], usesOnChanges: true, ngImport: i0, template: '', isInline: true, styles: [":host{width:-moz-fit-content;width:fit-content;display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChartWrapperComponent, decorators: [{
type: Component,
args: [{ selector: 'chart-wrapper', template: '', host: { class: 'chart-wrapper' }, exportAs: 'chartWrapper', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{width:-moz-fit-content;width:fit-content;display:block}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ScriptLoaderService }]; }, propDecorators: { specs: [{
type: Input
}], error: [{
type: Output
}], ready: [{
type: Output
}], select: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdvb2dsZS1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0LXdyYXBwZXIvY2hhcnQtd3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7OztBQVkzRSxNQUFNLE9BQU8scUJBQXFCO0lBeUJoQyxZQUFvQixPQUFtQixFQUFVLG1CQUF3QztRQUFyRSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVpsRixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFHNUMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRzVDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQUd2RCx3QkFBbUIsR0FBRyxJQUFJLGFBQWEsQ0FBb0MsQ0FBQyxDQUFDLENBQUM7UUFDOUUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFFZ0UsQ0FBQztJQUU3RixJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lB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LEtBQUs7c0JBRFgsTUFBTTtnQkFJQSxNQUFNO3NCQURaLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY3JpcHRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IENoYXJ0RXJyb3JFdmVudCwgQ2hhcnRSZWFkeUV2ZW50LCBDaGFydFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5pbXBvcnQgeyBDaGFydEJhc2UgfSBmcm9tICcuLi9jaGFydC1iYXNlL2NoYXJ0LWJhc2UuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2hhcnQtd3JhcHBlcicsXG4gIHRlbXBsYXRlOiAnJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgd2lkdGg6IGZpdC1jb250ZW50OyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBob3N0OiB7IGNsYXNzOiAnY2hhcnQtd3JhcHBlcicgfSxcbiAgZXhwb3J0QXM6ICdjaGFydFdyYXBwZXInLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFdyYXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBDaGFydEJhc2UsIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgLyoqXG4gICAqIEVpdGhlciBhIEpTT04gb2JqZWN0IGRlZmluaW5nIHRoZSBjaGFydCwgb3IgYSBzZXJpYWxpemVkIHN0cmluZyB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0LlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoaXMgb2JqZWN0IGlzIHNob3duIGluIHRoZVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vY2hhcnQvaW50ZXJhY3RpdmUvZG9jcy9yZWZlcmVuY2UjZ29vZ2xlLnZpc3VhbGl6YXRpb24uZHJhd2NoYXJ0IGBkcmF3Q2hhcnQoKWB9IGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIFRoZSBgY29udGFpbmVyYCBhbmQgYGNvbnRhaW5lcklkYCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoaXMgY29tcG9uZW50IHRvIGFsbG93XG4gICAqIHJlbmRlcmluZyB0aGUgY2hhcnQgaW50byB0aGUgY29tcG9uZW50cycgdGVtcGxhdGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3BlY3M/OiBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXJ0RXJyb3JFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFydFJlYWR5RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXJ0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PigpO1xuXG4gIHByaXZhdGUgd3JhcHBlcjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHdyYXBwZXJSZWFkeVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFdyYXBwZXI+KDEpO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIHNjcmlwdExvYWRlclNlcnZpY2U6IFNjcmlwdExvYWRlclNlcnZpY2UpIHt9XG5cbiAgcHVibGljIGdldCBjaGFydCgpOiBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydEJhc2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydFdyYXBwZXIuZ2V0Q2hhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd3JhcHBlclJlYWR5JCgpIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVyUmVhZHlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFydFdyYXBwZXIoKTogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyIHtcbiAgICBpZiAoIXRoaXMud3JhcHBlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIHRoZSBjaGFydCB3cmFwcGVyIGJlZm9yZSBpbml0aWFsaXphdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53cmFwcGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBjaGFydFdyYXBwZXIod3JhcHBlcjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKSB7XG4gICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjtcbiAgICB0aGlzLmRyYXdDaGFydCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gbG9hZCBhbnkgY2hhcnQgcGFja2FnZXMsIHRoZSBjaGFydCB3cmFwcGVyIHdpbGwgaGFuZGxlIHRoaXMgZWxzZSBmb3IgdXNcbiAgICB0aGlzLnNjcmlwdExvYWRlclNlcnZpY2UubG9hZENoYXJ0UGFja2FnZXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNwZWNzKSB7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB7fSBhcyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lcklkLCBjb250YWluZXIsIC4uLnNwZWNzIH0gPSB0aGlzLnNwZWNzO1xuXG4gICAgICAvLyBPbmx5IGV2ZXIgY3JlYXRlIHRoZSB3cmFwcGVyIG9uY2UgdG8gYWxsb3cgYW5pbWF0aW9ucyB0byBoYXBwZW4gaWYgc29tZXRoaW5nIGNoYW5nZXMuXG4gICAgICB0aGlzLndyYXBwZXIgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHtcbiAgICAgICAgLi4uc3BlY3MsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWdpc3RlckNoYXJ0RXZlbnRzKCk7XG5cbiAgICAgIHRoaXMud3JhcHBlclJlYWR5U3ViamVjdC5uZXh0KHRoaXMud3JhcHBlcik7XG5cbiAgICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuc3BlY3MpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDaGFydCgpIHtcbiAgICBpZiAoIXRoaXMuc3BlY3MpIHtcbiAgICAgIC8vIFdoZW4gY3JlYXRpbmcgdGhlIHdyYXBwZXIgd2l0aCBlbXB0eSBzcGVjcywgdGhlIGdvb2dsZSBjaGFydHMgbGlicmFyeSB3aWxsIHNob3cgYW4gZXJyb3JcbiAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIGEgamF2YXNjcmlwdCBlcnJvciB3aWxsIGJlIHRocm93biwgd2hpY2ggaXMgbm90IGFzIHZpc2libGUgdG8gdGhlIHVzZXJcbiAgICAgIHRoaXMuc3BlY3MgPSB7fSBhcyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuICAgIH1cblxuICAgIC8vIFRoZSB0eXBpbmcgaGVyZSBhcmUgbm90IGNvcnJlY3QuIFRoZXNlIG1ldGhvZHMgYWNjZXB0IGB1bmRlZmluZWRgIGFzIHdlbGwuXG4gICAgLy8gVGhhdCdzIHdoeSB3ZSBoYXZlIHRvIGNhc3QgdG8gYGFueWBcblxuICAgIHRoaXMud3JhcHBlciEuc2V0Q2hhcnRUeXBlKHRoaXMuc3BlY3MuY2hhcnRUeXBlKTtcbiAgICB0aGlzLndyYXBwZXIhLnNldERhdGFUYWJsZSh0aGlzLnNwZWNzLmRhdGFUYWJsZSBhcyBhbnkpO1xuICAgIHRoaXMud3JhcHBlciEuc2V0RGF0YVNvdXJjZVVybCh0aGlzLnNwZWNzLmRhdGFTb3VyY2VVcmwgYXMgYW55KTtcbiAgICB0aGlzLndyYXBwZXIhLnNldERhdGFTb3VyY2VVcmwodGhpcy5zcGVjcy5kYXRhU291cmNlVXJsIGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRRdWVyeSh0aGlzLnNwZWNzLnF1ZXJ5IGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRPcHRpb25zKHRoaXMuc3BlY3Mub3B0aW9ucyBhcyBhbnkpO1xuICAgIHRoaXMud3JhcHBlciEuc2V0UmVmcmVzaEludGVydmFsKHRoaXMuc3BlY3MucmVmcmVzaEludGVydmFsIGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRWaWV3KHRoaXMuc3BlY3Mudmlldyk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdDaGFydCgpIHtcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIuZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDaGFydEV2ZW50cygpIHtcbiAgICBnb29nbGUudmlzdWFsaXphdGlvbi5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKHRoaXMud3JhcHBlcik7XG5cbiAgICBjb25zdCByZWdpc3RlckNoYXJ0RXZlbnQgPSAob2JqZWN0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgICAgIGdvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihvYmplY3QsIGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZWdpc3RlckNoYXJ0RXZlbnQodGhpcy53cmFwcGVyLCAncmVhZHknLCAoKSA9PiB0aGlzLnJlYWR5LmVtaXQoeyBjaGFydDogdGhpcy5jaGFydCEgfSkpO1xuICAgIHJlZ2lzdGVyQ2hhcnRFdmVudCh0aGlzLndyYXBwZXIsICdlcnJvcicsIChlcnJvcjogQ2hhcnRFcnJvckV2ZW50KSA9PiB0aGlzLmVycm9yLmVtaXQoZXJyb3IpKTtcbiAgICByZWdpc3RlckNoYXJ0RXZlbnQodGhpcy53cmFwcGVyLCAnc2VsZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5jaGFydCEuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLnNlbGVjdC5lbWl0KHsgc2VsZWN0aW9uIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=