angular-google-charts
Version:
A wrapper for the Google Charts library written with Angular
114 lines • 14.6 kB
JavaScript
import { Inject, Injectable, LOCALE_ID, NgZone } from '@angular/core';
import { Observable, of, Subject } from 'rxjs';
import { map, mergeMap, switchMap } from 'rxjs/operators';
import { getDefaultConfig } from '../helpers/chart.helper';
import { GOOGLE_CHARTS_LAZY_CONFIG } from '../types/google-charts-config';
import * as i0 from "@angular/core";
import * as i1 from "rxjs";
export class ScriptLoaderService {
constructor(zone, localeId, config$) {
this.zone = zone;
this.localeId = localeId;
this.config$ = config$;
this.scriptSource = 'https://www.gstatic.com/charts/loader.js';
this.scriptLoadSubject = new Subject();
}
/**
* Checks whether `google.charts` is available.
*
* If not, it can be loaded by calling `loadChartPackages`.
*
* @returns `true` if `google.charts` is available, `false` otherwise.
*/
isGoogleChartsAvailable() {
if (typeof google === 'undefined' || typeof google.charts === 'undefined') {
return false;
}
return true;
}
/**
* Loads the Google Chart script and the provided chart packages.
* Can be called multiple times to load more packages.
*
* When called without any arguments, this will just load the default package
* containing the namespaces `google.charts` and `google.visualization` without any charts.
*
* @param packages The packages to load.
* @returns A stream emitting as soon as the chart packages are loaded.
*/
loadChartPackages(...packages) {
return this.loadGoogleCharts().pipe(mergeMap(() => this.config$), map(config => {
return { ...getDefaultConfig(), ...(config || {}) };
}), switchMap((googleChartsConfig) => {
return new Observable(observer => {
const config = {
packages,
language: this.localeId,
mapsApiKey: googleChartsConfig.mapsApiKey,
safeMode: googleChartsConfig.safeMode
};
google.charts.load(googleChartsConfig.version, config);
google.charts.setOnLoadCallback(() => {
this.zone.run(() => {
observer.next();
observer.complete();
});
});
});
}));
}
/**
* Loads the Google Charts script. After the script is loaded, `google.charts` is defined.
*
* @returns A stream emitting as soon as loading has completed.
* If the google charts script is already loaded, the stream emits immediately.
*/
loadGoogleCharts() {
if (this.isGoogleChartsAvailable()) {
return of(undefined);
}
else if (!this.isLoadingGoogleCharts()) {
const script = this.createGoogleChartsScript();
script.onload = () => {
this.zone.run(() => {
this.scriptLoadSubject.next();
this.scriptLoadSubject.complete();
});
};
script.onerror = () => {
this.zone.run(() => {
console.error('Failed to load the google charts script!');
this.scriptLoadSubject.error(new Error('Failed to load the google charts script!'));
});
};
}
return this.scriptLoadSubject.asObservable();
}
isLoadingGoogleCharts() {
return this.getGoogleChartsScript() != null;
}
getGoogleChartsScript() {
const pageScripts = Array.from(document.getElementsByTagName('script'));
return pageScripts.find(script => script.src === this.scriptSource);
}
createGoogleChartsScript() {
const script = document.createElement('script');
script.type = 'text/javascript';
script.src = this.scriptSource;
script.async = true;
document.getElementsByTagName('head')[0].appendChild(script);
return script;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScriptLoaderService, deps: [{ token: i0.NgZone }, { token: LOCALE_ID }, { token: GOOGLE_CHARTS_LAZY_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScriptLoaderService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScriptLoaderService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: undefined, decorators: [{
type: Inject,
args: [LOCALE_ID]
}] }, { type: i1.Observable, decorators: [{
type: Inject,
args: [GOOGLE_CHARTS_LAZY_CONFIG]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWxvYWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1nb29nbGUtY2hhcnRzL3NyYy9saWIvc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBc0IseUJBQXlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7O0FBRzlGLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUIsWUFDVSxJQUFZLEVBQ08sUUFBZ0IsRUFDUyxPQUF1QztRQUZuRixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ08sYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNTLFlBQU8sR0FBUCxPQUFPLENBQWdDO1FBTjVFLGlCQUFZLEdBQUcsMENBQTBDLENBQUM7UUFDMUQsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQU10RCxDQUFDO0lBRUo7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDekUsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLGlCQUFpQixDQUFDLEdBQUcsUUFBa0I7UUFDNUMsT0FB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QUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUNoQyxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0IsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOytHQTNHVSxtQkFBbUIsd0NBTXBCLFNBQVMsYUFDVCx5QkFBeUI7bUhBUHhCLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEL0IsVUFBVTs7MEJBT04sTUFBTTsyQkFBQyxTQUFTOzswQkFDaEIsTUFBTTsyQkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIExPQ0FMRV9JRCwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBnZXREZWZhdWx0Q29uZmlnIH0gZnJvbSAnLi4vaGVscGVycy9jaGFydC5oZWxwZXInO1xuaW1wb3J0IHsgR29vZ2xlQ2hhcnRzQ29uZmlnLCBHT09HTEVfQ0hBUlRTX0xBWllfQ09ORklHIH0gZnJvbSAnLi4vdHlwZXMvZ29vZ2xlLWNoYXJ0cy1jb25maWcnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2NyaXB0TG9hZGVyU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyaXB0U291cmNlID0gJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2NoYXJ0cy9sb2FkZXIuanMnO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmlwdExvYWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBsb2NhbGVJZDogc3RyaW5nLFxuICAgIEBJbmplY3QoR09PR0xFX0NIQVJUU19MQVpZX0NPTkZJRykgcHJpdmF0ZSByZWFkb25seSBjb25maWckOiBPYnNlcnZhYmxlPEdvb2dsZUNoYXJ0c0NvbmZpZz5cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBgZ29vZ2xlLmNoYXJ0c2AgaXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBJZiBub3QsIGl0IGNhbiBiZSBsb2FkZWQgYnkgY2FsbGluZyBgbG9hZENoYXJ0UGFja2FnZXNgLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYGdvb2dsZS5jaGFydHNgIGlzIGF2YWlsYWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNHb29nbGVDaGFydHNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBnb29nbGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBnb29nbGUuY2hhcnRzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBHb29nbGUgQ2hhcnQgc2NyaXB0IGFuZCB0aGUgcHJvdmlkZWQgY2hhcnQgcGFja2FnZXMuXG4gICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gbG9hZCBtb3JlIHBhY2thZ2VzLlxuICAgKlxuICAgKiBXaGVuIGNhbGxlZCB3aXRob3V0IGFueSBhcmd1bWVudHMsIHRoaXMgd2lsbCBqdXN0IGxvYWQgdGhlIGRlZmF1bHQgcGFja2FnZVxuICAgKiBjb250YWluaW5nIHRoZSBuYW1lc3BhY2VzIGBnb29nbGUuY2hhcnRzYCBhbmQgYGdvb2dsZS52aXN1YWxpemF0aW9uYCB3aXRob3V0IGFueSBjaGFydHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYWNrYWdlcyBUaGUgcGFja2FnZXMgdG8gbG9hZC5cbiAgICogQHJldHVybnMgQSBzdHJlYW0gZW1pdHRpbmcgYXMgc29vbiBhcyB0aGUgY2hhcnQgcGFja2FnZXMgYXJlIGxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBsb2FkQ2hhcnRQYWNrYWdlcyguLi5wYWNrYWdlczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkR29vZ2xlQ2hhcnRzKCkucGlwZShcbiAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY29uZmlnJCksXG4gICAgICBtYXAoY29uZmlnID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4uZ2V0RGVmYXVsdENvbmZpZygpLCAuLi4oY29uZmlnIHx8IHt9KSB9O1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKGdvb2dsZUNoYXJ0c0NvbmZpZzogR29vZ2xlQ2hhcnRzQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxudWxsPihvYnNlcnZlciA9PiB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgcGFja2FnZXMsXG4gICAgICAgICAgICBsYW5ndWFnZTogdGhpcy5sb2NhbGVJZCxcbiAgICAgICAgICAgIG1hcHNBcGlLZXk6IGdvb2dsZUNoYXJ0c0NvbmZpZy5tYXBzQXBpS2V5LFxuICAgICAgICAgICAgc2FmZU1vZGU6IGdvb2dsZUNoYXJ0c0NvbmZpZy5zYWZlTW9kZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBnb29nbGUuY2hhcnRzLmxvYWQoZ29vZ2xlQ2hhcnRzQ29uZmlnLnZlcnNpb24hLCBjb25maWcpO1xuICAgICAgICAgIGdvb2dsZS5jaGFydHMuc2V0T25Mb2FkQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgR29vZ2xlIENoYXJ0cyBzY3JpcHQuIEFmdGVyIHRoZSBzY3JpcHQgaXMgbG9hZGVkLCBgZ29vZ2xlLmNoYXJ0c2AgaXMgZGVmaW5lZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBzdHJlYW0gZW1pdHRpbmcgYXMgc29vbiBhcyBsb2FkaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqIElmIHRoZSBnb29nbGUgY2hhcnRzIHNjcmlwdCBpcyBhbHJlYWR5IGxvYWRlZCwgdGhlIHN0cmVhbSBlbWl0cyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHByaXZhdGUgbG9hZEdvb2dsZUNoYXJ0cygpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0dvb2dsZUNoYXJ0c0F2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTG9hZGluZ0dvb2dsZUNoYXJ0cygpKSB7XG4gICAgICBjb25zdCBzY3JpcHQgPSB0aGlzLmNyZWF0ZUdvb2dsZUNoYXJ0c1NjcmlwdCgpO1xuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zY3JpcHRMb2FkU3ViamVjdC5uZXh0KCk7XG4gICAgICAgICAgdGhpcy5zY3JpcHRMb2FkU3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCB0aGUgZ29vZ2xlIGNoYXJ0cyBzY3JpcHQhJyk7XG4gICAgICAgICAgdGhpcy5zY3JpcHRMb2FkU3ViamVjdC5lcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHRoZSBnb29nbGUgY2hhcnRzIHNjcmlwdCEnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zY3JpcHRMb2FkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMb2FkaW5nR29vZ2xlQ2hhcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEdvb2dsZUNoYXJ0c1NjcmlwdCgpICE9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEdvb2dsZUNoYXJ0c1NjcmlwdCgpOiBIVE1MU2NyaXB0RWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGFnZVNjcmlwdHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKSk7XG4gICAgcmV0dXJuIHBhZ2VTY3JpcHRzLmZpbmQoc2NyaXB0ID0+IHNjcmlwdC5zcmMgPT09IHRoaXMuc2NyaXB0U291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR29vZ2xlQ2hhcnRzU2NyaXB0KCk6IEhUTUxTY3JpcHRFbGVtZW50IHtcbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgIHNjcmlwdC5zcmMgPSB0aGlzLnNjcmlwdFNvdXJjZTtcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0uYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICByZXR1cm4gc2NyaXB0O1xuICB9XG59XG4iXX0=