@vuu-ui/vuu-chart 2.1.18 → 2.1.19-beta.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.
- package/package.json +9 -12
- package/src/Chart.css.js +42 -0
- package/src/Chart.js +64 -0
- package/src/ChartSeries.js +101 -0
- package/src/DataRowMovingWindow.js +64 -0
- package/src/index.js +2 -0
- package/src/useChartContextMenu.js +29 -0
- package/src/useChartOptions.js +76 -0
- package/cjs/Chart.css.js +0 -6
- package/cjs/Chart.css.js.map +0 -1
- package/cjs/Chart.js +0 -70
- package/cjs/Chart.js.map +0 -1
- package/cjs/ChartSeries.js +0 -130
- package/cjs/ChartSeries.js.map +0 -1
- package/cjs/DataRowMovingWindow.js +0 -97
- package/cjs/DataRowMovingWindow.js.map +0 -1
- package/cjs/index.js +0 -10
- package/cjs/index.js.map +0 -1
- package/cjs/useChartContextMenu.js +0 -41
- package/cjs/useChartContextMenu.js.map +0 -1
- package/cjs/useChartOptions.js +0 -87
- package/cjs/useChartOptions.js.map +0 -1
- package/esm/Chart.css.js +0 -4
- package/esm/Chart.css.js.map +0 -1
- package/esm/Chart.js +0 -68
- package/esm/Chart.js.map +0 -1
- package/esm/ChartSeries.js +0 -128
- package/esm/ChartSeries.js.map +0 -1
- package/esm/DataRowMovingWindow.js +0 -95
- package/esm/DataRowMovingWindow.js.map +0 -1
- package/esm/index.js +0 -3
- package/esm/index.js.map +0 -1
- package/esm/useChartContextMenu.js +0 -39
- package/esm/useChartContextMenu.js.map +0 -1
- package/esm/useChartOptions.js +0 -85
- package/esm/useChartOptions.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.1.
|
|
2
|
+
"version": "2.1.19-beta.2",
|
|
3
3
|
"description": "support for apache echarts using vuu data",
|
|
4
|
+
"type": "module",
|
|
4
5
|
"license": "Apache-2.0",
|
|
5
6
|
"devDependencies": {
|
|
6
|
-
"@vuu-ui/vuu-data-types": "2.1.
|
|
7
|
-
"@vuu-ui/vuu-protocol-types": "2.1.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "2.1.19-beta.2",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "2.1.19-beta.2"
|
|
8
9
|
},
|
|
9
10
|
"dependencies": {
|
|
10
11
|
"@salt-ds/styles": "0.2.1",
|
|
11
12
|
"@salt-ds/window": "0.1.1",
|
|
12
|
-
"@vuu-ui/vuu-context-menu": "2.1.
|
|
13
|
-
"@vuu-ui/vuu-utils": "2.1.
|
|
13
|
+
"@vuu-ui/vuu-context-menu": "2.1.19-beta.2",
|
|
14
|
+
"@vuu-ui/vuu-utils": "2.1.19-beta.2",
|
|
14
15
|
"clsx": "^2.0.0"
|
|
15
16
|
},
|
|
16
17
|
"peerDependencies": {
|
|
@@ -20,20 +21,16 @@
|
|
|
20
21
|
},
|
|
21
22
|
"files": [
|
|
22
23
|
"README.md",
|
|
23
|
-
"
|
|
24
|
-
"cjs",
|
|
24
|
+
"src",
|
|
25
25
|
"/types"
|
|
26
26
|
],
|
|
27
27
|
"exports": {
|
|
28
28
|
".": {
|
|
29
|
-
"
|
|
30
|
-
"import": "./esm/index.js",
|
|
29
|
+
"import": "./src/index.js",
|
|
31
30
|
"types": "./types/index.d.ts"
|
|
32
31
|
}
|
|
33
32
|
},
|
|
34
|
-
"
|
|
35
|
-
"module": "esm/index.js",
|
|
33
|
+
"module": "index.js",
|
|
36
34
|
"name": "@vuu-ui/vuu-chart",
|
|
37
|
-
"type": "module",
|
|
38
35
|
"types": "types/index.d.ts"
|
|
39
36
|
}
|
package/src/Chart.css.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const css = `
|
|
2
|
+
.vuuChartTooltip {
|
|
3
|
+
background-color: var(--salt-container-primary-background) !important;
|
|
4
|
+
border-color: var(--salt-selectable-borderColor-selected) !important;
|
|
5
|
+
font-family: var(--salt-text-fontFamily) !important;
|
|
6
|
+
border-radius: 6px !important;
|
|
7
|
+
|
|
8
|
+
& > div > div {
|
|
9
|
+
& > div:first-child {
|
|
10
|
+
color: var(--salt-content-primary-foreground) !important;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
& > div:nth-child(2) > div {
|
|
14
|
+
& > div {
|
|
15
|
+
align-items: center;
|
|
16
|
+
display: flex;
|
|
17
|
+
|
|
18
|
+
& span:first-child {
|
|
19
|
+
flex: 0 0 12px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
& span:nth-child(2) {
|
|
23
|
+
text-transform: capitalize;
|
|
24
|
+
flex: none;
|
|
25
|
+
color: var(--salt-content-secondary-foreground) !important;
|
|
26
|
+
font-size: var(--salt-text-label-fontSize) !important;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
& span:nth-child(3) {
|
|
30
|
+
text-align: right;
|
|
31
|
+
flex: auto;
|
|
32
|
+
color: var(--salt-content-primary-foreground) !important;
|
|
33
|
+
font-size: var(--salt-text-label-fontSize) !important;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
`;
|
|
42
|
+
export default css;
|
package/src/Chart.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { getInstanceByDom, init } from "echarts";
|
|
4
|
+
import { useComponentCssInjection } from "@salt-ds/styles";
|
|
5
|
+
import { useWindow } from "@salt-ds/window";
|
|
6
|
+
import { useChartOptions } from "./useChartOptions.js";
|
|
7
|
+
import { useChartContextMenu } from "./useChartContextMenu.js";
|
|
8
|
+
import clsx from "clsx";
|
|
9
|
+
import Chart from "./Chart.css";
|
|
10
|
+
const classBase = "vuuChart";
|
|
11
|
+
const Chart_Chart = ({ categoryColumnName, chartSettings = {
|
|
12
|
+
useCoarsePointer: true,
|
|
13
|
+
renderer: "svg"
|
|
14
|
+
}, className, dataSource, itemColorFunction, optionSettings = {
|
|
15
|
+
notMerge: true
|
|
16
|
+
}, palette, showTooltip, style = {
|
|
17
|
+
width: "100%",
|
|
18
|
+
height: "100%"
|
|
19
|
+
}, seriesColumnNames, ...htmlAttributes })=>{
|
|
20
|
+
const targetWindow = useWindow();
|
|
21
|
+
useComponentCssInjection({
|
|
22
|
+
testId: "vuu-toast-notification",
|
|
23
|
+
css: Chart,
|
|
24
|
+
window: targetWindow
|
|
25
|
+
});
|
|
26
|
+
const chartRef = useRef(null);
|
|
27
|
+
const option = useChartOptions({
|
|
28
|
+
categoryColumnName,
|
|
29
|
+
itemColorFunction,
|
|
30
|
+
palette,
|
|
31
|
+
dataSource,
|
|
32
|
+
seriesColumnNames,
|
|
33
|
+
showTooltip
|
|
34
|
+
});
|
|
35
|
+
const onContextMenu = useChartContextMenu({
|
|
36
|
+
categoryColumnName
|
|
37
|
+
});
|
|
38
|
+
useEffect(()=>{
|
|
39
|
+
const chart = init(chartRef.current, null, chartSettings);
|
|
40
|
+
chart.on("contextmenu", onContextMenu);
|
|
41
|
+
return ()=>{
|
|
42
|
+
chart?.dispose();
|
|
43
|
+
};
|
|
44
|
+
}, [
|
|
45
|
+
chartSettings,
|
|
46
|
+
onContextMenu
|
|
47
|
+
]);
|
|
48
|
+
useEffect(()=>{
|
|
49
|
+
if (chartRef.current) {
|
|
50
|
+
const chart = getInstanceByDom(chartRef.current);
|
|
51
|
+
chart?.setOption(option, optionSettings);
|
|
52
|
+
}
|
|
53
|
+
}, [
|
|
54
|
+
option,
|
|
55
|
+
optionSettings
|
|
56
|
+
]);
|
|
57
|
+
return /*#__PURE__*/ jsx("div", {
|
|
58
|
+
...htmlAttributes,
|
|
59
|
+
className: clsx(classBase, className),
|
|
60
|
+
ref: chartRef,
|
|
61
|
+
style: style
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
export { Chart_Chart as Chart };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { EventEmitter, Range, buildColumnMap, metadataKeys } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { MovingDataRowWindow } from "./DataRowMovingWindow.js";
|
|
3
|
+
const defaultItemColorFunction = ({ color })=>color;
|
|
4
|
+
const { KEY: KEY } = metadataKeys;
|
|
5
|
+
function DataSourceValue(key, row, value) {
|
|
6
|
+
return {
|
|
7
|
+
key,
|
|
8
|
+
row,
|
|
9
|
+
value
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getCategoriesAndSeries(columnMap, data, categoryColumn, seriesColumns, itemColorFunction = defaultItemColorFunction) {
|
|
13
|
+
const categoryValues = [];
|
|
14
|
+
const seriesMap = new Map();
|
|
15
|
+
data.forEach((row)=>{
|
|
16
|
+
const categoryValue = row[columnMap[categoryColumn]];
|
|
17
|
+
categoryValues.push(categoryValue);
|
|
18
|
+
for (const seriesColumn of seriesColumns){
|
|
19
|
+
let series = seriesMap.get(seriesColumn);
|
|
20
|
+
if (!series) {
|
|
21
|
+
series = {
|
|
22
|
+
id: seriesColumn,
|
|
23
|
+
name: seriesColumn,
|
|
24
|
+
label: seriesColumn,
|
|
25
|
+
data: [],
|
|
26
|
+
type: "line",
|
|
27
|
+
itemStyle: {
|
|
28
|
+
color: itemColorFunction
|
|
29
|
+
},
|
|
30
|
+
lineStyle: {
|
|
31
|
+
width: 1.5
|
|
32
|
+
},
|
|
33
|
+
symbol: "circle"
|
|
34
|
+
};
|
|
35
|
+
seriesMap.set(seriesColumn, series);
|
|
36
|
+
}
|
|
37
|
+
const key = row[KEY];
|
|
38
|
+
const value = row[columnMap[seriesColumn]];
|
|
39
|
+
series.data.push(DataSourceValue(key, row, value));
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return [
|
|
43
|
+
categoryValues,
|
|
44
|
+
Array.from(seriesMap.values())
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
class ChartSeries extends EventEmitter {
|
|
48
|
+
#categoryColumn = "";
|
|
49
|
+
#columnMap = {};
|
|
50
|
+
#itemColorFunction;
|
|
51
|
+
#dataWindow = new MovingDataRowWindow(Range(0, 1000));
|
|
52
|
+
#dates = [];
|
|
53
|
+
#series = [];
|
|
54
|
+
#seriesColumns = [];
|
|
55
|
+
handleData = (message)=>{
|
|
56
|
+
if ("subscribed" === message.type) this.#columnMap = buildColumnMap(message.tableSchema.columns);
|
|
57
|
+
else if ("viewport-update" === message.type) {
|
|
58
|
+
if ("size-only" === message.mode) ;
|
|
59
|
+
else if (message.rows) {
|
|
60
|
+
for (const row of message.rows)this.#dataWindow.add(row);
|
|
61
|
+
this.buildCategoriesAndSeries();
|
|
62
|
+
}
|
|
63
|
+
} else console.warn(JSON.stringify(message));
|
|
64
|
+
};
|
|
65
|
+
buildCategoriesAndSeries() {
|
|
66
|
+
if (this.#categoryColumn && this.#seriesColumns.length > 0) {
|
|
67
|
+
const [dates, series] = getCategoriesAndSeries(this.#columnMap, this.#dataWindow.data, this.#categoryColumn, this.#seriesColumns, this.#itemColorFunction);
|
|
68
|
+
this.#dates = dates;
|
|
69
|
+
this.#series = series;
|
|
70
|
+
this.emit("update");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
constructor({ dataSource, itemColorFunction }){
|
|
74
|
+
super();
|
|
75
|
+
this.#itemColorFunction = itemColorFunction;
|
|
76
|
+
dataSource.subscribe({
|
|
77
|
+
range: Range(0, 1000)
|
|
78
|
+
}, this.handleData);
|
|
79
|
+
}
|
|
80
|
+
get categoryColumn() {
|
|
81
|
+
return this.#categoryColumn;
|
|
82
|
+
}
|
|
83
|
+
set categoryColumn(categoryColumn) {
|
|
84
|
+
this.#categoryColumn = categoryColumn;
|
|
85
|
+
if (this.#seriesColumns.length > 0) this.buildCategoriesAndSeries();
|
|
86
|
+
}
|
|
87
|
+
get seriesColumnNames() {
|
|
88
|
+
return this.#seriesColumns;
|
|
89
|
+
}
|
|
90
|
+
set seriesColumnNames(seriesColumnNames) {
|
|
91
|
+
this.#seriesColumns = seriesColumnNames;
|
|
92
|
+
if (this.#categoryColumn) this.buildCategoriesAndSeries();
|
|
93
|
+
}
|
|
94
|
+
get categories() {
|
|
95
|
+
return this.#dates;
|
|
96
|
+
}
|
|
97
|
+
get series() {
|
|
98
|
+
return this.#series;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export { ChartSeries };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { WindowRange, metadataKeys } from "@vuu-ui/vuu-utils";
|
|
2
|
+
const { IDX: IDX, KEY: KEY } = metadataKeys;
|
|
3
|
+
class MovingDataRowWindow {
|
|
4
|
+
data;
|
|
5
|
+
rowCount = 0;
|
|
6
|
+
#range;
|
|
7
|
+
constructor({ from, to }){
|
|
8
|
+
this.#range = new WindowRange(from, to);
|
|
9
|
+
this.data = new Array(Math.max(0, to - from));
|
|
10
|
+
this.rowCount = 0;
|
|
11
|
+
}
|
|
12
|
+
setRowCount = (rowCount)=>{
|
|
13
|
+
if (rowCount < this.data.length) this.data.length = rowCount;
|
|
14
|
+
this.rowCount = rowCount;
|
|
15
|
+
};
|
|
16
|
+
add(data) {
|
|
17
|
+
const index = data[IDX];
|
|
18
|
+
if (this.isWithinRange(index)) {
|
|
19
|
+
const internalIndex = index - this.#range.from;
|
|
20
|
+
this.data[internalIndex] = data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getAtIndex(index) {
|
|
24
|
+
return this.#range.isWithin(index) && null != this.data[index - this.#range.from] ? this.data[index - this.#range.from] : void 0;
|
|
25
|
+
}
|
|
26
|
+
getByKey(key) {
|
|
27
|
+
return this.data.find((row)=>row[KEY] === key);
|
|
28
|
+
}
|
|
29
|
+
isWithinRange(index) {
|
|
30
|
+
return this.#range.isWithin(index);
|
|
31
|
+
}
|
|
32
|
+
setRange({ from, to }) {
|
|
33
|
+
if (from !== this.#range.from || to !== this.#range.to) {
|
|
34
|
+
const [overlapFrom, overlapTo] = this.#range.overlap(from, to);
|
|
35
|
+
const newData = new Array(Math.max(0, to - from));
|
|
36
|
+
for(let i = overlapFrom; i < overlapTo; i++){
|
|
37
|
+
const data = this.getAtIndex(i);
|
|
38
|
+
if (data) {
|
|
39
|
+
const index = i - from;
|
|
40
|
+
newData[index] = data;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
this.data = newData;
|
|
44
|
+
this.#range.from = from;
|
|
45
|
+
this.#range.to = to;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
get hasData() {
|
|
49
|
+
return this.data.some((d)=>void 0 !== d);
|
|
50
|
+
}
|
|
51
|
+
get firstRow() {
|
|
52
|
+
for(let i = 0; i < this.data.length; i++)if (this.data[i]) return this.data[i];
|
|
53
|
+
throw Error("[DataRowMovingWinddow] firstRow, no data");
|
|
54
|
+
}
|
|
55
|
+
get range() {
|
|
56
|
+
return this.#range;
|
|
57
|
+
}
|
|
58
|
+
get hasAllRowsWithinRange() {
|
|
59
|
+
const { from, to } = this.#range;
|
|
60
|
+
for(let i = from; i < to; i++)if (void 0 === this.getAtIndex(i)) return false;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export { MovingDataRowWindow };
|
package/src/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useContextMenu } from "@vuu-ui/vuu-context-menu";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
const useChartContextMenu = ({ categoryColumnName })=>{
|
|
4
|
+
const showContextMenu = useContextMenu();
|
|
5
|
+
const onContextMenu = useCallback(({ data, event, name: categoryValue, seriesName: valueColumn, value: keyedValue, ...rest })=>{
|
|
6
|
+
event.stop();
|
|
7
|
+
console.log({
|
|
8
|
+
rest
|
|
9
|
+
});
|
|
10
|
+
const { row, value } = data;
|
|
11
|
+
const menuOptions = {
|
|
12
|
+
categoryColumn: categoryColumnName,
|
|
13
|
+
categoryValue,
|
|
14
|
+
row,
|
|
15
|
+
valueColumn,
|
|
16
|
+
value
|
|
17
|
+
};
|
|
18
|
+
showContextMenu(event.event, "series", menuOptions, {
|
|
19
|
+
onOpenChange: (isOpen)=>{
|
|
20
|
+
console.log(`[useTableContextMenu] onOpenChange ${isOpen}`);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}, [
|
|
24
|
+
categoryColumnName,
|
|
25
|
+
showContextMenu
|
|
26
|
+
]);
|
|
27
|
+
return onContextMenu;
|
|
28
|
+
};
|
|
29
|
+
export { useChartContextMenu };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useMemo, useState } from "react";
|
|
2
|
+
import { ChartSeries } from "./ChartSeries.js";
|
|
3
|
+
import { itemsChanged } from "@vuu-ui/vuu-utils";
|
|
4
|
+
const defaultPalette = [
|
|
5
|
+
"#4676bf",
|
|
6
|
+
"#ab6528",
|
|
7
|
+
"#9f55c2",
|
|
8
|
+
"#2a8285",
|
|
9
|
+
"#697694",
|
|
10
|
+
"#B0549d"
|
|
11
|
+
];
|
|
12
|
+
const useChartOptions = ({ categoryColumnName, dataSource, itemColorFunction, palette = defaultPalette, seriesColumnNames, showTooltip = true })=>{
|
|
13
|
+
const [, forceRender] = useState({});
|
|
14
|
+
const chartSeries = useMemo(()=>{
|
|
15
|
+
console.log("new ChartSeries");
|
|
16
|
+
const cs = new ChartSeries({
|
|
17
|
+
itemColorFunction,
|
|
18
|
+
dataSource
|
|
19
|
+
});
|
|
20
|
+
cs.on("update", ()=>forceRender({}));
|
|
21
|
+
return cs;
|
|
22
|
+
}, [
|
|
23
|
+
dataSource,
|
|
24
|
+
itemColorFunction
|
|
25
|
+
]);
|
|
26
|
+
useMemo(()=>{
|
|
27
|
+
if (categoryColumnName !== chartSeries.categoryColumn) chartSeries.categoryColumn = categoryColumnName;
|
|
28
|
+
if (itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) chartSeries.seriesColumnNames = seriesColumnNames;
|
|
29
|
+
}, [
|
|
30
|
+
categoryColumnName,
|
|
31
|
+
chartSeries,
|
|
32
|
+
seriesColumnNames
|
|
33
|
+
]);
|
|
34
|
+
return {
|
|
35
|
+
animation: false,
|
|
36
|
+
color: palette,
|
|
37
|
+
dataZoom: [
|
|
38
|
+
{
|
|
39
|
+
backgroundColor: "var(--vuuChart-zoom-background, transparent)",
|
|
40
|
+
borderColor: "var(--vuuChart-zoom-borderColor, white)",
|
|
41
|
+
handleStyle: {
|
|
42
|
+
color: "var(--vuuChart-zoom-handleColor, white)"
|
|
43
|
+
},
|
|
44
|
+
moveHandleStyle: {
|
|
45
|
+
color: "var(--vuuChart-zoom-slideColor, white)"
|
|
46
|
+
},
|
|
47
|
+
type: "slider",
|
|
48
|
+
start: 0,
|
|
49
|
+
end: 100
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
grid: {
|
|
53
|
+
left: "0",
|
|
54
|
+
bottom: 0,
|
|
55
|
+
right: 5
|
|
56
|
+
},
|
|
57
|
+
series: chartSeries.series,
|
|
58
|
+
tooltip: showTooltip ? {
|
|
59
|
+
backgroundColor: "",
|
|
60
|
+
borderColor: "",
|
|
61
|
+
className: "vuuChartTooltip",
|
|
62
|
+
trigger: "axis"
|
|
63
|
+
} : void 0,
|
|
64
|
+
xAxis: {
|
|
65
|
+
data: chartSeries.categories
|
|
66
|
+
},
|
|
67
|
+
yAxis: {
|
|
68
|
+
splitLine: {
|
|
69
|
+
lineStyle: {
|
|
70
|
+
color: "var(--salt-separable-tertiary-borderColor)"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
export { useChartOptions };
|
package/cjs/Chart.css.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chartCss = "\n.vuuChartTooltip {\n background-color: var(--salt-container-primary-background) !important;\n border-color:var(--salt-selectable-borderColor-selected) !important;\n border-radius: 6px !important;\n font-family: var(--salt-text-fontFamily) !important;\n\n &> div > div {\n &>div:nth-child(1) {\n /* Title */\n color: var(--salt-content-primary-foreground) !important;\n }\n\n &>div:nth-child(2) > div {\n &>div {\n align-items: center;\n display: flex;\n /* Line item */\n span:nth-child(1){\n /* icon */\n flex: 0 0 12px\n }\n span:nth-child(2){\n /* label */\n color: var(--salt-content-secondary-foreground) !important;\n flex: 0 0 auto;\n font-size: var(--salt-text-label-fontSize) !important;\n text-transform: capitalize;\n }\n span:nth-child(3){\n /* value */\n flex: 1 1 auto;\n color: var(--salt-content-primary-foreground) !important;\n font-size: var(--salt-text-label-fontSize) !important;\n text-align: right;\n }\n }\n }\n\n } \n}";
|
|
4
|
-
|
|
5
|
-
module.exports = chartCss;
|
|
6
|
-
//# sourceMappingURL=Chart.css.js.map
|
package/cjs/Chart.css.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/cjs/Chart.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var react = require('react');
|
|
5
|
-
var echarts = require('echarts');
|
|
6
|
-
var styles = require('@salt-ds/styles');
|
|
7
|
-
var window = require('@salt-ds/window');
|
|
8
|
-
var useChartOptions = require('./useChartOptions.js');
|
|
9
|
-
var useChartContextMenu = require('./useChartContextMenu.js');
|
|
10
|
-
var cx = require('clsx');
|
|
11
|
-
var Chart$1 = require('./Chart.css.js');
|
|
12
|
-
|
|
13
|
-
const classBase = "vuuChart";
|
|
14
|
-
const Chart = ({
|
|
15
|
-
categoryColumnName,
|
|
16
|
-
chartSettings = { useCoarsePointer: true, renderer: "svg" },
|
|
17
|
-
// enables clicking near a line and still highlighting it
|
|
18
|
-
className,
|
|
19
|
-
dataSource,
|
|
20
|
-
itemColorFunction,
|
|
21
|
-
optionSettings = { notMerge: true },
|
|
22
|
-
// don't merge two options together when updating option
|
|
23
|
-
palette,
|
|
24
|
-
showTooltip,
|
|
25
|
-
style = { width: "100%", height: "100%" },
|
|
26
|
-
seriesColumnNames,
|
|
27
|
-
...htmlAttributes
|
|
28
|
-
}) => {
|
|
29
|
-
const targetWindow = window.useWindow();
|
|
30
|
-
styles.useComponentCssInjection({
|
|
31
|
-
testId: "vuu-toast-notification",
|
|
32
|
-
css: Chart$1,
|
|
33
|
-
window: targetWindow
|
|
34
|
-
});
|
|
35
|
-
const chartRef = react.useRef(null);
|
|
36
|
-
const option = useChartOptions.useChartOptions({
|
|
37
|
-
categoryColumnName,
|
|
38
|
-
itemColorFunction,
|
|
39
|
-
palette,
|
|
40
|
-
dataSource,
|
|
41
|
-
seriesColumnNames,
|
|
42
|
-
showTooltip
|
|
43
|
-
});
|
|
44
|
-
const onContextMenu = useChartContextMenu.useChartContextMenu({ categoryColumnName });
|
|
45
|
-
react.useEffect(() => {
|
|
46
|
-
const chart = echarts.init(chartRef.current, null, chartSettings);
|
|
47
|
-
chart.on("contextmenu", onContextMenu);
|
|
48
|
-
return () => {
|
|
49
|
-
chart?.dispose();
|
|
50
|
-
};
|
|
51
|
-
}, [chartSettings, onContextMenu]);
|
|
52
|
-
react.useEffect(() => {
|
|
53
|
-
if (chartRef.current) {
|
|
54
|
-
const chart = echarts.getInstanceByDom(chartRef.current);
|
|
55
|
-
chart?.setOption(option, optionSettings);
|
|
56
|
-
}
|
|
57
|
-
}, [option, optionSettings]);
|
|
58
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
-
"div",
|
|
60
|
-
{
|
|
61
|
-
...htmlAttributes,
|
|
62
|
-
className: cx(classBase, className),
|
|
63
|
-
ref: chartRef,
|
|
64
|
-
style
|
|
65
|
-
}
|
|
66
|
-
);
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
exports.Chart = Chart;
|
|
70
|
-
//# sourceMappingURL=Chart.js.map
|
package/cjs/Chart.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Chart.js","sources":["../../../packages/vuu-chart/src/Chart.tsx"],"sourcesContent":["import { useRef, useEffect, HTMLAttributes } from \"react\";\nimport { init, getInstanceByDom } from \"echarts\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ChartOptionsProps, useChartOptions } from \"./useChartOptions\";\nimport { useChartContextMenu } from \"./useChartContextMenu\";\nimport cx from \"clsx\";\n\nimport { ItemColorFunction } from \"./ChartSeries\";\n\nimport chartCss from \"./Chart.css\";\n\nconst classBase = \"vuuChart\";\n\ntype OptionSettings = {\n notMerge: boolean;\n};\n\ntype ChartSettings = {\n renderer: \"svg\" | \"canvas\";\n useCoarsePointer: boolean;\n};\n\nexport interface ChartProps\n extends ChartOptionsProps,\n HTMLAttributes<HTMLDivElement> {\n chartSettings?: ChartSettings;\n itemColorFunction?: ItemColorFunction;\n optionSettings?: OptionSettings;\n palette?: string[];\n showTooltip?: boolean;\n}\n\nexport const Chart = ({\n categoryColumnName,\n chartSettings = { useCoarsePointer: true, renderer: \"svg\" }, // enables clicking near a line and still highlighting it\n className,\n dataSource,\n itemColorFunction,\n optionSettings = { notMerge: true }, // don't merge two options together when updating option\n palette,\n showTooltip,\n style = { width: \"100%\", height: \"100%\" },\n seriesColumnNames,\n ...htmlAttributes\n}: ChartProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-toast-notification\",\n css: chartCss,\n window: targetWindow,\n });\n\n const chartRef = useRef<HTMLDivElement>(null);\n\n const option = useChartOptions({\n categoryColumnName,\n itemColorFunction,\n palette,\n dataSource,\n seriesColumnNames,\n showTooltip,\n });\n\n const onContextMenu = useChartContextMenu({ categoryColumnName });\n\n // Debounce resize event so it only fires periodically instead of constantly\n // const resizeChart = useMemo(\n // () =>\n // debounce(() => {\n // if (chartRef.current) {\n // const chart = getInstanceByDom(chartRef.current);\n // chart.resize();\n // }\n // }, 100),\n // [],\n // );\n\n useEffect(() => {\n // Initialize chart\n const chart = init(chartRef.current, null, chartSettings);\n\n chart.on(\"contextmenu\", onContextMenu);\n\n // Resize event listener\n // const resizeObserver = new ResizeObserver(() => {\n // resizeChart();\n // });\n\n // resizeObserver.observe(chartRef.current);\n\n // Return cleanup function\n return () => {\n chart?.dispose();\n\n // if (chartRef.current) {\n // resizeObserver.unobserve(chartRef.current);\n // }\n // resizeObserver.disconnect();\n };\n }, [chartSettings, onContextMenu]);\n\n useEffect(() => {\n if (chartRef.current) {\n // Re-render chart when option changes\n const chart = getInstanceByDom(chartRef.current);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n chart?.setOption(option, optionSettings);\n }\n }, [option, optionSettings]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={chartRef}\n style={style}\n />\n );\n};\n"],"names":["useWindow","useComponentCssInjection","chartCss","useRef","useChartOptions","useChartContextMenu","useEffect","init","getInstanceByDom","jsx"],"mappings":";;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,UAAA;AAqBX,MAAM,QAAQ,CAAC;AAAA,EACpB,kBAAA;AAAA,EACA,aAAgB,GAAA,EAAE,gBAAkB,EAAA,IAAA,EAAM,UAAU,KAAM,EAAA;AAAA;AAAA,EAC1D,SAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA,GAAiB,EAAE,QAAA,EAAU,IAAK,EAAA;AAAA;AAAA,EAClC,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAQ,GAAA,EAAE,KAAO,EAAA,MAAA,EAAQ,QAAQ,MAAO,EAAA;AAAA,EACxC,iBAAA;AAAA,EACA,GAAG;AACL,CAAkB,KAAA;AAChB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAAC,OAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,QAAA,GAAWC,aAAuB,IAAI,CAAA;AAE5C,EAAA,MAAM,SAASC,+BAAgB,CAAA;AAAA,IAC7B,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAgB,GAAAC,uCAAA,CAAoB,EAAE,kBAAA,EAAoB,CAAA;AAchE,EAAAC,eAAA,CAAU,MAAM;AAEd,IAAA,MAAM,KAAQ,GAAAC,YAAA,CAAK,QAAS,CAAA,OAAA,EAAS,MAAM,aAAa,CAAA;AAExD,IAAM,KAAA,CAAA,EAAA,CAAG,eAAe,aAAa,CAAA;AAUrC,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,EAAO,OAAQ,EAAA;AAAA,KAMjB;AAAA,GACC,EAAA,CAAC,aAAe,EAAA,aAAa,CAAC,CAAA;AAEjC,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAS,EAAA;AAEpB,MAAM,MAAA,KAAA,GAAQE,wBAAiB,CAAA,QAAA,CAAS,OAAO,CAAA;AAG/C,MAAO,KAAA,EAAA,SAAA,CAAU,QAAQ,cAAc,CAAA;AAAA;AACzC,GACC,EAAA,CAAC,MAAQ,EAAA,cAAc,CAAC,CAAA;AAE3B,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,QAAA;AAAA,MACL;AAAA;AAAA,GACF;AAEJ;;;;"}
|
package/cjs/ChartSeries.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
var DataRowMovingWindow = require('./DataRowMovingWindow.js');
|
|
5
|
-
|
|
6
|
-
var __defProp = Object.defineProperty;
|
|
7
|
-
var __typeError = (msg) => {
|
|
8
|
-
throw TypeError(msg);
|
|
9
|
-
};
|
|
10
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
12
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
13
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
14
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
15
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
16
|
-
var _categoryColumn, _columnMap, _itemColorFunction, _dataWindow, _dates, _series, _seriesColumns;
|
|
17
|
-
const defaultItemColorFunction = ({ color }) => color;
|
|
18
|
-
const { KEY } = vuuUtils.metadataKeys;
|
|
19
|
-
function DataSourceValue(key, row, value) {
|
|
20
|
-
return { key, row, value };
|
|
21
|
-
}
|
|
22
|
-
function getCategoriesAndSeries(columnMap, data, categoryColumn, seriesColumns, itemColorFunction = defaultItemColorFunction) {
|
|
23
|
-
const categoryValues = [];
|
|
24
|
-
const seriesMap = /* @__PURE__ */ new Map();
|
|
25
|
-
data.forEach((row) => {
|
|
26
|
-
const categoryValue = row[columnMap[categoryColumn]];
|
|
27
|
-
categoryValues.push(categoryValue);
|
|
28
|
-
for (const seriesColumn of seriesColumns) {
|
|
29
|
-
let series = seriesMap.get(seriesColumn);
|
|
30
|
-
if (!series) {
|
|
31
|
-
series = {
|
|
32
|
-
//any reason we can't simply use col name here ?
|
|
33
|
-
id: seriesColumn,
|
|
34
|
-
name: seriesColumn,
|
|
35
|
-
label: seriesColumn,
|
|
36
|
-
data: [],
|
|
37
|
-
type: "line",
|
|
38
|
-
itemStyle: {
|
|
39
|
-
color: itemColorFunction
|
|
40
|
-
},
|
|
41
|
-
lineStyle: {
|
|
42
|
-
width: 1.5
|
|
43
|
-
},
|
|
44
|
-
symbol: "circle"
|
|
45
|
-
};
|
|
46
|
-
seriesMap.set(seriesColumn, series);
|
|
47
|
-
}
|
|
48
|
-
const key = row[KEY];
|
|
49
|
-
const value = row[columnMap[seriesColumn]];
|
|
50
|
-
series.data.push(DataSourceValue(key, row, value));
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
return [categoryValues, Array.from(seriesMap.values())];
|
|
54
|
-
}
|
|
55
|
-
class ChartSeries extends vuuUtils.EventEmitter {
|
|
56
|
-
constructor({ dataSource, itemColorFunction }) {
|
|
57
|
-
super();
|
|
58
|
-
__privateAdd(this, _categoryColumn, "");
|
|
59
|
-
__privateAdd(this, _columnMap, {});
|
|
60
|
-
__privateAdd(this, _itemColorFunction);
|
|
61
|
-
__privateAdd(this, _dataWindow, new DataRowMovingWindow.MovingDataRowWindow(vuuUtils.Range(0, 1e3)));
|
|
62
|
-
__privateAdd(this, _dates, []);
|
|
63
|
-
__privateAdd(this, _series, []);
|
|
64
|
-
__privateAdd(this, _seriesColumns, []);
|
|
65
|
-
__publicField(this, "handleData", (message) => {
|
|
66
|
-
if (message.type === "subscribed") {
|
|
67
|
-
__privateSet(this, _columnMap, vuuUtils.buildColumnMap(message.tableSchema.columns));
|
|
68
|
-
} else if (message.type === "viewport-update") {
|
|
69
|
-
if (message.mode === "size-only") ; else if (message.rows) {
|
|
70
|
-
for (const row of message.rows) {
|
|
71
|
-
__privateGet(this, _dataWindow).add(row);
|
|
72
|
-
}
|
|
73
|
-
this.buildCategoriesAndSeries();
|
|
74
|
-
}
|
|
75
|
-
} else {
|
|
76
|
-
console.warn(JSON.stringify(message));
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
__privateSet(this, _itemColorFunction, itemColorFunction);
|
|
80
|
-
dataSource.subscribe({ range: vuuUtils.Range(0, 1e3) }, this.handleData);
|
|
81
|
-
}
|
|
82
|
-
buildCategoriesAndSeries() {
|
|
83
|
-
if (__privateGet(this, _categoryColumn) && __privateGet(this, _seriesColumns).length > 0) {
|
|
84
|
-
const [dates, series] = getCategoriesAndSeries(
|
|
85
|
-
__privateGet(this, _columnMap),
|
|
86
|
-
__privateGet(this, _dataWindow).data,
|
|
87
|
-
__privateGet(this, _categoryColumn),
|
|
88
|
-
__privateGet(this, _seriesColumns),
|
|
89
|
-
__privateGet(this, _itemColorFunction)
|
|
90
|
-
);
|
|
91
|
-
__privateSet(this, _dates, dates);
|
|
92
|
-
__privateSet(this, _series, series);
|
|
93
|
-
this.emit("update");
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
get categoryColumn() {
|
|
97
|
-
return __privateGet(this, _categoryColumn);
|
|
98
|
-
}
|
|
99
|
-
set categoryColumn(categoryColumn) {
|
|
100
|
-
__privateSet(this, _categoryColumn, categoryColumn);
|
|
101
|
-
if (__privateGet(this, _seriesColumns).length > 0) {
|
|
102
|
-
this.buildCategoriesAndSeries();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
get seriesColumnNames() {
|
|
106
|
-
return __privateGet(this, _seriesColumns);
|
|
107
|
-
}
|
|
108
|
-
set seriesColumnNames(seriesColumnNames) {
|
|
109
|
-
__privateSet(this, _seriesColumns, seriesColumnNames);
|
|
110
|
-
if (__privateGet(this, _categoryColumn)) {
|
|
111
|
-
this.buildCategoriesAndSeries();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
get categories() {
|
|
115
|
-
return __privateGet(this, _dates);
|
|
116
|
-
}
|
|
117
|
-
get series() {
|
|
118
|
-
return __privateGet(this, _series);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
_categoryColumn = new WeakMap();
|
|
122
|
-
_columnMap = new WeakMap();
|
|
123
|
-
_itemColorFunction = new WeakMap();
|
|
124
|
-
_dataWindow = new WeakMap();
|
|
125
|
-
_dates = new WeakMap();
|
|
126
|
-
_series = new WeakMap();
|
|
127
|
-
_seriesColumns = new WeakMap();
|
|
128
|
-
|
|
129
|
-
exports.ChartSeries = ChartSeries;
|
|
130
|
-
//# sourceMappingURL=ChartSeries.js.map
|
package/cjs/ChartSeries.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChartSeries.js","sources":["../../../packages/vuu-chart/src/ChartSeries.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribeCallback,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n Range,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\nimport { MovingDataRowWindow } from \"./DataRowMovingWindow\";\n\ntype Series = {\n id: string;\n name: string;\n label: string;\n data: DataSourceValue<number>[];\n lineStyle: {\n width: number;\n };\n itemStyle: {\n color: string | ItemColorFunction;\n };\n symbol: \"emptyCircle\" | \"circle\";\n type: \"line\";\n};\n\nexport type ItemColorFunction = (params: {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n seriesName: string;\n}) => string;\n\nconst defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue<T extends VuuRowDataItemType = number> = {\n key: string;\n readonly row: DataSourceRow;\n value: T;\n};\n\nfunction DataSourceValue<T extends VuuRowDataItemType = number>(\n key: string,\n row: DataSourceRow,\n value: T,\n): DataSourceValue<T> {\n return { key, row, value };\n}\n\nfunction getCategoriesAndSeries(\n columnMap: ColumnMap,\n data: DataSourceRow[],\n categoryColumn: string,\n seriesColumns: string[],\n itemColorFunction = defaultItemColorFunction,\n): [string[], Series[]] {\n const categoryValues: string[] = [];\n const seriesMap = new Map<string, Series>();\n\n data.forEach((row) => {\n const categoryValue = row[columnMap[categoryColumn]] as string;\n categoryValues.push(categoryValue);\n\n for (const seriesColumn of seriesColumns) {\n let series = seriesMap.get(seriesColumn);\n if (!series) {\n series = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n };\n seriesMap.set(seriesColumn, series);\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n series.data.push(DataSourceValue(key, row, value));\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values())];\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn = \"\";\n #columnMap: ColumnMap = {};\n #itemColorFunction: ItemColorFunction | undefined;\n #dataWindow = new MovingDataRowWindow(Range(0, 1000));\n\n #dates: string[] = [];\n #series: Series[] = [];\n #seriesColumns: string[] = [];\n\n handleData: DataSourceSubscribeCallback = (message) => {\n if (message.type === \"subscribed\") {\n this.#columnMap = buildColumnMap(message.tableSchema.columns);\n } else if (message.type === \"viewport-update\") {\n if (message.mode === \"size-only\") {\n // ???\n } else if (message.rows) {\n for (const row of message.rows) {\n this.#dataWindow.add(row);\n }\n this.buildCategoriesAndSeries();\n }\n } else {\n console.warn(JSON.stringify(message));\n }\n };\n\n buildCategoriesAndSeries() {\n if (this.#categoryColumn && this.#seriesColumns.length > 0) {\n const [dates, series] = getCategoriesAndSeries(\n this.#columnMap,\n this.#dataWindow.data,\n this.#categoryColumn,\n this.#seriesColumns,\n this.#itemColorFunction,\n );\n this.#dates = dates;\n this.#series = series;\n\n this.emit(\"update\");\n }\n }\n\n constructor({ dataSource, itemColorFunction }: ChartSeriesConstructorProps) {\n super();\n this.#itemColorFunction = itemColorFunction;\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get categoryColumn() {\n return this.#categoryColumn;\n }\n\n set categoryColumn(categoryColumn: string) {\n this.#categoryColumn = categoryColumn;\n if (this.#seriesColumns.length > 0) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get seriesColumnNames() {\n return this.#seriesColumns;\n }\n\n set seriesColumnNames(seriesColumnNames: string[]) {\n this.#seriesColumns = seriesColumnNames;\n if (this.#categoryColumn) {\n this.buildCategoriesAndSeries();\n }\n }\n\n get categories() {\n return this.#dates;\n }\n\n get series() {\n return this.#series;\n }\n}\n"],"names":["metadataKeys","EventEmitter","MovingDataRowWindow","Range","buildColumnMap"],"mappings":"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"}
|