UNPKG

@covalent/echarts

Version:
671 lines (657 loc) 21.3 kB
import { CommonModule } from '@angular/common'; import { debounceTime, distinctUntilChanged, takeUntil, tap } from 'rxjs/operators'; import { init, connect, dispose } from 'echarts/lib/echarts'; import { BehaviorSubject, Subject, fromEvent, merge, timer } from 'rxjs'; import 'zrender/lib/svg/svg'; import { Injectable, Optional, SkipSelf, Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ElementRef, ChangeDetectorRef, NgModule } from '@angular/core'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class TdChartOptionsService { constructor() { this._options = {}; this._optionsSubject = new BehaviorSubject(this._options); } /** * @param {?} option * @param {?} value * @return {?} */ setOption(option, value) { /** @type {?} */ let options = {}; options[option] = value; Object.assign(this._options, options); this._optionsSubject.next(this._options); } /** * @param {?} option * @param {?} value * @return {?} */ setArrayOption(option, value) { /** @type {?} */ let prevValue = this.getOption(option); if (prevValue) { /** @type {?} */ let index = prevValue.indexOf(value); index > -1 ? prevValue[index] = value : prevValue.push(value); } else { prevValue = [value]; } this.setOption(option, prevValue); } /** * @param {?} option * @param {?} value * @return {?} */ removeArrayOption(option, value) { /** @type {?} */ let prevValue = this.getOption(option); if (prevValue) { /** @type {?} */ let index = prevValue.indexOf(value); if (index > -1) { /* tslint:disable-next-line */ prevValue[index] = null; } else { prevValue = []; } } this.setOption(option, prevValue); } /** * @param {?} option * @return {?} */ getOption(option) { return this._options[option]; } /** * @param {?} option * @return {?} */ clearOption(option) { /* tslint:disable-next-line */ this.setOption(option, null); } /** * @return {?} */ listen() { return this._optionsSubject.asObservable(); } } TdChartOptionsService.decorators = [ { type: Injectable } ]; /** * @param {?} parent * @return {?} */ function CHART_PROVIDER_FACTORY(parent) { return parent || new TdChartOptionsService(); } /** @type {?} */ const CHART_PROVIDER = { // If there is already a service available, use that. Otherwise, provide a new one. provide: TdChartOptionsService, deps: [[new Optional(), new SkipSelf(), TdChartOptionsService]], useFactory: CHART_PROVIDER_FACTORY, }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @param {?} target * @param {...?} sources * @return {?} */ function assignDefined(target, ...sources) { /** @type {?} */ let keys = new Set(); for (const source of sources) { for (const key of Object.keys(source)) { keys.add(key); /** @type {?} */ const val = source[key]; /* tslint:disable-next-line */ if (val !== undefined && val !== null) { target[key] = val; /* tslint:disable-next-line */ } else if (val === null) { delete target[key]; } } } // delete keys that are not in any source for (const key of Object.keys(target)) { if (!keys.has(key)) { delete target[key]; } } return target; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class TdChartComponent { /** * @param {?} _changeDetectorRef * @param {?} _elementRef * @param {?} _optionsService */ constructor(_changeDetectorRef, _elementRef, _optionsService) { this._changeDetectorRef = _changeDetectorRef; this._elementRef = _elementRef; this._optionsService = _optionsService; this._destroy = new Subject(); this._widthSubject = new Subject(); this._heightSubject = new Subject(); this._state = {}; this._options = {}; /** * config?: any; * Sets the JS config object if you choose to not use the property inputs. * Note: [config] input properties will override input values * https://ecomfe.github.io/echarts-doc/public/en/option.html */ this.config = {}; /** * renderer: 'svg' | 'canvas' * sets the rendering mode for the chart. * defaults to 'canvas' * https://ecomfe.github.io/echarts-doc/public/en/tutorial.html#Render%20by%20Canvas%20or%20SVG */ this.renderer = 'canvas'; this.chartClick = new EventEmitter(); this.chartDblclick = new EventEmitter(); this.chartContextmenu = new EventEmitter(); this.magicTypeChanged = new EventEmitter(); this.dataViewChanged = new EventEmitter(); this.datazoom = new EventEmitter(); this.restore = new EventEmitter(); } /** * returns the echarts instance * @return {?} */ get instance() { return this._instance; } /** * @return {?} */ ngAfterViewInit() { this._initializeChart(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (this._instance) { // destroy and reinitialize chart only when `renderer`, `themeName` and `group` changes if (changes.renderer || changes.themeName || changes.group) { this._disposeChart(); this._initializeChart(); } else { this.render(); } } } /** * @return {?} */ ngOnDestroy() { this._disposeChart(); this._destroy.unsubscribe(); } /** * @return {?} */ render() { if (this._instance) { this._instance.setOption(assignDefined(this._state, { grid: { show: true, left: '20', right: '20', bottom: (this.config.toolbox && typeof this.config.toolbox.bottom === 'number') || (this._options.toolbox && typeof this._options.toolbox.bottom === 'number') ? '40' : '10', top: (this.config.toolbox && typeof this.config.toolbox.top === 'number') || (this._options.toolbox && typeof this._options.toolbox.top === 'number') ? '40' : '10', containLabel: true, borderColor: '#FCFCFC', }, }, this._options, this.config ? this.config : {}), true); this._changeDetectorRef.markForCheck(); } } /** * @return {?} */ _initializeChart() { this._instance = init(this._elementRef.nativeElement, this.themeName, { renderer: this.renderer, }); fromEvent(this._instance, 'click').pipe(takeUntil(this._destroy)).subscribe((params) => { this.chartClick.next(params); }); fromEvent(this._instance, 'dblclick').pipe(takeUntil(this._destroy)).subscribe((params) => { this.chartDblclick.next(params); }); fromEvent(this._instance, 'contextmenu').pipe(takeUntil(this._destroy)).subscribe((params) => { this.chartContextmenu.next(params); }); fromEvent(this._instance, 'magictypechanged').pipe(takeUntil(this._destroy)).subscribe((params) => { this.magicTypeChanged.next(params); }); fromEvent(this._instance, 'dataviewchanged').pipe(takeUntil(this._destroy)).subscribe((params) => { this.dataViewChanged.next(params); }); fromEvent(this._instance, 'datazoom').pipe(takeUntil(this._destroy)).subscribe((params) => { this.datazoom.next(params); }); fromEvent(this._instance, 'restore').pipe(takeUntil(this._destroy)).subscribe((params) => { this.restore.next(params); }); if (this.group) { this._instance.group = this.group; connect(this.group); this._changeDetectorRef.markForCheck(); } merge(fromEvent(window, 'resize').pipe(debounceTime(100)), this._widthSubject.asObservable().pipe(distinctUntilChanged()), this._heightSubject.asObservable().pipe(distinctUntilChanged())).pipe(takeUntil(this._destroy), debounceTime(100)).subscribe(() => { if (this._instance) { this._instance.resize(); this._changeDetectorRef.markForCheck(); } }); this._optionsService.listen().pipe(tap((options) => { assignDefined(this._options, options); }), debounceTime(0), takeUntil(this._destroy)).subscribe(() => { this.render(); }); timer(500, 250).pipe(takeUntil(this._destroy)).subscribe(() => { if (this._elementRef && this._elementRef.nativeElement) { this._widthSubject.next(((/** @type {?} */ (this._elementRef.nativeElement))).getBoundingClientRect().width); this._heightSubject.next(((/** @type {?} */ (this._elementRef.nativeElement))).getBoundingClientRect().height); } }); } /** * @return {?} */ _disposeChart() { if (this._instance) { this._instance.clear(); dispose(this._instance); } this._destroy.next(true); } } TdChartComponent.decorators = [ { type: Component, args: [{ selector: 'td-chart', template: '', changeDetection: ChangeDetectionStrategy.OnPush, providers: [CHART_PROVIDER], styles: [":host{display:block;width:100%}"] }] } ]; /** @nocollapse */ TdChartComponent.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: ElementRef }, { type: TdChartOptionsService } ]; TdChartComponent.propDecorators = { config: [{ type: Input, args: ['config',] }], group: [{ type: Input, args: ['group',] }], themeName: [{ type: Input, args: ['themeName',] }], renderer: [{ type: Input, args: ['renderer',] }], chartClick: [{ type: Output, args: ['chartClick',] }], chartDblclick: [{ type: Output, args: ['chartDblclick',] }], chartContextmenu: [{ type: Output, args: ['chartContextmenu',] }], magicTypeChanged: [{ type: Output, args: ['magicTypeChanged',] }], dataViewChanged: [{ type: Output, args: ['dataViewChanged',] }], datazoom: [{ type: Output, args: ['datazoom',] }], restore: [{ type: Output, args: ['restore',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @abstract */ class TdChartAxisComponent { /** * @param {?} _axisOption * @param {?} _optionsService */ constructor(_axisOption, _optionsService) { this._axisOption = _axisOption; this._optionsService = _optionsService; this._state = { axisLine: { lineStyle: { color: '#ABABAB', }, }, splitLine: { lineStyle: { color: '#ABABAB', }, }, }; this.config = {}; this.show = true; } /** * @return {?} */ ngOnInit() { this._setOptions(); } /** * @return {?} */ ngOnChanges() { this._setOptions(); } /** * @return {?} */ ngOnDestroy() { this._removeOption(); } /** * @return {?} */ _setOptions() { /** @type {?} */ let config = assignDefined(this._state, { id: this.id, show: this.show, gridIndex: this.gridIndex, position: this.position, offset: this.offset, type: this.type, name: this.name, nameLocation: this.nameLocation, nameTextStyle: this.nameTextStyle, nameGap: this.nameGap, nameRotate: this.nameRotate, inverse: this.inverse, boundaryGap: this.boundaryGap, min: this.min, max: this.max, scale: this.scale, minInterval: this.minInterval, interval: this.interval, logBase: this.logBase, silent: this.silent, triggerEvent: this.triggerEvent, axisLine: this.axisLine, axisTick: this.axisTick, axisLabel: this.axisLabel, splitLine: this.splitLine, splitArea: this.splitArea, data: this.data, axisPointer: this.axisPointer, zlevel: this.zlevel, z: this.z, }, this.config ? this.config : {}); this._optionsService.setArrayOption(this._axisOption, config); } /** * @return {?} */ _removeOption() { this._optionsService.clearOption(this._axisOption); } } TdChartAxisComponent.propDecorators = { config: [{ type: Input, args: ['config',] }], id: [{ type: Input, args: ['id',] }], show: [{ type: Input, args: ['show',] }], gridIndex: [{ type: Input, args: ['gridIndex',] }], offset: [{ type: Input, args: ['offset',] }], type: [{ type: Input, args: ['type',] }], name: [{ type: Input, args: ['name',] }], nameLocation: [{ type: Input, args: ['nameLocation',] }], nameTextStyle: [{ type: Input, args: ['nameTextStyle',] }], nameGap: [{ type: Input, args: ['nameGap',] }], nameRotate: [{ type: Input, args: ['nameRotate',] }], inverse: [{ type: Input, args: ['inverse',] }], boundaryGap: [{ type: Input, args: ['boundaryGap',] }], min: [{ type: Input, args: ['min',] }], max: [{ type: Input, args: ['max',] }], scale: [{ type: Input, args: ['scale',] }], minInterval: [{ type: Input, args: ['minInterval',] }], interval: [{ type: Input, args: ['interval',] }], logBase: [{ type: Input, args: ['logBase',] }], silent: [{ type: Input, args: ['silent',] }], triggerEvent: [{ type: Input, args: ['triggerEvent',] }], axisLine: [{ type: Input, args: ['axisLine',] }], axisTick: [{ type: Input, args: ['axisTick',] }], axisLabel: [{ type: Input, args: ['axisLabel',] }], splitLine: [{ type: Input, args: ['splitLine',] }], splitArea: [{ type: Input, args: ['splitArea',] }], data: [{ type: Input, args: ['data',] }], axisPointer: [{ type: Input, args: ['axisPointer',] }], zlevel: [{ type: Input, args: ['zlevel',] }], z: [{ type: Input, args: ['z',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class TdChartXAxisComponent extends TdChartAxisComponent { /** * @param {?} _optionsService */ constructor(_optionsService) { super('xAxis', _optionsService); } } TdChartXAxisComponent.decorators = [ { type: Component, args: [{ selector: 'td-chart-x-axis', template: '', changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ TdChartXAxisComponent.ctorParameters = () => [ { type: TdChartOptionsService } ]; TdChartXAxisComponent.propDecorators = { position: [{ type: Input, args: ['position',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ class TdChartYAxisComponent extends TdChartAxisComponent { /** * @param {?} _optionsService */ constructor(_optionsService) { super('yAxis', _optionsService); } } TdChartYAxisComponent.decorators = [ { type: Component, args: [{ selector: 'td-chart-y-axis', template: '', changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ TdChartYAxisComponent.ctorParameters = () => [ { type: TdChartOptionsService } ]; TdChartYAxisComponent.propDecorators = { position: [{ type: Input, args: ['position',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** @type {?} */ const BASE_MODULE_COMPONENTS = [ TdChartComponent, TdChartXAxisComponent, TdChartYAxisComponent, ]; class CovalentBaseEchartsModule { } CovalentBaseEchartsModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule, ], declarations: [ BASE_MODULE_COMPONENTS, ], exports: [ BASE_MODULE_COMPONENTS, ], },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @abstract * @template T */ class TdSeriesComponent { /** * @param {?} type * @param {?} optionsService */ constructor(type, optionsService) { this.optionsService = optionsService; this._state = {}; this._options = {}; this.config = {}; this._type = type; } /** * @return {?} */ get type() { return this._type; } /** * @return {?} */ ngOnInit() { this._setOptions(); } /** * @return {?} */ ngOnChanges() { this._setOptions(); } /** * @return {?} */ ngOnDestroy() { this._removeOption(); } /** * @param {?} option * @param {?} value * @return {?} */ setStateOption(option, value) { this._options[option] = value; this._setOptions(); } /** * @param {?} option * @return {?} */ removeStateOption(option) { /* tslint:disable-next-line */ this._options[option] = null; this._setOptions(); } /** * @return {?} */ _setOptions() { /** @type {?} */ let config = assignDefined(this._state, { id: this.id, type: this.type, name: this.name, color: this.color, data: this.data, animation: this.animation, animationThreshold: this.animationThreshold, animationDuration: this.animationDuration, animationEasing: this.animationEasing, animationDelay: this.animationDelay, animationDurationUpdate: this.animationDurationUpdate, animationEasingUpdate: this.animationEasingUpdate, animationDelayUpdate: this.animationDelayUpdate, tooltip: this.tooltip, }, this.getConfig(), this._options, this.config ? this.config : {}); this.optionsService.setArrayOption('series', config); } /** * @return {?} */ _removeOption() { this.optionsService.removeArrayOption('series', this._state); } } TdSeriesComponent.propDecorators = { config: [{ type: Input, args: ['config',] }], id: [{ type: Input, args: ['id',] }], name: [{ type: Input, args: ['name',] }], color: [{ type: Input, args: ['color',] }], data: [{ type: Input, args: ['data',] }], animation: [{ type: Input, args: ['animation',] }], animationThreshold: [{ type: Input, args: ['animationThreshold',] }], animationDuration: [{ type: Input, args: ['animationDuration',] }], animationEasing: [{ type: Input, args: ['animationEasing',] }], animationDelay: [{ type: Input, args: ['animationDelay',] }], animationDurationUpdate: [{ type: Input, args: ['animationDurationUpdate',] }], animationEasingUpdate: [{ type: Input, args: ['animationEasingUpdate',] }], animationDelayUpdate: [{ type: Input, args: ['animationDelayUpdate',] }], tooltip: [{ type: Input, args: ['tooltip',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ export { TdChartComponent, TdChartAxisComponent, TdChartYAxisComponent, TdChartXAxisComponent, TdChartOptionsService, CHART_PROVIDER, BASE_MODULE_COMPONENTS, CovalentBaseEchartsModule, assignDefined, TdSeriesComponent, CHART_PROVIDER_FACTORY as ɵa }; //# sourceMappingURL=covalent-echarts-base.js.map