@neo4j-ndl/react-charts 1.1.1 → 1.1.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.
- package/lib/cjs/charts/Chart.js +56 -462
- package/lib/cjs/charts/Chart.js.map +1 -1
- package/lib/cjs/charts/ChartContainer.js +71 -0
- package/lib/cjs/charts/ChartContainer.js.map +1 -0
- package/lib/cjs/charts/ChartEmpty.js.map +1 -1
- package/lib/cjs/charts/ChartRender.js +97 -0
- package/lib/cjs/charts/ChartRender.js.map +1 -0
- package/lib/cjs/charts/ChartTooltip.js.map +1 -1
- package/lib/cjs/charts/Legend.js +32 -246
- package/lib/cjs/charts/Legend.js.map +1 -1
- package/lib/cjs/charts/LegendItem.js +68 -0
- package/lib/cjs/charts/LegendItem.js.map +1 -0
- package/lib/cjs/charts/LegendLayout.js +363 -0
- package/lib/cjs/charts/LegendLayout.js.map +1 -0
- package/lib/cjs/charts/hooks/use-chart-instance.js +133 -0
- package/lib/cjs/charts/hooks/use-chart-instance.js.map +1 -0
- package/lib/cjs/charts/hooks/use-chart-option.js +79 -0
- package/lib/cjs/charts/hooks/use-chart-option.js.map +1 -0
- package/lib/cjs/charts/hooks/use-chart-refs.js +52 -0
- package/lib/cjs/charts/hooks/use-chart-refs.js.map +1 -0
- package/lib/cjs/charts/hooks/use-chart-zoom.js +117 -0
- package/lib/cjs/charts/hooks/use-chart-zoom.js.map +1 -0
- package/lib/cjs/charts/hooks/use-legend-interactions.js +149 -0
- package/lib/cjs/charts/hooks/use-legend-interactions.js.map +1 -0
- package/lib/cjs/charts/hooks/use-legend-series.js +181 -0
- package/lib/cjs/charts/hooks/use-legend-series.js.map +1 -0
- package/lib/cjs/charts/hooks/use-legend-visibility.js +91 -0
- package/lib/cjs/charts/hooks/use-legend-visibility.js.map +1 -0
- package/lib/cjs/charts/index.js +1 -1
- package/lib/cjs/charts/index.js.map +1 -1
- package/lib/cjs/charts/tests/chart-test-utils.js +56 -9
- package/lib/cjs/charts/tests/chart-test-utils.js.map +1 -1
- package/lib/cjs/charts/themes/ndl-echarts-theme.js.map +1 -1
- package/lib/cjs/charts/{aria-description.js → utils/aria-description.js} +4 -45
- package/lib/cjs/charts/utils/aria-description.js.map +1 -0
- package/lib/cjs/charts/utils/build-chart-option.js +74 -0
- package/lib/cjs/charts/utils/build-chart-option.js.map +1 -0
- package/lib/cjs/charts/utils/chart-tooltip-formatter.js +86 -0
- package/lib/cjs/charts/utils/chart-tooltip-formatter.js.map +1 -0
- package/lib/cjs/charts/utils/chart-types.js.map +1 -0
- package/lib/cjs/charts/utils/defaults.js.map +1 -0
- package/lib/cjs/charts/{utils.js → utils/format-utils.js} +3 -19
- package/lib/cjs/charts/utils/format-utils.js.map +1 -0
- package/lib/cjs/charts/utils/legend-layout.js +65 -0
- package/lib/cjs/charts/utils/legend-layout.js.map +1 -0
- package/lib/cjs/charts/{legend-utils.js → utils/legend-utils.js} +1 -78
- package/lib/cjs/charts/utils/legend-utils.js.map +1 -0
- package/lib/cjs/charts/utils/threshold.js +114 -0
- package/lib/cjs/charts/utils/threshold.js.map +1 -0
- package/lib/cjs/charts/{user-option-utils.js → utils/user-option-utils.js} +7 -16
- package/lib/cjs/charts/utils/user-option-utils.js.map +1 -0
- package/lib/esm/charts/Chart.js +50 -457
- package/lib/esm/charts/Chart.js.map +1 -1
- package/lib/esm/charts/ChartContainer.js +67 -0
- package/lib/esm/charts/ChartContainer.js.map +1 -0
- package/lib/esm/charts/ChartEmpty.js.map +1 -1
- package/lib/esm/charts/ChartRender.js +93 -0
- package/lib/esm/charts/ChartRender.js.map +1 -0
- package/lib/esm/charts/ChartTooltip.js.map +1 -1
- package/lib/esm/charts/Legend.js +32 -243
- package/lib/esm/charts/Legend.js.map +1 -1
- package/lib/esm/charts/LegendItem.js +61 -0
- package/lib/esm/charts/LegendItem.js.map +1 -0
- package/lib/esm/charts/LegendLayout.js +323 -0
- package/lib/esm/charts/LegendLayout.js.map +1 -0
- package/lib/esm/charts/hooks/use-chart-instance.js +128 -0
- package/lib/esm/charts/hooks/use-chart-instance.js.map +1 -0
- package/lib/esm/charts/hooks/use-chart-option.js +76 -0
- package/lib/esm/charts/hooks/use-chart-option.js.map +1 -0
- package/lib/esm/charts/hooks/use-chart-refs.js +48 -0
- package/lib/esm/charts/hooks/use-chart-refs.js.map +1 -0
- package/lib/esm/charts/hooks/use-chart-zoom.js +114 -0
- package/lib/esm/charts/hooks/use-chart-zoom.js.map +1 -0
- package/lib/esm/charts/hooks/use-legend-interactions.js +145 -0
- package/lib/esm/charts/hooks/use-legend-interactions.js.map +1 -0
- package/lib/esm/charts/hooks/use-legend-series.js +178 -0
- package/lib/esm/charts/hooks/use-legend-series.js.map +1 -0
- package/lib/esm/charts/hooks/use-legend-visibility.js +87 -0
- package/lib/esm/charts/hooks/use-legend-visibility.js.map +1 -0
- package/lib/esm/charts/index.js +1 -1
- package/lib/esm/charts/index.js.map +1 -1
- package/lib/esm/charts/tests/chart-test-utils.js +53 -8
- package/lib/esm/charts/tests/chart-test-utils.js.map +1 -1
- package/lib/esm/charts/themes/ndl-echarts-theme.js.map +1 -1
- package/lib/esm/charts/{aria-description.js → utils/aria-description.js} +4 -45
- package/lib/esm/charts/utils/aria-description.js.map +1 -0
- package/lib/esm/charts/utils/build-chart-option.js +69 -0
- package/lib/esm/charts/utils/build-chart-option.js.map +1 -0
- package/lib/esm/charts/utils/chart-tooltip-formatter.js +82 -0
- package/lib/esm/charts/utils/chart-tooltip-formatter.js.map +1 -0
- package/lib/esm/charts/utils/chart-types.js.map +1 -0
- package/lib/esm/charts/utils/defaults.js.map +1 -0
- package/lib/esm/charts/{utils.js → utils/format-utils.js} +2 -17
- package/lib/esm/charts/utils/format-utils.js.map +1 -0
- package/lib/esm/charts/utils/legend-layout.js +59 -0
- package/lib/esm/charts/utils/legend-layout.js.map +1 -0
- package/lib/esm/charts/{legend-utils.js → utils/legend-utils.js} +1 -75
- package/lib/esm/charts/utils/legend-utils.js.map +1 -0
- package/lib/esm/charts/utils/threshold.js +106 -0
- package/lib/esm/charts/utils/threshold.js.map +1 -0
- package/lib/esm/charts/{user-option-utils.js → utils/user-option-utils.js} +5 -14
- package/lib/esm/charts/utils/user-option-utils.js.map +1 -0
- package/lib/types/charts/Chart.d.ts +2 -2
- package/lib/types/charts/Chart.d.ts.map +1 -1
- package/lib/{esm/charts/types.js → types/charts/ChartContainer.d.ts} +14 -1
- package/lib/types/charts/ChartContainer.d.ts.map +1 -0
- package/lib/types/charts/ChartEmpty.d.ts +1 -1
- package/lib/types/charts/ChartEmpty.d.ts.map +1 -1
- package/lib/types/charts/ChartRender.d.ts +36 -0
- package/lib/types/charts/ChartRender.d.ts.map +1 -0
- package/lib/types/charts/ChartTooltip.d.ts +1 -1
- package/lib/types/charts/ChartTooltip.d.ts.map +1 -1
- package/lib/types/charts/Legend.d.ts +15 -3
- package/lib/types/charts/Legend.d.ts.map +1 -1
- package/lib/{cjs/charts/types.js → types/charts/LegendItem.d.ts} +10 -3
- package/lib/types/charts/LegendItem.d.ts.map +1 -0
- package/lib/types/charts/LegendLayout.d.ts +38 -0
- package/lib/types/charts/LegendLayout.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-chart-instance.d.ts +62 -0
- package/lib/types/charts/hooks/use-chart-instance.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-chart-option.d.ts +48 -0
- package/lib/types/charts/hooks/use-chart-option.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-chart-refs.d.ts +38 -0
- package/lib/types/charts/hooks/use-chart-refs.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-chart-zoom.d.ts +36 -0
- package/lib/types/charts/hooks/use-chart-zoom.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-legend-interactions.d.ts +56 -0
- package/lib/types/charts/hooks/use-legend-interactions.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-legend-series.d.ts +42 -0
- package/lib/types/charts/hooks/use-legend-series.d.ts.map +1 -0
- package/lib/types/charts/hooks/use-legend-visibility.d.ts +24 -0
- package/lib/types/charts/hooks/use-legend-visibility.d.ts.map +1 -0
- package/lib/types/charts/index.d.ts +2 -2
- package/lib/types/charts/index.d.ts.map +1 -1
- package/lib/types/charts/tests/chart-test-utils.d.ts +7 -1
- package/lib/types/charts/tests/chart-test-utils.d.ts.map +1 -1
- package/lib/types/charts/themes/ndl-echarts-theme.d.ts +1 -1
- package/lib/types/charts/themes/ndl-echarts-theme.d.ts.map +1 -1
- package/lib/types/charts/utils/aria-description.d.ts.map +1 -0
- package/lib/types/charts/utils/build-chart-option.d.ts +52 -0
- package/lib/types/charts/utils/build-chart-option.d.ts.map +1 -0
- package/lib/types/charts/utils/chart-tooltip-formatter.d.ts +37 -0
- package/lib/types/charts/utils/chart-tooltip-formatter.d.ts.map +1 -0
- package/lib/types/charts/{chart-types.d.ts → utils/chart-types.d.ts} +23 -22
- package/lib/types/charts/utils/chart-types.d.ts.map +1 -0
- package/lib/types/charts/utils/defaults.d.ts.map +1 -0
- package/lib/types/charts/{utils.d.ts → utils/format-utils.d.ts} +2 -4
- package/lib/types/charts/utils/format-utils.d.ts.map +1 -0
- package/lib/types/charts/utils/legend-layout.d.ts +37 -0
- package/lib/types/charts/utils/legend-layout.d.ts.map +1 -0
- package/lib/types/charts/{legend-utils.d.ts → utils/legend-utils.d.ts} +1 -11
- package/lib/types/charts/utils/legend-utils.d.ts.map +1 -0
- package/lib/types/charts/utils/threshold.d.ts +45 -0
- package/lib/types/charts/utils/threshold.d.ts.map +1 -0
- package/lib/types/charts/utils/user-option-utils.d.ts.map +1 -0
- package/package.json +3 -3
- package/lib/cjs/charts/aria-description.js.map +0 -1
- package/lib/cjs/charts/chart-types.js.map +0 -1
- package/lib/cjs/charts/defaults.js.map +0 -1
- package/lib/cjs/charts/legend-utils.js.map +0 -1
- package/lib/cjs/charts/types.js.map +0 -1
- package/lib/cjs/charts/user-option-utils.js.map +0 -1
- package/lib/cjs/charts/utils.js.map +0 -1
- package/lib/esm/charts/aria-description.js.map +0 -1
- package/lib/esm/charts/chart-types.js.map +0 -1
- package/lib/esm/charts/defaults.js.map +0 -1
- package/lib/esm/charts/legend-utils.js.map +0 -1
- package/lib/esm/charts/types.js.map +0 -1
- package/lib/esm/charts/user-option-utils.js.map +0 -1
- package/lib/esm/charts/utils.js.map +0 -1
- package/lib/types/charts/aria-description.d.ts.map +0 -1
- package/lib/types/charts/chart-types.d.ts.map +0 -1
- package/lib/types/charts/defaults.d.ts.map +0 -1
- package/lib/types/charts/legend-utils.d.ts.map +0 -1
- package/lib/types/charts/types.d.ts +0 -44
- package/lib/types/charts/types.d.ts.map +0 -1
- package/lib/types/charts/user-option-utils.d.ts.map +0 -1
- package/lib/types/charts/utils.d.ts.map +0 -1
- /package/lib/cjs/charts/{chart-types.js → utils/chart-types.js} +0 -0
- /package/lib/cjs/charts/{defaults.js → utils/defaults.js} +0 -0
- /package/lib/esm/charts/{chart-types.js → utils/chart-types.js} +0 -0
- /package/lib/esm/charts/{defaults.js → utils/defaults.js} +0 -0
- /package/lib/types/charts/{aria-description.d.ts → utils/aria-description.d.ts} +0 -0
- /package/lib/types/charts/{defaults.d.ts → utils/defaults.d.ts} +0 -0
- /package/lib/types/charts/{user-option-utils.d.ts → utils/user-option-utils.d.ts} +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) "Neo4j"
|
|
4
|
+
* Neo4j Sweden AB [http://neo4j.com]
|
|
5
|
+
*
|
|
6
|
+
* This file is part of Neo4j.
|
|
7
|
+
*
|
|
8
|
+
* Neo4j is free software: you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License as published by
|
|
10
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
* (at your option) any later version.
|
|
12
|
+
*
|
|
13
|
+
* This program is distributed in the hope that it will be useful,
|
|
14
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
* GNU General Public License for more details.
|
|
17
|
+
*
|
|
18
|
+
* You should have received a copy of the GNU General Public License
|
|
19
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
*/
|
|
21
|
+
import { getInstanceByDom } from 'echarts';
|
|
22
|
+
import { useCallback } from 'react';
|
|
23
|
+
import { isThresholdLine } from '../utils/threshold';
|
|
24
|
+
import { useChartRefsContext } from './use-chart-refs';
|
|
25
|
+
export const useLegendVisibility = (selectedSeries) => {
|
|
26
|
+
const { chartEchartRef } = useChartRefsContext();
|
|
27
|
+
const setOnlyVisible = useCallback((name) => {
|
|
28
|
+
if (chartEchartRef.current === null) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const chart = getInstanceByDom(chartEchartRef.current);
|
|
32
|
+
chart === null || chart === void 0 ? void 0 : chart.dispatchAction({
|
|
33
|
+
name: name,
|
|
34
|
+
type: 'legendSelect',
|
|
35
|
+
});
|
|
36
|
+
const otherNames = Object.keys(selectedSeries).filter((n) => n !== name);
|
|
37
|
+
otherNames.forEach((name) => {
|
|
38
|
+
if (isThresholdLine(name)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
chart === null || chart === void 0 ? void 0 : chart.dispatchAction({
|
|
42
|
+
name: name,
|
|
43
|
+
type: 'legendUnSelect',
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}, [chartEchartRef, selectedSeries]);
|
|
47
|
+
const setAllVisible = useCallback(() => {
|
|
48
|
+
if (chartEchartRef.current === null) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const chart = getInstanceByDom(chartEchartRef.current);
|
|
52
|
+
chart === null || chart === void 0 ? void 0 : chart.dispatchAction({
|
|
53
|
+
type: 'legendAllSelect',
|
|
54
|
+
});
|
|
55
|
+
}, [chartEchartRef]);
|
|
56
|
+
/**
|
|
57
|
+
* Toggle the visibility of a legend series
|
|
58
|
+
*
|
|
59
|
+
* The toggle logic depends on the current state of the series:
|
|
60
|
+
* - If only the legend series that was selected is visible: show all series
|
|
61
|
+
* - If all series are visible: hide all except the series that was selected
|
|
62
|
+
* - Otherwise: toggle the legend series
|
|
63
|
+
*
|
|
64
|
+
* The isOnlyVisible and isAllSeriesSelected states can't be calculated in this
|
|
65
|
+
* function since different legend types require different logic.
|
|
66
|
+
*/
|
|
67
|
+
const toggleLegendVisibility = useCallback((name, isAllSeriesSelected, isOnlyVisible) => {
|
|
68
|
+
if (chartEchartRef.current === null || name === undefined) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (isOnlyVisible) {
|
|
72
|
+
setAllVisible();
|
|
73
|
+
}
|
|
74
|
+
else if (isAllSeriesSelected) {
|
|
75
|
+
setOnlyVisible(name);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const chart = getInstanceByDom(chartEchartRef.current);
|
|
79
|
+
chart === null || chart === void 0 ? void 0 : chart.dispatchAction({
|
|
80
|
+
name: name,
|
|
81
|
+
type: 'legendToggleSelect',
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}, [chartEchartRef, setOnlyVisible, setAllVisible]);
|
|
85
|
+
return { toggleLegendVisibility };
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=use-legend-visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-legend-visibility.js","sourceRoot":"","sources":["../../../../src/charts/hooks/use-legend-visibility.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,cAAuC,EACvC,EAAE;IACF,MAAM,EAAE,cAAc,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEjD,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,IAAwB,EAAE,EAAE;QAC3B,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEvD,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;YACpB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,cAAc;SACrB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACzE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;gBACpB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,cAAc,EAAE,cAAc,CAAC,CACjC,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;QACrC,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEvD,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;YACpB,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,sBAAsB,GAAG,WAAW,CACxC,CACE,IAAwB,EACxB,mBAA4B,EAC5B,aAAsB,EACtB,EAAE;QACF,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,mBAAmB,EAAE,CAAC;YAC/B,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,cAAc,CAAC;gBACpB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,oBAAoB;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,cAAc,EAAE,cAAc,EAAE,aAAa,CAAC,CAChD,CAAC;IAEF,OAAO,EAAE,sBAAsB,EAAE,CAAC;AACpC,CAAC,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { getInstanceByDom } from 'echarts';\nimport { useCallback } from 'react';\n\nimport { isThresholdLine } from '../utils/threshold';\nimport { useChartRefsContext } from './use-chart-refs';\n\nexport const useLegendVisibility = (\n selectedSeries: Record<string, boolean>,\n) => {\n const { chartEchartRef } = useChartRefsContext();\n\n const setOnlyVisible = useCallback(\n (name: string | undefined) => {\n if (chartEchartRef.current === null) {\n return;\n }\n const chart = getInstanceByDom(chartEchartRef.current);\n\n chart?.dispatchAction({\n name: name,\n type: 'legendSelect',\n });\n\n const otherNames = Object.keys(selectedSeries).filter((n) => n !== name);\n otherNames.forEach((name) => {\n if (isThresholdLine(name)) {\n return;\n }\n\n chart?.dispatchAction({\n name: name,\n type: 'legendUnSelect',\n });\n });\n },\n [chartEchartRef, selectedSeries],\n );\n\n const setAllVisible = useCallback(() => {\n if (chartEchartRef.current === null) {\n return;\n }\n\n const chart = getInstanceByDom(chartEchartRef.current);\n\n chart?.dispatchAction({\n type: 'legendAllSelect',\n });\n }, [chartEchartRef]);\n\n /**\n * Toggle the visibility of a legend series\n *\n * The toggle logic depends on the current state of the series:\n * - If only the legend series that was selected is visible: show all series\n * - If all series are visible: hide all except the series that was selected\n * - Otherwise: toggle the legend series\n *\n * The isOnlyVisible and isAllSeriesSelected states can't be calculated in this\n * function since different legend types require different logic.\n */\n const toggleLegendVisibility = useCallback(\n (\n name: string | undefined,\n isAllSeriesSelected: boolean,\n isOnlyVisible: boolean,\n ) => {\n if (chartEchartRef.current === null || name === undefined) {\n return;\n }\n\n if (isOnlyVisible) {\n setAllVisible();\n } else if (isAllSeriesSelected) {\n setOnlyVisible(name);\n } else {\n const chart = getInstanceByDom(chartEchartRef.current);\n\n chart?.dispatchAction({\n name: name,\n type: 'legendToggleSelect',\n });\n }\n },\n [chartEchartRef, setOnlyVisible, setAllVisible],\n );\n\n return { toggleLegendVisibility };\n};\n"]}
|
package/lib/esm/charts/index.js
CHANGED
|
@@ -21,5 +21,5 @@
|
|
|
21
21
|
export * from './Chart';
|
|
22
22
|
export * from './ChartEmpty';
|
|
23
23
|
// Export utils and types that were previously exported from Chart.tsx. Not sure that they are needed, but keeping them to not be breaking.
|
|
24
|
-
export { defaultThresholdLineSeriesOption } from './defaults';
|
|
24
|
+
export { defaultThresholdLineSeriesOption } from './utils/defaults';
|
|
25
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/charts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,2IAA2I;AAC3I,OAAO,EAAE,gCAAgC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/charts/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,2IAA2I;AAC3I,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nexport * from './Chart';\nexport * from './ChartEmpty';\n// Export utils and types that were previously exported from Chart.tsx. Not sure that they are needed, but keeping them to not be breaking.\nexport { defaultThresholdLineSeriesOption } from './utils/defaults';\nexport {\n type ChartEmptyProps,\n type ThresholdLineSeriesOption,\n type Values,\n type SeriesOption,\n type EchartsSeries,\n type NeedleSeries,\n} from './utils/chart-types';\n"]}
|
|
@@ -127,7 +127,6 @@ export const multiSeriesChartProps = {
|
|
|
127
127
|
},
|
|
128
128
|
legend: {
|
|
129
129
|
show: true,
|
|
130
|
-
wrappingType: 'wrapping',
|
|
131
130
|
},
|
|
132
131
|
option: {},
|
|
133
132
|
series: [
|
|
@@ -174,14 +173,58 @@ export const pieChartWithTooltipFormatter = ({ seriesName, value, rgbSeriesColor
|
|
|
174
173
|
export const barChartWithTooltipFormatter = ({ seriesName, value, rgbSeriesColor, chartProps, width = '100%', height = '400px', }) => (_jsx("div", { style: { height, width }, children: _jsx(ChartWrapperWithTooltipFormatter, Object.assign({}, barChartProps(seriesName, value, rgbSeriesColor), chartProps)) }));
|
|
175
174
|
export const barChart = ({ seriesName, value, rgbSeriesColor, chartProps, width = '100%', height = '400px', }) => (_jsx("div", { style: { height, width }, children: _jsx(Chart, Object.assign({}, barChartProps(seriesName, value, rgbSeriesColor), chartProps)) }));
|
|
176
175
|
export const expectChartElementVisible = (page) => __awaiter(void 0, void 0, void 0, function* () {
|
|
177
|
-
yield expect(page.locator('svg')).toBeVisible();
|
|
176
|
+
yield expect(page.locator('svg').first()).toBeVisible();
|
|
178
177
|
yield expect(page.locator('.ndl-chart-legend')).toBeVisible();
|
|
179
178
|
});
|
|
179
|
+
export const startLegendMeasuringObserver = (page_1, ...args_1) => __awaiter(void 0, [page_1, ...args_1], void 0, function* (page, options = {}) {
|
|
180
|
+
yield page.evaluate(({ chartLayoutSelector }) => {
|
|
181
|
+
var _a;
|
|
182
|
+
const windowWithLegendObserver = window;
|
|
183
|
+
const legendElement = document.querySelector('.ndl-chart-legend');
|
|
184
|
+
const chartLayout = chartLayoutSelector
|
|
185
|
+
? document.querySelector(chartLayoutSelector)
|
|
186
|
+
: undefined;
|
|
187
|
+
windowWithLegendObserver.__chartHeightDuringLegendMeasurement = undefined;
|
|
188
|
+
windowWithLegendObserver.__legendMeasuringClassWasAdded = false;
|
|
189
|
+
(_a = windowWithLegendObserver.__legendMeasuringObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
190
|
+
if (!legendElement) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const observer = new MutationObserver(() => {
|
|
194
|
+
if (!legendElement.classList.contains('ndl-chart-legend-calculating')) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
windowWithLegendObserver.__legendMeasuringClassWasAdded = true;
|
|
198
|
+
if (chartLayout &&
|
|
199
|
+
windowWithLegendObserver.__chartHeightDuringLegendMeasurement ===
|
|
200
|
+
undefined) {
|
|
201
|
+
windowWithLegendObserver.__chartHeightDuringLegendMeasurement =
|
|
202
|
+
chartLayout.getBoundingClientRect().height;
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
observer.observe(legendElement, {
|
|
206
|
+
attributeFilter: ['class'],
|
|
207
|
+
attributes: true,
|
|
208
|
+
});
|
|
209
|
+
windowWithLegendObserver.__legendMeasuringObserver = observer;
|
|
210
|
+
}, options);
|
|
211
|
+
});
|
|
212
|
+
export const getLegendMeasuringObserverResult = (page) => __awaiter(void 0, void 0, void 0, function* () {
|
|
213
|
+
return page.evaluate(() => {
|
|
214
|
+
var _a, _b;
|
|
215
|
+
const windowWithLegendObserver = window;
|
|
216
|
+
(_a = windowWithLegendObserver.__legendMeasuringObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
217
|
+
return {
|
|
218
|
+
chartHeightDuringMeasurement: windowWithLegendObserver.__chartHeightDuringLegendMeasurement,
|
|
219
|
+
didAddMeasuringClass: (_b = windowWithLegendObserver.__legendMeasuringClassWasAdded) !== null && _b !== void 0 ? _b : false,
|
|
220
|
+
};
|
|
221
|
+
});
|
|
222
|
+
});
|
|
180
223
|
const SELECTORS = {
|
|
181
|
-
CHECKMARK: '.ndl-chart-legend-item-square-checkmark',
|
|
182
|
-
DESELECTED: '.ndl-chart-legend-item-deselected',
|
|
183
|
-
seriesCheckmark: (name) =>
|
|
184
|
-
seriesDeselected: (name) =>
|
|
224
|
+
CHECKMARK: '.ndl-chart-legend > .ndl-chart-legend-item .ndl-chart-legend-item-square-checkmark',
|
|
225
|
+
DESELECTED: '.ndl-chart-legend > .ndl-chart-legend-item-deselected',
|
|
226
|
+
seriesCheckmark: (name) => `.ndl-chart-legend > [data-labelname="${name}"] .ndl-chart-legend-item-square-checkmark`,
|
|
227
|
+
seriesDeselected: (name) => `.ndl-chart-legend > [data-labelname="${name}"].ndl-chart-legend-item-deselected`,
|
|
185
228
|
};
|
|
186
229
|
const getGraphPaletteColorFromSeriesIndex = (index) => {
|
|
187
230
|
const hexColor = tokens.categorical[index];
|
|
@@ -258,7 +301,7 @@ export const expectLegendSeriesToBeHighlightedInChart = (page, seriesNamesToBeHi
|
|
|
258
301
|
export const expectLegendSeriesToBeVisibleInChart = (page, seriesNamesToBeVisible) => __awaiter(void 0, void 0, void 0, function* () {
|
|
259
302
|
yield expect(page.locator('svg path').first()).toBeAttached();
|
|
260
303
|
for (const name of seriesNamesToBeVisible) {
|
|
261
|
-
const visibleLegendItem = page.locator(
|
|
304
|
+
const visibleLegendItem = page.locator(`.ndl-chart-legend > [data-labelname="${name}"]`);
|
|
262
305
|
if ((yield visibleLegendItem.count()) > 0) {
|
|
263
306
|
yield expect(visibleLegendItem).not.toHaveClass(/ndl-chart-legend-item-deselected/);
|
|
264
307
|
}
|
|
@@ -295,7 +338,9 @@ export const expectAllLegendsNeutral = (page) => __awaiter(void 0, void 0, void
|
|
|
295
338
|
* This is needed to make sure the series has the correct color when looking for them in the chart in later steps.
|
|
296
339
|
*/
|
|
297
340
|
export const clickSeries = (page, seriesName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
298
|
-
yield page
|
|
341
|
+
yield page
|
|
342
|
+
.locator(`.ndl-chart-legend > [data-labelname="${seriesName}"]`)
|
|
343
|
+
.click();
|
|
299
344
|
yield page.hover('.ndl-chart');
|
|
300
345
|
});
|
|
301
346
|
export const expectFormattedTooltipToBeVisible = (page, seriesName, value, rgbSeriesColor) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-test-utils.js","sourceRoot":"","sources":["../../../../src/charts/tests/chart-test-utils.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { tokens } from '@neo4j-ndl/base';\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport { expect } from '@playwright/experimental-ct-react';\nimport { type Page } from '@playwright/test';\nimport { type ComponentProps } from 'react';\n\nimport { ChartWrapperWithTooltipFormatter } from './ChartWrapperWithTooltipFormatter';\n\n/**\n * Convert hex color to rgb format\n *\n * @param hex color in hex code format\n * @returns color in rgb format rgb(_, _, _)\n */\nconst convertHexToRGB = (hex: string) => {\n const normalizedHex = hex.replace(/^#/, '');\n\n const red = parseInt(normalizedHex.substring(0, 2), 16);\n const green = parseInt(normalizedHex.substring(2, 4), 16);\n const blue = parseInt(normalizedHex.substring(4, 6), 16);\n\n return `rgb(${red}, ${green}, ${blue})`;\n};\n\nexport const chartColorsAfterHighlighting: Record<number, string> = {\n 1: 'rgb(93,207,216)',\n 10: 'rgb(210,126,49)',\n 11: 'rgb(78,151,121)',\n 12: 'rgb(190,255,117)',\n 2: 'rgb(84,80,223)',\n 3: 'rgb(242,152,62)',\n 4: 'rgb(221,75,155)',\n 5: 'rgb(156,154,255)',\n 6: 'rgb(132,244,136)',\n 7: 'rgb(69,140,249)',\n 8: 'rgb(113,69,188)',\n 9: 'rgb(240,210,70)',\n};\n\nexport const pieChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: [\n {\n source: [\n ['product', '2012'],\n [seriesName, value],\n ],\n },\n ],\n legend: {\n show: true,\n },\n series: [\n {\n center: ['50%', '50%'],\n encode: {\n itemName: 'product',\n value: '2012',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n radius: '90%',\n type: 'pie' as const,\n },\n ],\n});\n\nexport const barChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: {\n dimensions: ['Country', 'Sales'],\n source: [['Finland', value]],\n },\n legend: {\n show: true,\n },\n series: [\n {\n encode: {\n x: 'Country',\n y: 'Sales',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n name: seriesName,\n type: 'bar' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n});\n\nexport const multiSeriesChartProps = {\n dataset: {\n dimensions: ['day', 'first', 'second', 'third', 'fourth', 'fifth', 'sixth'],\n source: [\n ['Monday', 20, 40, 60, 80, 100, 120],\n ['Tuesday', 30, 50, 70, 90, 110, 130],\n ['Wednesday', 25, 45, 65, 85, 105, 125],\n ['Thursday', 35, 55, 75, 95, 115, 135],\n ['Friday', 40, 60, 80, 100, 120, 140],\n ],\n },\n legend: {\n show: true,\n wrappingType: 'wrapping' as const,\n },\n option: {},\n series: [\n {\n encode: { x: 'day', y: 'first' },\n name: 'First Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'second' },\n name: 'Second Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'third' },\n name: 'Third Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'fourth' },\n name: 'Fourth Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'fifth' },\n name: 'Fifth Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'sixth' },\n name: 'Sixth Series',\n type: 'line' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n};\n\nexport const multiSeriesChart = ({\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n}) => (\n <div style={{ height, width }} className=\"ndl-chart\">\n <Chart {...multiSeriesChartProps} {...chartProps} />\n </div>\n);\n\nexport const pieChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...pieChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChart = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <Chart\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const expectChartElementVisible = async (page: Page) => {\n await expect(page.locator('svg')).toBeVisible();\n await expect(page.locator('.ndl-chart-legend')).toBeVisible();\n};\n\nconst SELECTORS = {\n CHECKMARK: '.ndl-chart-legend-item-square-checkmark',\n DESELECTED: '.ndl-chart-legend-item-deselected',\n seriesCheckmark: (name: string) =>\n `[data-labelname=\"${name}\"] .ndl-chart-legend-item-square-checkmark`,\n seriesDeselected: (name: string) =>\n `[data-labelname=\"${name}\"].ndl-chart-legend-item-deselected`,\n} as const;\n\nconst getGraphPaletteColorFromSeriesIndex = (index: string): string => {\n const hexColor = tokens.categorical[index as keyof typeof tokens.categorical];\n if (!hexColor) {\n throw new Error(`Categorical palette index ${index} not found`);\n }\n\n return hexColor;\n};\n\n/**\n * Checks so a single series is not blurred.\n */\nexport const expectSingleSeriesNotToBeBlurred = async (\n page: Page,\n seriesName: string,\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n const seriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === seriesName) +\n 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[seriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n seriesIndex.toString(),\n );\n\n // More flexible color matching - try both with and without spaces\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n // Wait for the element to be attached to the DOM before checking its attributes\n await expect(pathLocator).toBeAttached({ timeout: 10000 });\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n};\n\n/**\n * Checks so that the seriesNamesToBeHighlighted are visible in the chart and that other series are blurred.\n */\nexport const expectLegendSeriesToBeHighlightedInChart = async (\n page: Page,\n seriesNamesToBeHighlighted: string[],\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n for (const name of seriesNamesToBeHighlighted) {\n const highlightedSeriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === name) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[highlightedSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n highlightedSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n }\n\n const seriesToBeBlurred = allChartSeries.filter(\n (series) => !seriesNamesToBeHighlighted.includes(series.name),\n );\n\n for (const series of seriesToBeBlurred) {\n const blurredSeriesIndex =\n allChartSeries.findIndex(\n (seriesItem) => seriesItem.name === series.name,\n ) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[blurredSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n blurredSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).toHaveAttribute('stroke-opacity');\n }\n};\n\n/**\n * Identifies if the series are visible / not visible in the chart by checking\n * component-owned legend state. ECharts rewrites generated SVG paths during\n * legend updates, which makes exact path color selectors flaky in Firefox.\n */\nexport const expectLegendSeriesToBeVisibleInChart = async (\n page: Page,\n seriesNamesToBeVisible: string[],\n) => {\n await expect(page.locator('svg path').first()).toBeAttached();\n\n for (const name of seriesNamesToBeVisible) {\n const visibleLegendItem = page.locator(`[data-labelname=\"${name}\"]`);\n\n if ((await visibleLegendItem.count()) > 0) {\n await expect(visibleLegendItem).not.toHaveClass(\n /ndl-chart-legend-item-deselected/,\n );\n }\n }\n\n const hiddenSeries = multiSeriesChartProps.series.filter(\n (series) => !seriesNamesToBeVisible.includes(series.name),\n );\n\n for (const hiddenSeriesItem of hiddenSeries) {\n const hiddenLegendItem = page.locator(\n SELECTORS.seriesDeselected(hiddenSeriesItem.name),\n );\n\n if ((await hiddenLegendItem.count()) > 0) {\n await expect(hiddenLegendItem).toBeVisible();\n }\n }\n};\n\n// Check so legends are selected -> has checkmark and no strike-through classes\nexport const expectLegendsSelected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesCheckmark(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesDeselected(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so legends are deselected -> has strike-through and no checkmark classes\nexport const expectLegendsDeselected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesDeselected(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesCheckmark(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so all legends are neutral -> no checkmark and no strike-through classes\nexport const expectAllLegendsNeutral = async (page: Page) => {\n await expect(page.locator(SELECTORS.CHECKMARK)).not.toBeVisible();\n await expect(page.locator(SELECTORS.DESELECTED)).not.toBeVisible();\n};\n\n/**\n * Clicks the series legend item and hover the chart to make sure no blur effect exists on other series in the chart.\n * This is needed to make sure the series has the correct color when looking for them in the chart in later steps.\n */\nexport const clickSeries = async (page: Page, seriesName: string) => {\n await page.locator(`[data-labelname=\"${seriesName}\"]`).click();\n await page.hover('.ndl-chart');\n};\n\nexport const expectFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n await expect(\n page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`)),\n ).toBeVisible();\n await page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`))\n .hover();\n const tooltip = page.getByText(`${seriesName}formatted ${value}`);\n await expect(tooltip).toBeVisible();\n};\n\nexport const expectDefaultFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n const chartElement = page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[fill=\"${rgbWithSpaces}\"]`));\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(seriesName);\n await expect(tooltip).toContainText(\n new Intl.NumberFormat('en-US').format(value),\n );\n};\n\nexport const waitForAnimationEnd = (page: Page, selector: string) => {\n return page\n .locator(selector)\n .evaluate((element) =>\n Promise.all(\n element.getAnimations().map((animation) => animation.finished),\n ),\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"chart-test-utils.js","sourceRoot":"","sources":["../../../../src/charts/tests/chart-test-utils.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { tokens } from '@neo4j-ndl/base';\nimport { Chart } from '@neo4j-ndl/react-charts';\nimport { expect } from '@playwright/experimental-ct-react';\nimport { type Page } from '@playwright/test';\nimport { type ComponentProps } from 'react';\n\nimport { ChartWrapperWithTooltipFormatter } from './ChartWrapperWithTooltipFormatter';\n\n/**\n * Convert hex color to rgb format\n *\n * @param hex color in hex code format\n * @returns color in rgb format rgb(_, _, _)\n */\nconst convertHexToRGB = (hex: string) => {\n const normalizedHex = hex.replace(/^#/, '');\n\n const red = parseInt(normalizedHex.substring(0, 2), 16);\n const green = parseInt(normalizedHex.substring(2, 4), 16);\n const blue = parseInt(normalizedHex.substring(4, 6), 16);\n\n return `rgb(${red}, ${green}, ${blue})`;\n};\n\nexport const chartColorsAfterHighlighting: Record<number, string> = {\n 1: 'rgb(93,207,216)',\n 10: 'rgb(210,126,49)',\n 11: 'rgb(78,151,121)',\n 12: 'rgb(190,255,117)',\n 2: 'rgb(84,80,223)',\n 3: 'rgb(242,152,62)',\n 4: 'rgb(221,75,155)',\n 5: 'rgb(156,154,255)',\n 6: 'rgb(132,244,136)',\n 7: 'rgb(69,140,249)',\n 8: 'rgb(113,69,188)',\n 9: 'rgb(240,210,70)',\n};\n\nexport const pieChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: [\n {\n source: [\n ['product', '2012'],\n [seriesName, value],\n ],\n },\n ],\n legend: {\n show: true,\n },\n series: [\n {\n center: ['50%', '50%'],\n encode: {\n itemName: 'product',\n value: '2012',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n radius: '90%',\n type: 'pie' as const,\n },\n ],\n});\n\nexport const barChartProps = (\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => ({\n dataset: {\n dimensions: ['Country', 'Sales'],\n source: [['Finland', value]],\n },\n legend: {\n show: true,\n },\n series: [\n {\n encode: {\n x: 'Country',\n y: 'Sales',\n },\n itemStyle: {\n color: rgbSeriesColor,\n },\n name: seriesName,\n type: 'bar' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n});\n\nexport const multiSeriesChartProps = {\n dataset: {\n dimensions: ['day', 'first', 'second', 'third', 'fourth', 'fifth', 'sixth'],\n source: [\n ['Monday', 20, 40, 60, 80, 100, 120],\n ['Tuesday', 30, 50, 70, 90, 110, 130],\n ['Wednesday', 25, 45, 65, 85, 105, 125],\n ['Thursday', 35, 55, 75, 95, 115, 135],\n ['Friday', 40, 60, 80, 100, 120, 140],\n ],\n },\n legend: {\n show: true,\n },\n option: {},\n series: [\n {\n encode: { x: 'day', y: 'first' },\n name: 'First Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'second' },\n name: 'Second Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'third' },\n name: 'Third Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'fourth' },\n name: 'Fourth Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'fifth' },\n name: 'Fifth Series',\n type: 'line' as const,\n },\n {\n encode: { x: 'day', y: 'sixth' },\n name: 'Sixth Series',\n type: 'line' as const,\n },\n ],\n xAxis: {\n type: 'category' as const,\n },\n yAxis: {\n type: 'value' as const,\n },\n};\n\nexport const multiSeriesChart = ({\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n}) => (\n <div style={{ height, width }} className=\"ndl-chart\">\n <Chart {...multiSeriesChartProps} {...chartProps} />\n </div>\n);\n\nexport const pieChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...pieChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChartWithTooltipFormatter = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <ChartWrapperWithTooltipFormatter\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const barChart = ({\n seriesName,\n value,\n rgbSeriesColor,\n chartProps,\n width = '100%',\n height = '400px',\n}: {\n chartProps?: Partial<ComponentProps<typeof Chart>>;\n width?: string;\n height?: string;\n seriesName: string;\n value: number;\n rgbSeriesColor: string;\n}) => (\n <div style={{ height, width }}>\n <Chart\n {...barChartProps(seriesName, value, rgbSeriesColor)}\n {...chartProps}\n />\n </div>\n);\n\nexport const expectChartElementVisible = async (page: Page) => {\n await expect(page.locator('svg').first()).toBeVisible();\n await expect(page.locator('.ndl-chart-legend')).toBeVisible();\n};\n\nexport const startLegendMeasuringObserver = async (\n page: Page,\n options: { chartLayoutSelector?: string } = {},\n) => {\n await page.evaluate(({ chartLayoutSelector }) => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n const legendElement = document.querySelector('.ndl-chart-legend');\n const chartLayout = chartLayoutSelector\n ? document.querySelector(chartLayoutSelector)\n : undefined;\n\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement = undefined;\n windowWithLegendObserver.__legendMeasuringClassWasAdded = false;\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n if (!legendElement) {\n return;\n }\n\n const observer = new MutationObserver(() => {\n if (!legendElement.classList.contains('ndl-chart-legend-calculating')) {\n return;\n }\n\n windowWithLegendObserver.__legendMeasuringClassWasAdded = true;\n\n if (\n chartLayout &&\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement ===\n undefined\n ) {\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement =\n chartLayout.getBoundingClientRect().height;\n }\n });\n\n observer.observe(legendElement, {\n attributeFilter: ['class'],\n attributes: true,\n });\n windowWithLegendObserver.__legendMeasuringObserver = observer;\n }, options);\n};\n\nexport const getLegendMeasuringObserverResult = async (page: Page) =>\n page.evaluate(() => {\n const windowWithLegendObserver = window as Window & {\n __chartHeightDuringLegendMeasurement?: number;\n __legendMeasuringClassWasAdded?: boolean;\n __legendMeasuringObserver?: MutationObserver;\n };\n\n windowWithLegendObserver.__legendMeasuringObserver?.disconnect();\n\n return {\n chartHeightDuringMeasurement:\n windowWithLegendObserver.__chartHeightDuringLegendMeasurement,\n didAddMeasuringClass:\n windowWithLegendObserver.__legendMeasuringClassWasAdded ?? false,\n };\n });\n\nconst SELECTORS = {\n CHECKMARK:\n '.ndl-chart-legend > .ndl-chart-legend-item .ndl-chart-legend-item-square-checkmark',\n DESELECTED: '.ndl-chart-legend > .ndl-chart-legend-item-deselected',\n seriesCheckmark: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"] .ndl-chart-legend-item-square-checkmark`,\n seriesDeselected: (name: string) =>\n `.ndl-chart-legend > [data-labelname=\"${name}\"].ndl-chart-legend-item-deselected`,\n} as const;\n\nconst getGraphPaletteColorFromSeriesIndex = (index: string): string => {\n const hexColor = tokens.categorical[index as keyof typeof tokens.categorical];\n if (!hexColor) {\n throw new Error(`Categorical palette index ${index} not found`);\n }\n\n return hexColor;\n};\n\n/**\n * Checks so a single series is not blurred.\n */\nexport const expectSingleSeriesNotToBeBlurred = async (\n page: Page,\n seriesName: string,\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n const seriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === seriesName) +\n 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[seriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n seriesIndex.toString(),\n );\n\n // More flexible color matching - try both with and without spaces\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n // Wait for the element to be attached to the DOM before checking its attributes\n await expect(pathLocator).toBeAttached({ timeout: 10000 });\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n};\n\n/**\n * Checks so that the seriesNamesToBeHighlighted are visible in the chart and that other series are blurred.\n */\nexport const expectLegendSeriesToBeHighlightedInChart = async (\n page: Page,\n seriesNamesToBeHighlighted: string[],\n) => {\n const allChartSeries = multiSeriesChartProps.series;\n\n for (const name of seriesNamesToBeHighlighted) {\n const highlightedSeriesIndex =\n allChartSeries.findIndex((seriesItem) => seriesItem.name === name) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[highlightedSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n highlightedSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).not.toHaveAttribute('stroke-opacity');\n }\n\n const seriesToBeBlurred = allChartSeries.filter(\n (series) => !seriesNamesToBeHighlighted.includes(series.name),\n );\n\n for (const series of seriesToBeBlurred) {\n const blurredSeriesIndex =\n allChartSeries.findIndex(\n (seriesItem) => seriesItem.name === series.name,\n ) + 1;\n\n const rgbSeriesColor = chartColorsAfterHighlighting[blurredSeriesIndex];\n const hexSeriesColor = getGraphPaletteColorFromSeriesIndex(\n blurredSeriesIndex.toString(),\n );\n\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n const hexRgb = convertHexToRGB(hexSeriesColor);\n const rgbWithoutSpaces = hexRgb.replace(/, /g, ',');\n\n const pathLocator = page\n .locator(`path[stroke=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[stroke=\"${rgbWithSpaces}\"]`))\n .or(page.locator(`path[stroke=\"${hexSeriesColor}\"]`))\n .or(page.locator(`path[stroke=\"${convertHexToRGB(hexSeriesColor)}\"]`))\n .or(page.locator(`path[stroke=\"${rgbWithoutSpaces}\"]`));\n\n await expect(pathLocator).toHaveAttribute('stroke-opacity');\n }\n};\n\n/**\n * Identifies if the series are visible / not visible in the chart by checking\n * component-owned legend state. ECharts rewrites generated SVG paths during\n * legend updates, which makes exact path color selectors flaky in Firefox.\n */\nexport const expectLegendSeriesToBeVisibleInChart = async (\n page: Page,\n seriesNamesToBeVisible: string[],\n) => {\n await expect(page.locator('svg path').first()).toBeAttached();\n\n for (const name of seriesNamesToBeVisible) {\n const visibleLegendItem = page.locator(\n `.ndl-chart-legend > [data-labelname=\"${name}\"]`,\n );\n\n if ((await visibleLegendItem.count()) > 0) {\n await expect(visibleLegendItem).not.toHaveClass(\n /ndl-chart-legend-item-deselected/,\n );\n }\n }\n\n const hiddenSeries = multiSeriesChartProps.series.filter(\n (series) => !seriesNamesToBeVisible.includes(series.name),\n );\n\n for (const hiddenSeriesItem of hiddenSeries) {\n const hiddenLegendItem = page.locator(\n SELECTORS.seriesDeselected(hiddenSeriesItem.name),\n );\n\n if ((await hiddenLegendItem.count()) > 0) {\n await expect(hiddenLegendItem).toBeVisible();\n }\n }\n};\n\n// Check so legends are selected -> has checkmark and no strike-through classes\nexport const expectLegendsSelected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesCheckmark(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesDeselected(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so legends are deselected -> has strike-through and no checkmark classes\nexport const expectLegendsDeselected = async (\n page: Page,\n seriesNames: string[],\n) => {\n for (const name of seriesNames) {\n await expect(page.locator(SELECTORS.seriesDeselected(name))).toBeVisible();\n await expect(\n page.locator(SELECTORS.seriesCheckmark(name)),\n ).not.toBeVisible();\n }\n};\n\n// Check so all legends are neutral -> no checkmark and no strike-through classes\nexport const expectAllLegendsNeutral = async (page: Page) => {\n await expect(page.locator(SELECTORS.CHECKMARK)).not.toBeVisible();\n await expect(page.locator(SELECTORS.DESELECTED)).not.toBeVisible();\n};\n\n/**\n * Clicks the series legend item and hover the chart to make sure no blur effect exists on other series in the chart.\n * This is needed to make sure the series has the correct color when looking for them in the chart in later steps.\n */\nexport const clickSeries = async (page: Page, seriesName: string) => {\n await page\n .locator(`.ndl-chart-legend > [data-labelname=\"${seriesName}\"]`)\n .click();\n await page.hover('.ndl-chart');\n};\n\nexport const expectFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n await expect(\n page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`)),\n ).toBeVisible();\n await page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`fill[stroke=\"${rgbWithSpaces}\"]`))\n .hover();\n const tooltip = page.getByText(`${seriesName}formatted ${value}`);\n await expect(tooltip).toBeVisible();\n};\n\nexport const expectDefaultFormattedTooltipToBeVisible = async (\n page: Page,\n seriesName: string,\n value: number,\n rgbSeriesColor: string,\n) => {\n const rgbWithSpaces = rgbSeriesColor.replace(/,/g, ', ');\n\n const chartElement = page\n .locator(`path[fill=\"${rgbSeriesColor}\"]`)\n .or(page.locator(`path[fill=\"${rgbWithSpaces}\"]`));\n\n await expect(chartElement).toBeVisible();\n await chartElement.hover();\n\n const tooltip = page.locator('.ndl-charts-chart-tooltip');\n await expect(tooltip).toContainText(seriesName);\n await expect(tooltip).toContainText(\n new Intl.NumberFormat('en-US').format(value),\n );\n};\n\nexport const waitForAnimationEnd = (page: Page, selector: string) => {\n return page\n .locator(selector)\n .evaluate((element) =>\n Promise.all(\n element.getAnimations().map((animation) => animation.finished),\n ),\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ndl-echarts-theme.js","sourceRoot":"","sources":["../../../../src/charts/themes/ndl-echarts-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,2BAA2B;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,MAAM,UAAU,GAAG,CAAC,KAAuB,EAAE,EAAE,CAAC,CAAC;IAC/C,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;QACpD,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,UAAU;QACtD,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,QAAQ;KACnD;IACD,QAAQ,EAAE;QACR,SAAS,EAAE;YACT,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;YACtD,KAAK,EAAE,CAAC;SACT;KACF;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;YACtD,KAAK,EAAE,CAAC;SACT;QACD,IAAI,EAAE,IAAI;KACX;IACD,cAAc,EAAE;QACd,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;SACrD;KACF;IACD,SAAS,EAAE;QACT,SAAS,EAAE;YACT,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC;SAChE;KACF;IACD,SAAS,EAAE;QACT,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;SACrD;KACF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAuB,EACvB,OAAoB,EACpB,EAAE;IACF,OAAO;QACL,QAAQ,EAAE,KAAK,KAAK,MAAM;QAC1B,KAAK,EAAE,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QACnD,eAAe,EAAE,aAAa;QAE9B,WAAW,EAAE;YACX,UAAU,EAAE;gBACV,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;aACvD;YACD,KAAK,EAAE;gBACL,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;aACrD;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;aACvD;SACF;QACD,0DAA0D;QAC1D,MAAM,EAAE,EAAE;QACV,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;SACrD;QACD,sEAAsE;QACtE,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QAEX,QAAQ,EAAE;YACR,eAAe,EAAE,aAAa;YAC9B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;YAC1D,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,cAAc,EAAE;gBACd,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO;oBACnD,OAAO,EAAE,CAAC;iBACX;gBACD,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;oBACpD,OAAO,EAAE,CAAC;oBACV,KAAK,EAAE,CAAC;iBACT;aACF;YACD,QAAQ,EAAE;gBACR,WAAW,EAAE,EAAE;gBACf,WAAW,EAAE;oBACX,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;oBAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM;oBAClD,OAAO,EAAE,CAAC;iBACX;gBACD,eAAe,EAAE;oBACf,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;oBAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;oBACtD,OAAO,EAAE,CAAC;iBACX;aACF;YACD,WAAW,EAAE,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,eAAe;YAChF,UAAU,EACR,kFAAkF;YACpF,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE;gBACX,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;gBAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI;gBAEhD,mCAAmC;aACpC;YACD,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE;gBACf,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM;gBAC5D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM;gBAClD,OAAO,EAAE,CAAC,EAAE,OAAO;aACpB;YACD,sBAAsB,EAAE;gBACtB,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC;oBACzD,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,CAAC;iBACd;gBACD,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;oBACtD,OAAO,EAAE,CAAC;oBACV,KAAK,EAAE,CAAC;iBACT;aACF;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM;aACrD;SACF;QACD,kBAAkB;QAClB,SAAS,EAAE,EAAE;QACb,kBAAkB;QAClB,QAAQ,EAAE,EAAE;QACZ,kBAAkB;QAClB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC;QAC3B,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;QAC1B,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC;QAC5B,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC;QAC/B,IAAI,EAAE;YACJ,MAAM,EAAE,QAAQ;SACjB;QACD,kBAAkB;QAClB,KAAK,EAAE,EAAE;QACT,kBAAkB;QAClB,KAAK,EAAE,EAAE;QACT,kBAAkB;QAClB,WAAW,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n// oxlint-disable sort-keys\nimport { tokens } from '@neo4j-ndl/base';\n\nimport { type HexColor } from '../chart-types';\n\nconst axisCommon = (theme: 'light' | 'dark') => ({\n axisLabel: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n fontFamily: tokens.typography['body-small'].fontFamily,\n fontSize: tokens.typography['body-small'].fontSize,\n },\n axisLine: {\n lineStyle: {\n cap: 'square',\n color: tokens.theme[theme].color.neutral.border.strong,\n width: 2,\n },\n },\n axisTick: {\n length: 8,\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n width: 1,\n },\n show: true,\n },\n minorSplitLine: {\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n },\n },\n splitArea: {\n areaStyle: {\n color: [tokens.theme[theme].color.neutral.hover, 'transparent'],\n },\n },\n splitLine: {\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n },\n },\n});\n\nexport const ndlEchartsTheme = (\n theme: 'light' | 'dark',\n palette?: HexColor[],\n) => {\n return {\n darkMode: theme === 'dark',\n color: palette ?? Object.values(tokens.categorical),\n backgroundColor: 'transparent',\n\n axisPointer: {\n crossStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n },\n label: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n },\n },\n // We use a custom legend so this does not affect anything\n legend: {},\n textStyle: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n // We are not using the echarts title so this does not affect anything\n title: {},\n toolbox: {},\n\n dataZoom: {\n backgroundColor: 'transparent',\n borderColor: tokens.theme[theme].color.neutral.border.weak,\n borderRadius: parseInt(tokens.borderRadius.sm.replace('px', '')),\n dataBackground: {\n areaStyle: {\n color: tokens.theme[theme].color.neutral.bg.default,\n opacity: 1,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n opacity: 1,\n width: 1,\n },\n },\n emphasis: {\n handleLabel: {},\n handleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.bg.strong,\n opacity: 1,\n },\n moveHandleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.border.strong,\n opacity: 1,\n },\n },\n fillerColor: `rgb( from ${tokens.theme[theme].color.neutral.hover} r g b / 0.1)`,\n handleIcon:\n 'M2 0.5h4s1.5 0 1.5 1.5v16s0 1.5 -1.5 1.5h-4s-1.5 0 -1.5 -1.5v-16s0 -1.5 1.5 -1.5',\n handleSize: '80%',\n handleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.bg.weak,\n\n // borderRadius: 0, // Doesn't work\n },\n moveHandleSize: 6,\n moveHandleStyle: {\n backgroundColor: tokens.theme[theme].color.neutral.bg.strong,\n color: tokens.theme[theme].color.neutral.bg.strong,\n opacity: 1, // 0.3,\n },\n selectedDataBackground: {\n areaStyle: {\n color: tokens.theme[theme].color.neutral.bg['on-bg-weak'],\n opacity: 1,\n shadowBlur: 0,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n opacity: 1,\n width: 1,\n },\n },\n textStyle: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n },\n // Not implemented\n visualMap: {},\n // Not implemented\n timeline: {},\n // Not implemented\n calendar: {},\n timeAxis: axisCommon(theme),\n logAxis: axisCommon(theme),\n valueAxis: axisCommon(theme),\n categoryAxis: axisCommon(theme),\n line: {\n symbol: 'circle',\n },\n // Not implemented\n graph: {},\n // Not implemented\n gauge: {},\n // Not implemented\n candlestick: {},\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ndl-echarts-theme.js","sourceRoot":"","sources":["../../../../src/charts/themes/ndl-echarts-theme.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n// oxlint-disable sort-keys\nimport { tokens } from '@neo4j-ndl/base';\n\nimport { type HexColor } from '../utils/chart-types';\n\nconst axisCommon = (theme: 'light' | 'dark') => ({\n axisLabel: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n fontFamily: tokens.typography['body-small'].fontFamily,\n fontSize: tokens.typography['body-small'].fontSize,\n },\n axisLine: {\n lineStyle: {\n cap: 'square',\n color: tokens.theme[theme].color.neutral.border.strong,\n width: 2,\n },\n },\n axisTick: {\n length: 8,\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n width: 1,\n },\n show: true,\n },\n minorSplitLine: {\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n },\n },\n splitArea: {\n areaStyle: {\n color: [tokens.theme[theme].color.neutral.hover, 'transparent'],\n },\n },\n splitLine: {\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n },\n },\n});\n\nexport const ndlEchartsTheme = (\n theme: 'light' | 'dark',\n palette?: HexColor[],\n) => {\n return {\n darkMode: theme === 'dark',\n color: palette ?? Object.values(tokens.categorical),\n backgroundColor: 'transparent',\n\n axisPointer: {\n crossStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n },\n label: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n },\n },\n // We use a custom legend so this does not affect anything\n legend: {},\n textStyle: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n // We are not using the echarts title so this does not affect anything\n title: {},\n toolbox: {},\n\n dataZoom: {\n backgroundColor: 'transparent',\n borderColor: tokens.theme[theme].color.neutral.border.weak,\n borderRadius: parseInt(tokens.borderRadius.sm.replace('px', '')),\n dataBackground: {\n areaStyle: {\n color: tokens.theme[theme].color.neutral.bg.default,\n opacity: 1,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.weak,\n opacity: 1,\n width: 1,\n },\n },\n emphasis: {\n handleLabel: {},\n handleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.bg.strong,\n opacity: 1,\n },\n moveHandleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.border.strong,\n opacity: 1,\n },\n },\n fillerColor: `rgb( from ${tokens.theme[theme].color.neutral.hover} r g b / 0.1)`,\n handleIcon:\n 'M2 0.5h4s1.5 0 1.5 1.5v16s0 1.5 -1.5 1.5h-4s-1.5 0 -1.5 -1.5v-16s0 -1.5 1.5 -1.5',\n handleSize: '80%',\n handleStyle: {\n borderColor: tokens.theme[theme].color.neutral.border.strong,\n color: tokens.theme[theme].color.neutral.bg.weak,\n\n // borderRadius: 0, // Doesn't work\n },\n moveHandleSize: 6,\n moveHandleStyle: {\n backgroundColor: tokens.theme[theme].color.neutral.bg.strong,\n color: tokens.theme[theme].color.neutral.bg.strong,\n opacity: 1, // 0.3,\n },\n selectedDataBackground: {\n areaStyle: {\n color: tokens.theme[theme].color.neutral.bg['on-bg-weak'],\n opacity: 1,\n shadowBlur: 0,\n },\n lineStyle: {\n color: tokens.theme[theme].color.neutral.border.strong,\n opacity: 1,\n width: 1,\n },\n },\n textStyle: {\n color: tokens.theme[theme].color.neutral.text.weaker,\n },\n },\n // Not implemented\n visualMap: {},\n // Not implemented\n timeline: {},\n // Not implemented\n calendar: {},\n timeAxis: axisCommon(theme),\n logAxis: axisCommon(theme),\n valueAxis: axisCommon(theme),\n categoryAxis: axisCommon(theme),\n line: {\n symbol: 'circle',\n },\n // Not implemented\n graph: {},\n // Not implemented\n gauge: {},\n // Not implemented\n candlestick: {},\n };\n};\n"]}
|
|
@@ -19,48 +19,7 @@
|
|
|
19
19
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
20
|
*/
|
|
21
21
|
import { defaultThresholdLineSeriesOption } from './defaults';
|
|
22
|
-
|
|
23
|
-
* Returns a human-readable description of a condition.
|
|
24
|
-
*/
|
|
25
|
-
function conditionToText(condition) {
|
|
26
|
-
switch (condition) {
|
|
27
|
-
case 'greater':
|
|
28
|
-
return 'greater than';
|
|
29
|
-
case 'greaterOrEqual':
|
|
30
|
-
return 'greater than or equal to';
|
|
31
|
-
case 'less':
|
|
32
|
-
return 'less than';
|
|
33
|
-
case 'lessOrEqual':
|
|
34
|
-
return 'less than or equal to';
|
|
35
|
-
case 'equal':
|
|
36
|
-
return 'equal to';
|
|
37
|
-
case 'notEqual':
|
|
38
|
-
return 'not equal to';
|
|
39
|
-
default:
|
|
40
|
-
return 'compared to';
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Checks if a value meets a threshold condition.
|
|
45
|
-
*/
|
|
46
|
-
function meetsCondition(value, condition, threshold) {
|
|
47
|
-
switch (condition) {
|
|
48
|
-
case 'greater':
|
|
49
|
-
return value > threshold;
|
|
50
|
-
case 'greaterOrEqual':
|
|
51
|
-
return value >= threshold;
|
|
52
|
-
case 'less':
|
|
53
|
-
return value < threshold;
|
|
54
|
-
case 'lessOrEqual':
|
|
55
|
-
return value <= threshold;
|
|
56
|
-
case 'equal':
|
|
57
|
-
return value === threshold;
|
|
58
|
-
case 'notEqual':
|
|
59
|
-
return value !== threshold;
|
|
60
|
-
default:
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
22
|
+
import { evaluateThresholdCondition, thresholdConditionToText, } from './threshold';
|
|
64
23
|
/**
|
|
65
24
|
* Extract numeric y-values from inline series data.
|
|
66
25
|
* Handles formats: [x, y], [x, y, ...], or single number.
|
|
@@ -242,7 +201,7 @@ export function generateThresholdAriaDescription(propsSeries, dataset) {
|
|
|
242
201
|
for (const threshold of thresholds) {
|
|
243
202
|
const conditionText = threshold.hasCustomCondition
|
|
244
203
|
? ((_c = threshold.customConditionText) !== null && _c !== void 0 ? _c : 'custom condition')
|
|
245
|
-
:
|
|
204
|
+
: thresholdConditionToText(threshold.condition);
|
|
246
205
|
parts.push(`${threshold.notificationType === 'warning' ? 'Warning' : 'Danger'} threshold at ${threshold.yAxisValue}: triggers when values are ${conditionText} ${threshold.yAxisValue}.`);
|
|
247
206
|
}
|
|
248
207
|
// 4. Report threshold violations per data series
|
|
@@ -257,10 +216,10 @@ export function generateThresholdAriaDescription(propsSeries, dataset) {
|
|
|
257
216
|
if (threshold.hasCustomCondition) {
|
|
258
217
|
continue;
|
|
259
218
|
}
|
|
260
|
-
const violatingValues = values.filter((v) =>
|
|
219
|
+
const violatingValues = values.filter((v) => evaluateThresholdCondition(v, threshold.condition, threshold.yAxisValue).isConditionMet);
|
|
261
220
|
if (violatingValues.length > 0) {
|
|
262
221
|
const count = violatingValues.length;
|
|
263
|
-
parts.push(`${name} has ${count} ${pluralize(count, 'value')} ${
|
|
222
|
+
parts.push(`${name} has ${count} ${pluralize(count, 'value')} ${thresholdConditionToText(threshold.condition)} the ${threshold.notificationType} threshold of ${threshold.yAxisValue}.`);
|
|
264
223
|
}
|
|
265
224
|
}
|
|
266
225
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aria-description.js","sourceRoot":"","sources":["../../../../src/charts/utils/aria-description.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport type { EChartsOption, SeriesOption } from 'echarts';\n\nimport type {\n Condition,\n NeedleSeries,\n NotificationType,\n ThresholdLineSeriesOption,\n} from './chart-types';\nimport { defaultThresholdLineSeriesOption } from './defaults';\nimport {\n evaluateThresholdCondition,\n thresholdConditionToText,\n} from './threshold';\n\ninterface ResolvedDataSeries {\n name: string;\n type: string;\n values: number[];\n}\n\ninterface ResolvedThreshold {\n notificationType: NotificationType;\n yAxisValue: number;\n condition: Condition;\n hasCustomCondition: boolean;\n customConditionText?: string;\n}\n\n/**\n * Extract numeric y-values from inline series data.\n * Handles formats: [x, y], [x, y, ...], or single number.\n */\nfunction extractInlineValues(\n data: SeriesOption['data'],\n encode?: { x?: string | number; y?: string | number },\n): number[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n const yIndex =\n encode?.y !== undefined && typeof encode.y === 'number' ? encode.y : 1;\n\n const values: number[] = [];\n for (const point of data) {\n if (point === null || point === undefined) {\n continue;\n }\n if (Array.isArray(point)) {\n const val = point[yIndex];\n if (typeof val === 'number' && !isNaN(val)) {\n values.push(val);\n }\n } else if (typeof point === 'number' && !isNaN(point)) {\n values.push(point);\n } else if (typeof point === 'object' && 'value' in point) {\n const val = point.value;\n if (typeof val === 'number' && !isNaN(val)) {\n values.push(val);\n } else if (Array.isArray(val)) {\n const v = val[yIndex];\n if (typeof v === 'number' && !isNaN(v)) {\n values.push(v);\n }\n }\n }\n }\n return values;\n}\n\n/**\n * Extract numeric y-values from a dataset source for a given series.\n */\nfunction extractDatasetValues(\n dataset: EChartsOption['dataset'],\n series: SeriesOption,\n): number[] {\n if (!dataset) {\n return [];\n }\n\n const datasets = Array.isArray(dataset) ? dataset : [dataset];\n const datasetIndex =\n 'datasetIndex' in series && typeof series.datasetIndex === 'number'\n ? series.datasetIndex\n : 0;\n const currentDataset = datasets[datasetIndex];\n\n if (!currentDataset || !Array.isArray(currentDataset.source)) {\n return [];\n }\n\n const source = currentDataset.source as (string | number)[][];\n if (source.length < 1) {\n return [];\n }\n\n // Determine column names and data start index.\n // When `dimensions` is provided, column names come from there and all\n // rows in `source` are data. Otherwise the first row is a header.\n const dimensions = currentDataset.dimensions as\n | (string | { name: string })[]\n | undefined;\n let columnNames: (string | number)[];\n let dataStartIndex: number;\n\n if (Array.isArray(dimensions) && dimensions.length > 0) {\n columnNames = dimensions.map((d) => (typeof d === 'string' ? d : d.name));\n dataStartIndex = 0;\n } else {\n const headerRow = source[0];\n if (!Array.isArray(headerRow) || source.length < 2) {\n return [];\n }\n columnNames = headerRow;\n dataStartIndex = 1;\n }\n\n // Determine which column contains the y-values\n const encode =\n 'encode' in series ? (series.encode as Record<string, unknown>) : undefined;\n let yColumnIndex = -1;\n\n if (encode?.y !== undefined) {\n if (typeof encode.y === 'number') {\n yColumnIndex = encode.y;\n } else if (typeof encode.y === 'string') {\n yColumnIndex = columnNames.indexOf(encode.y);\n }\n }\n\n if (yColumnIndex === -1) {\n // Avoid guessing a data column for aria descriptions.\n // If we cannot resolve a value column explicitly, return no values.\n return [];\n }\n\n const values: number[] = [];\n for (let i = dataStartIndex; i < source.length; i++) {\n const row = source[i];\n if (!Array.isArray(row)) {\n continue;\n }\n const val = row[yColumnIndex];\n if (typeof val === 'number' && !isNaN(val)) {\n values.push(val);\n }\n }\n\n return values;\n}\n\nfunction pluralize(count: number, singular: string, plural?: string): string {\n return count === 1 ? singular : (plural ?? `${singular}s`);\n}\n\n/**\n * Resolves y-values for a series from either inline data or a dataset.\n */\nfunction resolveSeriesValues(\n series: SeriesOption,\n dataset: EChartsOption['dataset'],\n): number[] {\n if ('data' in series && series.data) {\n const encode =\n 'encode' in series\n ? (series.encode as Record<string, unknown> | undefined)\n : undefined;\n return extractInlineValues(series.data, encode);\n }\n return extractDatasetValues(dataset, series);\n}\n\n/**\n * Generates a human-readable aria-label description for the chart\n * that includes meaningful threshold context and data relationships.\n */\nexport function generateThresholdAriaDescription(\n propsSeries: NeedleSeries,\n dataset: EChartsOption['dataset'],\n): string | undefined {\n const seriesArray = Array.isArray(propsSeries) ? propsSeries : [propsSeries];\n\n // Separate threshold lines from data series\n const thresholds: ResolvedThreshold[] = [];\n const dataSeries: ResolvedDataSeries[] = [];\n\n for (const series of seriesArray) {\n if (series.type === 'thresholdLine') {\n const threshold = series as ThresholdLineSeriesOption<NotificationType>;\n thresholds.push({\n condition:\n threshold.condition ?? defaultThresholdLineSeriesOption.condition,\n customConditionText: threshold.customConditionText,\n hasCustomCondition: typeof threshold.customCondition === 'function',\n notificationType: threshold.notificationType,\n yAxisValue: threshold.yAxis,\n });\n } else {\n const echartsSeriesOption = series as SeriesOption;\n const name =\n typeof echartsSeriesOption.name === 'string'\n ? echartsSeriesOption.name\n : `Series ${dataSeries.length + 1}`;\n\n const values = resolveSeriesValues(echartsSeriesOption, dataset);\n\n dataSeries.push({\n name,\n type: echartsSeriesOption.type ?? 'line',\n values,\n });\n }\n }\n\n if (thresholds.length === 0) {\n return undefined;\n }\n\n const parts: string[] = [];\n\n // 1. Overview\n const dataSeriesCountText =\n dataSeries.length === 1\n ? '1 data series'\n : `${dataSeries.length} data series`;\n const thresholdCountText =\n thresholds.length === 1\n ? '1 threshold line'\n : `${thresholds.length} threshold lines`;\n parts.push(\n `This chart has ${dataSeriesCountText} and ${thresholdCountText}.`,\n );\n\n // 2. Describe each data series\n for (const series of dataSeries) {\n const { name, type, values } = series;\n if (values.length > 0) {\n const min = Math.min(...values);\n const max = Math.max(...values);\n parts.push(\n `${name} is a ${type} chart with ${values.length} ${pluralize(values.length, 'data point')} ranging from ${min} to ${max}.`,\n );\n } else {\n parts.push(`${name} is a ${type} chart with no resolved data.`);\n }\n }\n\n // 3. Describe threshold lines\n for (const threshold of thresholds) {\n const conditionText = threshold.hasCustomCondition\n ? (threshold.customConditionText ?? 'custom condition')\n : thresholdConditionToText(threshold.condition);\n\n parts.push(\n `${threshold.notificationType === 'warning' ? 'Warning' : 'Danger'} threshold at ${threshold.yAxisValue}: triggers when values are ${conditionText} ${threshold.yAxisValue}.`,\n );\n }\n\n // 4. Report threshold violations per data series\n for (const series of dataSeries) {\n const { name, values } = series;\n if (values.length === 0) {\n continue;\n }\n\n for (const threshold of thresholds) {\n // Custom conditions use runtime callbacks that we cannot evaluate\n // at description-generation time, so we skip violation reporting.\n if (threshold.hasCustomCondition) {\n continue;\n }\n\n const violatingValues = values.filter(\n (v) =>\n evaluateThresholdCondition(\n v,\n threshold.condition,\n threshold.yAxisValue,\n ).isConditionMet,\n );\n\n if (violatingValues.length > 0) {\n const count = violatingValues.length;\n parts.push(\n `${name} has ${count} ${pluralize(count, 'value')} ${thresholdConditionToText(threshold.condition)} the ${threshold.notificationType} threshold of ${threshold.yAxisValue}.`,\n );\n }\n }\n }\n\n return parts.join(' ');\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) "Neo4j"
|
|
4
|
+
* Neo4j Sweden AB [http://neo4j.com]
|
|
5
|
+
*
|
|
6
|
+
* This file is part of Neo4j.
|
|
7
|
+
*
|
|
8
|
+
* Neo4j is free software: you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License as published by
|
|
10
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
11
|
+
* (at your option) any later version.
|
|
12
|
+
*
|
|
13
|
+
* This program is distributed in the hope that it will be useful,
|
|
14
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
* GNU General Public License for more details.
|
|
17
|
+
*
|
|
18
|
+
* You should have received a copy of the GNU General Public License
|
|
19
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
*/
|
|
21
|
+
import { generateThresholdAriaDescription } from './aria-description';
|
|
22
|
+
import { createAxisTooltipFormatter } from './chart-tooltip-formatter';
|
|
23
|
+
import { mergeToolbox } from './user-option-utils';
|
|
24
|
+
/**
|
|
25
|
+
* Slider zoom needs extra bottom grid space for ECharts' slider control.
|
|
26
|
+
*/
|
|
27
|
+
export function hasSliderDataZoom(dataZoom) {
|
|
28
|
+
return Array.isArray(dataZoom)
|
|
29
|
+
? dataZoom.some((dataZoomOption) => {
|
|
30
|
+
return (dataZoomOption === null || dataZoomOption === void 0 ? void 0 : dataZoomOption.type) === 'slider';
|
|
31
|
+
})
|
|
32
|
+
: (dataZoom === null || dataZoom === void 0 ? void 0 : dataZoom.type) === 'slider';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Category x-axes use slightly wider grid padding to avoid clipped labels.
|
|
36
|
+
*/
|
|
37
|
+
export function hasCategoryXAxis(xAxis) {
|
|
38
|
+
return Array.isArray(xAxis)
|
|
39
|
+
? xAxis.some((x) => x.type === 'category')
|
|
40
|
+
: (xAxis === null || xAxis === void 0 ? void 0 : xAxis.type) === 'category';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the ECharts option object from Needle chart props and derived values.
|
|
44
|
+
* Applying the option to an ECharts instance happens in `useChartOption`.
|
|
45
|
+
*/
|
|
46
|
+
export function buildChartOption({ dataZoom, dataset, hasCategoryXAxis, hasSliderZoom, legendSelected, propsSeries, series, thresholdLines, toolboxOptions, userOption, xAxis, yAxis, }) {
|
|
47
|
+
const customAriaDescription = generateThresholdAriaDescription(propsSeries, dataset);
|
|
48
|
+
return Object.assign(Object.assign({}, userOption), { aria: Object.assign(Object.assign({ decal: {
|
|
49
|
+
show: false,
|
|
50
|
+
}, enabled: true }, (customAriaDescription !== undefined && {
|
|
51
|
+
label: { description: customAriaDescription },
|
|
52
|
+
})), userOption === null || userOption === void 0 ? void 0 : userOption.aria), dataZoom,
|
|
53
|
+
dataset, grid: Object.assign({ bottom: hasSliderZoom ? '60px' : '10px', containLabel: true, left: hasCategoryXAxis ? '15px' : '10px', right: hasCategoryXAxis ? '15px' : '10px', top: '10px', type: 'solid' }, userOption === null || userOption === void 0 ? void 0 : userOption.grid), legend: {
|
|
54
|
+
// ECharts mutates option.legend.selected internally; callers pass a
|
|
55
|
+
// copied object so the React ref remains the source of truth.
|
|
56
|
+
selected: Object.assign({}, legendSelected),
|
|
57
|
+
show: false,
|
|
58
|
+
}, series, toolbox: mergeToolbox(toolboxOptions), tooltip: {
|
|
59
|
+
borderRadius: 0,
|
|
60
|
+
borderWidth: 0,
|
|
61
|
+
confine: true,
|
|
62
|
+
extraCssText: 'box-shadow: none; background-color: transparent;',
|
|
63
|
+
formatter: createAxisTooltipFormatter({ thresholdLines, userOption }),
|
|
64
|
+
padding: 0,
|
|
65
|
+
trigger: 'axis',
|
|
66
|
+
}, xAxis,
|
|
67
|
+
yAxis });
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=build-chart-option.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-chart-option.js","sourceRoot":"","sources":["../../../../src/charts/utils/build-chart-option.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAE,gCAAgC,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAiBnD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAmC;IAEnC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,cAAuC,EAAE,EAAE;YACxD,OAAO,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,MAAK,QAAQ,CAAC;QAC3C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;QAC1C,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,UAAU,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,MAAM,EACN,cAAc,EACd,cAAc,EACd,UAAU,EACV,KAAK,EACL,KAAK,GACkB;IACvB,MAAM,qBAAqB,GAAG,gCAAgC,CAC5D,WAAW,EACX,OAAO,CACR,CAAC;IAEF,uCACK,UAAU,KACb,IAAI,gCACF,KAAK,EAAE;gBACL,IAAI,EAAE,KAAK;aACZ,EACD,OAAO,EAAE,IAAI,IACV,CAAC,qBAAqB,KAAK,SAAS,IAAI;YACzC,KAAK,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE;SAC9C,CAAC,GACE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAA8B,GAEhD,QAAQ;QACR,OAAO,EACP,IAAI,kBACF,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACvC,YAAY,EAAE,IAAI,EAClB,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACxC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,IACT,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAA8B,GAEhD,MAAM,EAAE;YACN,oEAAoE;YACpE,8DAA8D;YAC9D,QAAQ,oBAAO,cAAc,CAAE;YAC/B,IAAI,EAAE,KAAK;SACZ,EACD,MAAM,EACN,OAAO,EAAE,YAAY,CAAC,cAAc,CAAC,EACrC,OAAO,EAAE;YACP,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,kDAAkD;YAChE,SAAS,EAAE,0BAA0B,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;YACrE,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,MAAM;SAChB,EACD,KAAK;QACL,KAAK,IACL;AACJ,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport type { DataZoomComponentOption, EChartsOption } from 'echarts';\n\nimport { generateThresholdAriaDescription } from './aria-description';\nimport { createAxisTooltipFormatter } from './chart-tooltip-formatter';\nimport type { ChartProps, EchartsSeries } from './chart-types';\nimport type { NormalizedThresholdLine } from './threshold';\nimport { mergeToolbox } from './user-option-utils';\n\ntype BuildChartOptionParams = {\n dataZoom: EChartsOption['dataZoom'];\n dataset: ChartProps['dataset'];\n hasCategoryXAxis: boolean;\n hasSliderZoom: boolean;\n legendSelected: Record<string, boolean>;\n propsSeries: ChartProps['series'];\n series: EchartsSeries;\n thresholdLines: NormalizedThresholdLine[];\n toolboxOptions: EChartsOption['toolbox'];\n userOption: ChartProps['option'];\n xAxis: EChartsOption['xAxis'];\n yAxis: EChartsOption['yAxis'];\n};\n\n/**\n * Slider zoom needs extra bottom grid space for ECharts' slider control.\n */\nexport function hasSliderDataZoom(\n dataZoom: EChartsOption['dataZoom'],\n): boolean {\n return Array.isArray(dataZoom)\n ? dataZoom.some((dataZoomOption: DataZoomComponentOption) => {\n return dataZoomOption?.type === 'slider';\n })\n : dataZoom?.type === 'slider';\n}\n\n/**\n * Category x-axes use slightly wider grid padding to avoid clipped labels.\n */\nexport function hasCategoryXAxis(xAxis: EChartsOption['xAxis']): boolean {\n return Array.isArray(xAxis)\n ? xAxis.some((x) => x.type === 'category')\n : xAxis?.type === 'category';\n}\n\n/**\n * Builds the ECharts option object from Needle chart props and derived values.\n * Applying the option to an ECharts instance happens in `useChartOption`.\n */\nexport function buildChartOption({\n dataZoom,\n dataset,\n hasCategoryXAxis,\n hasSliderZoom,\n legendSelected,\n propsSeries,\n series,\n thresholdLines,\n toolboxOptions,\n userOption,\n xAxis,\n yAxis,\n}: BuildChartOptionParams): EChartsOption {\n const customAriaDescription = generateThresholdAriaDescription(\n propsSeries,\n dataset,\n );\n\n return {\n ...userOption,\n aria: {\n decal: {\n show: false,\n },\n enabled: true,\n ...(customAriaDescription !== undefined && {\n label: { description: customAriaDescription },\n }),\n ...(userOption?.aria as EChartsOption['aria']),\n },\n dataZoom,\n dataset,\n grid: {\n bottom: hasSliderZoom ? '60px' : '10px',\n containLabel: true,\n left: hasCategoryXAxis ? '15px' : '10px',\n right: hasCategoryXAxis ? '15px' : '10px',\n top: '10px',\n type: 'solid',\n ...(userOption?.grid as EChartsOption['grid']),\n },\n legend: {\n // ECharts mutates option.legend.selected internally; callers pass a\n // copied object so the React ref remains the source of truth.\n selected: { ...legendSelected },\n show: false,\n },\n series,\n toolbox: mergeToolbox(toolboxOptions),\n tooltip: {\n borderRadius: 0,\n borderWidth: 0,\n confine: true,\n extraCssText: 'box-shadow: none; background-color: transparent;',\n formatter: createAxisTooltipFormatter({ thresholdLines, userOption }),\n padding: 0,\n trigger: 'axis',\n },\n xAxis,\n yAxis,\n };\n}\n"]}
|