@operato/scene-scichart 7.2.5 → 7.2.7
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.
- package/CHANGELOG.md +20 -0
- package/db.sqlite +0 -0
- package/dist/charts/ox-scichart-multiple copy.d.ts +53 -0
- package/dist/charts/ox-scichart-multiple copy.js +411 -0
- package/dist/charts/ox-scichart-multiple copy.js.map +1 -0
- package/dist/charts/ox-scichart-multiple.d.ts +9 -8
- package/dist/charts/ox-scichart-multiple.js +238 -98
- package/dist/charts/ox-scichart-multiple.js.map +1 -1
- package/dist/charts/scichart-builder copy.d.ts +22 -0
- package/dist/charts/scichart-builder copy.js +420 -0
- package/dist/charts/scichart-builder copy.js.map +1 -0
- package/dist/charts/scichart-builder.d.ts +2 -0
- package/dist/charts/scichart-builder.js +44 -30
- package/dist/charts/scichart-builder.js.map +1 -1
- package/dist/charts/scichart-overview-builder.d.ts +13 -0
- package/dist/charts/scichart-overview-builder.js +219 -0
- package/dist/charts/scichart-overview-builder.js.map +1 -0
- package/dist/templates/scichart-multiple-timeseries.d.ts +1 -1
- package/dist/templates/scichart-multiple-timeseries.js +1 -1
- package/dist/templates/scichart-multiple-timeseries.js.map +1 -1
- package/logs/.08636eb59927f12972f6774f5947c8507b3564c2-audit.json +35 -10
- package/logs/.5e5d741d8b7784a2fbad65eedc0fd46946aaf6f2-audit.json +30 -0
- package/logs/{application-2024-08-02-17.log → application-2024-08-03-13.log} +8 -8
- package/logs/{application-2024-08-02-18.log → application-2024-08-03-14.log} +8 -8
- package/logs/application-2024-08-03-15.log +210 -0
- package/logs/application-2024-08-04-01.log +105 -0
- package/logs/application-2024-08-04-04.log +420 -0
- package/logs/application-2024-08-04-18.log +2 -0
- package/logs/application-2024-08-04-19.log +105 -0
- package/logs/connections-2024-08-03-13.log +50 -0
- package/logs/connections-2024-08-03-14.log +50 -0
- package/logs/connections-2024-08-03-15.log +100 -0
- package/logs/connections-2024-08-04-01.log +50 -0
- package/logs/connections-2024-08-04-04.log +200 -0
- package/logs/connections-2024-08-04-19.log +50 -0
- package/package.json +2 -2
- package/src/charts/ox-scichart-multiple.ts +295 -114
- package/src/charts/scichart-builder.ts +47 -30
- package/src/templates/scichart-multiple-timeseries.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -3,9 +3,9 @@ import { __decorate } from "tslib";
|
|
|
3
3
|
import { LitElement, html, css } from 'lit';
|
|
4
4
|
import { property, query, customElement } from 'lit/decorators.js';
|
|
5
5
|
import { keyed } from 'lit/directives/keyed.js';
|
|
6
|
-
import { calculatePrecision, buildSciChart, buildSciChartOverview } from './scichart-builder';
|
|
6
|
+
import { calculatePrecision, buildSciChart, buildSciChartOverview, convertColor, DEFAULT_COLOR } from './scichart-builder';
|
|
7
7
|
import { AxisSynchroniser } from './axis-synchronizer';
|
|
8
|
-
import { NumberRange, SciChartVerticalGroup } from 'scichart';
|
|
8
|
+
import { EAutoRange, FastLineRenderableSeries, NumberRange, NumericAxis, SciChartVerticalGroup, XyDataSeries } from 'scichart';
|
|
9
9
|
import { ScrollbarStyles } from '@operato/styles';
|
|
10
10
|
let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends LitElement {
|
|
11
11
|
constructor() {
|
|
@@ -16,10 +16,10 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
16
16
|
this.showOverview = true;
|
|
17
17
|
this.synchronizer = new AxisSynchroniser(new NumberRange(200, 500));
|
|
18
18
|
this.verticalGroup = new SciChartVerticalGroup();
|
|
19
|
-
this.isInitializing = false;
|
|
20
19
|
this.overviewChart = null;
|
|
21
20
|
this.overviewDataSeries = [];
|
|
22
21
|
this.groupCharts = [];
|
|
22
|
+
this.initializationQueue = Promise.resolve();
|
|
23
23
|
/*
|
|
24
24
|
[주의]
|
|
25
25
|
ox-scichart container의 id를 글로벌 유니크하게 해야한다.
|
|
@@ -31,45 +31,50 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
31
31
|
}
|
|
32
32
|
async initializeSciChart() {
|
|
33
33
|
this.cleanup();
|
|
34
|
-
|
|
34
|
+
await this.createOverviewChart();
|
|
35
|
+
}
|
|
36
|
+
async createOverviewChart() {
|
|
37
|
+
const { chart, dataSeries } = (await buildSciChartOverview({
|
|
38
|
+
...this.config,
|
|
39
|
+
data: { datasets: [] }
|
|
40
|
+
}, this.overviewContainer, {}, this.synchronizer)) || {};
|
|
35
41
|
this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface);
|
|
36
42
|
this.overviewChart = chart;
|
|
37
43
|
this.overviewDataSeries = dataSeries;
|
|
38
44
|
}
|
|
39
45
|
async updated(changedProperties) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (this.isInitializing) {
|
|
49
|
-
await this.ensureInitialization();
|
|
46
|
+
this.initializationQueue = this.initializationQueue
|
|
47
|
+
.then(async () => {
|
|
48
|
+
let needUpdateDataSeries = false;
|
|
49
|
+
let needBuildChartGroup = false;
|
|
50
|
+
if (changedProperties.has('config') && this.config) {
|
|
51
|
+
await this.initializeSciChart();
|
|
52
|
+
needBuildChartGroup = true;
|
|
53
|
+
needUpdateDataSeries = true;
|
|
50
54
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
if (changedProperties.has('visibleSeries')) {
|
|
56
|
+
await this.updateSeries(this.visibleSeries, changedProperties.get('visibleSeries'));
|
|
57
|
+
/* [중요] buildChartGroup 을 visibleSeries 수정때마다 하는 이유는, render() 의 캐시 컨트롤이 안되기 때문이다. 가급적 시도하지 말라. */
|
|
58
|
+
needBuildChartGroup = true;
|
|
59
|
+
needUpdateDataSeries = true;
|
|
60
|
+
}
|
|
61
|
+
if (changedProperties.has('data')) {
|
|
62
|
+
needUpdateDataSeries = true;
|
|
63
|
+
}
|
|
64
|
+
if (needBuildChartGroup) {
|
|
65
|
+
await this.buildChartGroup();
|
|
66
|
+
}
|
|
67
|
+
if (needUpdateDataSeries) {
|
|
68
|
+
await this.updateDataSeries();
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
.catch((error) => {
|
|
72
|
+
console.error('Error in updated queue:', error);
|
|
73
|
+
});
|
|
65
74
|
}
|
|
66
75
|
cleanup() {
|
|
67
|
-
var _a;
|
|
68
76
|
this.cleanupGroup();
|
|
69
|
-
|
|
70
|
-
(_a = this.overviewChart.sciChartSurface) === null || _a === void 0 ? void 0 : _a.delete();
|
|
71
|
-
this.overviewChart = null;
|
|
72
|
-
}
|
|
77
|
+
this.cleanupOverview();
|
|
73
78
|
}
|
|
74
79
|
cleanupGroup() {
|
|
75
80
|
this.groupCharts.forEach(chart => {
|
|
@@ -81,6 +86,14 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
81
86
|
});
|
|
82
87
|
this.groupCharts.length = 0;
|
|
83
88
|
}
|
|
89
|
+
cleanupOverview() {
|
|
90
|
+
if (this.overviewChart) {
|
|
91
|
+
this.overviewChart.sciChartSurface.renderableSeries.clear();
|
|
92
|
+
this.overviewDataSeries.forEach(ds => ds.delete());
|
|
93
|
+
this.overviewDataSeries.length = 0;
|
|
94
|
+
}
|
|
95
|
+
this.overviewChart = null;
|
|
96
|
+
}
|
|
84
97
|
async updateDataSeries() {
|
|
85
98
|
const { config, data } = this;
|
|
86
99
|
const { datasets = [], labelDataKey: attrX } = (config === null || config === void 0 ? void 0 : config.data) || {};
|
|
@@ -88,38 +101,59 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
88
101
|
return [];
|
|
89
102
|
}
|
|
90
103
|
const newData = this.dataSet;
|
|
91
|
-
|
|
104
|
+
this.groupCharts.forEach(({ dataKey, sciChartSurface, dataSeries }) => {
|
|
92
105
|
try {
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
// dataKey로 시작하는 모든 시리즈를 업데이트
|
|
107
|
+
const relatedDatasets = datasets.filter(dataset => { var _a; return (_a = dataset.dataKey) === null || _a === void 0 ? void 0 : _a.startsWith(dataKey); });
|
|
108
|
+
// 각 relatedDatasets에 대해 해당하는 dataSeries를 업데이트
|
|
109
|
+
dataSeries.forEach((ds, index) => {
|
|
110
|
+
ds.clear();
|
|
111
|
+
const relatedDataset = relatedDatasets[index];
|
|
112
|
+
if (relatedDataset) {
|
|
113
|
+
const filteredData = newData[datasets.findIndex(ds => ds.dataKey === relatedDataset.dataKey)].filter(d => typeof d.yValue === 'number');
|
|
114
|
+
if (filteredData.length > 0) {
|
|
115
|
+
ds.appendRange(filteredData.map(d => d.xValue), filteredData.map(d => d.yValue));
|
|
116
|
+
}
|
|
99
117
|
}
|
|
100
118
|
});
|
|
119
|
+
sciChartSurface.zoomExtents();
|
|
120
|
+
sciChartSurface.invalidateElement();
|
|
101
121
|
}
|
|
102
122
|
catch (error) {
|
|
103
|
-
console.
|
|
123
|
+
console.error('Error updating data series:', error);
|
|
104
124
|
}
|
|
105
|
-
setTimeout(() => {
|
|
106
|
-
sciChartSurface.zoomExtents();
|
|
107
|
-
sciChartSurface.invalidateElement();
|
|
108
|
-
}, 200);
|
|
109
125
|
});
|
|
110
126
|
try {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
127
|
+
// Overview 차트 데이터 업데이트
|
|
128
|
+
this.overviewDataSeries.forEach((ds, index) => {
|
|
129
|
+
var _a;
|
|
130
|
+
const visibleKey = this.visibleSeries[index];
|
|
131
|
+
const dataset = datasets.find(dataset => dataset.dataKey === visibleKey);
|
|
132
|
+
if (!dataset) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const dataIndex = datasets.findIndex(ds => ds.dataKey === dataset.dataKey);
|
|
136
|
+
const filteredData = ((_a = newData[dataIndex]) === null || _a === void 0 ? void 0 : _a.filter(d => typeof d.yValue === 'number')) || [];
|
|
137
|
+
ds.clear();
|
|
138
|
+
if (filteredData.length > 0) {
|
|
139
|
+
ds.appendRange(filteredData.map(d => d.xValue), filteredData.map(d => d.yValue));
|
|
118
140
|
}
|
|
119
141
|
});
|
|
142
|
+
// this.overviewDataSeries.forEach(ds => ds.clear())
|
|
143
|
+
// newData.forEach((data, index) => {
|
|
144
|
+
// if (this.visibleSeries.includes(datasets[index].dataKey!)) {
|
|
145
|
+
// const filteredData = data.filter(d => typeof d.yValue === 'number')
|
|
146
|
+
// if (filteredData.length > 0) {
|
|
147
|
+
// this.overviewDataSeries[index].appendRange(
|
|
148
|
+
// filteredData.map(d => d.xValue),
|
|
149
|
+
// filteredData.map(d => d.yValue)
|
|
150
|
+
// )
|
|
151
|
+
// }
|
|
152
|
+
// }
|
|
153
|
+
// })
|
|
120
154
|
}
|
|
121
155
|
catch (error) {
|
|
122
|
-
console.
|
|
156
|
+
console.error('Error updating overview data series:', error);
|
|
123
157
|
}
|
|
124
158
|
}
|
|
125
159
|
get dataSet() {
|
|
@@ -153,7 +187,7 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
153
187
|
return html `
|
|
154
188
|
<div id=${this.containerId + '-overview'} class="overview" ?hidden=${!this.showOverview}></div>
|
|
155
189
|
<div id="chart-group">
|
|
156
|
-
${
|
|
190
|
+
${this.visibleSeries.map(dataKey => keyed(dataKey, html `
|
|
157
191
|
<div
|
|
158
192
|
id=${this.containerId + '-' + dataKey}
|
|
159
193
|
class="grouped-chart"
|
|
@@ -174,78 +208,184 @@ let OxSciChartMultiple = OxSciChartMultiple_1 = class OxSciChartMultiple extends
|
|
|
174
208
|
}));
|
|
175
209
|
}
|
|
176
210
|
async updateSeries(after, before) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
for (const series of
|
|
180
|
-
|
|
181
|
-
await this.removeChart(series);
|
|
182
|
-
}
|
|
211
|
+
const addSeries = (after === null || after === void 0 ? void 0 : after.filter(series => !before.includes(series))) || [];
|
|
212
|
+
const removeSeries = (before === null || before === void 0 ? void 0 : before.filter(series => !after.includes(series))) || [];
|
|
213
|
+
for (const series of removeSeries) {
|
|
214
|
+
await this.removeChart(series);
|
|
183
215
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (!before || !before.includes(series)) {
|
|
187
|
-
await this.addChart(series);
|
|
188
|
-
}
|
|
216
|
+
for (const series of addSeries) {
|
|
217
|
+
await this.addChart(series);
|
|
189
218
|
}
|
|
190
219
|
}
|
|
191
220
|
async addChart(dataKey) {
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
221
|
+
const chartData = await this.createChart(dataKey);
|
|
222
|
+
if (chartData) {
|
|
223
|
+
const { chart, dataSeries, dataKey } = chartData;
|
|
224
|
+
this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface);
|
|
225
|
+
this.groupCharts = this.groupSorter([
|
|
226
|
+
...this.groupCharts,
|
|
227
|
+
{ dataKey, sciChartSurface: chart.sciChartSurface, dataSeries }
|
|
228
|
+
]);
|
|
229
|
+
await this.addSeriesToOverviewChart(dataKey);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async removeChart(dataKey) {
|
|
233
|
+
const index = this.groupCharts.findIndex(chart => chart.dataKey == dataKey);
|
|
234
|
+
if (index === -1)
|
|
235
|
+
return;
|
|
236
|
+
const [groupedChart] = this.groupCharts.splice(index, 1);
|
|
237
|
+
this.destroyChart(groupedChart);
|
|
238
|
+
this.groupCharts = this.groupSorter(this.groupCharts);
|
|
239
|
+
await this.removeSeriesFromOverviewChart(dataKey);
|
|
240
|
+
}
|
|
241
|
+
groupSorter(group) {
|
|
242
|
+
return group.sort((a, b) => this.visibleSeries.findIndex((s) => s.dataKey == a.dataKey) -
|
|
243
|
+
this.visibleSeries.findIndex((s) => s.dataKey == b.dataKey));
|
|
244
|
+
}
|
|
245
|
+
async appendData(appendum) { }
|
|
246
|
+
async createChart(dataKey) {
|
|
247
|
+
var _a, _b;
|
|
197
248
|
const { data = {}, options = {} } = this.config || {};
|
|
198
249
|
const { datasets = [] } = data;
|
|
199
|
-
const
|
|
200
|
-
if (!
|
|
201
|
-
return;
|
|
250
|
+
const primaryDataset = datasets.find(dataset => dataset.dataKey == dataKey);
|
|
251
|
+
if (!primaryDataset) {
|
|
252
|
+
return null;
|
|
202
253
|
}
|
|
203
|
-
const {
|
|
204
|
-
const { yAxes = [] } = scales || {};
|
|
205
|
-
const { valueFormat } = dataset;
|
|
254
|
+
const relatedDatasets = datasets.filter(dataset => { var _a; return (_a = dataset.dataKey) === null || _a === void 0 ? void 0 : _a.startsWith(dataKey); });
|
|
206
255
|
const yAxis = {
|
|
207
|
-
...yAxes[0],
|
|
208
|
-
axisTitle:
|
|
256
|
+
...(_b = (_a = options.scales) === null || _a === void 0 ? void 0 : _a.yAxes) === null || _b === void 0 ? void 0 : _b[0],
|
|
257
|
+
axisTitle: primaryDataset === null || primaryDataset === void 0 ? void 0 : primaryDataset.label
|
|
209
258
|
};
|
|
210
259
|
const config = {
|
|
211
260
|
...this.config,
|
|
212
261
|
data: {
|
|
213
|
-
datasets:
|
|
262
|
+
datasets: relatedDatasets
|
|
214
263
|
},
|
|
215
264
|
options: {
|
|
216
265
|
...options,
|
|
217
266
|
scales: {
|
|
218
|
-
...scales,
|
|
267
|
+
...options.scales,
|
|
219
268
|
yAxes: [yAxis]
|
|
220
269
|
}
|
|
221
270
|
}
|
|
222
271
|
};
|
|
223
272
|
const container = this.renderRoot.querySelector(`#${this.containerId + '-' + dataKey}`);
|
|
224
|
-
|
|
225
|
-
|
|
273
|
+
const { chart, dataSeries } = (await buildSciChart(config, container, { fontSize: 14, fontFamily: 'Roboto', fontColor: undefined }, {
|
|
274
|
+
precision: primaryDataset.valueFormat ? calculatePrecision(primaryDataset.valueFormat) : undefined,
|
|
275
|
+
grouped: this.containerId
|
|
276
|
+
}));
|
|
226
277
|
this.synchronizer.addAxis(chart.sciChartSurface.xAxes.get(0));
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
278
|
+
// 각 시리즈에 대해 올바른 데이터를 추가
|
|
279
|
+
const newData = this.dataSet;
|
|
280
|
+
dataSeries.forEach((ds, seriesIndex) => {
|
|
281
|
+
var _a;
|
|
282
|
+
const dataset = relatedDatasets[seriesIndex];
|
|
283
|
+
const filteredData = ((_a = newData[seriesIndex]) === null || _a === void 0 ? void 0 : _a.filter(d => typeof d.yValue === 'number')) || [];
|
|
284
|
+
if (filteredData.length > 0) {
|
|
285
|
+
ds.appendRange(filteredData.map(d => d.xValue), filteredData.map(d => d.yValue));
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
return { chart, dataSeries, dataKey };
|
|
231
289
|
}
|
|
232
|
-
|
|
233
|
-
const index = this.groupCharts.findIndex((chart) => chart.dataKey == dataKey);
|
|
234
|
-
const [groupedChart] = this.groupCharts.splice(index, 1);
|
|
235
|
-
if (!groupedChart) {
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
290
|
+
destroyChart(groupedChart) {
|
|
238
291
|
this.verticalGroup.removeSurface(groupedChart.sciChartSurface);
|
|
239
292
|
this.synchronizer.removeAxis(groupedChart.sciChartSurface.xAxes.get(0));
|
|
240
293
|
groupedChart.sciChartSurface.delete();
|
|
241
|
-
groupedChart.sciChartSurface = undefined;
|
|
242
|
-
this.groupCharts = this.groupSorter(this.groupCharts);
|
|
243
294
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
295
|
+
async addSeriesToOverviewChart(dataKey) {
|
|
296
|
+
var _a;
|
|
297
|
+
if (!this.overviewChart || !this.overviewDataSeries) {
|
|
298
|
+
console.error('Overview chart is not initialized.');
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
// Check if the series already exists in the overview chart
|
|
302
|
+
const existingSeries = this.overviewChart.sciChartSurface.renderableSeries.asArray().find((series) => {
|
|
303
|
+
return series.dataSeries.dataSeriesName === dataKey;
|
|
304
|
+
});
|
|
305
|
+
if (existingSeries) {
|
|
306
|
+
console.warn(`Series for dataKey ${dataKey} already exists in the overview chart.`);
|
|
307
|
+
return; // Exit the function without adding the series again
|
|
308
|
+
}
|
|
309
|
+
const dataset = (_a = this.config) === null || _a === void 0 ? void 0 : _a.data.datasets.find(dataset => dataset.dataKey === dataKey);
|
|
310
|
+
if (!dataset) {
|
|
311
|
+
console.error('Dataset not found for dataKey:', dataKey);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const newSeries = await this.createSeriesForOverview(dataset);
|
|
315
|
+
if (newSeries) {
|
|
316
|
+
this.overviewChart.sciChartSurface.renderableSeries.add(newSeries.series);
|
|
317
|
+
this.overviewDataSeries.push(newSeries.dataSeries);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
async removeSeriesFromOverviewChart(dataKey) {
|
|
321
|
+
if (!this.overviewChart || !this.overviewDataSeries) {
|
|
322
|
+
console.error('Overview chart is not initialized.');
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const { sciChartSurface } = this.overviewChart;
|
|
326
|
+
// 오버뷰 차트의 renderableSeries에서 해당 시리즈 제거
|
|
327
|
+
const seriesIndex = sciChartSurface.renderableSeries.asArray().findIndex((series) => {
|
|
328
|
+
return series.dataSeries.dataSeriesName === dataKey;
|
|
329
|
+
});
|
|
330
|
+
if (seriesIndex !== -1) {
|
|
331
|
+
const series = sciChartSurface.renderableSeries.get(seriesIndex);
|
|
332
|
+
const yAxisId = series.yAxisId;
|
|
333
|
+
// 시리즈 제거
|
|
334
|
+
sciChartSurface.renderableSeries.removeAt(seriesIndex);
|
|
335
|
+
this.overviewDataSeries.splice(seriesIndex, 1); // 데이터 시리즈도 제거
|
|
336
|
+
// 고유 Y축 제거
|
|
337
|
+
if (yAxisId) {
|
|
338
|
+
const yAxisIndex = sciChartSurface.yAxes.asArray().findIndex((axis) => axis.id === yAxisId);
|
|
339
|
+
if (yAxisIndex !== -1) {
|
|
340
|
+
sciChartSurface.yAxes.removeAt(yAxisIndex);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.error('Series not found in overview chart for dataKey:', dataKey);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async createSeriesForOverview(dataset) {
|
|
349
|
+
if (!this.overviewChart)
|
|
350
|
+
return null;
|
|
351
|
+
const { sciChartSurface, wasmContext } = this.overviewChart;
|
|
352
|
+
const dataSeries = new XyDataSeries(wasmContext, {
|
|
353
|
+
dataSeriesName: dataset.dataKey,
|
|
354
|
+
containsNaN: false
|
|
355
|
+
});
|
|
356
|
+
// 새로운 Y축을 추가하여 노멀라이즈 효과를 제공
|
|
357
|
+
const yAxisId = `yAxis_${dataset.dataKey}`;
|
|
358
|
+
const yAxis = new NumericAxis(wasmContext, {
|
|
359
|
+
id: yAxisId,
|
|
360
|
+
autoRange: EAutoRange.Always,
|
|
361
|
+
drawLabels: false,
|
|
362
|
+
drawMajorTickLines: false,
|
|
363
|
+
drawMinorTickLines: false,
|
|
364
|
+
drawMajorGridLines: false,
|
|
365
|
+
drawMinorGridLines: false
|
|
366
|
+
});
|
|
367
|
+
sciChartSurface.yAxes.add(yAxis);
|
|
368
|
+
const series = new FastLineRenderableSeries(wasmContext, {
|
|
369
|
+
dataSeries,
|
|
370
|
+
strokeThickness: 1,
|
|
371
|
+
stroke: convertColor(dataset.color, DEFAULT_COLOR),
|
|
372
|
+
yAxisId
|
|
373
|
+
});
|
|
374
|
+
// 초기 데이터 추가
|
|
375
|
+
const newData = this.dataSet.find((data, index) => { var _a; return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.data.datasets[index].dataKey) === dataset.dataKey; });
|
|
376
|
+
if (newData && newData.length > 0) {
|
|
377
|
+
const xValues = newData.map(d => d.xValue);
|
|
378
|
+
const yValues = newData.map(d => d.yValue).filter(y => typeof y === 'number' && !isNaN(y)); // y 값 검증
|
|
379
|
+
if (yValues.length > 0) {
|
|
380
|
+
// 유효한 y 값이 있을 때만 추가
|
|
381
|
+
dataSeries.appendRange(xValues, yValues);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
console.warn('No valid yValues found for dataset:', dataset.dataKey);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return { series, dataSeries };
|
|
247
388
|
}
|
|
248
|
-
async appendData(appendum) { }
|
|
249
389
|
};
|
|
250
390
|
OxSciChartMultiple.idx = 0;
|
|
251
391
|
OxSciChartMultiple.styles = [
|
|
@@ -1 +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 { calculatePrecision, buildSciChart, buildSciChartOverview } from './scichart-builder'\nimport { AxisSynchroniser } from './axis-synchronizer'\nimport { NumberRange, scaleAxes, 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 try {\n dataSeries.forEach(ds => ds.clear())\n const dataSet = newData.filter((data, index) => dataKey == datasets[index].dataKey!)\n\n dataSet.forEach((data, index) => {\n const filteredData = data.filter(d => typeof d.yValue === 'number')\n\n if (filteredData.length > 0) {\n dataSeries[index].appendRange(\n filteredData.map(d => d.xValue),\n filteredData.map(d => d.yValue)\n )\n }\n })\n } catch (error) {\n console.log(error)\n }\n\n setTimeout(() => {\n sciChartSurface.zoomExtents()\n sciChartSurface.invalidateElement()\n }, 200)\n })\n\n try {\n this.overviewDataSeries.forEach(ds => ds.clear())\n\n newData.forEach((data, index) => {\n if (this.visibleSeries.includes(datasets[index].dataKey!)) {\n const filteredData = data.filter(d => typeof d.yValue === 'number')\n if (filteredData.length > 0) {\n this.overviewDataSeries[index].appendRange(\n filteredData.map(d => d.xValue),\n filteredData.map(d => d.yValue)\n )\n }\n }\n })\n } catch (error) {\n console.log(error)\n }\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 = {}, options = {} } = this.config || {}\n const { datasets = [] } = data as OperatoChart.ChartData\n const dataset = datasets.find(dataset => dataset.dataKey == dataKey)\n\n if (!dataset) {\n return\n }\n\n const { scales } = options\n const { yAxes = [] } = scales || {}\n const { valueFormat } = dataset\n\n const yAxis = {\n ...yAxes[0],\n axisTitle: dataset?.label\n }\n\n const config = {\n ...this.config,\n data: {\n datasets: [dataset]\n },\n options: {\n ...options,\n scales: {\n ...scales,\n yAxes: [yAxis]\n }\n }\n }\n\n const container = this.renderRoot.querySelector(`#${this.containerId + '-' + dataKey}`)\n var { chart, dataSeries } = (await buildSciChart(\n config,\n container,\n { fontSize: 14, fontFamily: 'Roboto', fontColor: undefined },\n { precision: valueFormat ? calculatePrecision(valueFormat) : undefined, grouped: 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 async appendData(appendum: { [attr: string]: any }[]) {}\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ox-scichart-multiple': OxSciChartMultiple\n }\n}\n"]}
|
|
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 {\n calculatePrecision,\n buildSciChart,\n buildSciChartOverview,\n convertColor,\n DEFAULT_COLOR\n} from './scichart-builder'\nimport { AxisSynchroniser } from './axis-synchronizer'\nimport {\n EAutoRange,\n FastLineRenderableSeries,\n NumberRange,\n NumericAxis,\n scaleAxes,\n SciChartVerticalGroup,\n XyDataSeries\n} 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 overviewChart: any = null\n private overviewDataSeries: any[] = []\n private groupCharts: {\n dataKey: string\n sciChartSurface: any\n dataSeries: any[]\n }[] = []\n\n private initializationQueue: Promise<void> = Promise.resolve()\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 await this.createOverviewChart()\n }\n\n async createOverviewChart() {\n const { chart, dataSeries } =\n (await buildSciChartOverview(\n {\n ...this.config,\n data: { datasets: [] }\n },\n this.overviewContainer,\n {},\n this.synchronizer\n )) || {}\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 this.initializationQueue = this.initializationQueue\n .then(async () => {\n let needUpdateDataSeries = false\n let needBuildChartGroup = false\n\n if (changedProperties.has('config') && this.config) {\n await this.initializeSciChart()\n needBuildChartGroup = true\n needUpdateDataSeries = true\n }\n\n if (changedProperties.has('visibleSeries')) {\n await this.updateSeries(this.visibleSeries, changedProperties.get('visibleSeries') as string[])\n /* [중요] buildChartGroup 을 visibleSeries 수정때마다 하는 이유는, render() 의 캐시 컨트롤이 안되기 때문이다. 가급적 시도하지 말라. */\n needBuildChartGroup = true\n needUpdateDataSeries = true\n }\n\n if (changedProperties.has('data')) {\n needUpdateDataSeries = true\n }\n\n if (needBuildChartGroup) {\n await this.buildChartGroup()\n }\n\n if (needUpdateDataSeries) {\n await this.updateDataSeries()\n }\n })\n .catch((error: any) => {\n console.error('Error in updated queue:', error)\n })\n }\n\n cleanup() {\n this.cleanupGroup()\n this.cleanupOverview()\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 cleanupOverview() {\n if (this.overviewChart) {\n this.overviewChart.sciChartSurface.renderableSeries.clear()\n this.overviewDataSeries.forEach(ds => ds.delete())\n this.overviewDataSeries.length = 0\n }\n\n this.overviewChart = null\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 try {\n // dataKey로 시작하는 모든 시리즈를 업데이트\n const relatedDatasets = datasets.filter(dataset => dataset.dataKey?.startsWith(dataKey))\n\n // 각 relatedDatasets에 대해 해당하는 dataSeries를 업데이트\n dataSeries.forEach((ds, index) => {\n ds.clear()\n\n const relatedDataset = relatedDatasets[index]\n if (relatedDataset) {\n const filteredData = newData[datasets.findIndex(ds => ds.dataKey === relatedDataset.dataKey)].filter(\n d => typeof d.yValue === 'number'\n )\n\n if (filteredData.length > 0) {\n ds.appendRange(\n filteredData.map(d => d.xValue),\n filteredData.map(d => d.yValue)\n )\n }\n }\n })\n\n sciChartSurface.zoomExtents()\n sciChartSurface.invalidateElement()\n } catch (error) {\n console.error('Error updating data series:', error)\n }\n })\n\n try {\n // Overview 차트 데이터 업데이트\n this.overviewDataSeries.forEach((ds, index) => {\n const visibleKey = this.visibleSeries[index]\n const dataset = datasets.find(dataset => dataset.dataKey === visibleKey)\n if (!dataset) {\n return\n }\n\n const dataIndex = datasets.findIndex(ds => ds.dataKey === dataset.dataKey)\n const filteredData = newData[dataIndex]?.filter(d => typeof d.yValue === 'number') || []\n\n ds.clear()\n if (filteredData.length > 0) {\n ds.appendRange(\n filteredData.map(d => d.xValue),\n filteredData.map(d => d.yValue)\n )\n }\n })\n\n // this.overviewDataSeries.forEach(ds => ds.clear())\n\n // newData.forEach((data, index) => {\n // if (this.visibleSeries.includes(datasets[index].dataKey!)) {\n // const filteredData = data.filter(d => typeof d.yValue === 'number')\n // if (filteredData.length > 0) {\n // this.overviewDataSeries[index].appendRange(\n // filteredData.map(d => d.xValue),\n // filteredData.map(d => d.yValue)\n // )\n // }\n // }\n // })\n } catch (error) {\n console.error('Error updating overview data series:', error)\n }\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 ${this.visibleSeries.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 const addSeries = after?.filter(series => !before.includes(series)) || []\n const removeSeries = before?.filter(series => !after.includes(series)) || []\n\n for (const series of removeSeries) {\n await this.removeChart(series)\n }\n\n for (const series of addSeries) {\n await this.addChart(series)\n }\n }\n\n async addChart(dataKey: string) {\n const chartData = await this.createChart(dataKey)\n\n if (chartData) {\n const { chart, dataSeries, dataKey } = chartData\n this.verticalGroup.addSurfaceToGroup(chart.sciChartSurface)\n\n this.groupCharts = this.groupSorter([\n ...this.groupCharts,\n { dataKey, sciChartSurface: chart.sciChartSurface, dataSeries }\n ])\n\n await this.addSeriesToOverviewChart(dataKey)\n }\n }\n\n async removeChart(dataKey: string) {\n const index = this.groupCharts.findIndex(chart => chart.dataKey == dataKey)\n if (index === -1) return\n\n const [groupedChart] = this.groupCharts.splice(index, 1)\n this.destroyChart(groupedChart)\n\n this.groupCharts = this.groupSorter(this.groupCharts)\n\n await this.removeSeriesFromOverviewChart(dataKey)\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 async appendData(appendum: { [attr: string]: any }[]) {}\n\n private async createChart(dataKey: string) {\n const { data = {}, options = {} } = this.config || {}\n const { datasets = [] } = data as OperatoChart.ChartData\n const primaryDataset = datasets.find(dataset => dataset.dataKey == dataKey)\n\n if (!primaryDataset) {\n return null\n }\n\n const relatedDatasets = datasets.filter(dataset => dataset.dataKey?.startsWith(dataKey))\n\n const yAxis = {\n ...options.scales?.yAxes?.[0],\n axisTitle: primaryDataset?.label\n }\n\n const config = {\n ...this.config,\n data: {\n datasets: relatedDatasets\n },\n options: {\n ...options,\n scales: {\n ...options.scales,\n yAxes: [yAxis]\n }\n }\n }\n\n const container = this.renderRoot.querySelector(`#${this.containerId + '-' + dataKey}`)\n const { chart, dataSeries } = (await buildSciChart(\n config,\n container,\n { fontSize: 14, fontFamily: 'Roboto', fontColor: undefined },\n {\n precision: primaryDataset.valueFormat ? calculatePrecision(primaryDataset.valueFormat) : undefined,\n grouped: this.containerId\n }\n ))!\n\n this.synchronizer.addAxis(chart.sciChartSurface.xAxes.get(0))\n\n // 각 시리즈에 대해 올바른 데이터를 추가\n const newData = this.dataSet\n dataSeries.forEach((ds, seriesIndex) => {\n const dataset = relatedDatasets[seriesIndex]\n const filteredData = newData[seriesIndex]?.filter(d => typeof d.yValue === 'number') || []\n if (filteredData.length > 0) {\n ds.appendRange(\n filteredData.map(d => d.xValue),\n filteredData.map(d => d.yValue)\n )\n }\n })\n\n return { chart, dataSeries, dataKey }\n }\n\n private destroyChart(groupedChart: { dataKey: string; sciChartSurface: any; dataSeries: any[] }) {\n this.verticalGroup.removeSurface(groupedChart.sciChartSurface)\n this.synchronizer.removeAxis(groupedChart.sciChartSurface.xAxes.get(0))\n groupedChart.sciChartSurface.delete()\n }\n\n private async addSeriesToOverviewChart(dataKey: string) {\n if (!this.overviewChart || !this.overviewDataSeries) {\n console.error('Overview chart is not initialized.')\n return\n }\n\n // Check if the series already exists in the overview chart\n const existingSeries = this.overviewChart.sciChartSurface.renderableSeries.asArray().find((series: any) => {\n return series.dataSeries.dataSeriesName === dataKey\n })\n\n if (existingSeries) {\n console.warn(`Series for dataKey ${dataKey} already exists in the overview chart.`)\n return // Exit the function without adding the series again\n }\n\n const dataset = this.config?.data.datasets.find(dataset => dataset.dataKey === dataKey)\n if (!dataset) {\n console.error('Dataset not found for dataKey:', dataKey)\n return\n }\n\n const newSeries = await this.createSeriesForOverview(dataset)\n\n if (newSeries) {\n this.overviewChart.sciChartSurface.renderableSeries.add(newSeries.series)\n this.overviewDataSeries.push(newSeries.dataSeries)\n }\n }\n\n private async removeSeriesFromOverviewChart(dataKey: string) {\n if (!this.overviewChart || !this.overviewDataSeries) {\n console.error('Overview chart is not initialized.')\n return\n }\n\n const { sciChartSurface } = this.overviewChart\n\n // 오버뷰 차트의 renderableSeries에서 해당 시리즈 제거\n const seriesIndex = sciChartSurface.renderableSeries.asArray().findIndex((series: any) => {\n return series.dataSeries.dataSeriesName === dataKey\n })\n\n if (seriesIndex !== -1) {\n const series = sciChartSurface.renderableSeries.get(seriesIndex)\n const yAxisId = series.yAxisId\n\n // 시리즈 제거\n sciChartSurface.renderableSeries.removeAt(seriesIndex)\n this.overviewDataSeries.splice(seriesIndex, 1) // 데이터 시리즈도 제거\n\n // 고유 Y축 제거\n if (yAxisId) {\n const yAxisIndex = sciChartSurface.yAxes.asArray().findIndex((axis: any) => axis.id === yAxisId)\n if (yAxisIndex !== -1) {\n sciChartSurface.yAxes.removeAt(yAxisIndex)\n }\n }\n } else {\n console.error('Series not found in overview chart for dataKey:', dataKey)\n }\n }\n\n private async createSeriesForOverview(dataset: any) {\n if (!this.overviewChart) return null\n\n const { sciChartSurface, wasmContext } = this.overviewChart\n const dataSeries = new XyDataSeries(wasmContext, {\n dataSeriesName: dataset.dataKey,\n containsNaN: false\n })\n\n // 새로운 Y축을 추가하여 노멀라이즈 효과를 제공\n const yAxisId = `yAxis_${dataset.dataKey}`\n const yAxis = new NumericAxis(wasmContext, {\n id: yAxisId,\n autoRange: EAutoRange.Always,\n drawLabels: false,\n drawMajorTickLines: false,\n drawMinorTickLines: false,\n drawMajorGridLines: false,\n drawMinorGridLines: false\n })\n\n sciChartSurface.yAxes.add(yAxis)\n\n const series = new FastLineRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: 1,\n stroke: convertColor(dataset.color, DEFAULT_COLOR),\n yAxisId\n })\n\n // 초기 데이터 추가\n const newData = this.dataSet.find((data, index) => this.config?.data.datasets[index].dataKey === dataset.dataKey)\n if (newData && newData.length > 0) {\n const xValues = newData.map(d => d.xValue)\n const yValues = newData.map(d => d.yValue).filter(y => typeof y === 'number' && !isNaN(y)) // y 값 검증\n\n if (yValues.length > 0) {\n // 유효한 y 값이 있을 때만 추가\n dataSeries.appendRange(xValues, yValues)\n } else {\n console.warn('No valid yValues found for dataset:', dataset.dataKey)\n }\n }\n\n return { series, dataSeries }\n }\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AxisSynchroniser } from './axis-synchronizer';
|
|
2
|
+
export declare function convertColor(color: string | string[] | undefined, defaultColor?: string): string | undefined;
|
|
3
|
+
export declare function calculatePrecision(format?: string | number): number;
|
|
4
|
+
export declare function buildSciChart(config: OperatoChart.ChartConfig | undefined | null, container: any, { fontSize, fontFamily, fontColor }: {
|
|
5
|
+
fontSize?: number;
|
|
6
|
+
fontFamily?: string;
|
|
7
|
+
fontColor?: string;
|
|
8
|
+
}, { grouped, precision }: {
|
|
9
|
+
grouped?: string;
|
|
10
|
+
precision?: number;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
chart: any;
|
|
13
|
+
dataSeries: any[];
|
|
14
|
+
} | undefined>;
|
|
15
|
+
export declare function buildSciChartOverview(config: OperatoChart.ChartConfig | undefined | null, container: any, { fontSize, fontFamily, fontColor }: {
|
|
16
|
+
fontSize?: number;
|
|
17
|
+
fontFamily?: string;
|
|
18
|
+
fontColor?: string;
|
|
19
|
+
}, axisSynchroniser: AxisSynchroniser): Promise<{
|
|
20
|
+
chart: any;
|
|
21
|
+
dataSeries: any[];
|
|
22
|
+
} | undefined>;
|