@covalent/echarts
Version:
Teradata Charts built on echarts
671 lines (657 loc) • 21.3 kB
JavaScript
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