@operato/chart 7.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/chartjs/config-converter.js +7 -1
  3. package/dist/src/chartjs/config-converter.js.map +1 -1
  4. package/dist/src/editors/configurer.d.ts +2 -2
  5. package/dist/src/editors/configurer.js +0 -1
  6. package/dist/src/editors/configurer.js.map +1 -1
  7. package/dist/src/editors/input-chart-abstract.js +3 -2
  8. package/dist/src/editors/input-chart-abstract.js.map +1 -1
  9. package/dist/src/progress/ox-progress-circle.d.ts +41 -0
  10. package/dist/src/progress/ox-progress-circle.js +169 -0
  11. package/dist/src/progress/ox-progress-circle.js.map +1 -0
  12. package/dist/src/scichart/ox-scichart.d.ts +4 -2
  13. package/dist/src/scichart/ox-scichart.js +77 -23
  14. package/dist/src/scichart/ox-scichart.js.map +1 -1
  15. package/dist/src/scichart/scichart-builder.d.ts +1 -1
  16. package/dist/src/scichart/scichart-builder.js +216 -22
  17. package/dist/src/scichart/scichart-builder.js.map +1 -1
  18. package/dist/stories/common.d.ts +1 -1
  19. package/dist/stories/common.js +31 -9
  20. package/dist/stories/common.js.map +1 -1
  21. package/dist/stories/ox-input-chart-bar.stories.js +32 -47
  22. package/dist/stories/ox-input-chart-bar.stories.js.map +1 -1
  23. package/dist/stories/ox-input-chart-doughnut.stories.js +1 -1
  24. package/dist/stories/ox-input-chart-doughnut.stories.js.map +1 -1
  25. package/dist/stories/ox-input-chart-hbar.stories.js +1 -1
  26. package/dist/stories/ox-input-chart-hbar.stories.js.map +1 -1
  27. package/dist/stories/ox-input-chart-line.stories.js +1 -1
  28. package/dist/stories/ox-input-chart-line.stories.js.map +1 -1
  29. package/dist/stories/ox-input-chart-pie.stories.js +1 -1
  30. package/dist/stories/ox-input-chart-pie.stories.js.map +1 -1
  31. package/dist/stories/ox-input-chart-polar-area.stories.js +1 -1
  32. package/dist/stories/ox-input-chart-polar-area.stories.js.map +1 -1
  33. package/dist/stories/ox-input-chart-radar.stories.js +1 -1
  34. package/dist/stories/ox-input-chart-radar.stories.js.map +1 -1
  35. package/dist/stories/ox-input-chart-timeseries.stories.js +77 -53
  36. package/dist/stories/ox-input-chart-timeseries.stories.js.map +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +3 -2
  39. package/src/chartjs/config-converter.ts +12 -4
  40. package/src/editors/configurer.ts +0 -1
  41. package/src/editors/input-chart-abstract.ts +3 -2
  42. package/src/progress/ox-progress-circle.ts +133 -0
  43. package/src/scichart/custom-point-markers.ts.xxx +178 -0
  44. package/src/scichart/ox-scichart.ts +83 -32
  45. package/src/scichart/scichart-builder.ts +272 -34
  46. package/src/types.d.ts +14 -2
  47. package/stories/common.ts +36 -9
  48. package/stories/ox-input-chart-bar.stories.ts +31 -45
  49. package/stories/ox-input-chart-doughnut.stories.ts +1 -1
  50. package/stories/ox-input-chart-hbar.stories.ts +1 -1
  51. package/stories/ox-input-chart-line.stories.ts +1 -1
  52. package/stories/ox-input-chart-pie.stories.ts +1 -1
  53. package/stories/ox-input-chart-polar-area.stories.ts +1 -1
  54. package/stories/ox-input-chart-radar.stories.ts +1 -1
  55. package/stories/ox-input-chart-timeseries.stories.ts +76 -51
@@ -10,16 +10,43 @@ let OxSciChart = class OxSciChart extends LitElement {
10
10
  this.attrX = 'x';
11
11
  this.attrY = 'y';
12
12
  this.chart = null;
13
+ this.dataSeries = [];
13
14
  }
14
15
  static { this.styles = css `
15
16
  :host {
16
17
  display: block;
18
+ width: 100%;
19
+ height: 100%;
17
20
  }
18
21
 
19
- div {
22
+ .chart-container {
23
+ display: flex;
20
24
  width: 100%;
21
25
  height: 100%;
22
26
  }
27
+
28
+ .chart-content {
29
+ flex: 1;
30
+ position: relative;
31
+ }
32
+
33
+ .legend {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ }
38
+
39
+ .legend-top,
40
+ .legend-bottom {
41
+ width: 100%;
42
+ height: 50px;
43
+ }
44
+
45
+ .legend-right,
46
+ .legend-left {
47
+ width: 150px;
48
+ height: 100%;
49
+ }
23
50
  `; }
24
51
  firstUpdated() {
25
52
  this.loadSciChart();
@@ -50,8 +77,9 @@ let OxSciChart = class OxSciChart extends LitElement {
50
77
  this.updateDataSeries();
51
78
  }
52
79
  async updated(changedProperties) {
53
- if (changedProperties.has('config')) {
80
+ if (changedProperties.has('config') && this.config) {
54
81
  await this.initializeSciChart();
82
+ this.updateLegend();
55
83
  }
56
84
  if (changedProperties.has('data')) {
57
85
  this.updateDataSeries();
@@ -59,38 +87,61 @@ let OxSciChart = class OxSciChart extends LitElement {
59
87
  }
60
88
  }
61
89
  updateDataSeries() {
62
- if (!this.dataSeries)
90
+ if (!this.dataSeries?.length)
63
91
  return;
64
- this.dataSeries.clear();
92
+ this.dataSeries.forEach(ds => ds.clear());
65
93
  const newData = this.dataSet;
66
- this.dataSeries.appendRange(newData.map(d => d.xValue), newData.map(d => d.yValue));
94
+ newData.forEach((data, index) => {
95
+ this.dataSeries[index].appendRange(data.map(d => d.xValue), data.map(d => d.yValue));
96
+ });
67
97
  this.chart?.sciChartSurface.zoomExtents();
68
98
  this.chart?.sciChartSurface.invalidateElement();
69
99
  }
70
100
  get dataSet() {
71
- const { attrX, attrY, data } = this;
101
+ const { attrX, data } = this;
102
+ const datasets = this.config?.data?.datasets || [];
72
103
  if (!(data instanceof Array)) {
73
104
  return [];
74
105
  }
75
- return data
76
- .map(item => {
77
- if (!item || typeof item !== 'object') {
78
- return;
79
- }
80
- const xValue = new Date(item[attrX]);
81
- if (isNaN(xValue.getTime())) {
82
- console.error('Invalid date:', item[attrX]);
83
- return;
84
- }
85
- return {
86
- xValue: xValue.getTime() / 1000,
87
- yValue: item[attrY]
88
- };
89
- })
90
- .filter(Boolean);
106
+ return datasets.map(dataset => {
107
+ return data
108
+ .map(item => {
109
+ if (!item || typeof item !== 'object') {
110
+ return;
111
+ }
112
+ const xValue = new Date(item[attrX]);
113
+ if (isNaN(xValue.getTime())) {
114
+ console.error('Invalid date:', item[attrX]);
115
+ return;
116
+ }
117
+ return {
118
+ xValue: xValue.getTime() / 1000,
119
+ yValue: item[dataset.dataKey]
120
+ };
121
+ })
122
+ .filter(Boolean);
123
+ });
124
+ }
125
+ updateLegend() {
126
+ const legendPosition = this.config?.options?.legend?.position || 'right';
127
+ const legendElement = this.shadowRoot?.getElementById('legend');
128
+ if (legendElement) {
129
+ legendElement.className = `legend legend-${legendPosition}`;
130
+ }
91
131
  }
92
132
  render() {
93
- return html `<div id="container"></div>`;
133
+ const legendPosition = this.config?.options?.legend?.position || 'right';
134
+ return html `
135
+ <div class="chart-container">
136
+ ${legendPosition === 'left' ? html `<div id="legend" class="legend legend-left"></div>` : ''}
137
+ <div class="chart-content">
138
+ ${legendPosition === 'top' ? html `<div id="legend" class="legend legend-top"></div>` : ''}
139
+ <div id="container"></div>
140
+ ${legendPosition === 'bottom' ? html `<div id="legend" class="legend legend-bottom"></div>` : ''}
141
+ </div>
142
+ ${legendPosition === 'right' ? html `<div id="legend" class="legend legend-right"></div>` : ''}
143
+ </div>
144
+ `;
94
145
  }
95
146
  };
96
147
  __decorate([
@@ -108,6 +159,9 @@ __decorate([
108
159
  __decorate([
109
160
  query('div#container')
110
161
  ], OxSciChart.prototype, "container", void 0);
162
+ __decorate([
163
+ query('div#legend')
164
+ ], OxSciChart.prototype, "legendContainer", void 0);
111
165
  OxSciChart = __decorate([
112
166
  customElement('ox-scichart')
113
167
  ], OxSciChart);
@@ -1 +1 @@
1
- {"version":3,"file":"ox-scichart.js","sourceRoot":"","sources":["../../../src/scichart/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// 전역 변수로 SciChart 로딩 상태 관리\ndeclare global {\n interface Window {\n sciChartLoaded: boolean\n sciChartLoadingPromise: Promise<void>\n }\n}\n\n@customElement('ox-scichart')\nclass OxSciChart extends LitElement {\n @property({ type: Object }) config: OperatoChart.ChartConfig | null = null\n @property({ type: Array }) data: { [attr: string]: any }[] = []\n @property({ type: String, attribute: 'attr-x' }) attrX: string = 'x'\n @property({ type: String, attribute: 'attr-y' }) attrY: string = 'y'\n\n private chart: any = null\n dataSeries?: any\n\n @query('div#container') container!: HTMLDivElement\n\n static styles = css`\n :host {\n display: block;\n }\n\n div {\n width: 100%;\n height: 100%;\n }\n `\n\n firstUpdated() {\n this.loadSciChart()\n }\n\n async loadSciChart() {\n if (!window.sciChartLoaded) {\n if (!window.sciChartLoadingPromise) {\n window.sciChartLoadingPromise = new Promise<void>(resolve => {\n const script = document.createElement('script')\n script.src = 'https://cdn.jsdelivr.net/npm/scichart/index.min.js'\n script.crossOrigin = 'anonymous'\n script.onload = () => {\n window.sciChartLoaded = true\n\n SciChart.SciChartSurface.UseCommunityLicense()\n\n resolve()\n }\n document.head.appendChild(script)\n })\n }\n\n await window.sciChartLoadingPromise\n }\n\n this.initializeSciChart()\n }\n\n async initializeSciChart() {\n const { chart, dataSeries } = (await buildSciChart(this.config, this.container, {})) || {}\n\n this.chart = chart\n this.dataSeries = dataSeries\n\n this.updateDataSeries()\n }\n\n async updated(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has('config')) {\n await this.initializeSciChart()\n }\n\n if (changedProperties.has('data')) {\n this.updateDataSeries()\n this.chart?.sciChartSurface.zoomExtents()\n }\n }\n\n updateDataSeries() {\n if (!this.dataSeries) return\n\n this.dataSeries.clear()\n const newData = this.dataSet\n\n this.dataSeries.appendRange(\n newData.map(d => d.xValue),\n newData.map(d => d.yValue)\n )\n\n this.chart?.sciChartSurface.zoomExtents()\n this.chart?.sciChartSurface.invalidateElement()\n }\n\n get dataSet(): { xValue: number; yValue: number }[] {\n const { attrX, attrY, data } = this\n\n if (!(data instanceof Array)) {\n return []\n }\n\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[attrY]\n }\n })\n .filter(Boolean) as { xValue: number; yValue: number }[]\n }\n\n render() {\n return html`<div id=\"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/scichart/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\ndeclare global {\n interface Window {\n sciChartLoaded: boolean\n sciChartLoadingPromise: Promise<void>\n }\n}\n\n@customElement('ox-scichart')\nclass OxSciChart extends LitElement {\n @property({ type: Object }) config: OperatoChart.ChartConfig | null = null\n @property({ type: Array }) data: { [attr: string]: any }[] = []\n @property({ type: String, attribute: 'attr-x' }) attrX: string = 'x'\n @property({ type: String, attribute: 'attr-y' }) attrY: string = 'y'\n\n private chart: any = null\n private dataSeries: any[] = []\n\n @query('div#container') container!: HTMLDivElement\n @query('div#legend') legendContainer!: HTMLDivElement\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 .legend {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .legend-top,\n .legend-bottom {\n width: 100%;\n height: 50px;\n }\n\n .legend-right,\n .legend-left {\n width: 150px;\n height: 100%;\n }\n `\n\n firstUpdated() {\n this.loadSciChart()\n }\n\n async loadSciChart() {\n if (!window.sciChartLoaded) {\n if (!window.sciChartLoadingPromise) {\n window.sciChartLoadingPromise = new Promise<void>(resolve => {\n const script = document.createElement('script')\n script.src = 'https://cdn.jsdelivr.net/npm/scichart/index.min.js'\n script.crossOrigin = 'anonymous'\n script.onload = () => {\n window.sciChartLoaded = true\n\n SciChart.SciChartSurface.UseCommunityLicense()\n\n resolve()\n }\n document.head.appendChild(script)\n })\n }\n\n await window.sciChartLoadingPromise\n }\n\n this.initializeSciChart()\n }\n\n async initializeSciChart() {\n const { chart, dataSeries } = (await buildSciChart(this.config, this.container, {})) || {}\n\n this.chart = chart\n this.dataSeries = dataSeries!\n\n this.updateDataSeries()\n }\n\n async updated(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has('config') && this.config) {\n await this.initializeSciChart()\n this.updateLegend()\n }\n\n if (changedProperties.has('data')) {\n this.updateDataSeries()\n this.chart?.sciChartSurface.zoomExtents()\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 { attrX, data } = this\n const datasets = this.config?.data?.datasets || []\n\n if (!(data instanceof Array)) {\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 updateLegend() {\n const legendPosition = this.config?.options?.legend?.position || 'right'\n const legendElement = this.shadowRoot?.getElementById('legend')\n if (legendElement) {\n legendElement.className = `legend legend-${legendPosition}`\n }\n }\n\n render() {\n const legendPosition = this.config?.options?.legend?.position || 'right'\n return html`\n <div class=\"chart-container\">\n ${legendPosition === 'left' ? html`<div id=\"legend\" class=\"legend legend-left\"></div>` : ''}\n <div class=\"chart-content\">\n ${legendPosition === 'top' ? html`<div id=\"legend\" class=\"legend legend-top\"></div>` : ''}\n <div id=\"container\"></div>\n ${legendPosition === 'bottom' ? html`<div id=\"legend\" class=\"legend legend-bottom\"></div>` : ''}\n </div>\n ${legendPosition === 'right' ? html`<div id=\"legend\" class=\"legend legend-right\"></div>` : ''}\n </div>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ox-scichart': OxSciChart\n }\n}\n"]}
@@ -4,5 +4,5 @@ export declare function buildSciChart(config: OperatoChart.ChartConfig | undefin
4
4
  fontColor?: string;
5
5
  }): Promise<{
6
6
  chart: any;
7
- dataSeries: any;
7
+ dataSeries: any[];
8
8
  } | undefined>;
@@ -1,46 +1,240 @@
1
+ import { TinyColor } from '@ctrl/tinycolor';
2
+ function getBaseColorFromTheme(theme) {
3
+ return new TinyColor(theme == 'dark' ? '#fff' : '#000');
4
+ }
5
+ function getThemeFromBrowser() {
6
+ return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
7
+ }
1
8
  export async function buildSciChart(config, container, { fontSize, fontFamily, fontColor }) {
2
9
  if (!config) {
3
10
  return;
4
11
  }
5
- const { SciChartSurface, SciChartDefaults, chartBuilder, SciChartJsNavyTheme, XyDataSeries, FastLineRenderableSeries, NumberRange, EAutoRange, EAxisAlignment, NumericAxis, DateTimeNumericAxis } = SciChart;
12
+ const { SciChartSurface, SciChartJSLightTheme, SciChartJSDarkv2Theme, XyDataSeries, FastLineRenderableSeries, SplineLineRenderableSeries, FastColumnRenderableSeries, StackedColumnRenderableSeries, StackedMountainRenderableSeries, StackedColumnCollection, StackedMountainCollection, NumericAxis, DateTimeNumericAxis, EAutoRange, EAxisAlignment, NumberRange, MouseWheelZoomModifier, RubberBandXyZoomModifier, ZoomExtentsModifier, RolloverModifier, SmartDateLabelProvider, EllipsePointMarker, SquarePointMarker, TrianglePointMarker, CrossPointMarker, XPointMarker, WaveAnimation, LegendModifier } = SciChart;
6
13
  const { type: chartType, options, data: fromData } = config;
7
- const { theme, animation, tooltip, stacked, legend, scales: fromScales, xGridLine, yGridLine, y2ndGridLine, multiAxis } = options || {};
8
14
  const { datasets = [] } = fromData || {};
15
+ var { theme, tooltip, animation, legend, scales: fromScales, xGridLine, yGridLine, y2ndGridLine, stacked } = options || {};
16
+ var baseColor = getBaseColorFromTheme(theme);
17
+ if (theme === 'auto') {
18
+ theme = getThemeFromBrowser();
19
+ }
20
+ fontColor = fontColor || baseColor.clone().toString();
9
21
  const { xAxes = [], yAxes = [] } = fromScales || {};
10
- const toScales = {};
11
22
  const chart = await SciChartSurface.create(container, {
12
- theme: new SciChartJsNavyTheme()
23
+ theme: theme == 'dark' ? new SciChartJSDarkv2Theme() : new SciChartJSLightTheme()
13
24
  });
14
25
  const { sciChartSurface, wasmContext } = chart;
26
+ // X 축 설정
15
27
  xAxes.forEach((axis, index) => {
16
- const { axisTitle, barSpacing, categorySpacing, barPercentage, ticks } = axis;
17
- const { autoMax, autoMin } = ticks || {};
18
- const id = xAxes.length > 1 ? `x${index + 1}` : 'x';
28
+ const { axisTitle, ticks } = axis;
29
+ const { autoMax, autoMin, min, max, stepSize, beginAtZero, color = fontColor, textStrokeColor = fontColor, display = !!axisTitle } = ticks || {};
19
30
  const xAxis = new DateTimeNumericAxis(wasmContext, {
20
31
  axisTitle,
21
- autoRange: EAutoRange.Always,
22
- axisAlignment: EAxisAlignment.Bottom
23
- // visibleRange: new NumberRange(minDate.getTime() / 1000, maxDate.getTime() / 1000)
32
+ autoRange: autoMin || autoMax ? EAutoRange.Always : undefined,
33
+ axisAlignment: EAxisAlignment.Bottom,
34
+ visibleRange: min !== undefined && max !== undefined ? new NumberRange(min, max) : undefined,
35
+ majorDelta: stepSize,
36
+ growBy: beginAtZero ? new NumberRange(0.1, 0.1) : undefined,
37
+ labelStyle: {
38
+ fontFamily,
39
+ fontSize,
40
+ color
41
+ },
42
+ axisTitleStyle: {
43
+ fontFamily,
44
+ fontSize,
45
+ color: textStrokeColor
46
+ },
47
+ labelProvider: new SmartDateLabelProvider()
24
48
  });
25
49
  sciChartSurface.xAxes.add(xAxis);
26
50
  });
51
+ // Y 축 설정
27
52
  yAxes.forEach((axis, index) => {
28
- const { axisTitle, barSpacing, categorySpacing, barPercentage, ticks } = axis;
29
- const { autoMax, autoMin } = ticks || {};
30
- const id = yAxes.length > 1 ? `right` : 'left';
53
+ const { axisTitle, ticks } = axis;
54
+ const { autoMax, autoMin, min, max, stepSize, beginAtZero } = ticks || {};
31
55
  const yAxis = new NumericAxis(wasmContext, {
56
+ id: `yAxis${index}`,
32
57
  axisTitle,
33
- autoRange: EAutoRange.Always,
34
- axisAlignment: yAxes.length > 1 ? EAxisAlignment.Right : EAxisAlignment.Left
58
+ autoRange: autoMin || autoMax ? EAutoRange.Always : undefined,
59
+ axisAlignment: index === 0 ? EAxisAlignment.Left : EAxisAlignment.Right,
60
+ visibleRange: min !== undefined && max !== undefined ? new NumberRange(min, max) : undefined,
61
+ majorDelta: stepSize,
62
+ growBy: beginAtZero ? new NumberRange(0.1, 0.1) : undefined,
63
+ labelStyle: {
64
+ fontFamily,
65
+ fontSize,
66
+ color: fontColor
67
+ },
68
+ axisTitleStyle: {
69
+ fontFamily,
70
+ fontSize,
71
+ color: fontColor
72
+ }
35
73
  });
36
74
  sciChartSurface.yAxes.add(yAxis);
37
75
  });
38
- const dataSeries = new XyDataSeries(wasmContext);
39
- const lineSeries = new FastLineRenderableSeries(wasmContext);
40
- lineSeries.strokeThickness = 2;
41
- lineSeries.stroke = '#FF6600';
42
- lineSeries.dataSeries = dataSeries;
43
- sciChartSurface.renderableSeries.add(lineSeries);
44
- return { chart, dataSeries };
76
+ // 시리즈 설정
77
+ const dataSeriesArray = datasets.map((dataset, index) => {
78
+ const dataSeries = new XyDataSeries(wasmContext, {
79
+ dataSeriesName: dataset.label,
80
+ containsNaN: false
81
+ });
82
+ const yAxisId = dataset.yAxisID || 'yAxis0';
83
+ const stackGroupId = dataset.stack || `__stack${index}__`;
84
+ let series;
85
+ if (dataset.type === 'bar') {
86
+ if (stacked) {
87
+ series = new StackedColumnRenderableSeries(wasmContext, {
88
+ dataSeries,
89
+ strokeThickness: dataset.borderWidth || 2,
90
+ fill: dataset.backgroundColor || '#FF6600',
91
+ yAxisId,
92
+ stackedGroupId: stackGroupId
93
+ });
94
+ }
95
+ else {
96
+ series = new FastColumnRenderableSeries(wasmContext, {
97
+ dataSeries,
98
+ strokeThickness: dataset.borderWidth || 2,
99
+ fill: dataset.backgroundColor || '#FF6600',
100
+ animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),
101
+ yAxisId
102
+ });
103
+ }
104
+ }
105
+ else {
106
+ const { pointStyle, lineTension } = dataset;
107
+ let pointMarker;
108
+ switch (pointStyle) {
109
+ case 'circle':
110
+ pointMarker = new EllipsePointMarker(wasmContext, {
111
+ width: 10,
112
+ height: 10,
113
+ strokeThickness: 2,
114
+ fill: dataset.color || '#FF6600',
115
+ stroke: '#000000'
116
+ });
117
+ break;
118
+ case 'triangle':
119
+ pointMarker = new TrianglePointMarker(wasmContext, {
120
+ width: 10,
121
+ height: 10,
122
+ strokeThickness: 2,
123
+ fill: dataset.color || '#FF6600',
124
+ stroke: '#000000'
125
+ });
126
+ break;
127
+ case 'rect':
128
+ pointMarker = new SquarePointMarker(wasmContext, {
129
+ width: 10,
130
+ height: 10,
131
+ strokeThickness: 2,
132
+ fill: dataset.color || '#FF6600',
133
+ stroke: '#000000'
134
+ });
135
+ break;
136
+ case 'cross':
137
+ pointMarker = new CrossPointMarker(wasmContext, {
138
+ width: 10,
139
+ height: 10,
140
+ strokeThickness: 2,
141
+ fill: dataset.color || '#FF6600',
142
+ stroke: '#000000'
143
+ });
144
+ break;
145
+ case 'crossRot':
146
+ pointMarker = new XPointMarker(wasmContext, {
147
+ width: 10,
148
+ height: 10,
149
+ strokeThickness: 2,
150
+ fill: dataset.color || '#FF6600',
151
+ stroke: '#000000'
152
+ });
153
+ break;
154
+ default:
155
+ pointMarker = new EllipsePointMarker(wasmContext, {
156
+ width: 10,
157
+ height: 10,
158
+ strokeThickness: 2,
159
+ fill: dataset.color || '#FF6600',
160
+ stroke: '#000000'
161
+ });
162
+ }
163
+ if (stacked) {
164
+ series = new StackedMountainRenderableSeries(wasmContext, {
165
+ dataSeries,
166
+ strokeThickness: dataset.borderWidth || 2,
167
+ stroke: dataset.color || '#FF6600',
168
+ fill: dataset.backgroundColor || '#FF6600',
169
+ yAxisId,
170
+ stackedGroupId: stackGroupId
171
+ });
172
+ }
173
+ else {
174
+ series =
175
+ !!lineTension && lineTension > 0
176
+ ? new SplineLineRenderableSeries(wasmContext, {
177
+ dataSeries,
178
+ strokeThickness: dataset.borderWidth || 2,
179
+ stroke: dataset.color || '#FF6600',
180
+ pointMarker,
181
+ animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),
182
+ yAxisId
183
+ })
184
+ : new FastLineRenderableSeries(wasmContext, {
185
+ dataSeries,
186
+ strokeThickness: dataset.borderWidth || 2,
187
+ stroke: dataset.color || '#FF6600',
188
+ pointMarker,
189
+ animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),
190
+ yAxisId
191
+ });
192
+ }
193
+ }
194
+ sciChartSurface.renderableSeries.add(series);
195
+ if (tooltip) {
196
+ const rolloverModifier = new RolloverModifier({
197
+ showTooltip: true,
198
+ showAxisLabels: true,
199
+ tooltipColor: 'white',
200
+ tooltipBackgroundColor: 'rgba(0, 0, 0, 0.7)',
201
+ rollOverDataSeries: dataSeries
202
+ });
203
+ sciChartSurface.chartModifiers.add(rolloverModifier);
204
+ }
205
+ return dataSeries;
206
+ });
207
+ // Stacked collections 추가
208
+ if (stacked) {
209
+ const stackedColumnCollection = new StackedColumnCollection(wasmContext);
210
+ const stackedMountainCollection = new StackedMountainCollection(wasmContext);
211
+ sciChartSurface.renderableSeries.asArray().forEach((series) => {
212
+ if (series instanceof StackedColumnRenderableSeries) {
213
+ stackedColumnCollection.add(series);
214
+ }
215
+ else if (series instanceof StackedMountainRenderableSeries) {
216
+ stackedMountainCollection.add(series);
217
+ }
218
+ });
219
+ if (stackedColumnCollection.size() > 0) {
220
+ sciChartSurface.renderableSeries.add(stackedColumnCollection);
221
+ }
222
+ if (stackedMountainCollection.size() > 0) {
223
+ sciChartSurface.renderableSeries.add(stackedMountainCollection);
224
+ }
225
+ }
226
+ // 줌인/줌아웃 모디파이어 추가
227
+ sciChartSurface.chartModifiers.add(new RubberBandXyZoomModifier(), new MouseWheelZoomModifier(), new ZoomExtentsModifier());
228
+ // Legend 설정
229
+ if (legend?.display) {
230
+ const legendModifier = new LegendModifier({
231
+ showCheckboxes: true,
232
+ showSeriesMarkers: true,
233
+ showLegend: true,
234
+ placement: legend.position || 'bottom-right'
235
+ });
236
+ sciChartSurface.chartModifiers.add(legendModifier);
237
+ }
238
+ return { chart, dataSeries: dataSeriesArray };
45
239
  }
46
240
  //# sourceMappingURL=scichart-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scichart-builder.js","sourceRoot":"","sources":["../../../src/scichart/scichart-builder.ts"],"names":[],"mappings":"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","sourcesContent":["export async function buildSciChart(\n config: OperatoChart.ChartConfig | undefined | null,\n container: any,\n { fontSize, fontFamily, fontColor }: { fontSize?: number; fontFamily?: string; fontColor?: string }\n): Promise<{ chart: any; dataSeries: any } | undefined> {\n if (!config) {\n return\n }\n\n const {\n SciChartSurface,\n SciChartDefaults,\n chartBuilder,\n SciChartJsNavyTheme,\n XyDataSeries,\n FastLineRenderableSeries,\n NumberRange,\n EAutoRange,\n EAxisAlignment,\n NumericAxis,\n DateTimeNumericAxis\n } = SciChart\n\n const { type: chartType, options, data: fromData } = config\n const {\n theme,\n animation,\n tooltip,\n stacked,\n legend,\n scales: fromScales,\n xGridLine,\n yGridLine,\n y2ndGridLine,\n multiAxis\n } = options || {}\n const { datasets = [] } = fromData || {}\n\n const { xAxes = [], yAxes = [] } = fromScales || {}\n const toScales = {} as any\n\n const chart = await SciChartSurface.create(container, {\n theme: new SciChartJsNavyTheme()\n })\n const { sciChartSurface, wasmContext } = chart\n\n xAxes.forEach((axis, index) => {\n const { axisTitle, barSpacing, categorySpacing, barPercentage, ticks } = axis\n const { autoMax, autoMin } = ticks || {}\n const id = xAxes.length > 1 ? `x${index + 1}` : 'x'\n\n const xAxis = new DateTimeNumericAxis(wasmContext, {\n axisTitle,\n autoRange: EAutoRange.Always,\n axisAlignment: EAxisAlignment.Bottom\n\n // visibleRange: new NumberRange(minDate.getTime() / 1000, maxDate.getTime() / 1000)\n })\n\n sciChartSurface.xAxes.add(xAxis)\n })\n\n yAxes.forEach((axis, index) => {\n const { axisTitle, barSpacing, categorySpacing, barPercentage, ticks } = axis\n const { autoMax, autoMin } = ticks || {}\n\n const id = yAxes.length > 1 ? `right` : 'left'\n\n const yAxis = new NumericAxis(wasmContext, {\n axisTitle,\n autoRange: EAutoRange.Always,\n axisAlignment: yAxes.length > 1 ? EAxisAlignment.Right : EAxisAlignment.Left\n })\n sciChartSurface.yAxes.add(yAxis)\n })\n\n const dataSeries = new XyDataSeries(wasmContext)\n\n const lineSeries = new FastLineRenderableSeries(wasmContext)\n lineSeries.strokeThickness = 2\n lineSeries.stroke = '#FF6600'\n lineSeries.dataSeries = dataSeries\n\n sciChartSurface.renderableSeries.add(lineSeries)\n\n return { chart, dataSeries }\n}\n"]}
1
+ {"version":3,"file":"scichart-builder.js","sourceRoot":"","sources":["../../../src/scichart/scichart-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,SAAS,qBAAqB,CAAC,KAAiC;IAC9D,OAAO,IAAI,SAAS,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACzD,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;AAC1G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmD,EACnD,SAAc,EACd,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAkE;IAEnG,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAM;IACR,CAAC;IAED,MAAM,EACJ,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACf,GAAG,QAAQ,CAAA;IAEZ,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAC3D,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAA;IACxC,IAAI,EACF,KAAK,EACL,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EAAE,UAAU,EAClB,SAAS,EACT,SAAS,EACT,YAAY,EACZ,OAAO,EACR,GAAG,OAAO,IAAI,EAAE,CAAA;IAEjB,IAAI,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAA;IAE5C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,KAAK,GAAG,mBAAmB,EAAE,CAAA;IAC/B,CAAC;IAED,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAA;IAErD,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,UAAU,IAAI,EAAE,CAAA;IAEnD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE;QACpD,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC,CAAC,IAAI,oBAAoB,EAAE;KAClF,CAAC,CAAA;IACF,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IAE9C,SAAS;IACT,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QACjC,MAAM,EACJ,OAAO,EACP,OAAO,EACP,GAAG,EACH,GAAG,EACH,QAAQ,EACR,WAAW,EACX,KAAK,GAAG,SAAS,EACjB,eAAe,GAAG,SAAS,EAC3B,OAAO,GAAG,CAAC,CAAC,SAAS,EACtB,GAAG,KAAK,IAAI,EAAE,CAAA;QAEf,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,WAAW,EAAE;YACjD,SAAS;YACT,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC7D,aAAa,EAAE,cAAc,CAAC,MAAM;YACpC,YAAY,EAAE,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5F,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,UAAU,EAAE;gBACV,UAAU;gBACV,QAAQ;gBACR,KAAK;aACN;YACD,cAAc,EAAE;gBACd,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,eAAe;aACvB;YACD,aAAa,EAAE,IAAI,sBAAsB,EAAE;SAC5C,CAAC,CAAA;QAEF,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,SAAS;IACT,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;QACjC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QAEzE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE;YACzC,EAAE,EAAE,QAAQ,KAAK,EAAE;YACnB,SAAS;YACT,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC7D,aAAa,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK;YACvE,YAAY,EAAE,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5F,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3D,UAAU,EAAE;gBACV,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,SAAS;aACjB;YACD,cAAc,EAAE;gBACd,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,SAAS;aACjB;SACF,CAAC,CAAA;QAEF,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,SAAS;IACT,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACtD,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE;YAC/C,cAAc,EAAE,OAAO,CAAC,KAAK;YAC7B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAA;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,KAAK,IAAI,CAAA;QAEzD,IAAI,MAAW,CAAA;QACf,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,6BAA6B,CAAC,WAAW,EAAE;oBACtD,UAAU;oBACV,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;oBACzC,IAAI,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;oBAC1C,OAAO;oBACP,cAAc,EAAE,YAAY;iBAC7B,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,IAAI,0BAA0B,CAAC,WAAW,EAAE;oBACnD,UAAU;oBACV,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;oBACzC,IAAI,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;oBAC1C,SAAS,EAAE,SAAS,IAAI,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;oBAC/E,OAAO;iBACR,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;YAC3C,IAAI,WAAW,CAAA;YAEf,QAAQ,UAAU,EAAE,CAAC;gBACnB,KAAK,QAAQ;oBACX,WAAW,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE;wBAChD,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;oBACF,MAAK;gBACP,KAAK,UAAU;oBACb,WAAW,GAAG,IAAI,mBAAmB,CAAC,WAAW,EAAE;wBACjD,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;oBACF,MAAK;gBACP,KAAK,MAAM;oBACT,WAAW,GAAG,IAAI,iBAAiB,CAAC,WAAW,EAAE;wBAC/C,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;oBACF,MAAK;gBACP,KAAK,OAAO;oBACV,WAAW,GAAG,IAAI,gBAAgB,CAAC,WAAW,EAAE;wBAC9C,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;oBACF,MAAK;gBACP,KAAK,UAAU;oBACb,WAAW,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE;wBAC1C,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;oBACF,MAAK;gBACP;oBACE,WAAW,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE;wBAChD,KAAK,EAAE,EAAE;wBACT,MAAM,EAAE,EAAE;wBACV,eAAe,EAAE,CAAC;wBAClB,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBAChC,MAAM,EAAE,SAAS;qBAClB,CAAC,CAAA;YACN,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,+BAA+B,CAAC,WAAW,EAAE;oBACxD,UAAU;oBACV,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;oBACzC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;oBAClC,IAAI,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;oBAC1C,OAAO;oBACP,cAAc,EAAE,YAAY;iBAC7B,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM;oBACJ,CAAC,CAAC,WAAW,IAAI,WAAW,GAAG,CAAC;wBAC9B,CAAC,CAAC,IAAI,0BAA0B,CAAC,WAAW,EAAE;4BAC1C,UAAU;4BACV,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;4BACzC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;4BAClC,WAAW;4BACX,SAAS,EAAE,SAAS,IAAI,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;4BAC/E,OAAO;yBACR,CAAC;wBACJ,CAAC,CAAC,IAAI,wBAAwB,CAAC,WAAW,EAAE;4BACxC,UAAU;4BACV,eAAe,EAAE,OAAO,CAAC,WAAW,IAAI,CAAC;4BACzC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;4BAClC,WAAW;4BACX,SAAS,EAAE,SAAS,IAAI,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;4BAC/E,OAAO;yBACR,CAAC,CAAA;YACV,CAAC;QACH,CAAC;QAED,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE5C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;gBAC5C,WAAW,EAAE,IAAI;gBACjB,cAAc,EAAE,IAAI;gBACpB,YAAY,EAAE,OAAO;gBACrB,sBAAsB,EAAE,oBAAoB;gBAC5C,kBAAkB,EAAE,UAAU;aAC/B,CAAC,CAAA;YAEF,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACtD,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAC,CAAA;IAEF,yBAAyB;IACzB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,CAAC,WAAW,CAAC,CAAA;QACxE,MAAM,yBAAyB,GAAG,IAAI,yBAAyB,CAAC,WAAW,CAAC,CAAA;QAE5E,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,EAAE;YACjE,IAAI,MAAM,YAAY,6BAA6B,EAAE,CAAC;gBACpD,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACrC,CAAC;iBAAM,IAAI,MAAM,YAAY,+BAA+B,EAAE,CAAC;gBAC7D,yBAAyB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YACvC,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,uBAAuB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACvC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QAC/D,CAAC;QAED,IAAI,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACzC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,eAAe,CAAC,cAAc,CAAC,GAAG,CAChC,IAAI,wBAAwB,EAAE,EAC9B,IAAI,sBAAsB,EAAE,EAC5B,IAAI,mBAAmB,EAAE,CAC1B,CAAA;IAED,YAAY;IACZ,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;YACxC,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,IAAI;YACvB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc;SAC7C,CAAC,CAAA;QACF,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IACpD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,CAAA;AAC/C,CAAC","sourcesContent":["import { TinyColor } from '@ctrl/tinycolor'\nimport { format as formatText } from '../utils/text-formatter'\n\nfunction getBaseColorFromTheme(theme?: 'light' | 'dark' | 'auto') {\n return new TinyColor(theme == 'dark' ? '#fff' : '#000')\n}\n\nfunction getThemeFromBrowser() {\n return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nexport async function buildSciChart(\n config: OperatoChart.ChartConfig | undefined | null,\n container: any,\n { fontSize, fontFamily, fontColor }: { fontSize?: number; fontFamily?: string; fontColor?: string }\n): Promise<{ chart: any; dataSeries: any[] } | undefined> {\n if (!config) {\n return\n }\n\n const {\n SciChartSurface,\n SciChartJSLightTheme,\n SciChartJSDarkv2Theme,\n XyDataSeries,\n FastLineRenderableSeries,\n SplineLineRenderableSeries,\n FastColumnRenderableSeries,\n StackedColumnRenderableSeries,\n StackedMountainRenderableSeries,\n StackedColumnCollection,\n StackedMountainCollection,\n NumericAxis,\n DateTimeNumericAxis,\n EAutoRange,\n EAxisAlignment,\n NumberRange,\n MouseWheelZoomModifier,\n RubberBandXyZoomModifier,\n ZoomExtentsModifier,\n RolloverModifier,\n SmartDateLabelProvider,\n EllipsePointMarker,\n SquarePointMarker,\n TrianglePointMarker,\n CrossPointMarker,\n XPointMarker,\n WaveAnimation,\n LegendModifier\n } = SciChart\n\n const { type: chartType, options, data: fromData } = config\n const { datasets = [] } = fromData || {}\n var {\n theme,\n tooltip,\n animation,\n legend,\n scales: fromScales,\n xGridLine,\n yGridLine,\n y2ndGridLine,\n stacked\n } = options || {}\n\n var baseColor = getBaseColorFromTheme(theme)\n\n if (theme === 'auto') {\n theme = getThemeFromBrowser()\n }\n\n fontColor = fontColor || baseColor.clone().toString()\n\n const { xAxes = [], yAxes = [] } = fromScales || {}\n\n const chart = await SciChartSurface.create(container, {\n theme: theme == 'dark' ? new SciChartJSDarkv2Theme() : new SciChartJSLightTheme()\n })\n const { sciChartSurface, wasmContext } = chart\n\n // X 축 설정\n xAxes.forEach((axis, index) => {\n const { axisTitle, ticks } = axis\n const {\n autoMax,\n autoMin,\n min,\n max,\n stepSize,\n beginAtZero,\n color = fontColor,\n textStrokeColor = fontColor,\n display = !!axisTitle\n } = ticks || {}\n\n const xAxis = new DateTimeNumericAxis(wasmContext, {\n axisTitle,\n autoRange: autoMin || autoMax ? EAutoRange.Always : undefined,\n axisAlignment: EAxisAlignment.Bottom,\n visibleRange: min !== undefined && max !== undefined ? new NumberRange(min, max) : undefined,\n majorDelta: stepSize,\n growBy: beginAtZero ? new NumberRange(0.1, 0.1) : undefined,\n labelStyle: {\n fontFamily,\n fontSize,\n color\n },\n axisTitleStyle: {\n fontFamily,\n fontSize,\n color: textStrokeColor\n },\n labelProvider: new SmartDateLabelProvider()\n })\n\n sciChartSurface.xAxes.add(xAxis)\n })\n\n // Y 축 설정\n yAxes.forEach((axis, index) => {\n const { axisTitle, ticks } = axis\n const { autoMax, autoMin, min, max, stepSize, beginAtZero } = ticks || {}\n\n const yAxis = new NumericAxis(wasmContext, {\n id: `yAxis${index}`,\n axisTitle,\n autoRange: autoMin || autoMax ? EAutoRange.Always : undefined,\n axisAlignment: index === 0 ? EAxisAlignment.Left : EAxisAlignment.Right,\n visibleRange: min !== undefined && max !== undefined ? new NumberRange(min, max) : undefined,\n majorDelta: stepSize,\n growBy: beginAtZero ? new NumberRange(0.1, 0.1) : undefined,\n labelStyle: {\n fontFamily,\n fontSize,\n color: fontColor\n },\n axisTitleStyle: {\n fontFamily,\n fontSize,\n color: fontColor\n }\n })\n\n sciChartSurface.yAxes.add(yAxis)\n })\n\n // 시리즈 설정\n const dataSeriesArray = datasets.map((dataset, index) => {\n const dataSeries = new XyDataSeries(wasmContext, {\n dataSeriesName: dataset.label,\n containsNaN: false\n })\n\n const yAxisId = dataset.yAxisID || 'yAxis0'\n const stackGroupId = dataset.stack || `__stack${index}__`\n\n let series: any\n if (dataset.type === 'bar') {\n if (stacked) {\n series = new StackedColumnRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: dataset.borderWidth || 2,\n fill: dataset.backgroundColor || '#FF6600',\n yAxisId,\n stackedGroupId: stackGroupId\n })\n } else {\n series = new FastColumnRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: dataset.borderWidth || 2,\n fill: dataset.backgroundColor || '#FF6600',\n animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),\n yAxisId\n })\n }\n } else {\n const { pointStyle, lineTension } = dataset\n let pointMarker\n\n switch (pointStyle) {\n case 'circle':\n pointMarker = new EllipsePointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n break\n case 'triangle':\n pointMarker = new TrianglePointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n break\n case 'rect':\n pointMarker = new SquarePointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n break\n case 'cross':\n pointMarker = new CrossPointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n break\n case 'crossRot':\n pointMarker = new XPointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n break\n default:\n pointMarker = new EllipsePointMarker(wasmContext, {\n width: 10,\n height: 10,\n strokeThickness: 2,\n fill: dataset.color || '#FF6600',\n stroke: '#000000'\n })\n }\n\n if (stacked) {\n series = new StackedMountainRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: dataset.borderWidth || 2,\n stroke: dataset.color || '#FF6600',\n fill: dataset.backgroundColor || '#FF6600',\n yAxisId,\n stackedGroupId: stackGroupId\n })\n } else {\n series =\n !!lineTension && lineTension > 0\n ? new SplineLineRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: dataset.borderWidth || 2,\n stroke: dataset.color || '#FF6600',\n pointMarker,\n animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),\n yAxisId\n })\n : new FastLineRenderableSeries(wasmContext, {\n dataSeries,\n strokeThickness: dataset.borderWidth || 2,\n stroke: dataset.color || '#FF6600',\n pointMarker,\n animation: animation && new WaveAnimation({ duration: 1000, fadeEffect: true }),\n yAxisId\n })\n }\n }\n\n sciChartSurface.renderableSeries.add(series)\n\n if (tooltip) {\n const rolloverModifier = new RolloverModifier({\n showTooltip: true,\n showAxisLabels: true,\n tooltipColor: 'white',\n tooltipBackgroundColor: 'rgba(0, 0, 0, 0.7)',\n rollOverDataSeries: dataSeries\n })\n\n sciChartSurface.chartModifiers.add(rolloverModifier)\n }\n\n return dataSeries\n })\n\n // Stacked collections 추가\n if (stacked) {\n const stackedColumnCollection = new StackedColumnCollection(wasmContext)\n const stackedMountainCollection = new StackedMountainCollection(wasmContext)\n\n sciChartSurface.renderableSeries.asArray().forEach((series: any) => {\n if (series instanceof StackedColumnRenderableSeries) {\n stackedColumnCollection.add(series)\n } else if (series instanceof StackedMountainRenderableSeries) {\n stackedMountainCollection.add(series)\n }\n })\n\n if (stackedColumnCollection.size() > 0) {\n sciChartSurface.renderableSeries.add(stackedColumnCollection)\n }\n\n if (stackedMountainCollection.size() > 0) {\n sciChartSurface.renderableSeries.add(stackedMountainCollection)\n }\n }\n\n // 줌인/줌아웃 모디파이어 추가\n sciChartSurface.chartModifiers.add(\n new RubberBandXyZoomModifier(),\n new MouseWheelZoomModifier(),\n new ZoomExtentsModifier()\n )\n\n // Legend 설정\n if (legend?.display) {\n const legendModifier = new LegendModifier({\n showCheckboxes: true,\n showSeriesMarkers: true,\n showLegend: true,\n placement: legend.position || 'bottom-right'\n })\n sciChartSurface.chartModifiers.add(legendModifier)\n }\n\n return { chart, dataSeries: dataSeriesArray }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  export declare function getDefaultChartConfig(type: OperatoChart.ChartType, datasets?: OperatoChart.Dataset[]): OperatoChart.ChartConfig;
2
2
  export declare function getDefaultAxisOptions(): OperatoChart.AxisOptions;
3
3
  export declare const data: {
4
- year: number;
4
+ timestamp: number;
5
5
  count: number;
6
6
  average: number;
7
7
  }[];
@@ -41,13 +41,35 @@ export function getDefaultAxisOptions() {
41
41
  }
42
42
  };
43
43
  }
44
- export const data = [
45
- { year: 2010, count: 10, average: 120 },
46
- { year: 2011, count: 20, average: 110 },
47
- { year: 2012, count: 15, average: 80 },
48
- { year: 2013, count: 25, average: 130 },
49
- { year: 2014, count: 22, average: 120 },
50
- { year: 2015, count: 30, average: 60 },
51
- { year: 2016, count: 28, average: 90 }
52
- ];
44
+ // export const data = [
45
+ // { timestamp: 2010, count: 10, average: 120 },
46
+ // { timestamp: 2011, count: 20, average: 110 },
47
+ // { timestamp: 2012, count: 15, average: 80 },
48
+ // { timestamp: 2013, count: 25, average: 130 },
49
+ // { timestamp: 2014, count: 22, average: 120 },
50
+ // { timestamp: 2015, count: 30, average: 60 },
51
+ // { timestamp: 2016, count: 28, average: 90 }
52
+ // ]
53
+ // 랜덤한 범위의 숫자를 생성하는 함수
54
+ function getRandomInRange(min, max) {
55
+ return Math.floor(Math.random() * (max - min + 1)) + min;
56
+ }
57
+ // 랜덤 데이터를 생성하는 함수
58
+ function generateRandomData(count) {
59
+ const randomData = [];
60
+ const startTimestamp = Math.floor(Date.now()); // 현재 시간을 Unix 타임스탬프로 설정
61
+ for (let i = 0; i < count; i++) {
62
+ const timestamp = startTimestamp + i * 360 * 30 * 1000; // 3초씩 증가하는 타임스탬프 설정
63
+ const randomCount = getRandomInRange(5, 35); // count 값을 5에서 35 사이로 랜덤 생성
64
+ const randomAverage = getRandomInRange(50, 150); // average 값을 50에서 150 사이로 랜덤 생성
65
+ randomData.push({
66
+ timestamp: timestamp,
67
+ count: randomCount,
68
+ average: randomAverage
69
+ });
70
+ }
71
+ return randomData;
72
+ }
73
+ // 100개의 랜덤 데이터를 생성
74
+ export const data = generateRandomData(100);
53
75
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../stories/common.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CACnC,IAA4B,EAC5B,QAAiC;IAEjC,OAAO;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,YAAY,EAAE,EAAE;SACjB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,KAAK;aAChB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBAChC,KAAK,EAAE,CAAC,qBAAqB,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC,oCAAoC;aAC/F;YACD,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK;SACjB;QACD,IAAI;KACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,GAAG;QAClB,KAAK,EAAE;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,SAAS;SACpB;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IACvC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IACvC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACtC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IACvC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;IACvC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;IACtC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;CACvC,CAAA","sourcesContent":["export function getDefaultChartConfig(\n type: OperatoChart.ChartType,\n datasets?: OperatoChart.Dataset[]\n): OperatoChart.ChartConfig {\n return {\n data: {\n datasets: datasets || [],\n labelDataKey: ''\n },\n options: {\n theme: 'light',\n tooltip: true,\n animation: true,\n legend: {\n display: true,\n position: 'top'\n },\n scales: {\n xAxes: [getDefaultAxisOptions()],\n yAxes: [getDefaultAxisOptions(), getDefaultAxisOptions()] // Two y-axes for multi-axis support\n },\n stacked: false,\n xGridLine: true,\n yGridLine: true,\n y2ndGridLine: false,\n multiAxis: false\n },\n type\n }\n}\n\nexport function getDefaultAxisOptions(): OperatoChart.AxisOptions {\n return {\n axisTitle: '',\n barSpacing: 0,\n categorySpacing: 0,\n barPercentage: 0.9,\n ticks: {\n display: true,\n autoMin: true,\n autoMax: true,\n min: undefined,\n max: undefined,\n stepSize: undefined\n }\n }\n}\n\nexport const data = [\n { year: 2010, count: 10, average: 120 },\n { year: 2011, count: 20, average: 110 },\n { year: 2012, count: 15, average: 80 },\n { year: 2013, count: 25, average: 130 },\n { year: 2014, count: 22, average: 120 },\n { year: 2015, count: 30, average: 60 },\n { year: 2016, count: 28, average: 90 }\n]\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../stories/common.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CACnC,IAA4B,EAC5B,QAAiC;IAEjC,OAAO;QACL,IAAI,EAAE;YACJ,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,YAAY,EAAE,EAAE;SACjB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,KAAK;aAChB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,qBAAqB,EAAE,CAAC;gBAChC,KAAK,EAAE,CAAC,qBAAqB,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC,oCAAoC;aAC/F;YACD,OAAO,EAAE,KAAK;YACd,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK;SACjB;QACD,IAAI;KACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,CAAC;QACb,eAAe,EAAE,CAAC;QAClB,aAAa,EAAE,GAAG;QAClB,KAAK,EAAE;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,SAAS;YACd,GAAG,EAAE,SAAS;YACd,QAAQ,EAAE,SAAS;SACpB;KACF,CAAA;AACH,CAAC;AAED,wBAAwB;AACxB,kDAAkD;AAClD,kDAAkD;AAClD,iDAAiD;AACjD,kDAAkD;AAClD,kDAAkD;AAClD,iDAAiD;AACjD,gDAAgD;AAChD,IAAI;AACJ,sBAAsB;AACtB,SAAS,gBAAgB,CAAC,GAAW,EAAE,GAAW;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;AAC1D,CAAC;AAED,kBAAkB;AAClB,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,UAAU,GAAG,EAAE,CAAA;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA,CAAC,wBAAwB;IAEtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,cAAc,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,oBAAoB;QAC3E,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA,CAAC,4BAA4B;QACxE,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA,CAAC,gCAAgC;QAEhF,UAAU,CAAC,IAAI,CAAC;YACd,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,aAAa;SACvB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,mBAAmB;AACnB,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA","sourcesContent":["export function getDefaultChartConfig(\n type: OperatoChart.ChartType,\n datasets?: OperatoChart.Dataset[]\n): OperatoChart.ChartConfig {\n return {\n data: {\n datasets: datasets || [],\n labelDataKey: ''\n },\n options: {\n theme: 'light',\n tooltip: true,\n animation: true,\n legend: {\n display: true,\n position: 'top'\n },\n scales: {\n xAxes: [getDefaultAxisOptions()],\n yAxes: [getDefaultAxisOptions(), getDefaultAxisOptions()] // Two y-axes for multi-axis support\n },\n stacked: false,\n xGridLine: true,\n yGridLine: true,\n y2ndGridLine: false,\n multiAxis: false\n },\n type\n }\n}\n\nexport function getDefaultAxisOptions(): OperatoChart.AxisOptions {\n return {\n axisTitle: '',\n barSpacing: 0,\n categorySpacing: 0,\n barPercentage: 0.9,\n ticks: {\n display: true,\n autoMin: true,\n autoMax: true,\n min: undefined,\n max: undefined,\n stepSize: undefined\n }\n }\n}\n\n// export const data = [\n// { timestamp: 2010, count: 10, average: 120 },\n// { timestamp: 2011, count: 20, average: 110 },\n// { timestamp: 2012, count: 15, average: 80 },\n// { timestamp: 2013, count: 25, average: 130 },\n// { timestamp: 2014, count: 22, average: 120 },\n// { timestamp: 2015, count: 30, average: 60 },\n// { timestamp: 2016, count: 28, average: 90 }\n// ]\n// 랜덤한 범위의 숫자를 생성하는 함수\nfunction getRandomInRange(min: number, max: number) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\n// 랜덤 데이터를 생성하는 함수\nfunction generateRandomData(count: number) {\n const randomData = []\n const startTimestamp = Math.floor(Date.now()) // 현재 시간을 Unix 타임스탬프로 설정\n\n for (let i = 0; i < count; i++) {\n const timestamp = startTimestamp + i * 360 * 30 * 1000 // 3초씩 증가하는 타임스탬프 설정\n const randomCount = getRandomInRange(5, 35) // count 값을 5에서 35 사이로 랜덤 생성\n const randomAverage = getRandomInRange(50, 150) // average 값을 50에서 150 사이로 랜덤 생성\n\n randomData.push({\n timestamp: timestamp,\n count: randomCount,\n average: randomAverage\n })\n }\n\n return randomData\n}\n\n// 100개의 랜덤 데이터를 생성\nexport const data = generateRandomData(100)\n"]}