UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

97 lines 17.5 kB
import { Component, Input, ElementRef, ViewChild, inject } from '@angular/core'; import { MeasurementRealtimeService, ThemeSwitcherService } from '@c8y/ngx-components'; import { AsyncPipe } from '@angular/common'; import { BehaviorSubject, of, switchMap, tap } from 'rxjs'; import { NGX_ECHARTS_CONFIG, NgxEchartsModule } from 'ngx-echarts'; import { GAUGE_PRESETS } from '../info-gauge-widget-config/gauge.model'; import { RadialGaugeService } from './radial-gauge.service'; import * as i0 from "@angular/core"; import * as i1 from "ngx-echarts"; export class RadialGaugeViewComponent { constructor() { this.fractionSize = 2; this.selectedPresetId = ''; this.rangeColors = { default: '#E8EBED', yellow: '#ff8800', red: '#d70f0f' }; this.configChangedSubject = new BehaviorSubject(null); this.themeSwitcherService = inject(ThemeSwitcherService); this.radialGaugeService = inject(RadialGaugeService); this.chartOptions$ = this.configChangedSubject.pipe(switchMap(() => of(this.radialGaugeService.getChartOptions(this.gaugeOptions, this.activeDatapointGauge, this.selectedPresetId, this.gaugeOptionsColors, this.rangeColors, this.measurement, this.fractionSize))), tap(options => { if (this.echartsInstance) { this.echartsInstance.setOption(options, false, true); } })); } ngOnInit() { if (!this.gaugeOptions) { this.gaugeOptions = GAUGE_PRESETS[0]; } this.themeSubscription = this.themeSwitcherService.currentlyAppliedTheme$.subscribe(() => { queueMicrotask(() => { this.radialGaugeService.setChart(this.chart); this.rangeColors = this.radialGaugeService.updateRangeColors(); this.gaugeOptionsColors = this.radialGaugeService.updateGaugeOptionsColors(); requestAnimationFrame(() => { this.configChangedSubject.next(); }); }); }); } ngAfterViewInit() { this.resizeObserver = new ResizeObserver(entries => { for (const entry of entries) { if (entry.contentRect.width > 0 && entry.contentRect.height > 0) { this.radialGaugeService.containerSize = entry.contentRect.width >= entry.contentRect.height ? entry.contentRect.height : entry.contentRect.width; this.configChangedSubject.next(); } } }); this.resizeObserver.observe(this.chart.nativeElement); } ngOnDestroy() { if (this.themeSubscription) { this.themeSubscription.unsubscribe(); } if (this.resizeObserver) { this.resizeObserver.disconnect(); } } ngOnChanges(changes) { if (changes.gaugeOptions || changes.measurement || changes.activeDatapointGauge) { this.configChangedSubject.next(); } } onChartInit(ec) { this.echartsInstance = ec; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RadialGaugeViewComponent, isStandalone: true, selector: "c8y-radial-gauge", inputs: { activeDatapointGauge: "activeDatapointGauge", measurement: "measurement", fractionSize: "fractionSize", gaugeOptions: "gaugeOptions", selectedPresetId: "selectedPresetId" }, host: { classAttribute: "c8y-radial-gauge" }, providers: [ MeasurementRealtimeService, RadialGaugeService, { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) } ], viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"p-absolute fit-w fit-h\"\n data-cy=\"c8y-radial-gauge--chart\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n></div>\n", dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: NgxEchartsModule }, { kind: "directive", type: i1.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeViewComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-radial-gauge', host: { class: 'c8y-radial-gauge' }, providers: [ MeasurementRealtimeService, RadialGaugeService, { provide: NGX_ECHARTS_CONFIG, useFactory: () => ({ echarts: () => import('echarts') }) } ], standalone: true, imports: [AsyncPipe, NgxEchartsModule], template: "<div\n class=\"p-absolute fit-w fit-h\"\n data-cy=\"c8y-radial-gauge--chart\"\n #chart\n echarts\n [options]=\"chartOptions$ | async\"\n (chartInit)=\"onChartInit($event)\"\n></div>\n" }] }], ctorParameters: () => [], propDecorators: { activeDatapointGauge: [{ type: Input }], measurement: [{ type: Input }], fractionSize: [{ type: Input }], gaugeOptions: [{ type: Input }], selectedPresetId: [{ type: Input }], chart: [{ type: ViewChild, args: ['chart', { static: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaWFsLWdhdWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL2luZm8tZ2F1Z2UvcmFkaWFsLWdhdWdlL3JhZGlhbC1nYXVnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL3JhZGlhbC1nYXVnZS9yYWRpYWwtZ2F1Z2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBRUwsVUFBVSxFQUNWLFNBQVMsRUFHVCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFnQixTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsYUFBYSxFQUdkLE1BQU0seUNBQXlDLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQWM1RCxNQUFNLE9BQU8sd0JBQXdCO0lBbUJuQztRQWhCUyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUVqQixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFNL0IsZ0JBQVcsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFFaEUseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQWMsSUFBSSxDQUFD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SztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDaUMsS0FBSztzQkFBM0MsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkNoYW5nZXMsXG4gIElucHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBFQ2hhcnRzIH0gZnJvbSAnZWNoYXJ0cyc7XG5pbXBvcnQgdHlwZSB7IEtQSURldGFpbHMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RhdGFwb2ludC1zZWxlY3Rvcic7XG5pbXBvcnQgeyBNZWFzdXJlbWVudFJlYWx0aW1lU2VydmljZSwgVGhlbWVTd2l0Y2hlclNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJTWVhc3VyZW1lbnRWYWx1ZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5HWF9FQ0hBUlRTX0NPTkZJRywgTmd4RWNoYXJ0c01vZHVsZSB9IGZyb20gJ25neC1lY2hhcnRzJztcbmltcG9ydCB7XG4gIEdBVUdFX1BSRVNFVFMsXG4gIEdhdWdlT3B0aW9ucyxcbiAgR2F1Z2VPcHRpb25zQ29sb3JzXG59IGZyb20gJy4uL2luZm8tZ2F1Z2Utd2lkZ2V0LWNvbmZpZy9nYXVnZS5tb2RlbCc7XG5pbXBvcnQgeyBSYWRpYWxHYXVnZVNlcnZpY2UgfSBmcm9tICcuL3JhZGlhbC1nYXVnZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXJhZGlhbC1nYXVnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yYWRpYWwtZ2F1Z2UuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7IGNsYXNzOiAnYzh5LXJhZGlhbC1nYXVnZScgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgTWVhc3VyZW1lbnRSZWFsdGltZVNlcnZpY2UsXG4gICAgUmFkaWFsR2F1Z2VTZXJ2aWNlLFxuICAgIHsgcHJvdmlkZTogTkdYX0VDSEFSVFNfQ09ORklHLCB1c2VGYWN0b3J5OiAoKSA9PiAoeyBlY2hhcnRzOiAoKSA9PiBpbXBvcnQoJ2VjaGFydHMnKSB9KSB9XG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtBc3luY1BpcGUsIE5neEVjaGFydHNNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFJhZGlhbEdhdWdlVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgYWN0aXZlRGF0YXBvaW50R2F1Z2U6IEtQSURldGFpbHM7XG4gIEBJbnB1dCgpIG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZTtcbiAgQElucHV0KCkgZnJhY3Rpb25TaXplID0gMjtcbiAgQElucHV0KCkgZ2F1Z2VPcHRpb25zOiBHYXVnZU9wdGlvbnM7XG4gIEBJbnB1dCgpIHNlbGVjdGVkUHJlc2V0SWQgPSAnJztcbiAgQFZpZXdDaGlsZCgnY2hhcnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY2hhcnQhOiBFbGVtZW50UmVmO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyITogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY2hhcnRPcHRpb25zJDogT2JzZXJ2YWJsZTxHYXVnZU9wdGlvbnM+O1xuICBlY2hhcnRzSW5zdGFuY2UhOiBFQ2hhcnRzO1xuICByYW5nZUNvbG9ycyA9IHsgZGVmYXVsdDogJyNFOEVCRUQnLCB5ZWxsb3c6ICcjZmY4ODAwJywgcmVkOiAnI2Q3MGYwZicgfTtcbiAgZ2F1Z2VPcHRpb25zQ29sb3JzOiBHYXVnZU9wdGlvbnNDb2xvcnM7XG4gIHByaXZhdGUgY29uZmlnQ2hhbmdlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHZvaWQgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSB0aGVtZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTd2l0Y2hlclNlcnZpY2UgPSBpbmplY3QoVGhlbWVTd2l0Y2hlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJhZGlhbEdhdWdlU2VydmljZSA9IGluamVjdChSYWRpYWxHYXVnZVNlcnZpY2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2hhcnRPcHRpb25zJCA9IHRoaXMuY29uZmlnQ2hhbmdlZFN1YmplY3QucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICBvZihcbiAgICAgICAgICB0aGlzLnJhZGlhbEdhdWdlU2VydmljZS5nZXRDaGFydE9wdGlvbnMoXG4gICAgICAgICAgICB0aGlzLmdhdWdlT3B0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0YXBvaW50R2F1Z2UsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0SWQsXG4gICAgICAgICAgICB0aGlzLmdhdWdlT3B0aW9uc0NvbG9ycyxcbiAgICAgICAgICAgIHRoaXMucmFuZ2VDb2xvcnMsXG4gICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50LFxuICAgICAgICAgICAgdGhpcy5mcmFjdGlvblNpemVcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICB0YXAob3B0aW9ucyA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVjaGFydHNJbnN0YW5jZSkge1xuICAgICAgICAgIHRoaXMuZWNoYXJ0c0luc3RhbmNlLnNldE9wdGlvbihvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5nYXVnZU9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZ2F1Z2VPcHRpb25zID0gR0FVR0VfUFJFU0VUU1swXTtcbiAgICB9XG5cbiAgICB0aGlzLnRoZW1lU3Vic2NyaXB0aW9uID0gdGhpcy50aGVtZVN3aXRjaGVyU2VydmljZS5jdXJyZW50bHlBcHBsaWVkVGhlbWUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgIHRoaXMucmFkaWFsR2F1Z2VTZXJ2aWNlLnNldENoYXJ0KHRoaXMuY2hhcnQpO1xuICAgICAgICB0aGlzLnJhbmdlQ29sb3JzID0gdGhpcy5yYWRpYWxHYXVnZVNlcnZpY2UudXBkYXRlUmFuZ2VDb2xvcnMoKTtcbiAgICAgICAgdGhpcy5nYXVnZU9wdGlvbnNDb2xvcnMgPSB0aGlzLnJhZGlhbEdhdWdlU2VydmljZS51cGRhdGVHYXVnZU9wdGlvbnNDb2xvcnMoKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NoYW5nZWRTdWJqZWN0Lm5leHQoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5jb250ZW50UmVjdC53aWR0aCA+IDAgJiYgZW50cnkuY29udGVudFJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRoaXMucmFkaWFsR2F1Z2VTZXJ2aWNlLmNvbnRhaW5lclNpemUgPVxuICAgICAgICAgICAgZW50cnkuY29udGVudFJlY3Qud2lkdGggPj0gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICAgID8gZW50cnkuY29udGVudFJlY3QuaGVpZ2h0XG4gICAgICAgICAgICAgIDogZW50cnkuY29udGVudFJlY3Qud2lkdGg7XG4gICAgICAgICAgdGhpcy5jb25maWdDaGFuZ2VkU3ViamVjdC5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNoYXJ0Lm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGhlbWVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMudGhlbWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmdhdWdlT3B0aW9ucyB8fCBjaGFuZ2VzLm1lYXN1cmVtZW50IHx8IGNoYW5nZXMuYWN0aXZlRGF0YXBvaW50R2F1Z2UpIHtcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZFN1YmplY3QubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhcnRJbml0KGVjOiBFQ2hhcnRzKSB7XG4gICAgdGhpcy5lY2hhcnRzSW5zdGFuY2UgPSBlYztcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInAtYWJzb2x1dGUgZml0LXcgZml0LWhcIlxuICBkYXRhLWN5PVwiYzh5LXJhZGlhbC1nYXVnZS0tY2hhcnRcIlxuICAjY2hhcnRcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJjaGFydE9wdGlvbnMkIHwgYXN5bmNcIlxuICAoY2hhcnRJbml0KT1cIm9uQ2hhcnRJbml0KCRldmVudClcIlxuPjwvZGl2PlxuIl19