@tetacom/ng-components 1.0.27 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/component/filter/filter.module.d.ts +2 -1
  2. package/component/public-api.d.ts +0 -1
  3. package/directive/hint/hint.directive.d.ts +1 -0
  4. package/esm2020/component/filter/filter.module.mjs +6 -2
  5. package/esm2020/component/filter/numeric-filter/numeric-filter.component.mjs +4 -3
  6. package/esm2020/component/message/message.service.mjs +3 -3
  7. package/esm2020/component/public-api.mjs +1 -3
  8. package/esm2020/directive/click-outside/click-outside.directive.mjs +1 -3
  9. package/esm2020/directive/hint/hint.directive.mjs +4 -1
  10. package/esm2020/directive/only-number/only-number.directive.mjs +3 -2
  11. package/esm2020/pipe/public-api.mjs +2 -1
  12. package/esm2020/util/date-util.mjs +8 -5
  13. package/fesm2015/tetacom-ng-components.mjs +45 -2309
  14. package/fesm2015/tetacom-ng-components.mjs.map +1 -1
  15. package/fesm2020/tetacom-ng-components.mjs +45 -2303
  16. package/fesm2020/tetacom-ng-components.mjs.map +1 -1
  17. package/package.json +1 -1
  18. package/pipe/public-api.d.ts +1 -0
  19. package/component/chart/chart/chart.component.d.ts +0 -39
  20. package/component/chart/chart.module.d.ts +0 -8
  21. package/component/chart/core/axis-creator.d.ts +0 -29
  22. package/component/chart/core/chart.d.ts +0 -70
  23. package/component/chart/core/public-api.d.ts +0 -2
  24. package/component/chart/drawer/area-drawer.d.ts +0 -7
  25. package/component/chart/drawer/bar-drawer.d.ts +0 -8
  26. package/component/chart/drawer/contour-drawer.d.ts +0 -7
  27. package/component/chart/drawer/default-drawer-mapping.d.ts +0 -4
  28. package/component/chart/drawer/line-drawer.d.ts +0 -11
  29. package/component/chart/drawer/pie-drawer.d.ts +0 -7
  30. package/component/chart/drawer/public-api.d.ts +0 -6
  31. package/component/chart/drawer/scatter-drawer.d.ts +0 -15
  32. package/component/chart/drawer/spline-drawer.d.ts +0 -7
  33. package/component/chart/legend-drawer/default-drawer-legend-mapping.d.ts +0 -3
  34. package/component/chart/legend-drawer/gradient-drawer.d.ts +0 -5
  35. package/component/chart/legend-drawer/swatch-drawer.d.ts +0 -6
  36. package/component/chart/model/annotation.d.ts +0 -59
  37. package/component/chart/model/axis-options.d.ts +0 -43
  38. package/component/chart/model/chart-bounds.d.ts +0 -12
  39. package/component/chart/model/chart-options.d.ts +0 -51
  40. package/component/chart/model/enum/axis-type.d.ts +0 -4
  41. package/component/chart/model/enum/dispatch-type.d.ts +0 -4
  42. package/component/chart/model/enum/drag-point-type.d.ts +0 -5
  43. package/component/chart/model/enum/legend-type.d.ts +0 -4
  44. package/component/chart/model/enum/public-api.d.ts +0 -7
  45. package/component/chart/model/enum/scale-type.d.ts +0 -7
  46. package/component/chart/model/enum/scale.d.ts +0 -5
  47. package/component/chart/model/enum/series-type.d.ts +0 -10
  48. package/component/chart/model/enum/zoom-type.d.ts +0 -5
  49. package/component/chart/model/i-drag-event.d.ts +0 -5
  50. package/component/chart/model/i-drawer-legend.d.ts +0 -12
  51. package/component/chart/model/i-drawer.d.ts +0 -9
  52. package/component/chart/model/i-zoom-event.d.ts +0 -8
  53. package/component/chart/model/plot-band.d.ts +0 -28
  54. package/component/chart/model/plot-line.d.ts +0 -20
  55. package/component/chart/model/point/bar-point.d.ts +0 -6
  56. package/component/chart/model/point/base-point.d.ts +0 -9
  57. package/component/chart/model/point/contour-point.d.ts +0 -4
  58. package/component/chart/model/point/marker-options.d.ts +0 -11
  59. package/component/chart/model/point/public-api.d.ts +0 -3
  60. package/component/chart/model/point/scatter-point.d.ts +0 -5
  61. package/component/chart/model/public-api.d.ts +0 -15
  62. package/component/chart/model/series.d.ts +0 -62
  63. package/component/chart/model/tooltip-options.d.ts +0 -14
  64. package/component/chart/public-api.d.ts +0 -5
  65. package/esm2020/component/chart/chart/chart.component.mjs +0 -164
  66. package/esm2020/component/chart/chart.module.mjs +0 -18
  67. package/esm2020/component/chart/core/axis-creator.mjs +0 -82
  68. package/esm2020/component/chart/core/chart.mjs +0 -1339
  69. package/esm2020/component/chart/core/public-api.mjs +0 -3
  70. package/esm2020/component/chart/drawer/area-drawer.mjs +0 -20
  71. package/esm2020/component/chart/drawer/bar-drawer.mjs +0 -23
  72. package/esm2020/component/chart/drawer/contour-drawer.mjs +0 -29
  73. package/esm2020/component/chart/drawer/default-drawer-mapping.mjs +0 -17
  74. package/esm2020/component/chart/drawer/line-drawer.mjs +0 -152
  75. package/esm2020/component/chart/drawer/pie-drawer.mjs +0 -4
  76. package/esm2020/component/chart/drawer/public-api.mjs +0 -7
  77. package/esm2020/component/chart/drawer/scatter-drawer.mjs +0 -93
  78. package/esm2020/component/chart/drawer/spline-drawer.mjs +0 -23
  79. package/esm2020/component/chart/legend-drawer/default-drawer-legend-mapping.mjs +0 -7
  80. package/esm2020/component/chart/legend-drawer/gradient-drawer.mjs +0 -45
  81. package/esm2020/component/chart/legend-drawer/swatch-drawer.mjs +0 -62
  82. package/esm2020/component/chart/model/annotation.mjs +0 -30
  83. package/esm2020/component/chart/model/axis-options.mjs +0 -26
  84. package/esm2020/component/chart/model/chart-bounds.mjs +0 -13
  85. package/esm2020/component/chart/model/chart-options.mjs +0 -37
  86. package/esm2020/component/chart/model/enum/axis-type.mjs +0 -6
  87. package/esm2020/component/chart/model/enum/dispatch-type.mjs +0 -6
  88. package/esm2020/component/chart/model/enum/drag-point-type.mjs +0 -7
  89. package/esm2020/component/chart/model/enum/legend-type.mjs +0 -6
  90. package/esm2020/component/chart/model/enum/public-api.mjs +0 -8
  91. package/esm2020/component/chart/model/enum/scale-type.mjs +0 -9
  92. package/esm2020/component/chart/model/enum/scale.mjs +0 -7
  93. package/esm2020/component/chart/model/enum/series-type.mjs +0 -12
  94. package/esm2020/component/chart/model/enum/zoom-type.mjs +0 -7
  95. package/esm2020/component/chart/model/i-drag-event.mjs +0 -2
  96. package/esm2020/component/chart/model/i-drawer-legend.mjs +0 -2
  97. package/esm2020/component/chart/model/i-drawer.mjs +0 -2
  98. package/esm2020/component/chart/model/i-zoom-event.mjs +0 -2
  99. package/esm2020/component/chart/model/plot-band.mjs +0 -18
  100. package/esm2020/component/chart/model/plot-line.mjs +0 -13
  101. package/esm2020/component/chart/model/point/bar-point.mjs +0 -2
  102. package/esm2020/component/chart/model/point/base-point.mjs +0 -2
  103. package/esm2020/component/chart/model/point/contour-point.mjs +0 -2
  104. package/esm2020/component/chart/model/point/marker-options.mjs +0 -2
  105. package/esm2020/component/chart/model/point/public-api.mjs +0 -4
  106. package/esm2020/component/chart/model/point/scatter-point.mjs +0 -2
  107. package/esm2020/component/chart/model/public-api.mjs +0 -16
  108. package/esm2020/component/chart/model/series.mjs +0 -27
  109. package/esm2020/component/chart/model/tooltip-options.mjs +0 -19
  110. package/esm2020/component/chart/public-api.mjs +0 -6
@@ -1,15 +0,0 @@
1
- export * from './enum/public-api';
2
- export * from './point/public-api';
3
- export * from './axis-options';
4
- export * from './point/base-point';
5
- export * from './chart-options';
6
- export * from './i-drawer';
7
- export * from './i-drawer-legend';
8
- export * from './series';
9
- export * from './tooltip-options';
10
- export * from './annotation';
11
- export * from './chart-bounds';
12
- export * from './plot-line';
13
- export * from './plot-band';
14
- export * from './i-drag-event';
15
- export * from './i-zoom-event';
@@ -1,62 +0,0 @@
1
- import { BasePoint } from './point/base-point';
2
- import { SeriesType } from './enum/series-type';
3
- import { IDrawer } from './i-drawer';
4
- import * as d3 from 'd3';
5
- export declare class Series<T extends BasePoint> {
6
- id?: number;
7
- renderTo?: 'canvas' | 'svg';
8
- type: SeriesType;
9
- curveType?: d3.CurveFactoryLineOnly | d3.CurveFactory;
10
- data: T[];
11
- axisFormat?: () => void;
12
- name?: string;
13
- xAxisIndex?: number;
14
- yAxisIndex?: number;
15
- drawer?: IDrawer<T>;
16
- strokeWidth?: number;
17
- strokeDasharray?: string;
18
- visible?: boolean;
19
- color?: string;
20
- colorScale?: d3.ScaleSequential<any, any>;
21
- drag?: {
22
- enable?: boolean;
23
- extendLine?: boolean;
24
- grabbers?: {
25
- radius?: number;
26
- stroke?: string;
27
- fill?: string;
28
- strokeWidth?: string;
29
- };
30
- };
31
- extend?: boolean;
32
- showInLegend?: boolean;
33
- constructor(options?: {
34
- id?: number;
35
- renderTo?: 'canvas' | 'svg';
36
- type?: SeriesType;
37
- curveType?: d3.CurveFactoryLineOnly | d3.CurveFactory;
38
- data?: T[];
39
- axisFormat?: () => void;
40
- name?: string;
41
- xAxisIndex?: number;
42
- yAxisIndex?: number;
43
- drawer?: IDrawer<T>;
44
- strokeWidth?: number;
45
- strokeDasharray?: string;
46
- visible?: boolean;
47
- color?: string;
48
- colorScale?: d3.ScaleSequential<any, any>;
49
- drag?: {
50
- enable?: boolean;
51
- extendLine?: boolean;
52
- grabbers?: {
53
- radius?: number;
54
- stroke?: string;
55
- fill?: string;
56
- strokeWidth?: string;
57
- };
58
- };
59
- extend?: boolean;
60
- showInLegend?: boolean;
61
- });
62
- }
@@ -1,14 +0,0 @@
1
- export declare class TooltipOptions {
2
- enable?: boolean;
3
- showMarkers?: boolean;
4
- showLine?: boolean;
5
- tracking?: 'x' | 'y' | 'both';
6
- format?: (data: any) => any;
7
- constructor(options?: {
8
- enable?: boolean;
9
- showMarkers?: boolean;
10
- showLine?: boolean;
11
- tracking?: 'x' | 'y' | 'both';
12
- format?: (data: any) => any;
13
- });
14
- }
@@ -1,5 +0,0 @@
1
- export * from './chart.module';
2
- export * from './chart/chart.component';
3
- export * from './core/public-api';
4
- export * from './drawer/public-api';
5
- export * from './model/public-api';
@@ -1,164 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
2
- import { Subject } from 'rxjs';
3
- import { map, takeWhile, throttleTime } from 'rxjs/operators';
4
- import { TetaChart } from '../core/chart';
5
- import { SeriesType } from '../model/enum/series-type';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- export class ChartComponent {
9
- constructor(_zone) {
10
- this._zone = _zone;
11
- this.plotLinesMove = new EventEmitter();
12
- this.plotBandsMove = new EventEmitter();
13
- this.seriesMove = new EventEmitter();
14
- this.pointMove = new EventEmitter();
15
- this.zoomChange = new EventEmitter();
16
- this._alive = true;
17
- this.size$ = new Subject();
18
- }
19
- click(event) {
20
- const composedPath = event.composedPath();
21
- const triggerToken = 'legend';
22
- const isLegend = composedPath.some((_) => _.classList?.contains(triggerToken));
23
- if (isLegend) {
24
- const clickedElement = event.target?.__data__;
25
- if (!clickedElement) {
26
- return;
27
- }
28
- const serieIndex = this._config?.series?.indexOf(clickedElement);
29
- if (clickedElement.serieType === SeriesType.bar) {
30
- const foundSerie = this._config.series[clickedElement.serieIndex];
31
- this._config.series[foundSerie.id].data = this._config.series[foundSerie.id].data.map((_) => {
32
- if (clickedElement.id === _.id) {
33
- return {
34
- ..._,
35
- visible: !_.visible,
36
- };
37
- }
38
- return _;
39
- });
40
- this.redraw(this._config);
41
- }
42
- if (serieIndex !== -1) {
43
- const foundSerie = this._config.series[serieIndex];
44
- const yAxisIndex = foundSerie?.yAxisIndex;
45
- this._config.series[serieIndex].visible = !foundSerie.visible;
46
- const attachedYAxes = this._config.series
47
- ?.filter((_) => _.visible)
48
- .map((_) => _.yAxisIndex);
49
- const shouldVisibleYAxis = attachedYAxes?.includes(yAxisIndex);
50
- this._config.yAxis[yAxisIndex].visible = shouldVisibleYAxis;
51
- this.redraw(this._config);
52
- }
53
- }
54
- }
55
- ngOnChanges(changes) {
56
- if (this.config && changes.hasOwnProperty('config')) {
57
- this.setConfig(this.config);
58
- if (this.zoom) {
59
- this._chart?.setZoom(this.zoom);
60
- }
61
- }
62
- if (this.zoom && changes.hasOwnProperty('zoom')) {
63
- this._chart?.setZoom(this.zoom);
64
- }
65
- }
66
- ngOnInit() { }
67
- ngAfterViewInit() {
68
- this._observer = new ResizeObserver((entries) => {
69
- const { contentRect } = entries[0];
70
- this.size$.next(contentRect);
71
- });
72
- this._observer.observe(this.chart.nativeElement);
73
- this.size$
74
- .pipe(throttleTime(100, undefined, { trailing: true }))
75
- .pipe(takeWhile((_) => this._alive), map((_) => {
76
- this.resize(_);
77
- this.redraw(this._config);
78
- }))
79
- .subscribe();
80
- }
81
- get showLegend() {
82
- return this._config?.legend?.visible;
83
- }
84
- ngOnDestroy() {
85
- this._alive = false;
86
- this._observer?.unobserve(this.chart.nativeElement);
87
- }
88
- redraw(config) {
89
- if (config) {
90
- this._chart.redraw(config);
91
- }
92
- }
93
- resize(contentRect) {
94
- const { width, height } = contentRect;
95
- this._chart.setSize({
96
- width,
97
- height,
98
- });
99
- }
100
- setConfig(config) {
101
- if (config) {
102
- this._config = config;
103
- this.hasSeriesData = !!this._config?.series?.some((_) => _.data.length);
104
- if (!this._chart) {
105
- this._chart = new TetaChart(this._config, this.chart);
106
- this._chart.plotLinesMove
107
- .pipe(takeWhile((_) => this._alive))
108
- .subscribe((_) => this.plotLinesMove.emit(_));
109
- this._chart.plotBandsMove
110
- .pipe(takeWhile((_) => this._alive))
111
- .subscribe((_) => this.plotBandsMove.emit(_));
112
- this._chart.seriesMove
113
- .pipe(takeWhile((_) => this._alive))
114
- .subscribe((_) => this.seriesMove.emit(_));
115
- this._chart.pointMove
116
- .pipe(takeWhile((_) => this._alive))
117
- .subscribe((_) => {
118
- this.pointMove.emit(_);
119
- });
120
- this._chart.zoom
121
- .pipe(takeWhile((_) => this._alive), map((_) => {
122
- this.zoomChange.emit(_);
123
- }))
124
- .subscribe();
125
- }
126
- if (this.chart) {
127
- if (this.hasSeriesData) {
128
- if (!this._zoom || this._zoom?.event?.type === 'end') {
129
- this.redraw(this._config);
130
- }
131
- }
132
- }
133
- }
134
- }
135
- }
136
- ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
137
- ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: ChartComponent, selector: "teta-chart", inputs: { zoom: "zoom", config: "config" }, outputs: { plotLinesMove: "plotLinesMove", plotBandsMove: "plotBandsMove", seriesMove: "seriesMove", pointMove: "pointMove", zoomChange: "zoomChange" }, host: { listeners: { "click": "click($event)" } }, viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div [style.display]=\"hasSeriesData ? 'contents' : 'none'\">\n <div #chart class=\"chart-container\"></div>\n <div *ngIf=\"showLegend\" class=\"legend-container\"></div>\n</div>\n<div [style.display]=\"!hasSeriesData ? 'block' : 'none'\" class=\"chart-placeholder text-align-center\">\n <span class=\"font-body-3 color-text-40\">\u0414\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442</span>\n</div>\n\n\n", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column}.chart-container{position:relative;min-height:0;flex-grow:1;flex-basis:1px}.chart-placeholder{margin:auto;width:100%}.chart-placeholder span{text-overflow:ellipsis;overflow:hidden;display:block}.legend-container{flex-shrink:0;flex-basis:1px}::ng-deep .grid line{stroke-dasharray:1,4}::ng-deep .tooltip-chart{padding:8px 12px;border-radius:2px}::ng-deep .legend{grid-gap:8px;padding-bottom:5px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly}::ng-deep .legend .item{display:flex;align-items:center;cursor:pointer}::ng-deep .legend .item .swatch{width:10px;height:10px}::ng-deep .legend .item .line{width:12px;height:2px}::ng-deep .legend .item .label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:5px}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
138
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartComponent, decorators: [{
139
- type: Component,
140
- args: [{ selector: 'teta-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [style.display]=\"hasSeriesData ? 'contents' : 'none'\">\n <div #chart class=\"chart-container\"></div>\n <div *ngIf=\"showLegend\" class=\"legend-container\"></div>\n</div>\n<div [style.display]=\"!hasSeriesData ? 'block' : 'none'\" class=\"chart-placeholder text-align-center\">\n <span class=\"font-body-3 color-text-40\">\u0414\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442</span>\n</div>\n\n\n", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column}.chart-container{position:relative;min-height:0;flex-grow:1;flex-basis:1px}.chart-placeholder{margin:auto;width:100%}.chart-placeholder span{text-overflow:ellipsis;overflow:hidden;display:block}.legend-container{flex-shrink:0;flex-basis:1px}::ng-deep .grid line{stroke-dasharray:1,4}::ng-deep .tooltip-chart{padding:8px 12px;border-radius:2px}::ng-deep .legend{grid-gap:8px;padding-bottom:5px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-evenly}::ng-deep .legend .item{display:flex;align-items:center;cursor:pointer}::ng-deep .legend .item .swatch{width:10px;height:10px}::ng-deep .legend .item .line{width:12px;height:2px}::ng-deep .legend .item .label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-left:5px}\n"] }]
141
- }], ctorParameters: function () { return [{ type: i0.NgZone }]; }, propDecorators: { zoom: [{
142
- type: Input
143
- }], config: [{
144
- type: Input
145
- }], plotLinesMove: [{
146
- type: Output
147
- }], plotBandsMove: [{
148
- type: Output
149
- }], seriesMove: [{
150
- type: Output
151
- }], pointMove: [{
152
- type: Output
153
- }], zoomChange: [{
154
- type: Output
155
- }], chart: [{
156
- type: ViewChild,
157
- args: ['chart', {
158
- static: true,
159
- }]
160
- }], click: [{
161
- type: HostListener,
162
- args: ['click', ['$event']]
163
- }] } });
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9jaGFydC9jaGFydC9jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50L2NoYXJ0L2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUtMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBU3ZELE1BQU0sT0FBTyxjQUFjO0lBMkN6QixZQUFvQixLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQW5DakMsa0JBQWEsR0FBdUMsSUFBSSxZQUFZLEVBRWpFLENBQUM7UUFHSixrQkFBYSxHQUF1QyxJQUFJLFlBQVksRUFFakUsQ0FBQztRQUdKLGVBQVUsR0FBZ0QsSUFBSSxZQUFZLEVBRXZFLENBQUM7UUFHSixjQUFTLEdBQWdELElBQUksWUFBWSxFQUV0RSxDQUFDO1FBR0osZUFBVSxHQUE2QixJQUFJLFlBQVksRUFBYyxDQUFDO1FBUzlELFdBQU0sR0FBRyxJQUFJLENBQUM7UUFDZCxVQUFLLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUtDLENBQUM7SUFFRixLQUFLLENBQUMsS0FBVTtRQUNqRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7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S0FBSyxLQUFLLEVBQUU7d0JBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUMzQjtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDOzsyR0EzTVUsY0FBYzsrRkFBZCxjQUFjLDZhQ3BDM0IsMmNBU0E7MkZEMkJhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsWUFBWSxtQkFHTCx1QkFBdUIsQ0FBQyxNQUFNOzZGQUt0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUdOLGFBQWE7c0JBRFosTUFBTTtnQkFNUCxhQUFhO3NCQURaLE1BQU07Z0JBTVAsVUFBVTtzQkFEVCxNQUFNO2dCQU1QLFNBQVM7c0JBRFIsTUFBTTtnQkFNUCxVQUFVO3NCQURULE1BQU07Z0JBTVAsS0FBSztzQkFISixTQUFTO3VCQUFDLE9BQU8sRUFBRTt3QkFDbEIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7Z0JBYWtDLEtBQUs7c0JBQXZDLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YWtlV2hpbGUsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRldGFDaGFydCB9IGZyb20gJy4uL2NvcmUvY2hhcnQnO1xuaW1wb3J0IHsgQ2hhcnRPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWwvY2hhcnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludC9iYXNlLXBvaW50JztcbmltcG9ydCB7IFNlcmllcyB9IGZyb20gJy4uL21vZGVsL3Nlcmllcyc7XG5pbXBvcnQgeyBQbG90TGluZSB9IGZyb20gJy4uL21vZGVsL3Bsb3QtbGluZSc7XG5pbXBvcnQgeyBQbG90QmFuZCB9IGZyb20gJy4uL21vZGVsL3Bsb3QtYmFuZCc7XG5pbXBvcnQgeyBJRHJhZ0V2ZW50IH0gZnJvbSAnLi4vbW9kZWwvaS1kcmFnLWV2ZW50JztcbmltcG9ydCB7IElab29tRXZlbnQgfSBmcm9tICcuLi9tb2RlbC9pLXpvb20tZXZlbnQnO1xuaW1wb3J0IHsgU2VyaWVzVHlwZSB9IGZyb20gJy4uL21vZGVsL2VudW0vc2VyaWVzLXR5cGUnO1xuaW1wb3J0IHsgQmFyUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9wb2ludC9iYXItcG9pbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZXRhLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xue1xuICBASW5wdXQoKSB6b29tOiBJWm9vbUV2ZW50O1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogQ2hhcnRPcHRpb25zO1xuXG4gIEBPdXRwdXQoKVxuICBwbG90TGluZXNNb3ZlOiBFdmVudEVtaXR0ZXI8SURyYWdFdmVudDxQbG90TGluZT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBJRHJhZ0V2ZW50PFBsb3RMaW5lPlxuICA+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHBsb3RCYW5kc01vdmU6IEV2ZW50RW1pdHRlcjxJRHJhZ0V2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElEcmFnRXZlbnQ8UGxvdEJhbmQ+XG4gID4oKTtcblxuICBAT3V0cHV0KClcbiAgc2VyaWVzTW92ZTogRXZlbnRFbWl0dGVyPElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+PiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgSURyYWdFdmVudDxTZXJpZXM8QmFzZVBvaW50Pj5cbiAgPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwb2ludE1vdmU6IEV2ZW50RW1pdHRlcjxJRHJhZ0V2ZW50PFNlcmllczxCYXNlUG9pbnQ+Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElEcmFnRXZlbnQ8U2VyaWVzPEJhc2VQb2ludD4+XG4gID4oKTtcblxuICBAT3V0cHV0KClcbiAgem9vbUNoYW5nZTogRXZlbnRFbWl0dGVyPElab29tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJWm9vbUV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXJ0Jywge1xuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgY2hhcnQ6IEVsZW1lbnRSZWY7XG4gIGhhc1Nlcmllc0RhdGE6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBDaGFydE9wdGlvbnM7XG4gIHByaXZhdGUgX2FsaXZlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzaXplJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIF9jaGFydDogVGV0YUNoYXJ0O1xuICBwcml2YXRlIF96b29tOiBJWm9vbUV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge31cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pIGNsaWNrKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb3NlZFBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTtcbiAgICBjb25zdCB0cmlnZ2VyVG9rZW4gPSAnbGVnZW5kJztcblxuICAgIGNvbnN0IGlzTGVnZW5kID0gY29tcG9zZWRQYXRoLnNvbWUoKF8pID0+XG4gICAgICBfLmNsYXNzTGlzdD8uY29udGFpbnModHJpZ2dlclRva2VuKVxuICAgICk7XG5cbiAgICBpZiAoaXNMZWdlbmQpIHtcbiAgICAgIGNvbnN0IGNsaWNrZWRFbGVtZW50OiBhbnkgPSBldmVudC50YXJnZXQ/Ll9fZGF0YV9fO1xuXG4gICAgICBpZiAoIWNsaWNrZWRFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VyaWVJbmRleCA9IHRoaXMuX2NvbmZpZz8uc2VyaWVzPy5pbmRleE9mKGNsaWNrZWRFbGVtZW50KTtcblxuICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LnNlcmllVHlwZSA9PT0gU2VyaWVzVHlwZS5iYXIpIHtcbiAgICAgICAgY29uc3QgZm91bmRTZXJpZSA9IHRoaXMuX2NvbmZpZy5zZXJpZXNbY2xpY2tlZEVsZW1lbnQuc2VyaWVJbmRleF07XG5cbiAgICAgICAgdGhpcy5fY29uZmlnLnNlcmllc1tmb3VuZFNlcmllLmlkXS5kYXRhID0gdGhpcy5fY29uZmlnLnNlcmllc1tcbiAgICAgICAgICBmb3VuZFNlcmllLmlkXG4gICAgICAgIF0uZGF0YS5tYXAoKF86IEJhc2VQb2ludCAmIEJhclBvaW50KSA9PiB7XG4gICAgICAgICAgaWYgKGNsaWNrZWRFbGVtZW50LmlkID09PSBfLmlkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5fLFxuICAgICAgICAgICAgICB2aXNpYmxlOiAhXy52aXNpYmxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gXztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWRyYXcodGhpcy5fY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlcmllSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kU2VyaWUgPSB0aGlzLl9jb25maWcuc2VyaWVzW3NlcmllSW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IHlBeGlzSW5kZXggPSBmb3VuZFNlcmllPy55QXhpc0luZGV4O1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZy5zZXJpZXNbc2VyaWVJbmRleF0udmlzaWJsZSA9ICFmb3VuZFNlcmllLnZpc2libGU7XG5cbiAgICAgICAgY29uc3QgYXR0YWNoZWRZQXhlcyA9IHRoaXMuX2NvbmZpZy5zZXJpZXNcbiAgICAgICAgICA/LmZpbHRlcigoXykgPT4gXy52aXNpYmxlKVxuICAgICAgICAgIC5tYXAoKF8pID0+IF8ueUF4aXNJbmRleCk7XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkVmlzaWJsZVlBeGlzID0gYXR0YWNoZWRZQXhlcz8uaW5jbHVkZXMoeUF4aXNJbmRleCk7XG5cbiAgICAgICAgdGhpcy5fY29uZmlnLnlBeGlzW3lBeGlzSW5kZXhdLnZpc2libGUgPSBzaG91bGRWaXNpYmxlWUF4aXM7XG4gICAgICAgIHRoaXMucmVkcmF3KHRoaXMuX2NvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLmNvbmZpZyAmJiBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdjb25maWcnKSkge1xuICAgICAgdGhpcy5zZXRDb25maWcodGhpcy5jb25maWcpO1xuXG4gICAgICBpZiAodGhpcy56b29tKSB7XG4gICAgICAgIHRoaXMuX2NoYXJ0Py5zZXRab29tKHRoaXMuem9vbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuem9vbSAmJiBjaGFuZ2VzLmhhc093blByb3BlcnR5KCd6b29tJykpIHtcbiAgICAgIHRoaXMuX2NoYXJ0Py5zZXRab29tKHRoaXMuem9vbSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgY29uc3QgeyBjb250ZW50UmVjdCB9ID0gZW50cmllc1swXTtcbiAgICAgIHRoaXMuc2l6ZSQubmV4dChjb250ZW50UmVjdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICB0aGlzLnNpemUkXG4gICAgICAucGlwZSh0aHJvdHRsZVRpbWUoMTAwLCB1bmRlZmluZWQsIHsgdHJhaWxpbmc6IHRydWUgfSkpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKChfKSA9PiB0aGlzLl9hbGl2ZSksXG4gICAgICAgIG1hcCgoXykgPT4ge1xuICAgICAgICAgIHRoaXMucmVzaXplKF8pO1xuICAgICAgICAgIHRoaXMucmVkcmF3KHRoaXMuX2NvbmZpZyk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXQgc2hvd0xlZ2VuZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnPy5sZWdlbmQ/LnZpc2libGU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuX29ic2VydmVyPy51bm9ic2VydmUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkcmF3KGNvbmZpZzogYW55KSB7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5fY2hhcnQucmVkcmF3KGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemUoY29udGVudFJlY3Q6IGFueSkge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29udGVudFJlY3Q7XG4gICAgdGhpcy5fY2hhcnQuc2V0U2l6ZSh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29uZmlnKGNvbmZpZzogQ2hhcnRPcHRpb25zKSB7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgdGhpcy5oYXNTZXJpZXNEYXRhID0gISF0aGlzLl9jb25maWc/LnNlcmllcz8uc29tZSgoXykgPT4gXy5kYXRhLmxlbmd0aCk7XG5cbiAgICAgIGlmICghdGhpcy5fY2hhcnQpIHtcbiAgICAgICAgdGhpcy5fY2hhcnQgPSBuZXcgVGV0YUNoYXJ0KHRoaXMuX2NvbmZpZywgdGhpcy5jaGFydCk7XG5cbiAgICAgICAgdGhpcy5fY2hhcnQucGxvdExpbmVzTW92ZVxuICAgICAgICAgIC5waXBlKHRha2VXaGlsZSgoXykgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHRoaXMucGxvdExpbmVzTW92ZS5lbWl0KF8pKTtcblxuICAgICAgICB0aGlzLl9jaGFydC5wbG90QmFuZHNNb3ZlXG4gICAgICAgICAgLnBpcGUodGFrZVdoaWxlKChfKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoXykgPT4gdGhpcy5wbG90QmFuZHNNb3ZlLmVtaXQoXykpO1xuXG4gICAgICAgIHRoaXMuX2NoYXJ0LnNlcmllc01vdmVcbiAgICAgICAgICAucGlwZSh0YWtlV2hpbGUoKF8pID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChfKSA9PiB0aGlzLnNlcmllc01vdmUuZW1pdChfKSk7XG5cbiAgICAgICAgdGhpcy5fY2hhcnQucG9pbnRNb3ZlXG4gICAgICAgICAgLnBpcGUodGFrZVdoaWxlKChfKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICAgICAgdGhpcy5wb2ludE1vdmUuZW1pdChfKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jaGFydC56b29tXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlV2hpbGUoKF8pID0+IHRoaXMuX2FsaXZlKSxcbiAgICAgICAgICAgIG1hcCgoXykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnpvb21DaGFuZ2UuZW1pdChfKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2hhcnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU2VyaWVzRGF0YSkge1xuICAgICAgICAgIGlmICghdGhpcy5fem9vbSB8fCB0aGlzLl96b29tPy5ldmVudD8udHlwZSA9PT0gJ2VuZCcpIHtcbiAgICAgICAgICAgIHRoaXMucmVkcmF3KHRoaXMuX2NvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IFtzdHlsZS5kaXNwbGF5XT1cImhhc1Nlcmllc0RhdGEgPyAnY29udGVudHMnIDogJ25vbmUnXCI+XG4gIDxkaXYgI2NoYXJ0IGNsYXNzPVwiY2hhcnQtY29udGFpbmVyXCI+PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJzaG93TGVnZW5kXCIgY2xhc3M9XCJsZWdlbmQtY29udGFpbmVyXCI+PC9kaXY+XG48L2Rpdj5cbjxkaXYgW3N0eWxlLmRpc3BsYXldPVwiIWhhc1Nlcmllc0RhdGEgPyAnYmxvY2snIDogJ25vbmUnXCIgY2xhc3M9XCJjaGFydC1wbGFjZWhvbGRlciB0ZXh0LWFsaWduLWNlbnRlclwiPlxuICA8c3BhbiBjbGFzcz1cImZvbnQtYm9keS0zIGNvbG9yLXRleHQtNDBcIj7QlNCw0L3QvdGL0LUg0L7RgtGB0YPRgtGB0YLQstGD0Y7Rgjwvc3Bhbj5cbjwvZGl2PlxuXG5cbiJdfQ==
@@ -1,18 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { ChartComponent } from './chart/chart.component';
4
- import * as i0 from "@angular/core";
5
- export class ChartModule {
6
- }
7
- ChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
- ChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartModule, declarations: [ChartComponent], imports: [CommonModule], exports: [ChartComponent] });
9
- ChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartModule, imports: [[CommonModule]] });
10
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartModule, decorators: [{
11
- type: NgModule,
12
- args: [{
13
- declarations: [ChartComponent],
14
- exports: [ChartComponent],
15
- imports: [CommonModule],
16
- }]
17
- }] });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9jaGFydC9jaGFydC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQU96RCxNQUFNLE9BQU8sV0FBVzs7d0dBQVgsV0FBVzt5R0FBWCxXQUFXLGlCQUpQLGNBQWMsYUFFbkIsWUFBWSxhQURaLGNBQWM7eUdBR2IsV0FBVyxZQUZiLENBQUMsWUFBWSxDQUFDOzJGQUVaLFdBQVc7a0JBTHZCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsY0FBYyxDQUFDO29CQUM5QixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7b0JBQ3pCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYXJ0Q29tcG9uZW50IH0gZnJvbSAnLi9jaGFydC9jaGFydC5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtDaGFydENvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtDaGFydENvbXBvbmVudF0sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydE1vZHVsZSB7fVxuIl19
@@ -1,82 +0,0 @@
1
- import * as d3 from 'd3';
2
- import { AxisType } from '../model/enum/axis-type';
3
- export class Axis {
4
- constructor(options) {
5
- this._extents = [0, 0];
6
- this._type = options?.type;
7
- this._index = options?.index || 0;
8
- this._chartOptions = options?.chartOptions;
9
- this._height = options?.height;
10
- if (this._chartOptions == null) {
11
- throw new Error(`No chartOptions for axis ${AxisType[this._type]}`);
12
- }
13
- this.createExtents();
14
- this.width = this.calculateAxisWidth();
15
- }
16
- get index() {
17
- return this._index;
18
- }
19
- get options() {
20
- return this._type === AxisType.abscissa
21
- ? this._chartOptions.xAxis[this.index]
22
- : this._chartOptions.yAxis[this.index];
23
- }
24
- get extent() {
25
- return this._extents;
26
- }
27
- get type() {
28
- return this._type;
29
- }
30
- get offset() {
31
- return this._offset;
32
- }
33
- get ticks() {
34
- return this._ticks;
35
- }
36
- setOffset(offset) {
37
- this._offset = offset;
38
- }
39
- calculateAxisWidth() {
40
- if (this.type === AxisType.abscissa) {
41
- return 0;
42
- }
43
- const y = d3
44
- .scaleLinear()
45
- .domain([this.extent[0], this.extent[1]])
46
- .range([0, this._height])
47
- .nice();
48
- const body = d3
49
- .select('body')
50
- .append('svg')
51
- .attr('class', 'calculate-offset')
52
- .style('position', 'absolute')
53
- .style('left', '-9999px');
54
- const axis = d3.axisRight(y).tickValues(this.ticks);
55
- const element = body.append('g').attr('class', 'font-caption').call(axis);
56
- const bBox = element.node().getBBox();
57
- d3.selectAll('.calculate-offset').remove();
58
- return bBox.width;
59
- }
60
- createExtents() {
61
- const hasMin = this.options?.min != null;
62
- const hasMax = this.options?.max != null;
63
- if (!hasMin || !hasMax) {
64
- const filtered = this._chartOptions?.series?.filter((serie) => this._index ===
65
- serie[this._type === AxisType.abscissa ? 'xAxisIndex' : 'yAxisIndex']);
66
- const raw = filtered.map((series) => d3.extent(series?.data, (point) => this._type === AxisType.abscissa ? point.x : point.y));
67
- const merged = [].concat(...(raw ?? []));
68
- const abs = (num) => Math.abs(num);
69
- this._extents = this.options.negative
70
- ? [-Math.abs(d3.max(merged.map(abs))), d3.max(merged.map(abs))]
71
- : [d3.min(merged), d3.max(merged)];
72
- }
73
- if (hasMin) {
74
- this._extents[0] = this.options?.min;
75
- }
76
- if (hasMax) {
77
- this._extents[1] = this.options?.max;
78
- }
79
- }
80
- }
81
- Axis.offsetFactor = 22;
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy1jcmVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudC9jaGFydC9jb3JlL2F4aXMtY3JlYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFNakQsTUFBTSxPQUFPLElBQUk7SUFZZixZQUFZLE9BS1g7UUFYTyxhQUFRLEdBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBWTFDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxFQUFFLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUM7UUFFL0IsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDRCQUE0QixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsUUFBUTtZQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FB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LEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3JELENBQ0YsQ0FBQztZQUVGLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2dCQUNuQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7U0FDdEM7UUFFRCxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUM7U0FDdEM7SUFDSCxDQUFDOztBQXhIYSxpQkFBWSxHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7QXhpc1R5cGV9IGZyb20gJy4uL21vZGVsL2VudW0vYXhpcy10eXBlJztcbmltcG9ydCB7U2VyaWVzfSBmcm9tICcuLi9tb2RlbC9zZXJpZXMnO1xuaW1wb3J0IHtCYXNlUG9pbnR9IGZyb20gJy4uL21vZGVsL3BvaW50L2Jhc2UtcG9pbnQnO1xuaW1wb3J0IHtDaGFydE9wdGlvbnN9IGZyb20gJy4uL21vZGVsL2NoYXJ0LW9wdGlvbnMnO1xuaW1wb3J0IHtBeGlzT3B0aW9uc30gZnJvbSAnLi4vbW9kZWwvYXhpcy1vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIEF4aXMge1xuICBwdWJsaWMgc3RhdGljIG9mZnNldEZhY3RvciA9IDIyO1xuICBwdWJsaWMgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcblxuICBwcml2YXRlIF90eXBlOiBBeGlzVHlwZTtcbiAgcHJpdmF0ZSBfY2hhcnRPcHRpb25zOiBDaGFydE9wdGlvbnM7XG4gIHByaXZhdGUgX2V4dGVudHM6IFtudW1iZXIsIG51bWJlcl0gPSBbMCwgMF07XG4gIHByaXZhdGUgX2luZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xuICBwcml2YXRlIF9vZmZzZXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGlja3M6IGFueTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgdHlwZTogQXhpc1R5cGU7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBjaGFydE9wdGlvbnM6IENoYXJ0T3B0aW9ucztcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gIH0pIHtcbiAgICB0aGlzLl90eXBlID0gb3B0aW9ucz8udHlwZTtcbiAgICB0aGlzLl9pbmRleCA9IG9wdGlvbnM/LmluZGV4IHx8IDA7XG4gICAgdGhpcy5fY2hhcnRPcHRpb25zID0gb3B0aW9ucz8uY2hhcnRPcHRpb25zO1xuICAgIHRoaXMuX2hlaWdodCA9IG9wdGlvbnM/LmhlaWdodDtcblxuICAgIGlmICh0aGlzLl9jaGFydE9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjaGFydE9wdGlvbnMgZm9yIGF4aXMgJHtBeGlzVHlwZVt0aGlzLl90eXBlXX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmNyZWF0ZUV4dGVudHMoKTtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5jYWxjdWxhdGVBeGlzV2lkdGgoKTtcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBnZXQgb3B0aW9ucygpOiBBeGlzT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhXG4gICAgICA/IHRoaXMuX2NoYXJ0T3B0aW9ucy54QXhpc1t0aGlzLmluZGV4XVxuICAgICAgOiB0aGlzLl9jaGFydE9wdGlvbnMueUF4aXNbdGhpcy5pbmRleF07XG4gIH1cblxuICBnZXQgZXh0ZW50KCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICAgIHJldHVybiB0aGlzLl9leHRlbnRzO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogQXhpc1R5cGUge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG5cbiAgZ2V0IG9mZnNldCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9vZmZzZXQ7XG4gIH1cblxuICBnZXQgdGlja3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpY2tzO1xuICB9XG5cbiAgc2V0T2Zmc2V0KG9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVBeGlzV2lkdGgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50eXBlID09PSBBeGlzVHlwZS5hYnNjaXNzYSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgY29uc3QgeSA9IGQzXG4gICAgICAuc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5leHRlbnRbMF0sIHRoaXMuZXh0ZW50WzFdXSlcbiAgICAgIC5yYW5nZShbMCwgdGhpcy5faGVpZ2h0XSlcbiAgICAgIC5uaWNlKCk7XG5cbiAgICBjb25zdCBib2R5ID0gZDNcbiAgICAgIC5zZWxlY3QoJ2JvZHknKVxuICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgIC5hdHRyKCdjbGFzcycsICdjYWxjdWxhdGUtb2Zmc2V0JylcbiAgICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxuICAgICAgLnN0eWxlKCdsZWZ0JywgJy05OTk5cHgnKTtcbiAgICBjb25zdCBheGlzID0gZDMuYXhpc1JpZ2h0KHkpLnRpY2tWYWx1ZXModGhpcy50aWNrcyk7XG4gICAgY29uc3QgZWxlbWVudCA9IGJvZHkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZm9udC1jYXB0aW9uJykuY2FsbChheGlzKTtcblxuICAgIGNvbnN0IGJCb3ggPSBlbGVtZW50Lm5vZGUoKS5nZXRCQm94KCk7XG5cbiAgICBkMy5zZWxlY3RBbGwoJy5jYWxjdWxhdGUtb2Zmc2V0JykucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4gYkJveC53aWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW50cygpIHtcbiAgICBjb25zdCBoYXNNaW4gPSB0aGlzLm9wdGlvbnM/Lm1pbiAhPSBudWxsO1xuICAgIGNvbnN0IGhhc01heCA9IHRoaXMub3B0aW9ucz8ubWF4ICE9IG51bGw7XG5cbiAgICBpZiAoIWhhc01pbiB8fCAhaGFzTWF4KSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IHRoaXMuX2NoYXJ0T3B0aW9ucz8uc2VyaWVzPy5maWx0ZXIoXG4gICAgICAgIChzZXJpZTogU2VyaWVzPEJhc2VQb2ludD4pID0+XG4gICAgICAgICAgdGhpcy5faW5kZXggPT09XG4gICAgICAgICAgc2VyaWVbdGhpcy5fdHlwZSA9PT0gQXhpc1R5cGUuYWJzY2lzc2EgPyAneEF4aXNJbmRleCcgOiAneUF4aXNJbmRleCddXG4gICAgICApO1xuXG4gICAgICBjb25zdCByYXcgPSBmaWx0ZXJlZC5tYXAoKHNlcmllczogU2VyaWVzPEJhc2VQb2ludD4pID0+XG4gICAgICAgIGQzLmV4dGVudChzZXJpZXM/LmRhdGEsIChwb2ludDogQmFzZVBvaW50KSA9PlxuICAgICAgICAgIHRoaXMuX3R5cGUgPT09IEF4aXNUeXBlLmFic2Npc3NhID8gcG9pbnQueCA6IHBvaW50LnlcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWVyZ2VkID0gW10uY29uY2F0KC4uLihyYXcgPz8gW10pKTtcblxuICAgICAgY29uc3QgYWJzID0gKG51bSkgPT4gTWF0aC5hYnMobnVtKTtcblxuICAgICAgdGhpcy5fZXh0ZW50cyA9IHRoaXMub3B0aW9ucy5uZWdhdGl2ZVxuICAgICAgICA/IFstTWF0aC5hYnMoZDMubWF4KG1lcmdlZC5tYXAoYWJzKSkpLCBkMy5tYXgobWVyZ2VkLm1hcChhYnMpKV1cbiAgICAgICAgOiBbZDMubWluKG1lcmdlZCksIGQzLm1heChtZXJnZWQpXTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTWluKSB7XG4gICAgICB0aGlzLl9leHRlbnRzWzBdID0gdGhpcy5vcHRpb25zPy5taW47XG4gICAgfVxuXG4gICAgaWYgKGhhc01heCkge1xuICAgICAgdGhpcy5fZXh0ZW50c1sxXSA9IHRoaXMub3B0aW9ucz8ubWF4O1xuICAgIH1cbiAgfVxufVxuIl19