@operato/scene-scichart 7.0.7 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/db.sqlite +0 -0
  3. package/dist/charts/axis-synchronizer.d.ts +10 -0
  4. package/dist/charts/axis-synchronizer.js +32 -0
  5. package/dist/charts/axis-synchronizer.js.map +1 -0
  6. package/dist/charts/ox-scichart-multiple.d.ts +40 -0
  7. package/dist/charts/ox-scichart-multiple.js +272 -0
  8. package/dist/charts/ox-scichart-multiple.js.map +1 -0
  9. package/dist/charts/ox-scichart.d.ts +1 -1
  10. package/dist/charts/ox-scichart.js.map +1 -1
  11. package/dist/charts/scichart-builder.d.ts +10 -1
  12. package/dist/charts/scichart-builder.js +80 -8
  13. package/dist/charts/scichart-builder.js.map +1 -1
  14. package/dist/index.d.ts +1 -0
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/scichart-multiple-timeseries.d.ts +14 -0
  18. package/dist/scichart-multiple-timeseries.js +60 -0
  19. package/dist/scichart-multiple-timeseries.js.map +1 -0
  20. package/dist/scichart-timeseries.d.ts +2 -11
  21. package/dist/scichart-timeseries.js +2 -42
  22. package/dist/scichart-timeseries.js.map +1 -1
  23. package/dist/templates/index.js +2 -1
  24. package/dist/templates/index.js.map +1 -1
  25. package/dist/templates/scichart-multiple-timeseries.d.ts +53 -0
  26. package/dist/templates/scichart-multiple-timeseries.js +81 -0
  27. package/dist/templates/scichart-multiple-timeseries.js.map +1 -0
  28. package/helps/scene/component/scichart-multiple-timeseries.md +23 -0
  29. package/helps/scene/component/scichart-timeseries.md +18 -0
  30. package/icons/scichart-multiple-timeseries.png +0 -0
  31. package/logs/.08636eb59927f12972f6774f5947c8507b3564c2-audit.json +11 -6
  32. package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +18 -23
  33. package/logs/{application-2024-07-13-21.log → application-2024-07-28-03.log} +8 -8
  34. package/logs/{application-2024-07-13-20.log → application-2024-07-28-17.log} +32 -36
  35. package/logs/application-2024-07-28-18.log +210 -0
  36. package/logs/connections-2024-07-23-14.log +50 -0
  37. package/logs/connections-2024-07-25-23.log +50 -0
  38. package/logs/connections-2024-07-26-18.log +50 -0
  39. package/logs/connections-2024-07-28-03.log +50 -0
  40. package/logs/connections-2024-07-28-17.log +200 -0
  41. package/logs/connections-2024-07-28-18.log +100 -0
  42. package/package.json +2 -2
  43. package/schema.graphql +112 -0
  44. package/src/charts/axis-synchronizer.ts +37 -0
  45. package/src/charts/ox-scichart-multiple.ts +334 -0
  46. package/src/charts/ox-scichart.ts +1 -1
  47. package/src/charts/scichart-builder.ts +109 -8
  48. package/src/index.ts +1 -0
  49. package/src/scichart-multiple-timeseries.ts +74 -0
  50. package/src/scichart-timeseries.ts +3 -54
  51. package/src/templates/index.ts +2 -1
  52. package/src/templates/scichart-multiple-timeseries.ts +87 -0
  53. package/things-scene.config.js +0 -2
  54. package/translations/en.json +3 -1
  55. package/translations/ja.json +3 -1
  56. package/translations/ko.json +3 -1
  57. package/translations/ms.json +3 -1
  58. package/translations/zh.json +3 -1
  59. package/tsconfig.tsbuildinfo +1 -1
  60. package/cache/translations/system/en.json +0 -1
  61. package/cache/translations/system/ko.json +0 -1
  62. package/logs/connections-2024-07-08-22.log +0 -50
  63. package/logs/connections-2024-07-08-23.log +0 -100
  64. package/logs/connections-2024-07-09-15.log +0 -100
  65. package/logs/connections-2024-07-10-00.log +0 -50
  66. package/logs/connections-2024-07-10-10.log +0 -50
  67. package/logs/connections-2024-07-13-20.log +0 -200
  68. package/logs/connections-2024-07-13-21.log +0 -50
package/CHANGELOG.md CHANGED
@@ -3,6 +3,15 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [7.1.0](https://github.com/things-scene/operato-scene/compare/v7.0.12...v7.1.0) (2024-07-28)
7
+
8
+
9
+ ### :rocket: New Features
10
+
11
+ * scichart-multiple-timeseries ([d8c6f99](https://github.com/things-scene/operato-scene/commit/d8c6f997bb7118f0400c0f114a42fa1040ebe0d5))
12
+
13
+
14
+
6
15
  ## [7.0.7](https://github.com/things-scene/operato-scene/compare/v7.0.6...v7.0.7) (2024-07-13)
7
16
 
8
17
 
package/db.sqlite CHANGED
Binary file
@@ -0,0 +1,10 @@
1
+ import { AxisBase2D, EventHandler, NumberRange, VisibleRangeChangedArgs } from 'scichart';
2
+ export declare class AxisSynchroniser {
3
+ visibleRange: NumberRange;
4
+ private axes;
5
+ visibleRangeChanged: EventHandler<VisibleRangeChangedArgs>;
6
+ constructor(initialRange: NumberRange, axes?: AxisBase2D[]);
7
+ publishChange(data?: VisibleRangeChangedArgs): void;
8
+ addAxis(axis: AxisBase2D): void;
9
+ removeAxis(axis: AxisBase2D): void;
10
+ }
@@ -0,0 +1,32 @@
1
+ import { EventHandler } from 'scichart';
2
+ export class AxisSynchroniser {
3
+ constructor(initialRange, axes) {
4
+ this.axes = [];
5
+ this.visibleRangeChanged = new EventHandler();
6
+ this.visibleRange = initialRange;
7
+ this.publishChange = this.publishChange.bind(this);
8
+ if (axes) {
9
+ axes.forEach(a => this.addAxis(a));
10
+ }
11
+ }
12
+ publishChange(data) {
13
+ this.visibleRange = data.visibleRange;
14
+ this.axes.forEach(a => (a.visibleRange = this.visibleRange));
15
+ this.visibleRangeChanged.raiseEvent(data);
16
+ }
17
+ addAxis(axis) {
18
+ if (!this.axes.includes(axis)) {
19
+ this.axes.push(axis);
20
+ axis.visibleRange = this.visibleRange;
21
+ axis.visibleRangeChanged.subscribe(this.publishChange);
22
+ }
23
+ }
24
+ removeAxis(axis) {
25
+ const index = this.axes.findIndex(a => a === axis);
26
+ if (index >= 0) {
27
+ this.axes.splice(index, 1);
28
+ axis.visibleRangeChanged.unsubscribe(this.publishChange);
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=axis-synchronizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis-synchronizer.js","sourceRoot":"","sources":["../../src/charts/axis-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAwC,MAAM,UAAU,CAAA;AAEzF,MAAM,OAAO,gBAAgB;IAK3B,YAAmB,YAAyB,EAAE,IAAmB;QAHzD,SAAI,GAAiB,EAAE,CAAA;QACxB,wBAAmB,GAA0C,IAAI,YAAY,EAA2B,CAAA;QAG7G,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,aAAa,CAAC,IAA8B;QACjD,IAAI,CAAC,YAAY,GAAG,IAAK,CAAC,YAAY,CAAA;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;QAC5D,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAEM,OAAO,CAAC,IAAgB;QAC7B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;YACrC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,IAAgB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QAClD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC1B,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;CACF","sourcesContent":["import { AxisBase2D, EventHandler, NumberRange, VisibleRangeChangedArgs } from 'scichart'\n\nexport class AxisSynchroniser {\n public visibleRange: NumberRange\n private axes: AxisBase2D[] = []\n public visibleRangeChanged: EventHandler<VisibleRangeChangedArgs> = new EventHandler<VisibleRangeChangedArgs>()\n\n public constructor(initialRange: NumberRange, axes?: AxisBase2D[]) {\n this.visibleRange = initialRange\n this.publishChange = this.publishChange.bind(this)\n if (axes) {\n axes.forEach(a => this.addAxis(a))\n }\n }\n\n public publishChange(data?: VisibleRangeChangedArgs) {\n this.visibleRange = data!.visibleRange\n this.axes.forEach(a => (a.visibleRange = this.visibleRange))\n this.visibleRangeChanged.raiseEvent(data)\n }\n\n public addAxis(axis: AxisBase2D) {\n if (!this.axes.includes(axis)) {\n this.axes.push(axis)\n axis.visibleRange = this.visibleRange\n axis.visibleRangeChanged.subscribe(this.publishChange)\n }\n }\n\n public removeAxis(axis: AxisBase2D) {\n const index = this.axes.findIndex(a => a === axis)\n if (index >= 0) {\n this.axes.splice(index, 1)\n axis.visibleRangeChanged.unsubscribe(this.publishChange)\n }\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class OxSciChartMultiple extends LitElement {
3
+ config: OperatoChart.ChartConfig | null;
4
+ data: {
5
+ [attr: string]: any;
6
+ }[];
7
+ visibleSeries: string[];
8
+ showOverview: boolean;
9
+ private synchronizer;
10
+ private verticalGroup;
11
+ private isInitializing;
12
+ private overviewChart;
13
+ private overviewDataSeries;
14
+ private groupCharts;
15
+ private containerId;
16
+ overviewContainer: HTMLDivElement;
17
+ static idx: number;
18
+ static styles: import("lit").CSSResult[];
19
+ initializeSciChart(): Promise<void>;
20
+ updated(changedProperties: Map<string | number | symbol, unknown>): Promise<void>;
21
+ private ensureInitialization;
22
+ cleanup(): void;
23
+ cleanupGroup(): void;
24
+ updateDataSeries(): Promise<never[] | undefined>;
25
+ get dataSet(): {
26
+ xValue: number;
27
+ yValue: number;
28
+ }[][];
29
+ render(): import("lit-html").TemplateResult<1>;
30
+ buildChartGroup(): Promise<void>;
31
+ updateSeries(after: string[], before: string[]): Promise<void>;
32
+ addChart(dataKey: string): Promise<void>;
33
+ removeChart(dataKey: string): void;
34
+ groupSorter(group: any[]): any[];
35
+ }
36
+ declare global {
37
+ interface HTMLElementTagNameMap {
38
+ 'ox-scichart-multiple': OxSciChartMultiple;
39
+ }
40
+ }
@@ -0,0 +1,272 @@
1
+ var OxSciChartMultiple_1;
2
+ import { __decorate } from "tslib";
3
+ import { LitElement, html, css } from 'lit';
4
+ import { property, query, customElement } from 'lit/decorators.js';
5
+ import { keyed } from 'lit/directives/keyed.js';
6
+ import { buildSciChart, buildSciChartOverview } from './scichart-builder';
7
+ import { AxisSynchroniser } from './axis-synchronizer';
8
+ import { NumberRange, SciChartVerticalGroup } from 'scichart';
9
+ import { ScrollbarStyles } from '@operato/styles';
10
+ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends LitElement {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.config = null;
14
+ this.data = [];
15
+ this.visibleSeries = [];
16
+ this.showOverview = true;
17
+ this.synchronizer = new AxisSynchroniser(new NumberRange(200, 500));
18
+ this.verticalGroup = new SciChartVerticalGroup();
19
+ this.isInitializing = false;
20
+ this.overviewChart = null;
21
+ this.overviewDataSeries = [];
22
+ this.groupCharts = [];
23
+ /*
24
+ [주의]
25
+ ox-scichart container의 id를 글로벌 유니크하게 해야한다.
26
+ SciChart가 특별히 container의 id를 기반으로 하위 컴포넌트를 구성하고 있기 때문이다.
27
+ shadowDom 안에 있는 container 이더라도, 글로벌 유니크한 id를 제공해야 한다.
28
+ 그렇지 않으면, 단 하나의 차트만 제대로 렌더링된다.
29
+ */
30
+ this.containerId = 'ox-scichart-multiple' + ++OxSciChartMultiple_1.idx;
31
+ }
32
+ async initializeSciChart() {
33
+ this.cleanup();
34
+ const { chart, dataSeries } = (await buildSciChartOverview(this.config, this.overviewContainer, {}, this.synchronizer)) || {};
35
+ this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface);
36
+ this.overviewChart = chart;
37
+ this.overviewDataSeries = dataSeries;
38
+ }
39
+ async updated(changedProperties) {
40
+ var needDataUpdate = false;
41
+ if (changedProperties.has('config') && this.config) {
42
+ this.isInitializing = true;
43
+ await this.initializeSciChart();
44
+ this.isInitializing = false;
45
+ needDataUpdate = true;
46
+ }
47
+ if (changedProperties.has('visibleSeries')) {
48
+ if (this.isInitializing) {
49
+ await this.ensureInitialization();
50
+ }
51
+ await this.updateSeries(this.visibleSeries, changedProperties.get('visibleSeries'));
52
+ needDataUpdate = true;
53
+ }
54
+ if (changedProperties.has('data')) {
55
+ needDataUpdate = true;
56
+ }
57
+ if (needDataUpdate) {
58
+ await this.updateDataSeries();
59
+ }
60
+ }
61
+ async ensureInitialization() {
62
+ while (this.isInitializing) {
63
+ await new Promise(resolve => setTimeout(resolve, 100)); // Check every 100ms
64
+ }
65
+ }
66
+ cleanup() {
67
+ var _a;
68
+ this.cleanupGroup();
69
+ if (this.overviewChart) {
70
+ (_a = this.overviewChart.sciChartSurface) === null || _a === void 0 ? void 0 : _a.delete();
71
+ this.overviewChart = null;
72
+ }
73
+ }
74
+ cleanupGroup() {
75
+ this.groupCharts.forEach(chart => {
76
+ if (chart.sciChartSurface) {
77
+ this.synchronizer.removeAxis(chart.sciChartSurface.xAxes.get(0));
78
+ this.verticalGroup.removeSurface(chart.sciChartSurface);
79
+ chart.sciChartSurface.delete();
80
+ }
81
+ });
82
+ this.groupCharts.length = 0;
83
+ }
84
+ async updateDataSeries() {
85
+ var _a, _b;
86
+ const { config, data } = this;
87
+ const { datasets = [], labelDataKey: attrX } = (config === null || config === void 0 ? void 0 : config.data) || {};
88
+ if (!(data instanceof Array) || !attrX) {
89
+ return [];
90
+ }
91
+ const newData = this.dataSet;
92
+ (this.groupCharts || []).forEach(({ dataKey, sciChartSurface, dataSeries }) => {
93
+ dataSeries.forEach(ds => ds.clear());
94
+ const dataSet = newData.filter((data, index) => dataKey == datasets[index].dataKey);
95
+ dataSet.forEach((data, index) => {
96
+ dataSeries[index].appendRange(data.map(d => d.xValue), data.map(d => d.yValue));
97
+ });
98
+ sciChartSurface.zoomExtents();
99
+ sciChartSurface.invalidateElement();
100
+ });
101
+ this.overviewDataSeries.forEach(ds => ds.clear());
102
+ newData.forEach((data, index) => {
103
+ if (this.visibleSeries.includes(datasets[index].dataKey)) {
104
+ this.overviewDataSeries[index].appendRange(data.map(d => d.xValue), data.map(d => d.yValue));
105
+ }
106
+ });
107
+ (_a = this.overviewChart) === null || _a === void 0 ? void 0 : _a.sciChartSurface.zoomExtents();
108
+ (_b = this.overviewChart) === null || _b === void 0 ? void 0 : _b.sciChartSurface.invalidateElement();
109
+ }
110
+ get dataSet() {
111
+ const { config, data } = this;
112
+ const { datasets = [], labelDataKey: attrX } = (config === null || config === void 0 ? void 0 : config.data) || {};
113
+ if (!(data instanceof Array) || !attrX) {
114
+ return [];
115
+ }
116
+ return datasets.map(dataset => {
117
+ return data
118
+ .map(item => {
119
+ if (!item || typeof item !== 'object') {
120
+ return;
121
+ }
122
+ const xValue = new Date(item[attrX]);
123
+ if (isNaN(xValue.getTime())) {
124
+ console.error('Invalid date:', item[attrX]);
125
+ return;
126
+ }
127
+ return {
128
+ xValue: xValue.getTime() / 1000,
129
+ yValue: item[dataset.dataKey]
130
+ };
131
+ })
132
+ .filter(Boolean);
133
+ });
134
+ }
135
+ render() {
136
+ var _a;
137
+ const { datasets = [] } = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.data) || {};
138
+ return html `
139
+ <div id=${this.containerId + '-overview'} class="overview" ?hidden=${!this.showOverview}></div>
140
+ <div id="chart-group">
141
+ ${datasets.map(({ dataKey }) => keyed(dataKey, html `
142
+ <div
143
+ id=${this.containerId + '-' + dataKey}
144
+ class="grouped-chart"
145
+ ?hidden=${!this.visibleSeries.includes(dataKey)}
146
+ ></div>
147
+ `))}
148
+ </div>
149
+ `;
150
+ }
151
+ async buildChartGroup() {
152
+ this.cleanupGroup();
153
+ const { config } = this;
154
+ const { datasets = [] } = (config === null || config === void 0 ? void 0 : config.data) || {};
155
+ await Promise.all(datasets
156
+ .filter(dataset => this.visibleSeries.includes(dataset.dataKey))
157
+ .map(async (dataset) => {
158
+ await this.addChart(dataset.dataKey);
159
+ }));
160
+ }
161
+ async updateSeries(after, before) {
162
+ /* 기존 시리즈와 새로운 시리즈의 차이를 비교해서, before에는 있는데, after에는 없으면 await removeChart(string)를 호출하고, after에는 있는데, before에는 없으면, addChart(string) 한다. */
163
+ // before에는 있는데 after에는 없는 시리즈를 제거합니다.
164
+ for (const series of before || []) {
165
+ if (!after.includes(series)) {
166
+ await this.removeChart(series);
167
+ }
168
+ }
169
+ // after에는 있는데 before에는 없는 시리즈를 추가합니다.
170
+ for (const series of after || []) {
171
+ if (!before || !before.includes(series)) {
172
+ await this.addChart(series);
173
+ }
174
+ }
175
+ }
176
+ async addChart(dataKey) {
177
+ var _a;
178
+ const groupedChart = {
179
+ dataKey: '',
180
+ sciChartSurface: undefined,
181
+ dataSeries: []
182
+ };
183
+ const { data } = this;
184
+ const { datasets = [] } = ((_a = this.config) === null || _a === void 0 ? void 0 : _a.data) || {};
185
+ const config = {
186
+ ...this.config,
187
+ data: {
188
+ ...data,
189
+ datasets: datasets.filter(dataset => dataset.dataKey == dataKey)
190
+ }
191
+ };
192
+ const container = this.renderRoot.querySelector(`#${this.containerId + '-' + dataKey}`);
193
+ var { chart, dataSeries } = (await buildSciChart(config, container, { fontSize: undefined, fontFamily: undefined, fontColor: undefined }, this.containerId));
194
+ this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface);
195
+ this.synchronizer.addAxis(chart.sciChartSurface.xAxes.get(0));
196
+ groupedChart.dataKey = config.data.datasets[0].dataKey;
197
+ groupedChart.sciChartSurface = chart.sciChartSurface;
198
+ groupedChart.dataSeries = dataSeries;
199
+ this.groupCharts = this.groupSorter([...this.groupCharts, groupedChart]);
200
+ }
201
+ removeChart(dataKey) {
202
+ const index = this.groupCharts.findIndex((chart) => chart.dataKey == dataKey);
203
+ const [groupedChart] = this.groupCharts.splice(index, 1);
204
+ if (!groupedChart) {
205
+ return;
206
+ }
207
+ this.verticalGroup.removeSurface(groupedChart.sciChartSurface);
208
+ this.synchronizer.removeAxis(groupedChart.sciChartSurface.xAxes.get(0));
209
+ groupedChart.sciChartSurface.delete();
210
+ groupedChart.sciChartSurface = undefined;
211
+ this.groupCharts = this.groupSorter(this.groupCharts);
212
+ }
213
+ groupSorter(group) {
214
+ return group.sort((a, b) => this.visibleSeries.findIndex((s) => s.dataKey == a.dataKey) -
215
+ this.visibleSeries.findIndex((s) => s.dataKey == b.dataKey));
216
+ }
217
+ };
218
+ OxSciChartMultiple.idx = 0;
219
+ OxSciChartMultiple.styles = [
220
+ ScrollbarStyles,
221
+ css `
222
+ :host {
223
+ display: flex;
224
+ flex-direction: column;
225
+
226
+ width: 100%;
227
+ height: 100%;
228
+ }
229
+
230
+ .overview {
231
+ height: 80px;
232
+ }
233
+
234
+ #chart-group {
235
+ flex: 1;
236
+
237
+ display: flex;
238
+ flex-direction: column;
239
+ overflow-y: auto;
240
+ }
241
+
242
+ .grouped-chart {
243
+ flex: 1;
244
+
245
+ min-height: 25%;
246
+ }
247
+
248
+ [hidden] {
249
+ display: none;
250
+ }
251
+ `
252
+ ];
253
+ __decorate([
254
+ property({ type: Object })
255
+ ], OxSciChartMultiple.prototype, "config", void 0);
256
+ __decorate([
257
+ property({ type: Array })
258
+ ], OxSciChartMultiple.prototype, "data", void 0);
259
+ __decorate([
260
+ property({ type: Array })
261
+ ], OxSciChartMultiple.prototype, "visibleSeries", void 0);
262
+ __decorate([
263
+ property({ type: Boolean, attribute: 'show-overview' })
264
+ ], OxSciChartMultiple.prototype, "showOverview", void 0);
265
+ __decorate([
266
+ query('.overview')
267
+ ], OxSciChartMultiple.prototype, "overviewContainer", void 0);
268
+ OxSciChartMultiple = OxSciChartMultiple_1 = __decorate([
269
+ customElement('ox-scichart-multiple')
270
+ ], OxSciChartMultiple);
271
+ export { OxSciChartMultiple };
272
+ //# sourceMappingURL=ox-scichart-multiple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-scichart-multiple.js","sourceRoot":"","sources":["../../src/charts/ox-scichart-multiple.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { property, query, customElement } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { buildSciChart, buildSciChartOverview } from './scichart-builder'\nimport { AxisSynchroniser } from './axis-synchronizer'\nimport { NumberRange, SciChartVerticalGroup } from 'scichart'\n\nimport { ScrollbarStyles } from '@operato/styles'\n\n@customElement('ox-scichart-multiple')\nexport class OxSciChartMultiple extends LitElement {\n @property({ type: Object }) config: OperatoChart.ChartConfig | null = null\n @property({ type: Array }) data: { [attr: string]: any }[] = []\n @property({ type: Array }) visibleSeries: string[] = []\n @property({ type: Boolean, attribute: 'show-overview' }) showOverview: boolean = true\n\n private synchronizer: AxisSynchroniser = new AxisSynchroniser(new NumberRange(200, 500))\n private verticalGroup: SciChartVerticalGroup = new SciChartVerticalGroup()\n\n private isInitializing: boolean = false\n private overviewChart: any = null\n private overviewDataSeries: any[] = []\n private groupCharts: {\n dataKey: string\n sciChartSurface: any\n dataSeries: any[]\n }[] = []\n\n /*\n [주의]\n ox-scichart container의 id를 글로벌 유니크하게 해야한다. \n SciChart가 특별히 container의 id를 기반으로 하위 컴포넌트를 구성하고 있기 때문이다.\n shadowDom 안에 있는 container 이더라도, 글로벌 유니크한 id를 제공해야 한다.\n 그렇지 않으면, 단 하나의 차트만 제대로 렌더링된다.\n */\n private containerId: string = 'ox-scichart-multiple' + ++OxSciChartMultiple.idx\n\n @query('.overview') overviewContainer!: HTMLDivElement\n\n static idx: number = 0\n\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n width: 100%;\n height: 100%;\n }\n\n .overview {\n height: 80px;\n }\n\n #chart-group {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n }\n\n .grouped-chart {\n flex: 1;\n\n min-height: 25%;\n }\n\n [hidden] {\n display: none;\n }\n `\n ]\n\n async initializeSciChart() {\n this.cleanup()\n\n const { chart, dataSeries } =\n (await buildSciChartOverview(this.config, this.overviewContainer, {}, this.synchronizer)) || {}\n\n this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface)\n\n this.overviewChart = chart\n this.overviewDataSeries = dataSeries!\n }\n\n async updated(changedProperties: Map<string | number | symbol, unknown>) {\n var needDataUpdate = false\n\n if (changedProperties.has('config') && this.config) {\n this.isInitializing = true\n await this.initializeSciChart()\n this.isInitializing = false\n needDataUpdate = true\n }\n\n if (changedProperties.has('visibleSeries')) {\n if (this.isInitializing) {\n await this.ensureInitialization()\n }\n await this.updateSeries(this.visibleSeries, changedProperties.get('visibleSeries') as string[])\n needDataUpdate = true\n }\n\n if (changedProperties.has('data')) {\n needDataUpdate = true\n }\n\n if (needDataUpdate) {\n await this.updateDataSeries()\n }\n }\n\n private async ensureInitialization() {\n while (this.isInitializing) {\n await new Promise(resolve => setTimeout(resolve, 100)) // Check every 100ms\n }\n }\n\n cleanup() {\n this.cleanupGroup()\n\n if (this.overviewChart) {\n this.overviewChart.sciChartSurface?.delete()\n this.overviewChart = null\n }\n }\n\n cleanupGroup() {\n this.groupCharts.forEach(chart => {\n if (chart.sciChartSurface) {\n this.synchronizer.removeAxis(chart.sciChartSurface.xAxes.get(0))\n this.verticalGroup.removeSurface(chart.sciChartSurface)\n chart.sciChartSurface.delete()\n }\n })\n\n this.groupCharts.length = 0\n }\n\n async updateDataSeries() {\n const { config, data } = this\n const { datasets = [], labelDataKey: attrX } = config?.data || {}\n\n if (!(data instanceof Array) || !attrX) {\n return []\n }\n\n const newData = this.dataSet\n\n ;(this.groupCharts || []).forEach(({ dataKey, sciChartSurface, dataSeries }) => {\n dataSeries.forEach(ds => ds.clear())\n const dataSet = newData.filter((data, index) => dataKey == datasets[index].dataKey!)\n\n dataSet.forEach((data, index) => {\n dataSeries[index].appendRange(\n data.map(d => d.xValue),\n data.map(d => d.yValue)\n )\n })\n\n sciChartSurface.zoomExtents()\n sciChartSurface.invalidateElement()\n })\n\n this.overviewDataSeries.forEach(ds => ds.clear())\n\n newData.forEach((data, index) => {\n if (this.visibleSeries.includes(datasets[index].dataKey!)) {\n this.overviewDataSeries[index].appendRange(\n data.map(d => d.xValue),\n data.map(d => d.yValue)\n )\n }\n })\n\n this.overviewChart?.sciChartSurface.zoomExtents()\n this.overviewChart?.sciChartSurface.invalidateElement()\n }\n\n get dataSet(): { xValue: number; yValue: number }[][] {\n const { config, data } = this\n const { datasets = [], labelDataKey: attrX } = config?.data || {}\n\n if (!(data instanceof Array) || !attrX) {\n return []\n }\n\n return datasets.map(dataset => {\n return data\n .map(item => {\n if (!item || typeof item !== 'object') {\n return\n }\n\n const xValue = new Date(item[attrX])\n if (isNaN(xValue.getTime())) {\n console.error('Invalid date:', item[attrX])\n return\n }\n\n return {\n xValue: xValue.getTime() / 1000,\n yValue: item[dataset.dataKey!]\n }\n })\n .filter(Boolean) as { xValue: number; yValue: number }[]\n })\n }\n\n render() {\n const { datasets = [] } = this.config?.data || {}\n\n return html`\n <div id=${this.containerId + '-overview'} class=\"overview\" ?hidden=${!this.showOverview}></div>\n <div id=\"chart-group\">\n ${datasets.map(({ dataKey }) =>\n keyed(\n dataKey,\n html`\n <div\n id=${this.containerId + '-' + dataKey}\n class=\"grouped-chart\"\n ?hidden=${!this.visibleSeries.includes(dataKey!)}\n ></div>\n `\n )\n )}\n </div>\n `\n }\n\n async buildChartGroup() {\n this.cleanupGroup()\n\n const { config } = this\n const { datasets = [] } = config?.data || {}\n\n await Promise.all(\n datasets\n .filter(dataset => this.visibleSeries.includes(dataset.dataKey!))\n .map(async dataset => {\n await this.addChart(dataset.dataKey!)\n })\n )\n }\n\n async updateSeries(after: string[], before: string[]) {\n /* 기존 시리즈와 새로운 시리즈의 차이를 비교해서, before에는 있는데, after에는 없으면 await removeChart(string)를 호출하고, after에는 있는데, before에는 없으면, addChart(string) 한다. */\n // before에는 있는데 after에는 없는 시리즈를 제거합니다.\n for (const series of before || []) {\n if (!after.includes(series)) {\n await this.removeChart(series)\n }\n }\n\n // after에는 있는데 before에는 없는 시리즈를 추가합니다.\n for (const series of after || []) {\n if (!before || !before.includes(series)) {\n await this.addChart(series)\n }\n }\n }\n\n async addChart(dataKey: string) {\n const groupedChart = {\n dataKey: '',\n sciChartSurface: undefined,\n dataSeries: [] as any[]\n }\n\n const { data } = this\n const { datasets = [] } = this.config?.data || {}\n\n const config = {\n ...this.config,\n data: {\n ...data,\n datasets: datasets.filter(dataset => dataset.dataKey == dataKey)\n }\n }\n\n const container = this.renderRoot.querySelector(`#${this.containerId + '-' + dataKey}`)\n var { chart, dataSeries } = (await buildSciChart(\n config,\n container,\n { fontSize: undefined, fontFamily: undefined, fontColor: undefined },\n this.containerId\n ))!\n\n this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface)\n this.synchronizer.addAxis(chart.sciChartSurface.xAxes.get(0))\n\n groupedChart.dataKey = config.data.datasets[0]!.dataKey!\n groupedChart.sciChartSurface = chart.sciChartSurface\n groupedChart.dataSeries = dataSeries\n\n this.groupCharts = this.groupSorter([...this.groupCharts, groupedChart])\n }\n\n removeChart(dataKey: string) {\n const index = this.groupCharts.findIndex((chart: any) => chart.dataKey == dataKey)\n const [groupedChart] = this.groupCharts.splice(index, 1)\n\n if (!groupedChart) {\n return\n }\n\n this.verticalGroup.removeSurface(groupedChart.sciChartSurface)\n this.synchronizer.removeAxis(groupedChart.sciChartSurface.xAxes.get(0))\n\n groupedChart.sciChartSurface.delete()\n groupedChart.sciChartSurface = undefined\n\n this.groupCharts = this.groupSorter(this.groupCharts)\n }\n\n groupSorter(group: any[]) {\n return group.sort(\n (a, b) =>\n this.visibleSeries.findIndex((s: any) => s.dataKey == a.dataKey) -\n this.visibleSeries.findIndex((s: any) => s.dataKey == b.dataKey)\n )\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ox-scichart-multiple': OxSciChartMultiple\n }\n}\n"]}
@@ -4,7 +4,7 @@ export declare class OxSciChart extends LitElement {
4
4
  data: {
5
5
  [attr: string]: any;
6
6
  }[];
7
- private chart;
7
+ chart: any;
8
8
  private dataSeries;
9
9
  private containerId;
10
10
  container: HTMLDivElement;
@@ -1 +1 @@
1
- {"version":3,"file":"ox-scichart.js","sourceRoot":"","sources":["../../src/charts/ox-scichart.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG3C,IAAM,UAAU,kBAAhB,MAAM,UAAW,SAAQ,UAAU;IAAnC;;QACuB,WAAM,GAAoC,IAAI,CAAA;QAC/C,SAAI,GAA8B,EAAE,CAAA;QAEvD,UAAK,GAAQ,IAAI,CAAA;QACjB,eAAU,GAAU,EAAE,CAAA;QAC9B;;;;;;WAMG;QACK,gBAAW,GAAW,cAAc,GAAG,EAAE,YAAU,CAAC,GAAG,CAAA;IAwGjE,CAAC;IA/EC,KAAK,CAAC,kBAAkB;;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAA,IAAI,CAAC,KAAK,CAAC,eAAe,0CAAE,MAAM,EAAE,CAAA;YACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAE1F,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,UAAU,GAAG,UAAW,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,iBAAyD;QACrE,IAAI,cAAc,GAAG,KAAK,CAAA;QAE1B,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;YAC/B,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,cAAc,GAAG,IAAI,CAAA;QACvB,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAC/B,CAAC;IACH,CAAC;IAED,gBAAgB;;QACd,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,MAAM,CAAA;YAAE,OAAM;QAEpC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC9B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAChC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EACvB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CACxB,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAA,IAAI,CAAC,KAAK,0CAAE,eAAe,CAAC,WAAW,EAAE,CAAA;QACzC,MAAA,IAAI,CAAC,KAAK,0CAAE,eAAe,CAAC,iBAAiB,EAAE,CAAA;IACjD,CAAC;IAED,IAAI,OAAO;QACT,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QAC7B,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,KAAI,EAAE,CAAA;QAEjE,IAAI,CAAC,CAAC,IAAI,YAAY,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC5B,OAAO,IAAI;iBACR,GAAG,CAAC,IAAI,CAAC,EAAE;gBACV,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACtC,OAAM;gBACR,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;gBACpC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;oBAC3C,OAAM;gBACR,CAAC;gBAED,OAAO;oBACL,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI;oBAC/B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAQ,CAAC;iBAC/B,CAAA;YACH,CAAC,CAAC;iBACD,MAAM,CAAC,OAAO,CAAyC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,YAAY,IAAI,CAAC,WAAW,kCAAkC,CAAA;IAC3E,CAAC;;AAnGM,cAAG,GAAW,CAAC,AAAZ,CAAY;AAEf,iBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;GAiBlB,AAjBY,CAiBZ;AAnC2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAA+C;AAC/C;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;wCAAqC;AAapC;IAA1B,KAAK,CAAC,kBAAkB,CAAC;6CAA2B;AAf1C,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CAqHtB","sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { property, query, customElement } from 'lit/decorators.js'\nimport { buildSciChart } from './scichart-builder'\n\n@customElement('ox-scichart')\nexport class OxSciChart extends LitElement {\n @property({ type: Object }) config: OperatoChart.ChartConfig | null = null\n @property({ type: Array }) data: { [attr: string]: any }[] = []\n\n private chart: any = null\n private dataSeries: any[] = []\n /*\n [주의]\n ox-scichart container의 id를 글로벌 유니크하게 해야한다. \n SciChart가 특별히 container의 id를 기반으로 하위 컴포넌트를 구성하고 있기 때문이다.\n shadowDom 안에 있는 container 이더라도, 글로벌 유니크한 id를 제공해야 한다.\n 그렇지 않으면, 단 하나의 차트만 제대로 렌더링된다.\n */\n private containerId: string = 'ox-sci-chart' + ++OxSciChart.idx\n\n @query('.chart-container') container!: HTMLDivElement\n\n static idx: number = 0\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .chart-container {\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n .chart-content {\n flex: 1;\n position: relative;\n }\n `\n\n async initializeSciChart() {\n if (this.chart) {\n this.chart.sciChartSurface?.delete()\n this.chart = null\n }\n\n const { chart, dataSeries } = (await buildSciChart(this.config, this.container, {})) || {}\n\n this.chart = chart\n this.dataSeries = dataSeries!\n }\n\n async updated(changedProperties: Map<string | number | symbol, unknown>) {\n var needDataUpdate = false\n\n if (changedProperties.has('config') && this.config) {\n await this.initializeSciChart()\n needDataUpdate = true\n }\n\n if (changedProperties.has('data')) {\n needDataUpdate = true\n }\n\n if (needDataUpdate) {\n await this.updateDataSeries()\n }\n }\n\n updateDataSeries() {\n if (!this.dataSeries?.length) return\n\n this.dataSeries.forEach(ds => ds.clear())\n const newData = this.dataSet\n\n newData.forEach((data, index) => {\n this.dataSeries[index].appendRange(\n data.map(d => d.xValue),\n data.map(d => d.yValue)\n )\n })\n\n this.chart?.sciChartSurface.zoomExtents()\n this.chart?.sciChartSurface.invalidateElement()\n }\n\n get dataSet(): { xValue: number; yValue: number }[][] {\n const { config, data } = this\n const { datasets = [], labelDataKey: attrX } = config?.data || {}\n\n if (!(data instanceof Array) || !attrX) {\n return []\n }\n\n return datasets.map(dataset => {\n return data\n .map(item => {\n if (!item || typeof item !== 'object') {\n return\n }\n\n const xValue = new Date(item[attrX])\n if (isNaN(xValue.getTime())) {\n console.error('Invalid date:', item[attrX])\n return\n }\n\n return {\n xValue: xValue.getTime() / 1000,\n yValue: item[dataset.dataKey!]\n }\n })\n .filter(Boolean) as { xValue: number; yValue: number }[]\n })\n }\n\n render() {\n return html` <div id=${this.containerId} class=\"chart-container\"></div> `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ox-scichart': OxSciChart\n }\n}\n"]}
1
+ {"version":3,"file":"ox-scichart.js","sourceRoot":"","sources":["../../src/charts/ox-scichart.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css } from 'lit'\nimport { property, query, customElement } from 'lit/decorators.js'\nimport { buildSciChart } from './scichart-builder'\n\n@customElement('ox-scichart')\nexport class OxSciChart extends LitElement {\n @property({ type: Object }) config: OperatoChart.ChartConfig | null = null\n @property({ type: Array }) data: { [attr: string]: any }[] = []\n\n public chart: any = null\n private dataSeries: any[] = []\n /*\n [주의]\n ox-scichart container의 id를 글로벌 유니크하게 해야한다. \n SciChart가 특별히 container의 id를 기반으로 하위 컴포넌트를 구성하고 있기 때문이다.\n shadowDom 안에 있는 container 이더라도, 글로벌 유니크한 id를 제공해야 한다.\n 그렇지 않으면, 단 하나의 차트만 제대로 렌더링된다.\n */\n private containerId: string = 'ox-sci-chart' + ++OxSciChart.idx\n\n @query('.chart-container') container!: HTMLDivElement\n\n static idx: number = 0\n\n static styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .chart-container {\n display: flex;\n width: 100%;\n height: 100%;\n }\n\n .chart-content {\n flex: 1;\n position: relative;\n }\n `\n\n async initializeSciChart() {\n if (this.chart) {\n this.chart.sciChartSurface?.delete()\n this.chart = null\n }\n\n const { chart, dataSeries } = (await buildSciChart(this.config, this.container, {})) || {}\n\n this.chart = chart\n this.dataSeries = dataSeries!\n }\n\n async updated(changedProperties: Map<string | number | symbol, unknown>) {\n var needDataUpdate = false\n\n if (changedProperties.has('config') && this.config) {\n await this.initializeSciChart()\n needDataUpdate = true\n }\n\n if (changedProperties.has('data')) {\n needDataUpdate = true\n }\n\n if (needDataUpdate) {\n await this.updateDataSeries()\n }\n }\n\n updateDataSeries() {\n if (!this.dataSeries?.length) return\n\n this.dataSeries.forEach(ds => ds.clear())\n const newData = this.dataSet\n\n newData.forEach((data, index) => {\n this.dataSeries[index].appendRange(\n data.map(d => d.xValue),\n data.map(d => d.yValue)\n )\n })\n\n this.chart?.sciChartSurface.zoomExtents()\n this.chart?.sciChartSurface.invalidateElement()\n }\n\n get dataSet(): { xValue: number; yValue: number }[][] {\n const { config, data } = this\n const { datasets = [], labelDataKey: attrX } = config?.data || {}\n\n if (!(data instanceof Array) || !attrX) {\n return []\n }\n\n return datasets.map(dataset => {\n return data\n .map(item => {\n if (!item || typeof item !== 'object') {\n return\n }\n\n const xValue = new Date(item[attrX])\n if (isNaN(xValue.getTime())) {\n console.error('Invalid date:', item[attrX])\n return\n }\n\n return {\n xValue: xValue.getTime() / 1000,\n yValue: item[dataset.dataKey!]\n }\n })\n .filter(Boolean) as { xValue: number; yValue: number }[]\n })\n }\n\n render() {\n return html` <div id=${this.containerId} class=\"chart-container\"></div> `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ox-scichart': OxSciChart\n }\n}\n"]}
@@ -1,8 +1,17 @@
1
+ import { AxisSynchroniser } from './axis-synchronizer';
1
2
  export declare function buildSciChart(config: OperatoChart.ChartConfig | undefined | null, container: any, { fontSize, fontFamily, fontColor }: {
2
3
  fontSize?: number;
3
4
  fontFamily?: string;
4
5
  fontColor?: string;
5
- }): Promise<{
6
+ }, grouped?: string): Promise<{
7
+ chart: any;
8
+ dataSeries: any[];
9
+ } | undefined>;
10
+ export declare function buildSciChartOverview(config: OperatoChart.ChartConfig | undefined | null, container: any, { fontSize, fontFamily, fontColor }: {
11
+ fontSize?: number;
12
+ fontFamily?: string;
13
+ fontColor?: string;
14
+ }, axisSynchroniser: AxisSynchroniser): Promise<{
6
15
  chart: any;
7
16
  dataSeries: any[];
8
17
  } | undefined>;
@@ -1,5 +1,5 @@
1
1
  import { TinyColor } from '@ctrl/tinycolor';
2
- import { SciChartSurface, SciChartJSLightTheme, SciChartJSDarkv2Theme, XyDataSeries, FastLineRenderableSeries, SplineLineRenderableSeries, FastColumnRenderableSeries, StackedColumnRenderableSeries, StackedMountainRenderableSeries, StackedColumnCollection, StackedMountainCollection, NumericAxis, DateTimeNumericAxis, EAutoRange, EAxisAlignment, ECoordinateMode, EHorizontalAnchorPoint, EVerticalAnchorPoint, NumberRange, MouseWheelZoomModifier, ZoomPanModifier, ZoomExtentsModifier, RolloverModifier, SmartDateLabelProvider, EllipsePointMarker, SquarePointMarker, TrianglePointMarker, CrossPointMarker, XPointMarker, WaveAnimation, LegendModifier, ELegendPlacement, EXyDirection, XAxisDragModifier, YAxisDragModifier, TextAnnotation, LineAnnotation, BoxAnnotation, HorizontalLineAnnotation, VerticalLineAnnotation } from 'scichart';
2
+ import { SciChartSurface, SciChartJSLightTheme, SciChartJSDarkv2Theme, XyDataSeries, FastLineRenderableSeries, SplineLineRenderableSeries, FastColumnRenderableSeries, StackedColumnRenderableSeries, StackedMountainRenderableSeries, StackedColumnCollection, StackedMountainCollection, NumericAxis, DateTimeNumericAxis, EAutoRange, EAxisAlignment, EExecuteOn, ECoordinateMode, EHorizontalAnchorPoint, EVerticalAnchorPoint, NumberRange, MouseWheelZoomModifier, RubberBandXyZoomModifier, ZoomPanModifier, ZoomExtentsModifier, RolloverModifier, SmartDateLabelProvider, EllipsePointMarker, SquarePointMarker, TrianglePointMarker, CrossPointMarker, XPointMarker, WaveAnimation, LegendModifier, ELegendPlacement, EXyDirection, XAxisDragModifier, YAxisDragModifier, TextAnnotation, LineAnnotation, BoxAnnotation, HorizontalLineAnnotation, VerticalLineAnnotation, OverviewRangeSelectionModifier, ENumericFormat } from 'scichart';
3
3
  SciChartSurface.UseCommunityLicense();
4
4
  SciChartSurface.configure({
5
5
  dataUrl: `/node_modules/scichart/_wasm/scichart2d.data`,
@@ -10,6 +10,10 @@ const DEFAULT_STROKE = '#000000';
10
10
  const POINT_MARKER_SIZE = 10;
11
11
  const STROKE_THICKNESS = 2;
12
12
  const ANIMATION_DURATION = 1000;
13
+ function getLocalTimeOffset() {
14
+ const now = new Date();
15
+ return now.getTimezoneOffset() * -60;
16
+ }
13
17
  function getBaseColorFromTheme(theme) {
14
18
  return new TinyColor(theme == 'dark' ? '#fff' : '#000');
15
19
  }
@@ -45,7 +49,7 @@ function createPointMarker(wasmContext, dataset, color = DEFAULT_COLOR) {
45
49
  return new EllipsePointMarker(wasmContext, pointMarkerOptions);
46
50
  }
47
51
  }
48
- function createAxis(wasmContext, axis, index, isXAxis, fontColor, fontFamily, fontSize) {
52
+ function createAxis(wasmContext, axis, index, isXAxis, fontColor, fontFamily, fontSize, options) {
49
53
  const { axisTitle, ticks } = axis;
50
54
  const { autoMax, autoMin, min, max, stepSize, beginAtZero, color = fontColor, textStrokeColor = fontColor } = ticks || {};
51
55
  const axisOptions = {
@@ -64,10 +68,21 @@ function createAxis(wasmContext, axis, index, isXAxis, fontColor, fontFamily, fo
64
68
  fontFamily,
65
69
  fontSize,
66
70
  color: textStrokeColor
67
- }
71
+ },
72
+ ...options
68
73
  };
74
+ const labelProvider = new SmartDateLabelProvider({
75
+ labelFormat: ENumericFormat.Date_HHMMSS,
76
+ showWiderDateOnFirstLabel: true,
77
+ showYearOnWiderDate: true,
78
+ dateOffset: getLocalTimeOffset()
79
+ });
80
+ labelProvider.cursorNumericFormat = ENumericFormat.Date_DDMMHHMM;
69
81
  return isXAxis
70
- ? new DateTimeNumericAxis(wasmContext, { ...axisOptions, labelProvider: new SmartDateLabelProvider() })
82
+ ? new DateTimeNumericAxis(wasmContext, {
83
+ ...axisOptions,
84
+ labelProvider
85
+ })
71
86
  : new NumericAxis(wasmContext, { ...axisOptions, id: index !== 0 ? `yAxis${index}` : undefined });
72
87
  }
73
88
  function createSeries(wasmContext, dataset, index, stacked, animation, yAxisId) {
@@ -125,7 +140,7 @@ function createSeries(wasmContext, dataset, index, stacked, animation, yAxisId)
125
140
  }
126
141
  return { series, dataSeries };
127
142
  }
128
- export async function buildSciChart(config, container, { fontSize, fontFamily, fontColor }) {
143
+ export async function buildSciChart(config, container, { fontSize, fontFamily, fontColor }, grouped) {
129
144
  if (!config)
130
145
  return;
131
146
  const { type: chartType, options, data: fromData } = config;
@@ -158,7 +173,8 @@ export async function buildSciChart(config, container, { fontSize, fontFamily, f
158
173
  if (tooltip) {
159
174
  const rolloverModifier = new RolloverModifier({
160
175
  showTooltip: true,
161
- showAxisLabel: true
176
+ showAxisLabel: true,
177
+ modifierGroup: grouped
162
178
  });
163
179
  sciChartSurface.chartModifiers.add(rolloverModifier);
164
180
  }
@@ -255,8 +271,7 @@ export async function buildSciChart(config, container, { fontSize, fontFamily, f
255
271
  });
256
272
  }
257
273
  // 줌인/줌아웃 모디파이어 추가
258
- sciChartSurface.chartModifiers.add(
259
- // new RubberBandXyZoomModifier(),
274
+ sciChartSurface.chartModifiers.add(new RubberBandXyZoomModifier({ executeOn: EExecuteOn.MouseRightButton, modifierGroup: grouped }),
260
275
  // new ZoomPanModifier({ xyDirection: EXyDirection.XDirection }),
261
276
  new ZoomPanModifier(), new MouseWheelZoomModifier({ xyDirection: EXyDirection.XDirection }), new ZoomExtentsModifier(), new XAxisDragModifier(), new YAxisDragModifier());
262
277
  if (legend === null || legend === void 0 ? void 0 : legend.display) {
@@ -276,4 +291,61 @@ export async function buildSciChart(config, container, { fontSize, fontFamily, f
276
291
  }
277
292
  return { chart, dataSeries: dataSeriesArray };
278
293
  }
294
+ export async function buildSciChartOverview(config, container, { fontSize, fontFamily, fontColor }, axisSynchroniser) {
295
+ if (!config)
296
+ return;
297
+ const { type: chartType, options, data: fromData } = config;
298
+ const { datasets = [] } = fromData || {};
299
+ var { theme, animation, scales: fromScales, stacked, multiAxis } = options || {};
300
+ var baseColor = getBaseColorFromTheme(theme);
301
+ if (theme === 'auto') {
302
+ theme = getThemeFromBrowser();
303
+ }
304
+ fontColor = fontColor || baseColor.clone().toString();
305
+ const { xAxes = [], yAxes = [] } = fromScales || {};
306
+ // Instead we create a normal chart and then manually add the OverviewRangeSelectionModifier and bind it to the axisSynchroniser
307
+ const chart = await SciChartSurface.create(container, {
308
+ theme: theme == 'dark' ? new SciChartJSDarkv2Theme() : new SciChartJSLightTheme()
309
+ });
310
+ const { sciChartSurface, wasmContext } = chart;
311
+ // X 축 설정
312
+ xAxes.forEach((axis, index) => {
313
+ const xAxis = createAxis(wasmContext, axis, index, true, fontColor, fontFamily, fontSize);
314
+ sciChartSurface.xAxes.add(xAxis);
315
+ });
316
+ (multiAxis ? yAxes : [yAxes[0]]).forEach((axis, index) => {
317
+ const yAxis = createAxis(wasmContext, axis, index, false, fontColor, fontFamily, fontSize, {
318
+ drawLabels: false,
319
+ drawMajorTicks: false,
320
+ drawMinorTicks: false,
321
+ drawMajorGridLines: false,
322
+ drawMinorGridLines: false
323
+ });
324
+ sciChartSurface.yAxes.add(yAxis);
325
+ });
326
+ const rangeSelectionModifier = new OverviewRangeSelectionModifier();
327
+ // When the range selection is moved, updated the linked charts
328
+ rangeSelectionModifier.onSelectedAreaChanged = (selectedRange) => {
329
+ if (!selectedRange.equals(axisSynchroniser.visibleRange)) {
330
+ axisSynchroniser.publishChange({ visibleRange: selectedRange });
331
+ }
332
+ };
333
+ rangeSelectionModifier.selectedArea = axisSynchroniser.visibleRange;
334
+ sciChartSurface.chartModifiers.add(rangeSelectionModifier);
335
+ // When charts are moved, update the range selection
336
+ axisSynchroniser.visibleRangeChanged.subscribe(({ visibleRange }) => {
337
+ const updatedSelectedRange = visibleRange.clip(sciChartSurface.xAxes.get(0).visibleRange);
338
+ const shouldUpdateSelectedRange = !updatedSelectedRange.equals(rangeSelectionModifier.selectedArea);
339
+ if (shouldUpdateSelectedRange) {
340
+ rangeSelectionModifier.selectedArea = updatedSelectedRange;
341
+ }
342
+ });
343
+ const dataSeriesArray = datasets.map((dataset, index) => {
344
+ const yAxisId = dataset.yAxisID == 'right' && multiAxis ? 'yAxis1' : undefined;
345
+ const { series, dataSeries } = createSeries(wasmContext, dataset, index, !!stacked, !!animation, yAxisId);
346
+ sciChartSurface.renderableSeries.add(series);
347
+ return dataSeries;
348
+ });
349
+ return { chart, dataSeries: dataSeriesArray };
350
+ }
279
351
  //# sourceMappingURL=scichart-builder.js.map