@vuu-ui/vuu-chart 2.1.19-beta.1 → 2.1.19-beta.3

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 (49) hide show
  1. package/cjs/Chart.css.js +6 -0
  2. package/cjs/Chart.css.js.map +1 -0
  3. package/cjs/Chart.js +89 -0
  4. package/cjs/Chart.js.map +1 -0
  5. package/cjs/ChartSeries.js +183 -0
  6. package/cjs/ChartSeries.js.map +1 -0
  7. package/cjs/DataRowMovingWindow.js +97 -0
  8. package/cjs/DataRowMovingWindow.js.map +1 -0
  9. package/cjs/chart-types.js +6 -0
  10. package/cjs/chart-types.js.map +1 -0
  11. package/cjs/chartTooltip.js +27 -0
  12. package/cjs/chartTooltip.js.map +1 -0
  13. package/cjs/index.js +10 -0
  14. package/cjs/index.js.map +1 -0
  15. package/cjs/useChartContextMenu.js +29 -0
  16. package/cjs/useChartContextMenu.js.map +1 -0
  17. package/cjs/useChartOptions.js +101 -0
  18. package/cjs/useChartOptions.js.map +1 -0
  19. package/cjs/useChartSelection.js +72 -0
  20. package/cjs/useChartSelection.js.map +1 -0
  21. package/esm/Chart.css.js +4 -0
  22. package/esm/Chart.css.js.map +1 -0
  23. package/esm/Chart.js +87 -0
  24. package/esm/Chart.js.map +1 -0
  25. package/esm/ChartSeries.js +181 -0
  26. package/esm/ChartSeries.js.map +1 -0
  27. package/esm/DataRowMovingWindow.js +95 -0
  28. package/esm/DataRowMovingWindow.js.map +1 -0
  29. package/esm/chart-types.js +4 -0
  30. package/esm/chart-types.js.map +1 -0
  31. package/esm/chartTooltip.js +25 -0
  32. package/esm/chartTooltip.js.map +1 -0
  33. package/esm/index.js +3 -0
  34. package/esm/index.js.map +1 -0
  35. package/esm/useChartContextMenu.js +27 -0
  36. package/esm/useChartContextMenu.js.map +1 -0
  37. package/esm/useChartOptions.js +99 -0
  38. package/esm/useChartOptions.js.map +1 -0
  39. package/esm/useChartSelection.js +70 -0
  40. package/esm/useChartSelection.js.map +1 -0
  41. package/package.json +11 -8
  42. package/types/Chart.d.ts +13 -4
  43. package/types/ChartSeries.d.ts +10 -27
  44. package/types/chart-types.d.ts +42 -0
  45. package/types/chartTooltip.d.ts +12 -0
  46. package/types/index.d.ts +4 -2
  47. package/types/useChartContextMenu.d.ts +7 -7
  48. package/types/useChartOptions.d.ts +19 -3
  49. package/types/useChartSelection.d.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartOptions.js","sources":["../../../packages/vuu-chart/src/useChartOptions.ts"],"sourcesContent":["import { DataSource, DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { ColumnMap, itemsChanged } from \"@vuu-ui/vuu-utils\";\nimport { type EChartsCoreOption } from \"echarts\";\nimport { useMemo, useState } from \"react\";\nimport type {\n ChartSelectionModel,\n ItemColorFunction,\n SymbolSize,\n SymbolSizeFunction,\n SymbolType,\n} from \"./chart-types\";\nimport { ChartSeries } from \"./ChartSeries\";\nimport { chartTooltip } from \"./chartTooltip\";\n\nconst defaultPalette = [\n \"#4676bf\",\n \"#ab6528\",\n \"#9f55c2\",\n \"#2a8285\",\n \"#697694\",\n \"#B0549d\",\n];\n\nexport interface ChartConfig {\n itemColorFunction?: ItemColorFunction;\n selectionModel?: ChartSelectionModel;\n symbolSize?: SymbolSize;\n}\n\nexport interface DataExclusionOptions {\n isExcludedData: (\n row: DataSourceRow,\n columnMap: ColumnMap,\n column: string,\n ) => boolean;\n /**\n * An embedded SVG path. If provided, will be used to render excluded values.\n */\n symbol?: SymbolType;\n}\n\nexport interface ChartOptionsProps {\n categoryColumnName: string;\n config: ChartConfig;\n dataExclusions?: DataExclusionOptions;\n dataSource: DataSource;\n itemColorFunction?: ItemColorFunction;\n palette?: string[];\n seriesColumnNames: string[];\n showTooltip?: boolean;\n symbolSizeFunction?: SymbolSizeFunction;\n}\n\nconst combineConfig = (config: ChartConfig, overrides: ChartConfig) => {\n return {\n ...config,\n ...overrides,\n };\n};\n\nexport const useChartOptions = ({\n categoryColumnName,\n config,\n dataExclusions,\n dataSource,\n itemColorFunction,\n palette = defaultPalette,\n seriesColumnNames,\n showTooltip = true,\n symbolSizeFunction: symbolSize,\n}: ChartOptionsProps) => {\n const [, forceRender] = useState({});\n\n const chartSeries = useMemo(() => {\n const cs = new ChartSeries({\n config: combineConfig(config, { itemColorFunction, symbolSize }),\n dataExclusions,\n dataSource,\n palette,\n });\n cs.on(\"update\", () => forceRender({}));\n return cs;\n }, [dataSource, config]);\n\n useMemo(() => {\n if (categoryColumnName !== chartSeries.categoryColumn) {\n chartSeries.categoryColumn = categoryColumnName;\n }\n if (itemsChanged(seriesColumnNames, chartSeries.seriesColumnNames)) {\n chartSeries.seriesColumnNames = seriesColumnNames;\n }\n }, [categoryColumnName, chartSeries, seriesColumnNames]);\n\n return {\n animation: false,\n color: chartSeries.palette,\n dataZoom: [\n {\n backgroundColor: \"var(--vuuChart-zoom-background, transparent)\",\n borderColor: \"var(--vuuChart-zoom-borderColor, white)\",\n handleStyle: {\n color: \"var(--vuuChart-zoom-handleColor, white)\",\n },\n moveHandleStyle: {\n color: \"var(--vuuChart-zoom-slideColor, white)\",\n },\n type: \"slider\",\n start: 0,\n end: 100,\n },\n ],\n grid: {\n left: \"0\",\n bottom: 0,\n right: 5,\n },\n series: chartSeries.series,\n tooltip: showTooltip\n ? {\n alwaysShowContent: true,\n backgroundColor: \"\",\n borderColor: \"\",\n // borderWidth: \"\",\n className: \"vuuChartTooltip\",\n enterable: true,\n formatter: chartTooltip,\n // padding: \"\",\n trigger: \"axis\",\n }\n : undefined,\n xAxis: {\n data: chartSeries.categories,\n },\n yAxis: {\n splitLine: {\n lineStyle: {\n color: \"var(--salt-separable-tertiary-borderColor)\",\n },\n },\n },\n } as EChartsCoreOption;\n};\n"],"names":["useState","useMemo","ChartSeries","itemsChanged","chartTooltip"],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ const dataItemMatch = (dataItem, targetSeries, targetKey) => dataItem?.column === targetSeries && dataItem?.key === targetKey;
6
+ const dataItemInList = (dataItems, targetColumn, targetKey) => dataItems.some(
7
+ (dataItem) => dataItemMatch(dataItem, targetColumn, targetKey)
8
+ );
9
+ const useChartSelection = (_props) => {
10
+ const [selectedKeys, setSelectedKeys] = react.useState([]);
11
+ const [, setHighlightedKey] = react.useState();
12
+ const selectedKeysRef = react.useRef(selectedKeys);
13
+ const highlightedKeyRef = react.useRef(void 0);
14
+ const handleClick = react.useCallback(
15
+ ({ data, event, seriesName: column }) => {
16
+ if (column) {
17
+ event?.stop();
18
+ const { row } = data;
19
+ const key = row[6];
20
+ setSelectedKeys((currentSelection) => {
21
+ return selectedKeysRef.current = dataItemInList(
22
+ currentSelection,
23
+ column,
24
+ key
25
+ ) ? [] : [{ column, key }];
26
+ });
27
+ }
28
+ },
29
+ []
30
+ );
31
+ const handleMouseOver = react.useCallback(
32
+ ({ data, seriesName }) => {
33
+ if (seriesName) {
34
+ const { row } = data;
35
+ setHighlightedKey(
36
+ highlightedKeyRef.current = { column: seriesName, key: row[6] }
37
+ );
38
+ }
39
+ },
40
+ []
41
+ );
42
+ const handleMouseOut = react.useCallback(() => {
43
+ setHighlightedKey(highlightedKeyRef.current = void 0);
44
+ }, []);
45
+ const itemColorFunction = react.useCallback(
46
+ ({ color, data, seriesName }) => {
47
+ return dataItemInList(selectedKeysRef.current, seriesName, data.key) ? "purple" : color;
48
+ },
49
+ []
50
+ );
51
+ const symbolSizeFunction = react.useCallback(
52
+ (value, { data, seriesName }) => {
53
+ const isSelected = dataItemInList(
54
+ selectedKeysRef.current,
55
+ seriesName,
56
+ data.key
57
+ );
58
+ return isSelected || dataItemMatch(highlightedKeyRef.current, seriesName, data.key) ? 16 : 6;
59
+ },
60
+ []
61
+ );
62
+ return {
63
+ onClick: handleClick,
64
+ onMouseOver: handleMouseOver,
65
+ onMouseOut: handleMouseOut,
66
+ itemColorFunction,
67
+ symbolSizeFunction
68
+ };
69
+ };
70
+
71
+ exports.useChartSelection = useChartSelection;
72
+ //# sourceMappingURL=useChartSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartSelection.js","sources":["../../../packages/vuu-chart/src/useChartSelection.ts"],"sourcesContent":["import { ECElementEvent } from \"echarts\";\nimport { useCallback, useRef, useState } from \"react\";\nimport {\n ChartSelectionModel,\n EChartsCallbackParams,\n ItemColorFunction,\n SymbolSizeFunction,\n} from \"./chart-types\";\nimport { DataSourceValue } from \"./ChartSeries\";\n\ninterface ChartSelectionHookProps {\n selectionModel?: ChartSelectionModel;\n categoryColumnName: string;\n}\n\ntype DataItem = {\n column: string;\n key: string;\n};\n\nconst dataItemMatch = (\n dataItem: DataItem | undefined,\n targetSeries: string,\n targetKey: string,\n) => dataItem?.column === targetSeries && dataItem?.key === targetKey;\nconst dataItemInList = (\n dataItems: DataItem[],\n targetColumn: string,\n targetKey: string,\n) =>\n dataItems.some((dataItem) =>\n dataItemMatch(dataItem, targetColumn, targetKey),\n );\n\nexport const useChartSelection = (_props: ChartSelectionHookProps) => {\n const [selectedKeys, setSelectedKeys] = useState<DataItem[]>([]);\n const [, setHighlightedKey] = useState<DataItem | undefined>();\n const selectedKeysRef = useRef<DataItem[]>(selectedKeys);\n const highlightedKeyRef = useRef<DataItem | undefined>(undefined);\n\n const handleClick = useCallback(\n ({ data, event, seriesName: column }: ECElementEvent) => {\n if (column) {\n event?.stop();\n\n const { row } = data as DataSourceValue;\n const key = row[6];\n\n setSelectedKeys((currentSelection) => {\n return (selectedKeysRef.current = dataItemInList(\n currentSelection,\n column,\n key,\n )\n ? []\n : [{ column, key }]);\n });\n }\n },\n [],\n );\n\n const handleMouseOver = useCallback(\n ({ data, seriesName }: ECElementEvent) => {\n if (seriesName) {\n const { row } = data as DataSourceValue;\n setHighlightedKey(\n (highlightedKeyRef.current = { column: seriesName, key: row[6] }),\n );\n }\n },\n [],\n );\n\n const handleMouseOut = useCallback(() => {\n setHighlightedKey((highlightedKeyRef.current = undefined));\n }, []);\n\n const itemColorFunction = useCallback<ItemColorFunction>(\n ({ color, data, seriesName }) => {\n return dataItemInList(selectedKeysRef.current, seriesName, data.key)\n ? \"purple\"\n : color;\n },\n [],\n );\n\n const symbolSizeFunction = useCallback<SymbolSizeFunction>(\n (value: number, { data, seriesName }: EChartsCallbackParams) => {\n const isSelected = dataItemInList(\n selectedKeysRef.current,\n seriesName,\n data.key,\n );\n return isSelected ||\n dataItemMatch(highlightedKeyRef.current, seriesName, data.key)\n ? 16\n : 6;\n },\n [],\n );\n\n return {\n onClick: handleClick,\n onMouseOver: handleMouseOver,\n onMouseOut: handleMouseOut,\n itemColorFunction,\n symbolSizeFunction,\n };\n};\n"],"names":["useState","useRef","useCallback"],"mappings":";;;;AAoBA,MAAM,aAAA,GAAgB,CACpB,QACA,EAAA,YAAA,EACA,cACG,QAAU,EAAA,MAAA,KAAW,YAAgB,IAAA,QAAA,EAAU,GAAQ,KAAA,SAAA;AAC5D,MAAM,cAAiB,GAAA,CACrB,SACA,EAAA,YAAA,EACA,cAEA,SAAU,CAAA,IAAA;AAAA,EAAK,CAAC,QAAA,KACd,aAAc,CAAA,QAAA,EAAU,cAAc,SAAS;AACjD,CAAA;AAEW,MAAA,iBAAA,GAAoB,CAAC,MAAoC,KAAA;AACpE,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,CAAI,GAAAA,cAAA,CAAqB,EAAE,CAAA;AAC/D,EAAA,MAAM,GAAG,iBAAiB,CAAA,GAAIA,cAA+B,EAAA;AAC7D,EAAM,MAAA,eAAA,GAAkBC,aAAmB,YAAY,CAAA;AACvD,EAAM,MAAA,iBAAA,GAAoBA,aAA6B,KAAS,CAAA,CAAA;AAEhE,EAAA,MAAM,WAAc,GAAAC,iBAAA;AAAA,IAClB,CAAC,EAAE,IAAA,EAAM,KAAO,EAAA,UAAA,EAAY,QAA6B,KAAA;AACvD,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,KAAA,EAAO,IAAK,EAAA;AAEZ,QAAM,MAAA,EAAE,KAAQ,GAAA,IAAA;AAChB,QAAM,MAAA,GAAA,GAAM,IAAI,CAAC,CAAA;AAEjB,QAAA,eAAA,CAAgB,CAAC,gBAAqB,KAAA;AACpC,UAAA,OAAQ,gBAAgB,OAAU,GAAA,cAAA;AAAA,YAChC,gBAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,cAEE,EAAC,GACD,CAAC,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,SACrB,CAAA;AAAA;AACH,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,eAAkB,GAAAA,iBAAA;AAAA,IACtB,CAAC,EAAE,IAAM,EAAA,UAAA,EAAiC,KAAA;AACxC,MAAA,IAAI,UAAY,EAAA;AACd,QAAM,MAAA,EAAE,KAAQ,GAAA,IAAA;AAChB,QAAA,iBAAA;AAAA,UACG,iBAAA,CAAkB,UAAU,EAAE,MAAA,EAAQ,YAAY,GAAK,EAAA,GAAA,CAAI,CAAC,CAAE;AAAA,SACjE;AAAA;AACF,KACF;AAAA,IACA;AAAC,GACH;AAEA,EAAM,MAAA,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAmB,iBAAA,CAAA,iBAAA,CAAkB,UAAU,KAAU,CAAA,CAAA;AAAA,GAC3D,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,iBAAoB,GAAAA,iBAAA;AAAA,IACxB,CAAC,EAAE,KAAO,EAAA,IAAA,EAAM,YAAiB,KAAA;AAC/B,MAAA,OAAO,eAAe,eAAgB,CAAA,OAAA,EAAS,YAAY,IAAK,CAAA,GAAG,IAC/D,QACA,GAAA,KAAA;AAAA,KACN;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,kBAAqB,GAAAA,iBAAA;AAAA,IACzB,CAAC,KAAA,EAAe,EAAE,IAAA,EAAM,YAAwC,KAAA;AAC9D,MAAA,MAAM,UAAa,GAAA,cAAA;AAAA,QACjB,eAAgB,CAAA,OAAA;AAAA,QAChB,UAAA;AAAA,QACA,IAAK,CAAA;AAAA,OACP;AACA,MAAO,OAAA,UAAA,IACL,cAAc,iBAAkB,CAAA,OAAA,EAAS,YAAY,IAAK,CAAA,GAAG,IAC3D,EACA,GAAA,CAAA;AAAA,KACN;AAAA,IACA;AAAC,GACH;AAEA,EAAO,OAAA;AAAA,IACL,OAAS,EAAA,WAAA;AAAA,IACT,WAAa,EAAA,eAAA;AAAA,IACb,UAAY,EAAA,cAAA;AAAA,IACZ,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,4 @@
1
+ var chartCss = "\n\n.vuuChart {\n\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 .vuuChart-tooltip-title {\n color: var(--salt-content-primary-foreground) !important;\n }\n\n .vuuChart-tooltip-entry {\n align-items: center;\n display: flex;\n gap: 6px;\n\n .vuuChart-tooltip-icon {\n border-radius: 12px;\n display: block;\n flex: 0 0 12px;\n height: 12px;\n }\n .vuuChart-tooltip-label {\n color: var(--salt-content-secondary-foreground) !important;\n flex: 1 1 auto;\n font-size: var(--salt-text-label-fontSize) !important;\n min-width: 60px;\n padding-top: 3px;\n text-transform: capitalize;\n }\n .vuuChart-tooltip-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";
2
+
3
+ export { chartCss as default };
4
+ //# sourceMappingURL=Chart.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chart.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/esm/Chart.js ADDED
@@ -0,0 +1,87 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
4
+ import cx from 'clsx';
5
+ import { init, getInstanceByDom } from 'echarts';
6
+ import { useRef, useEffect } from 'react';
7
+ import { useChartContextMenu } from './useChartContextMenu.js';
8
+ import { useChartOptions } from './useChartOptions.js';
9
+ import { useChartSelection } from './useChartSelection.js';
10
+ import { buildColumnMap } from '@vuu-ui/vuu-utils';
11
+ import chartCss from './Chart.css.js';
12
+
13
+ const classBase = "vuuChart";
14
+ const Chart = ({
15
+ categoryColumnName,
16
+ chartSettings = { useCoarsePointer: true, renderer: "svg" },
17
+ className,
18
+ config,
19
+ dataExclusions,
20
+ dataSource,
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 = useWindow();
30
+ useComponentCssInjection({
31
+ testId: "vuu-toast-notification",
32
+ css: chartCss,
33
+ window: targetWindow
34
+ });
35
+ const chartRef = useRef(null);
36
+ const columnMap = buildColumnMap(dataSource.columns);
37
+ const onContextMenu = useChartContextMenu({ categoryColumnName, columnMap });
38
+ const {
39
+ itemColorFunction,
40
+ onClick,
41
+ onMouseOut,
42
+ onMouseOver,
43
+ symbolSizeFunction
44
+ } = useChartSelection({
45
+ categoryColumnName,
46
+ selectionModel: config?.selectionModel
47
+ });
48
+ const option = useChartOptions({
49
+ categoryColumnName,
50
+ config,
51
+ itemColorFunction,
52
+ palette,
53
+ dataExclusions,
54
+ dataSource,
55
+ seriesColumnNames,
56
+ symbolSizeFunction,
57
+ showTooltip
58
+ });
59
+ useEffect(() => {
60
+ const chart = init(chartRef.current, null, chartSettings);
61
+ chart.on("contextmenu", onContextMenu);
62
+ chart.on("click", onClick);
63
+ chart.on("mouseover", onMouseOver);
64
+ chart.on("mouseout", onMouseOut);
65
+ return () => {
66
+ chart?.dispose();
67
+ };
68
+ }, [chartSettings, onClick, onContextMenu, onMouseOver, onMouseOut]);
69
+ useEffect(() => {
70
+ if (chartRef.current) {
71
+ const chart = getInstanceByDom(chartRef.current);
72
+ chart?.setOption(option, optionSettings);
73
+ }
74
+ }, [option, optionSettings]);
75
+ return /* @__PURE__ */ jsx(
76
+ "div",
77
+ {
78
+ ...htmlAttributes,
79
+ className: cx(classBase, className),
80
+ ref: chartRef,
81
+ style
82
+ }
83
+ );
84
+ };
85
+
86
+ export { Chart };
87
+ //# sourceMappingURL=Chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chart.js","sources":["../../../packages/vuu-chart/src/Chart.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { getInstanceByDom, init } from \"echarts\";\nimport { HTMLAttributes, useEffect, useRef } from \"react\";\nimport { useChartContextMenu } from \"./useChartContextMenu\";\nimport { ChartOptionsProps, useChartOptions } from \"./useChartOptions\";\nimport { useChartSelection } from \"./useChartSelection\";\nimport { buildColumnMap } from \"@vuu-ui/vuu-utils\";\n\nimport chartCss from \"./Chart.css\";\n\nconst classBase = \"vuuChart\";\n\ntype OptionSettings = {\n notMerge: boolean;\n};\n\ntype ChartSettings = {\n /**\n * Default value will be svg\n */\n renderer: \"svg\" | \"canvas\";\n /**\n * Enlarges 'click zone' around interactive elements.\n * Default value true;\n */\n useCoarsePointer: boolean;\n};\n\nexport interface ChartProps\n extends ChartOptionsProps,\n HTMLAttributes<HTMLDivElement> {\n chartSettings?: Partial<ChartSettings>;\n optionSettings?: OptionSettings;\n /**\n * An array of color values that will be assigned, in the order given\n * to rendered series.\n */\n palette?: string[];\n showTooltip?: boolean;\n}\n\nexport const Chart = ({\n categoryColumnName,\n chartSettings = { useCoarsePointer: true, renderer: \"svg\" },\n className,\n config,\n dataExclusions,\n dataSource,\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 columnMap = buildColumnMap(dataSource.columns);\n\n const onContextMenu = useChartContextMenu({ categoryColumnName, columnMap });\n const {\n itemColorFunction,\n onClick,\n onMouseOut,\n onMouseOver,\n symbolSizeFunction,\n } = useChartSelection({\n categoryColumnName,\n selectionModel: config?.selectionModel,\n });\n\n const option = useChartOptions({\n categoryColumnName,\n config,\n itemColorFunction,\n palette,\n dataExclusions,\n dataSource,\n seriesColumnNames,\n symbolSizeFunction,\n showTooltip,\n });\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 chart.on(\"click\", onClick);\n chart.on(\"mouseover\", onMouseOver);\n chart.on(\"mouseout\", onMouseOut);\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, onClick, onContextMenu, onMouseOver, onMouseOut]);\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":[],"mappings":";;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,UAAA;AA+BX,MAAM,QAAQ,CAAC;AAAA,EACpB,kBAAA;AAAA,EACA,aAAgB,GAAA,EAAE,gBAAkB,EAAA,IAAA,EAAM,UAAU,KAAM,EAAA;AAAA,EAC1D,SAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;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,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,wBAAA;AAAA,IACR,GAAK,EAAA,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,QAAA,GAAW,OAAuB,IAAI,CAAA;AAE5C,EAAM,MAAA,SAAA,GAAY,cAAe,CAAA,UAAA,CAAW,OAAO,CAAA;AAEnD,EAAA,MAAM,aAAgB,GAAA,mBAAA,CAAoB,EAAE,kBAAA,EAAoB,WAAW,CAAA;AAC3E,EAAM,MAAA;AAAA,IACJ,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,MACE,iBAAkB,CAAA;AAAA,IACpB,kBAAA;AAAA,IACA,gBAAgB,MAAQ,EAAA;AAAA,GACzB,CAAA;AAED,EAAA,MAAM,SAAS,eAAgB,CAAA;AAAA,IAC7B,kBAAA;AAAA,IACA,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAcD,EAAA,SAAA,CAAU,MAAM;AAEd,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,QAAS,CAAA,OAAA,EAAS,MAAM,aAAa,CAAA;AAExD,IAAM,KAAA,CAAA,EAAA,CAAG,eAAe,aAAa,CAAA;AACrC,IAAM,KAAA,CAAA,EAAA,CAAG,SAAS,OAAO,CAAA;AACzB,IAAM,KAAA,CAAA,EAAA,CAAG,aAAa,WAAW,CAAA;AACjC,IAAM,KAAA,CAAA,EAAA,CAAG,YAAY,UAAU,CAAA;AAU/B,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,EAAO,OAAQ,EAAA;AAAA,KAMjB;AAAA,KACC,CAAC,aAAA,EAAe,SAAS,aAAe,EAAA,WAAA,EAAa,UAAU,CAAC,CAAA;AAEnE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAS,EAAA;AAEpB,MAAM,MAAA,KAAA,GAAQ,gBAAiB,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,uBAAA,GAAA;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;;;;"}
@@ -0,0 +1,181 @@
1
+ import { EventEmitter, Range, metadataKeys, buildColumnMap } from '@vuu-ui/vuu-utils';
2
+ import { MovingDataRowWindow } from './DataRowMovingWindow.js';
3
+ import { defaultItemColorFunction } from './chart-types.js';
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
11
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
+ 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);
14
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
+ var _categoryColumn, _colorMap, _columnMap, _config, _dataExclusions, _dataWindow, _dates, _palette, _series, _seriesColumns;
16
+ const { KEY } = metadataKeys;
17
+ function DataSourceValue(key, row, value) {
18
+ return { key, row, value };
19
+ }
20
+ class ChartSeries extends EventEmitter {
21
+ constructor({
22
+ config,
23
+ dataExclusions,
24
+ dataSource,
25
+ palette
26
+ }) {
27
+ super();
28
+ __privateAdd(this, _categoryColumn, "");
29
+ __privateAdd(this, _colorMap, /* @__PURE__ */ new Map());
30
+ __privateAdd(this, _columnMap, {});
31
+ __privateAdd(this, _config);
32
+ __privateAdd(this, _dataExclusions);
33
+ __privateAdd(this, _dataWindow, new MovingDataRowWindow(Range(0, 1e3)));
34
+ __privateAdd(this, _dates, []);
35
+ __privateAdd(this, _palette);
36
+ __privateAdd(this, _series, []);
37
+ __privateAdd(this, _seriesColumns, []);
38
+ __publicField(this, "handleData", (message) => {
39
+ if (message.type === "subscribed") {
40
+ __privateSet(this, _columnMap, buildColumnMap(message.tableSchema.columns));
41
+ } else if (message.type === "viewport-update") {
42
+ if (message.mode === "size-only") ; else if (message.rows) {
43
+ for (const row of message.rows) {
44
+ __privateGet(this, _dataWindow).add(row);
45
+ }
46
+ this.buildCategoriesAndSeries();
47
+ }
48
+ } else {
49
+ console.warn(JSON.stringify(message));
50
+ }
51
+ });
52
+ __privateSet(this, _config, config);
53
+ __privateSet(this, _dataExclusions, dataExclusions);
54
+ __privateSet(this, _palette, palette);
55
+ dataSource.subscribe({ range: Range(0, 1e3) }, this.handleData);
56
+ }
57
+ buildCategoriesAndSeries() {
58
+ if (__privateGet(this, _categoryColumn) && __privateGet(this, _seriesColumns).length > 0) {
59
+ const [dates, series] = this.getCategoriesAndSeries();
60
+ __privateSet(this, _dates, dates);
61
+ __privateSet(this, _series, series);
62
+ this.emit("update");
63
+ }
64
+ }
65
+ get palette() {
66
+ return __privateGet(this, _seriesColumns).map((col) => __privateGet(this, _colorMap).get(col));
67
+ }
68
+ get categoryColumn() {
69
+ return __privateGet(this, _categoryColumn);
70
+ }
71
+ set categoryColumn(categoryColumn) {
72
+ __privateSet(this, _categoryColumn, categoryColumn);
73
+ if (__privateGet(this, _seriesColumns).length > 0) {
74
+ this.buildCategoriesAndSeries();
75
+ }
76
+ }
77
+ get seriesColumnNames() {
78
+ return __privateGet(this, _seriesColumns);
79
+ }
80
+ set seriesColumnNames(seriesColumnNames) {
81
+ __privateSet(this, _seriesColumns, seriesColumnNames);
82
+ if (__privateGet(this, _categoryColumn)) {
83
+ this.buildCategoriesAndSeries();
84
+ }
85
+ }
86
+ get categories() {
87
+ return __privateGet(this, _dates);
88
+ }
89
+ get series() {
90
+ return __privateGet(this, _series);
91
+ }
92
+ getCategoriesAndSeries() {
93
+ const colorMap = __privateGet(this, _colorMap);
94
+ const columnMap = __privateGet(this, _columnMap);
95
+ const data = __privateGet(this, _dataWindow).data;
96
+ const categoryColumn = __privateGet(this, _categoryColumn);
97
+ const seriesColumns = __privateGet(this, _seriesColumns);
98
+ const config = __privateGet(this, _config);
99
+ const categoryValues = [];
100
+ const seriesMap = /* @__PURE__ */ new Map();
101
+ const { itemColorFunction = defaultItemColorFunction, symbolSize = 6 } = config;
102
+ data.forEach((row) => {
103
+ const categoryValue = row[columnMap[categoryColumn]];
104
+ categoryValues.push(categoryValue);
105
+ for (const seriesColumn of seriesColumns) {
106
+ let lineSeries;
107
+ let scatterSeries = void 0;
108
+ const seriesTuple = seriesMap.get(seriesColumn);
109
+ if (seriesTuple) {
110
+ [lineSeries, scatterSeries] = seriesTuple;
111
+ } else {
112
+ if (!colorMap.has(seriesColumn)) {
113
+ colorMap.set(seriesColumn, __privateGet(this, _palette)[__privateGet(this, _colorMap).size]);
114
+ }
115
+ lineSeries = {
116
+ //any reason we can't simply use col name here ?
117
+ id: seriesColumn,
118
+ name: seriesColumn,
119
+ label: seriesColumn,
120
+ connectNulls: true,
121
+ data: [],
122
+ type: "line",
123
+ itemStyle: {
124
+ color: itemColorFunction
125
+ },
126
+ lineStyle: {
127
+ width: 1.5
128
+ },
129
+ symbol: "circle",
130
+ symbolSize
131
+ };
132
+ if (__privateGet(this, _dataExclusions)) {
133
+ const { symbol } = __privateGet(this, _dataExclusions);
134
+ scatterSeries = {
135
+ id: `${seriesColumn}-excluded`,
136
+ data: [],
137
+ itemStyle: {
138
+ borderColor: "#FDC82F",
139
+ color: "#101820",
140
+ borderWidth: 2
141
+ },
142
+ label: "",
143
+ name: seriesColumn,
144
+ symbol,
145
+ symbolSize: 20,
146
+ type: "scatter"
147
+ };
148
+ }
149
+ if (scatterSeries) {
150
+ seriesMap.set(seriesColumn, [lineSeries, scatterSeries]);
151
+ } else {
152
+ seriesMap.set(seriesColumn, [lineSeries]);
153
+ }
154
+ }
155
+ const key = row[KEY];
156
+ const value = row[columnMap[seriesColumn]];
157
+ if (__privateGet(this, _dataExclusions)?.isExcludedData(row, columnMap, seriesColumn)) {
158
+ lineSeries.data.push(DataSourceValue(key, row, null));
159
+ scatterSeries?.data.push(DataSourceValue(key, row, value));
160
+ } else {
161
+ lineSeries.data.push(DataSourceValue(key, row, value));
162
+ scatterSeries?.data.push(DataSourceValue(key, row, null));
163
+ }
164
+ }
165
+ });
166
+ return [categoryValues, Array.from(seriesMap.values()).flat()];
167
+ }
168
+ }
169
+ _categoryColumn = new WeakMap();
170
+ _colorMap = new WeakMap();
171
+ _columnMap = new WeakMap();
172
+ _config = new WeakMap();
173
+ _dataExclusions = new WeakMap();
174
+ _dataWindow = new WeakMap();
175
+ _dates = new WeakMap();
176
+ _palette = new WeakMap();
177
+ _series = new WeakMap();
178
+ _seriesColumns = new WeakMap();
179
+
180
+ export { ChartSeries };
181
+ //# sourceMappingURL=ChartSeries.js.map
@@ -0,0 +1 @@
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 {\n buildColumnMap,\n ColumnMap,\n EventEmitter,\n metadataKeys,\n Range,\n} from \"@vuu-ui/vuu-utils\";\nimport { MovingDataRowWindow } from \"./DataRowMovingWindow\";\nimport {\n defaultItemColorFunction,\n LineSeries,\n ScatterSeries,\n Series,\n} from \"./chart-types\";\nimport { ChartConfig, DataExclusionOptions } from \"./useChartOptions\";\n\nconst { KEY } = metadataKeys;\n\nexport type DataSourceValue = {\n key: string;\n readonly row: DataSourceRow;\n value: number | null;\n};\n\nfunction DataSourceValue(\n key: string,\n row: DataSourceRow,\n value: number | null,\n): DataSourceValue {\n return { key, row, value };\n}\n\nexport type ChartEvents = {\n update: () => void;\n};\nexport interface ChartSeriesConstructorProps {\n dataExclusions?: DataExclusionOptions;\n dataSource: DataSource;\n config: ChartConfig;\n palette: string[];\n}\n\nexport class ChartSeries extends EventEmitter<ChartEvents> {\n #categoryColumn = \"\";\n #colorMap = new Map<string, string>();\n #columnMap: ColumnMap = {};\n #config: ChartConfig;\n #dataExclusions: DataExclusionOptions | undefined;\n #dataWindow = new MovingDataRowWindow(Range(0, 1000));\n\n #dates: string[] = [];\n #palette: 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] = this.getCategoriesAndSeries();\n this.#dates = dates;\n this.#series = series;\n\n this.emit(\"update\");\n }\n }\n\n constructor({\n config,\n dataExclusions,\n dataSource,\n palette,\n }: ChartSeriesConstructorProps) {\n super();\n this.#config = config;\n this.#dataExclusions = dataExclusions;\n this.#palette = palette;\n dataSource.subscribe({ range: Range(0, 1000) }, this.handleData);\n }\n\n get palette() {\n return this.#seriesColumns.map((col) => this.#colorMap.get(col));\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 private getCategoriesAndSeries(): [string[], Series[]] {\n const colorMap = this.#colorMap;\n const columnMap = this.#columnMap;\n const data = this.#dataWindow.data;\n const categoryColumn = this.#categoryColumn;\n const seriesColumns = this.#seriesColumns;\n const config = this.#config;\n\n const categoryValues: string[] = [];\n const seriesMap = new Map<\n string,\n [LineSeries, ScatterSeries] | [LineSeries]\n >();\n const { itemColorFunction = defaultItemColorFunction, symbolSize = 6 } =\n config;\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 lineSeries: LineSeries;\n let scatterSeries: ScatterSeries | undefined = undefined;\n\n const seriesTuple = seriesMap.get(seriesColumn);\n if (seriesTuple) {\n [lineSeries, scatterSeries] = seriesTuple;\n } else {\n if (!colorMap.has(seriesColumn)) {\n // Record palette color used for each series so we can preserve the color\n // associations even if some series are hidden by user.\n colorMap.set(seriesColumn, this.#palette[this.#colorMap.size]);\n }\n\n lineSeries = {\n //any reason we can't simply use col name here ?\n id: seriesColumn,\n name: seriesColumn,\n label: seriesColumn,\n connectNulls: true,\n data: [],\n type: \"line\",\n itemStyle: {\n color: itemColorFunction,\n },\n lineStyle: {\n width: 1.5,\n },\n symbol: \"circle\",\n symbolSize,\n };\n\n if (this.#dataExclusions) {\n const { symbol } = this.#dataExclusions;\n scatterSeries = {\n id: `${seriesColumn}-excluded`,\n data: [],\n itemStyle: {\n borderColor: \"#FDC82F\",\n color: \"#101820\",\n borderWidth: 2,\n },\n label: \"\",\n name: seriesColumn,\n symbol,\n symbolSize: 20,\n type: \"scatter\",\n };\n }\n\n if (scatterSeries) {\n seriesMap.set(seriesColumn, [lineSeries, scatterSeries]);\n } else {\n seriesMap.set(seriesColumn, [lineSeries]);\n }\n }\n\n const key = row[KEY] as string;\n const value = row[columnMap[seriesColumn]] as number;\n\n if (\n this.#dataExclusions?.isExcludedData(row, columnMap, seriesColumn)\n ) {\n lineSeries.data.push(DataSourceValue(key, row, null));\n scatterSeries?.data.push(DataSourceValue(key, row, value));\n } else {\n lineSeries.data.push(DataSourceValue(key, row, value));\n scatterSeries?.data.push(DataSourceValue(key, row, null));\n }\n }\n });\n\n return [categoryValues, Array.from(seriesMap.values()).flat()];\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { WindowRange, metadataKeys } from '@vuu-ui/vuu-utils';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __typeError = (msg) => {
5
+ throw TypeError(msg);
6
+ };
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
+ 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);
12
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
+ var _range;
14
+ const { IDX, KEY } = metadataKeys;
15
+ class MovingDataRowWindow {
16
+ constructor({ from, to }) {
17
+ __publicField(this, "data");
18
+ __publicField(this, "rowCount", 0);
19
+ __privateAdd(this, _range);
20
+ __publicField(this, "setRowCount", (rowCount) => {
21
+ if (rowCount < this.data.length) {
22
+ this.data.length = rowCount;
23
+ }
24
+ this.rowCount = rowCount;
25
+ });
26
+ __privateSet(this, _range, new WindowRange(from, to));
27
+ this.data = new Array(Math.max(0, to - from));
28
+ this.rowCount = 0;
29
+ }
30
+ add(data) {
31
+ const index = data[IDX];
32
+ if (this.isWithinRange(index)) {
33
+ const internalIndex = index - __privateGet(this, _range).from;
34
+ this.data[internalIndex] = data;
35
+ }
36
+ }
37
+ getAtIndex(index) {
38
+ return __privateGet(this, _range).isWithin(index) && this.data[index - __privateGet(this, _range).from] != null ? this.data[index - __privateGet(this, _range).from] : void 0;
39
+ }
40
+ getByKey(key) {
41
+ return this.data.find((row) => row[KEY] === key);
42
+ }
43
+ isWithinRange(index) {
44
+ return __privateGet(this, _range).isWithin(index);
45
+ }
46
+ setRange({ from, to }) {
47
+ if (from !== __privateGet(this, _range).from || to !== __privateGet(this, _range).to) {
48
+ const [overlapFrom, overlapTo] = __privateGet(this, _range).overlap(from, to);
49
+ const newData = new Array(Math.max(0, to - from));
50
+ for (let i = overlapFrom; i < overlapTo; i++) {
51
+ const data = this.getAtIndex(i);
52
+ if (data) {
53
+ const index = i - from;
54
+ newData[index] = data;
55
+ }
56
+ }
57
+ this.data = newData;
58
+ __privateGet(this, _range).from = from;
59
+ __privateGet(this, _range).to = to;
60
+ }
61
+ }
62
+ get hasData() {
63
+ return this.data.some((d) => d !== void 0);
64
+ }
65
+ /**
66
+ * This will throw if there is no data. Check `hasData` first
67
+ * to guard against this, if not certain.
68
+ */
69
+ get firstRow() {
70
+ for (let i = 0; i < this.data.length; i++) {
71
+ if (this.data[i]) {
72
+ return this.data[i];
73
+ }
74
+ }
75
+ throw Error(`[DataRowMovingWinddow] firstRow, no data`);
76
+ }
77
+ get range() {
78
+ return __privateGet(this, _range);
79
+ }
80
+ // TODO make this more performant, see implementation in
81
+ // array-backed-moving-window - use same implementation
82
+ get hasAllRowsWithinRange() {
83
+ const { from, to } = __privateGet(this, _range);
84
+ for (let i = from; i < to; i++) {
85
+ if (this.getAtIndex(i) === void 0) {
86
+ return false;
87
+ }
88
+ }
89
+ return true;
90
+ }
91
+ }
92
+ _range = new WeakMap();
93
+
94
+ export { MovingDataRowWindow };
95
+ //# sourceMappingURL=DataRowMovingWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataRowMovingWindow.js","sources":["../../../packages/vuu-chart/src/DataRowMovingWindow.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { WindowRange } from \"@vuu-ui/vuu-utils\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst { IDX, KEY } = metadataKeys;\n\nexport class MovingDataRowWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n #range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.#range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const index = data[IDX];\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.#range.from;\n this.data[internalIndex] = data;\n }\n }\n\n getAtIndex(index: number) {\n return this.#range.isWithin(index) &&\n this.data[index - this.#range.from] != null\n ? this.data[index - this.#range.from]\n : undefined;\n }\n\n getByKey(key: string) {\n return this.data.find((row) => row[KEY] === key);\n }\n\n isWithinRange(index: number) {\n return this.#range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.#range.from || to !== this.#range.to) {\n const [overlapFrom, overlapTo] = this.#range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.#range.from = from;\n this.#range.to = to;\n }\n }\n\n get hasData() {\n return this.data.some((d) => d !== undefined);\n }\n\n /**\n * This will throw if there is no data. Check `hasData` first\n * to guard against this, if not certain.\n */\n get firstRow() {\n for (let i = 0; i < this.data.length; i++) {\n if (this.data[i]) {\n return this.data[i];\n }\n }\n throw Error(`[DataRowMovingWinddow] firstRow, no data`);\n }\n\n get range() {\n return this.#range;\n }\n\n // TODO make this more performant, see implementation in\n // array-backed-moving-window - use same implementation\n get hasAllRowsWithinRange(): boolean {\n const { from, to } = this.#range;\n\n for (let i = from; i < to; i++) {\n if (this.getAtIndex(i) === undefined) {\n return false;\n }\n }\n return true;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ const defaultItemColorFunction = ({ color }) => color;
2
+
3
+ export { defaultItemColorFunction };
4
+ //# sourceMappingURL=chart-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-types.js","sources":["../../../packages/vuu-chart/src/chart-types.ts"],"sourcesContent":["import { DataSourceValue } from \"./ChartSeries\";\n\nexport const defaultItemColorFunction: ItemColorFunction = ({ color }) => color;\n\nexport type EChartsCallbackParams = {\n color: string;\n data: DataSourceValue;\n dataIndex: number;\n name: string;\n /**\n * This is the Vuu column name\n */\n seriesName: string;\n};\n\nexport type SymbolSizeFunction = (\n value: number,\n params: EChartsCallbackParams,\n) => number | [number, number];\nexport type SymbolSize = number | [number, number] | SymbolSizeFunction;\nexport type SymbolType = \"emptyCircle\" | \"circle\" | `path://${string}`;\n\nexport type ItemColorFunction = (params: EChartsCallbackParams) => string;\n\nexport interface SeriesBase {\n data: DataSourceValue[];\n id: string;\n itemStyle?: {\n borderColor?: string;\n color: string | ItemColorFunction;\n borderWidth?: number;\n };\n label: string;\n name: string;\n symbol?: SymbolType;\n symbolSize: SymbolSize;\n}\n\nexport interface LineSeries extends SeriesBase {\n connectNulls?: boolean;\n lineStyle: {\n color?: string;\n width: number;\n };\n type: \"line\";\n}\nexport interface ScatterSeries extends SeriesBase {\n type: \"scatter\";\n}\n\nexport type Series = LineSeries | ScatterSeries;\n\nexport type ChartSelectionModel =\n | \"none\"\n | \"single\"\n | \"single-no-deselect\"\n | \"extended\";\n"],"names":[],"mappings":"AAEO,MAAM,wBAA8C,GAAA,CAAC,EAAE,KAAA,EAAY,KAAA;;;;"}
@@ -0,0 +1,25 @@
1
+ const chartTooltip = (params) => {
2
+ if (params.length > 0) {
3
+ const [{ axisValueLabel }] = params;
4
+ const values = [];
5
+ for (const { color, seriesName, seriesType, value } of params) {
6
+ if (seriesType === "line") {
7
+ values.push({ color, value, seriesName });
8
+ }
9
+ }
10
+ const tooltipEntries = values.map(({ color, value, seriesName }) => [
11
+ '<div class="vuuChart-tooltip-entry">',
12
+ `<span class="vuuChart-tooltip-icon" style="background:${color};"></span>`,
13
+ `<span class="vuuChart-tooltip-label">${seriesName}</span>`,
14
+ `<span class="vuuChart-tooltip-value">${value ?? "n/a"}</span>`,
15
+ "</div>"
16
+ ].join(""));
17
+ return [
18
+ `<div class="vuuChart-tooltip-title">${axisValueLabel}</div>`,
19
+ '<div class="vuuChart-tooltip-container">'
20
+ ].concat(tooltipEntries).concat("</div>").join("");
21
+ }
22
+ };
23
+
24
+ export { chartTooltip };
25
+ //# sourceMappingURL=chartTooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chartTooltip.js","sources":["../../../packages/vuu-chart/src/chartTooltip.ts"],"sourcesContent":["import { DataSourceValue } from \"./ChartSeries\";\n\nexport interface TooltipParams {\n axisValueLabel: string\n color: string;\n componentType: string;\n componentSubType: string;\n data: DataSourceValue;\n seriesName: string;\n seriesType: 'line' | 'scatter';\n value: number;\n}\n\nexport const chartTooltip = (params: TooltipParams[]) => {\n\n if (params.length > 0){\n const [{axisValueLabel}] = params;\n\n const values = [];\n\n for (const {color, seriesName, seriesType, value} of params){\n if (seriesType === 'line'){\n values.push({color, value, seriesName})\n }\n }\n \n const tooltipEntries = values.map(({color, value, seriesName}) => \n ['<div class=\"vuuChart-tooltip-entry\">',\n `<span class=\"vuuChart-tooltip-icon\" style=\"background:${color};\"></span>`,\n `<span class=\"vuuChart-tooltip-label\">${seriesName}</span>`,\n `<span class=\"vuuChart-tooltip-value\">${value ?? 'n/a'}</span>`,\n '</div>'\n ].join(\"\"));\n\n\n return [\n `<div class=\"vuuChart-tooltip-title\">${axisValueLabel}</div>`,\n '<div class=\"vuuChart-tooltip-container\">']\n .concat(tooltipEntries)\n .concat('</div>')\n .join(\"\");\n\n }\n\n}\n"],"names":[],"mappings":"AAaa,MAAA,YAAA,GAAe,CAAC,MAA4B,KAAA;AAErD,EAAI,IAAA,MAAA,CAAO,SAAS,CAAE,EAAA;AAClB,IAAA,MAAM,CAAC,EAAC,cAAc,EAAC,CAAI,GAAA,MAAA;AAE3B,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,EAAC,KAAO,EAAA,UAAA,EAAY,UAAY,EAAA,KAAA,MAAU,MAAO,EAAA;AACxD,MAAA,IAAI,eAAe,MAAO,EAAA;AACtB,QAAA,MAAA,CAAO,IAAK,CAAA,EAAC,KAAO,EAAA,KAAA,EAAO,YAAW,CAAA;AAAA;AAC1C;AAGJ,IAAM,MAAA,cAAA,GAAiB,OAAO,GAAI,CAAA,CAAC,EAAC,KAAO,EAAA,KAAA,EAAO,YAC1C,KAAA;AAAA,MAAC,sCAAA;AAAA,MACA,yDAAyD,KAAK,CAAA,UAAA,CAAA;AAAA,MAC9D,wCAAwC,UAAU,CAAA,OAAA,CAAA;AAAA,MAClD,CAAA,qCAAA,EAAwC,SAAS,KAAK,CAAA,OAAA,CAAA;AAAA,MACtD;AAAA,KACD,CAAE,IAAK,CAAA,EAAE,CAAC,CAAA;AAGlB,IAAO,OAAA;AAAA,MACH,uCAAuC,cAAc,CAAA,MAAA,CAAA;AAAA,MACrD;AAAA,KAA0C,CACzC,OAAO,cAAc,CAAA,CACrB,OAAO,QAAQ,CAAA,CACf,KAAK,EAAE,CAAA;AAAA;AAIpB;;;;"}
package/esm/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { Chart } from './Chart.js';
2
+ export { ChartSeries } from './ChartSeries.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,27 @@
1
+ import { useContextMenu } from '@vuu-ui/vuu-context-menu';
2
+ import { useCallback } from 'react';
3
+
4
+ const useChartContextMenu = ({
5
+ columnMap
6
+ }) => {
7
+ const showContextMenu = useContextMenu();
8
+ const onContextMenu = useCallback(
9
+ ({ data, event, seriesName }) => {
10
+ if (event && seriesName) {
11
+ event?.stop();
12
+ const { row } = data;
13
+ const menuOptions = {
14
+ column: seriesName,
15
+ columnMap,
16
+ row
17
+ };
18
+ showContextMenu(event.event, "series", menuOptions);
19
+ }
20
+ },
21
+ [columnMap, showContextMenu]
22
+ );
23
+ return onContextMenu;
24
+ };
25
+
26
+ export { useChartContextMenu };
27
+ //# sourceMappingURL=useChartContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChartContextMenu.js","sources":["../../../packages/vuu-chart/src/useChartContextMenu.ts"],"sourcesContent":["import { useContextMenu } from \"@vuu-ui/vuu-context-menu\";\nimport { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { useCallback } from \"react\";\nimport { ECElementEvent } from \"echarts\";\nimport { DataSourceValue } from \"./ChartSeries\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\n\nexport type ChartMenuLocation = \"canvas\" | \"series\";\n\nexport type ChartContextMenuOptions = {\n column: string;\n columnMap: ColumnMap;\n row: DataSourceRow;\n};\n\ninterface ChartContextMenuHookProps {\n allowContextMenu?: boolean;\n categoryColumnName?: string;\n columnMap: ColumnMap;\n}\n\nexport const useChartContextMenu = ({\n columnMap,\n}: ChartContextMenuHookProps) => {\n const showContextMenu = useContextMenu();\n\n const onContextMenu = useCallback(\n ({ data, event, seriesName }: ECElementEvent) => {\n if (event && seriesName) {\n event?.stop();\n\n const { row } = data as DataSourceValue;\n\n const menuOptions: ChartContextMenuOptions = {\n column: seriesName,\n columnMap,\n row,\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n showContextMenu(event.event as any, \"series\", menuOptions);\n }\n },\n [columnMap, showContextMenu],\n );\n\n return onContextMenu;\n};\n"],"names":[],"mappings":";;;AAqBO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AACF,CAAiC,KAAA;AAC/B,EAAA,MAAM,kBAAkB,cAAe,EAAA;AAEvC,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,EAAE,IAAM,EAAA,KAAA,EAAO,YAAiC,KAAA;AAC/C,MAAA,IAAI,SAAS,UAAY,EAAA;AACvB,QAAA,KAAA,EAAO,IAAK,EAAA;AAEZ,QAAM,MAAA,EAAE,KAAQ,GAAA,IAAA;AAEhB,QAAA,MAAM,WAAuC,GAAA;AAAA,UAC3C,MAAQ,EAAA,UAAA;AAAA,UACR,SAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAgB,eAAA,CAAA,KAAA,CAAM,KAAc,EAAA,QAAA,EAAU,WAAW,CAAA;AAAA;AAC3D,KACF;AAAA,IACA,CAAC,WAAW,eAAe;AAAA,GAC7B;AAEA,EAAO,OAAA,aAAA;AACT;;;;"}