@neo4j-ndl/react-charts 1.3.18 → 1.4.0
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/ChartTooltip.js +6 -2
- package/lib/cjs/charts/ChartTooltip.js.map +1 -1
- package/lib/cjs/charts/hooks/use-chart-option.js +6 -0
- package/lib/cjs/charts/hooks/use-chart-option.js.map +1 -1
- package/lib/cjs/charts/hooks/use-legend-series.js +7 -1
- package/lib/cjs/charts/hooks/use-legend-series.js.map +1 -1
- package/lib/cjs/charts/index.js.map +1 -1
- package/lib/cjs/charts/tests/chart-test-utils.js +121 -1
- package/lib/cjs/charts/tests/chart-test-utils.js.map +1 -1
- package/lib/cjs/charts/utils/build-chart-option.js +39 -4
- package/lib/cjs/charts/utils/build-chart-option.js.map +1 -1
- package/lib/cjs/charts/utils/chart-tooltip-formatter.js +93 -0
- package/lib/cjs/charts/utils/chart-tooltip-formatter.js.map +1 -1
- package/lib/cjs/charts/utils/defaults.js +18 -1
- package/lib/cjs/charts/utils/defaults.js.map +1 -1
- package/lib/cjs/charts/utils/legend-utils.js +7 -2
- package/lib/cjs/charts/utils/legend-utils.js.map +1 -1
- package/lib/cjs/charts/utils/scatter-tooltip-points.js +301 -0
- package/lib/cjs/charts/utils/scatter-tooltip-points.js.map +1 -0
- package/lib/cjs/charts/utils/user-option-utils.js +16 -6
- package/lib/cjs/charts/utils/user-option-utils.js.map +1 -1
- package/lib/esm/charts/ChartTooltip.js +6 -2
- package/lib/esm/charts/ChartTooltip.js.map +1 -1
- package/lib/esm/charts/hooks/use-chart-option.js +6 -0
- package/lib/esm/charts/hooks/use-chart-option.js.map +1 -1
- package/lib/esm/charts/hooks/use-legend-series.js +7 -1
- package/lib/esm/charts/hooks/use-legend-series.js.map +1 -1
- package/lib/esm/charts/index.js.map +1 -1
- package/lib/esm/charts/tests/chart-test-utils.js +115 -0
- package/lib/esm/charts/tests/chart-test-utils.js.map +1 -1
- package/lib/esm/charts/utils/build-chart-option.js +40 -5
- package/lib/esm/charts/utils/build-chart-option.js.map +1 -1
- package/lib/esm/charts/utils/chart-tooltip-formatter.js +92 -0
- package/lib/esm/charts/utils/chart-tooltip-formatter.js.map +1 -1
- package/lib/esm/charts/utils/defaults.js +16 -1
- package/lib/esm/charts/utils/defaults.js.map +1 -1
- package/lib/esm/charts/utils/legend-utils.js +7 -2
- package/lib/esm/charts/utils/legend-utils.js.map +1 -1
- package/lib/esm/charts/utils/scatter-tooltip-points.js +291 -0
- package/lib/esm/charts/utils/scatter-tooltip-points.js.map +1 -0
- package/lib/esm/charts/utils/user-option-utils.js +17 -7
- package/lib/esm/charts/utils/user-option-utils.js.map +1 -1
- package/lib/types/charts/ChartTooltip.d.ts +6 -1
- package/lib/types/charts/ChartTooltip.d.ts.map +1 -1
- package/lib/types/charts/hooks/use-chart-option.d.ts.map +1 -1
- package/lib/types/charts/hooks/use-legend-series.d.ts.map +1 -1
- package/lib/types/charts/index.d.ts +1 -0
- package/lib/types/charts/index.d.ts.map +1 -1
- package/lib/types/charts/tests/chart-test-utils.d.ts +78 -0
- package/lib/types/charts/tests/chart-test-utils.d.ts.map +1 -1
- package/lib/types/charts/utils/build-chart-option.d.ts +4 -1
- package/lib/types/charts/utils/build-chart-option.d.ts.map +1 -1
- package/lib/types/charts/utils/chart-tooltip-formatter.d.ts +45 -2
- package/lib/types/charts/utils/chart-tooltip-formatter.d.ts.map +1 -1
- package/lib/types/charts/utils/defaults.d.ts +10 -1
- package/lib/types/charts/utils/defaults.d.ts.map +1 -1
- package/lib/types/charts/utils/legend-utils.d.ts.map +1 -1
- package/lib/types/charts/utils/scatter-tooltip-points.d.ts +84 -0
- package/lib/types/charts/utils/scatter-tooltip-points.d.ts.map +1 -0
- package/lib/types/charts/utils/user-option-utils.d.ts.map +1 -1
- package/package.json +3 -3
- package/skills/ndl-react-charts/SKILL.md +3 -3
- package/skills/ndl-react-charts/components/charts.md +279 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) "Neo4j"
|
|
5
|
+
* Neo4j Sweden AB [http://neo4j.com]
|
|
6
|
+
*
|
|
7
|
+
* This file is part of Neo4j.
|
|
8
|
+
*
|
|
9
|
+
* Neo4j is free software: you can redistribute it and/or modify
|
|
10
|
+
* it under the terms of the GNU General Public License as published by
|
|
11
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
12
|
+
* (at your option) any later version.
|
|
13
|
+
*
|
|
14
|
+
* This program is distributed in the hope that it will be useful,
|
|
15
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
+
* GNU General Public License for more details.
|
|
18
|
+
*
|
|
19
|
+
* You should have received a copy of the GNU General Public License
|
|
20
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.getEncodedAxisRefs = exports.extraTooltipRefs = exports.encodedDimensionLabel = exports.readEncodedValue = exports.encodeRefs = void 0;
|
|
24
|
+
exports.getScatterSymbolSize = getScatterSymbolSize;
|
|
25
|
+
exports.findNearbyScatterPoints = findNearbyScatterPoints;
|
|
26
|
+
/**
|
|
27
|
+
* Scanning stops past this many points so a dense chart cannot turn every hover
|
|
28
|
+
* into a long walk over the dataset.
|
|
29
|
+
*/
|
|
30
|
+
const MAX_SCANNED_POINTS = 20000;
|
|
31
|
+
/** Symbol width ECharts falls back to when a series sets no numeric size. */
|
|
32
|
+
const DEFAULT_SYMBOL_SIZE = 10;
|
|
33
|
+
const toArray = (value) => {
|
|
34
|
+
if (value === undefined) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
return Array.isArray(value) ? value : [value];
|
|
38
|
+
};
|
|
39
|
+
const encodeRefs = (encode, key) => {
|
|
40
|
+
if (encode === undefined) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const raw = encode[key];
|
|
44
|
+
const refs = Array.isArray(raw) ? raw : [raw];
|
|
45
|
+
return refs.filter((ref) => typeof ref === 'number' || typeof ref === 'string');
|
|
46
|
+
};
|
|
47
|
+
exports.encodeRefs = encodeRefs;
|
|
48
|
+
const readEncodedValue = (value, ref, dimensionNames) => {
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
if (typeof ref === 'number') {
|
|
51
|
+
return value[ref];
|
|
52
|
+
}
|
|
53
|
+
const dimensionIndex = dimensionNames === null || dimensionNames === void 0 ? void 0 : dimensionNames.indexOf(ref);
|
|
54
|
+
return dimensionIndex !== undefined && dimensionIndex >= 0
|
|
55
|
+
? value[dimensionIndex]
|
|
56
|
+
: undefined;
|
|
57
|
+
}
|
|
58
|
+
if (value !== null && typeof value === 'object') {
|
|
59
|
+
const record = value;
|
|
60
|
+
if (typeof ref === 'string' && ref in record) {
|
|
61
|
+
return record[ref];
|
|
62
|
+
}
|
|
63
|
+
if (typeof ref === 'number') {
|
|
64
|
+
const dimensionName = dimensionNames === null || dimensionNames === void 0 ? void 0 : dimensionNames[ref];
|
|
65
|
+
if (dimensionName !== undefined && dimensionName in record) {
|
|
66
|
+
return record[dimensionName];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
};
|
|
72
|
+
exports.readEncodedValue = readEncodedValue;
|
|
73
|
+
const encodedDimensionLabel = (ref, dimensionNames, fallback) => {
|
|
74
|
+
if (typeof ref === 'string') {
|
|
75
|
+
return ref;
|
|
76
|
+
}
|
|
77
|
+
const dimensionName = dimensionNames === null || dimensionNames === void 0 ? void 0 : dimensionNames[ref];
|
|
78
|
+
if (typeof dimensionName === 'string' && dimensionName.length > 0) {
|
|
79
|
+
return dimensionName;
|
|
80
|
+
}
|
|
81
|
+
return fallback;
|
|
82
|
+
};
|
|
83
|
+
exports.encodedDimensionLabel = encodedDimensionLabel;
|
|
84
|
+
/**
|
|
85
|
+
* Dimensions holding the unique per-point value: `encode.tooltip` first, then
|
|
86
|
+
* `encode.itemName`, and finally any dimension the axes do not already use.
|
|
87
|
+
*/
|
|
88
|
+
const extraTooltipRefs = (point) => {
|
|
89
|
+
const xRefs = (0, exports.encodeRefs)(point.encode, 'x');
|
|
90
|
+
const yRefs = (0, exports.encodeRefs)(point.encode, 'y');
|
|
91
|
+
const isAxisRef = (ref) => xRefs.includes(ref) || yRefs.includes(ref);
|
|
92
|
+
const tooltipRefs = (0, exports.encodeRefs)(point.encode, 'tooltip').filter((ref) => !isAxisRef(ref));
|
|
93
|
+
if (tooltipRefs.length > 0) {
|
|
94
|
+
return tooltipRefs;
|
|
95
|
+
}
|
|
96
|
+
const itemNameRefs = (0, exports.encodeRefs)(point.encode, 'itemName');
|
|
97
|
+
if (itemNameRefs.length > 0) {
|
|
98
|
+
return itemNameRefs;
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(point.value) && point.value.length > 2) {
|
|
101
|
+
const usedIndices = new Set([...xRefs, ...yRefs].filter((ref) => typeof ref === 'number'));
|
|
102
|
+
if (usedIndices.size === 0) {
|
|
103
|
+
usedIndices.add(0);
|
|
104
|
+
usedIndices.add(1);
|
|
105
|
+
}
|
|
106
|
+
return point.value.flatMap((_value, index) => usedIndices.has(index) ? [] : [index]);
|
|
107
|
+
}
|
|
108
|
+
return [];
|
|
109
|
+
};
|
|
110
|
+
exports.extraTooltipRefs = extraTooltipRefs;
|
|
111
|
+
const getEncodedAxisRefs = (encode) => {
|
|
112
|
+
var _a, _b;
|
|
113
|
+
return ({
|
|
114
|
+
// oxlint-disable-next-line id-length
|
|
115
|
+
x: (_a = (0, exports.encodeRefs)(encode, 'x')[0]) !== null && _a !== void 0 ? _a : 0,
|
|
116
|
+
// oxlint-disable-next-line id-length
|
|
117
|
+
y: (_b = (0, exports.encodeRefs)(encode, 'y')[0]) !== null && _b !== void 0 ? _b : 1,
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
exports.getEncodedAxisRefs = getEncodedAxisRefs;
|
|
121
|
+
const toStringArray = (value) => Array.isArray(value) && value.every((entry) => typeof entry === 'string')
|
|
122
|
+
? value
|
|
123
|
+
: undefined;
|
|
124
|
+
const isHeaderRow = (row) => Array.isArray(row) &&
|
|
125
|
+
row.length > 0 &&
|
|
126
|
+
row.every((cell) => typeof cell === 'string');
|
|
127
|
+
/**
|
|
128
|
+
* Resolves the rows a series draws, together with the dimension names its
|
|
129
|
+
* `encode` refers to. Rows are aligned with ECharts' data indices, so a sniffed
|
|
130
|
+
* header row is dropped the way ECharts drops it.
|
|
131
|
+
*/
|
|
132
|
+
const resolveSeriesSource = (series, datasets) => {
|
|
133
|
+
var _a, _b;
|
|
134
|
+
const inlineData = Array.isArray(series.data) ? series.data : undefined;
|
|
135
|
+
const dataset = inlineData === undefined ? datasets[(_a = series.datasetIndex) !== null && _a !== void 0 ? _a : 0] : undefined;
|
|
136
|
+
const rows = inlineData !== null && inlineData !== void 0 ? inlineData : (Array.isArray(dataset === null || dataset === void 0 ? void 0 : dataset.source) ? dataset.source : undefined);
|
|
137
|
+
if (rows === undefined) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
const declaredDimensions = toStringArray((_b = series.dimensions) !== null && _b !== void 0 ? _b : dataset === null || dataset === void 0 ? void 0 : dataset.dimensions);
|
|
141
|
+
if (declaredDimensions !== undefined) {
|
|
142
|
+
return { dimensionNames: declaredDimensions, rows };
|
|
143
|
+
}
|
|
144
|
+
if (isHeaderRow(rows[0]) && !isHeaderRow(rows[1])) {
|
|
145
|
+
return { dimensionNames: rows[0], rows: rows.slice(1) };
|
|
146
|
+
}
|
|
147
|
+
return { rows };
|
|
148
|
+
};
|
|
149
|
+
const toNumericValue = (value) => {
|
|
150
|
+
if (typeof value === 'number') {
|
|
151
|
+
return Number.isFinite(value) ? value : undefined;
|
|
152
|
+
}
|
|
153
|
+
if (value instanceof Date) {
|
|
154
|
+
return value.getTime();
|
|
155
|
+
}
|
|
156
|
+
if (typeof value === 'string') {
|
|
157
|
+
const numeric = Number(value);
|
|
158
|
+
if (Number.isFinite(numeric)) {
|
|
159
|
+
return numeric;
|
|
160
|
+
}
|
|
161
|
+
const time = Date.parse(value);
|
|
162
|
+
return Number.isFinite(time) ? time : undefined;
|
|
163
|
+
}
|
|
164
|
+
return undefined;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Distance from the hovered value along one axis, as a share of the tolerance.
|
|
168
|
+
* Values that cannot be compared numerically, such as category labels, only
|
|
169
|
+
* count as near when they are identical.
|
|
170
|
+
*/
|
|
171
|
+
const axisDistance = (value, hoveredValue, tolerance) => {
|
|
172
|
+
const numeric = toNumericValue(value);
|
|
173
|
+
const hoveredNumeric = toNumericValue(hoveredValue);
|
|
174
|
+
if (numeric === undefined || hoveredNumeric === undefined) {
|
|
175
|
+
return value === hoveredValue ? 0 : undefined;
|
|
176
|
+
}
|
|
177
|
+
if (tolerance <= 0) {
|
|
178
|
+
return numeric === hoveredNumeric ? 0 : undefined;
|
|
179
|
+
}
|
|
180
|
+
return (numeric - hoveredNumeric) / tolerance;
|
|
181
|
+
};
|
|
182
|
+
const isCoordinatePair = (value) => Array.isArray(value) &&
|
|
183
|
+
value.length >= 2 &&
|
|
184
|
+
Number.isFinite(value[0]) &&
|
|
185
|
+
Number.isFinite(value[1]);
|
|
186
|
+
/**
|
|
187
|
+
* Converts a pixel radius around the hovered point into a distance on each
|
|
188
|
+
* axis, so points can be compared in data space instead of converting every
|
|
189
|
+
* one of them to pixels.
|
|
190
|
+
*/
|
|
191
|
+
const getAxisTolerances = (chart, seriesIndex, hoveredValue, radius) => {
|
|
192
|
+
const finder = { seriesIndex };
|
|
193
|
+
const pixel = chart.convertToPixel(finder, hoveredValue);
|
|
194
|
+
if (!isCoordinatePair(pixel)) {
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
const origin = chart.convertFromPixel(finder, [pixel[0], pixel[1]]);
|
|
198
|
+
const offset = chart.convertFromPixel(finder, [
|
|
199
|
+
pixel[0] + radius,
|
|
200
|
+
pixel[1] + radius,
|
|
201
|
+
]);
|
|
202
|
+
if (!isCoordinatePair(origin) || !isCoordinatePair(offset)) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
// oxlint-disable-next-line id-length
|
|
207
|
+
x: Math.abs(offset[0] - origin[0]),
|
|
208
|
+
// oxlint-disable-next-line id-length
|
|
209
|
+
y: Math.abs(offset[1] - origin[1]),
|
|
210
|
+
};
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* Widest scatter symbol in the chart, which doubles as the radius in which
|
|
214
|
+
* points are considered to overlap the hovered one.
|
|
215
|
+
*/
|
|
216
|
+
function getScatterSymbolSize(series) {
|
|
217
|
+
const sizes = toArray(series)
|
|
218
|
+
.filter((seriesOption) => (seriesOption === null || seriesOption === void 0 ? void 0 : seriesOption.type) === 'scatter')
|
|
219
|
+
.map((seriesOption) => typeof seriesOption.symbolSize === 'number' &&
|
|
220
|
+
Number.isFinite(seriesOption.symbolSize)
|
|
221
|
+
? seriesOption.symbolSize
|
|
222
|
+
: DEFAULT_SYMBOL_SIZE);
|
|
223
|
+
return sizes.length > 0 ? Math.max(...sizes) : DEFAULT_SYMBOL_SIZE;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Collects the points whose symbols overlap the hovered one, closest first,
|
|
227
|
+
* with the hovered point always leading.
|
|
228
|
+
*
|
|
229
|
+
* Distances are measured in data space against a tolerance derived from the
|
|
230
|
+
* pixel radius (ECharts `convertToPixel` / `convertFromPixel`), which keeps the
|
|
231
|
+
* scan to plain arithmetic per point and works on value, time, and log axes
|
|
232
|
+
* alike.
|
|
233
|
+
*/
|
|
234
|
+
function findNearbyScatterPoints({ chart, dataset, hovered, legendSelected, maxPoints, radius, series, }) {
|
|
235
|
+
var _a;
|
|
236
|
+
const hoveredSeriesIndex = hovered.seriesIndex;
|
|
237
|
+
if (chart === undefined || hoveredSeriesIndex === undefined) {
|
|
238
|
+
return [hovered];
|
|
239
|
+
}
|
|
240
|
+
const hoveredRefs = (0, exports.getEncodedAxisRefs)(hovered.encode);
|
|
241
|
+
const hoveredX = (0, exports.readEncodedValue)(hovered.value, hoveredRefs.x, hovered.dimensionNames);
|
|
242
|
+
const hoveredY = (0, exports.readEncodedValue)(hovered.value, hoveredRefs.y, hovered.dimensionNames);
|
|
243
|
+
const tolerances = getAxisTolerances(chart, hoveredSeriesIndex, [hoveredX, hoveredY], radius);
|
|
244
|
+
if (tolerances === undefined) {
|
|
245
|
+
return [hovered];
|
|
246
|
+
}
|
|
247
|
+
const seriesList = toArray(series);
|
|
248
|
+
const datasets = toArray(dataset);
|
|
249
|
+
const neighbors = [];
|
|
250
|
+
let scannedPoints = 0;
|
|
251
|
+
for (const [seriesIndex, seriesOption] of seriesList.entries()) {
|
|
252
|
+
if ((seriesOption === null || seriesOption === void 0 ? void 0 : seriesOption.type) !== 'scatter' ||
|
|
253
|
+
(legendSelected === null || legendSelected === void 0 ? void 0 : legendSelected[(_a = seriesOption.name) !== null && _a !== void 0 ? _a : '']) === false) {
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const source = resolveSeriesSource(seriesOption, datasets);
|
|
257
|
+
if (source === undefined) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const refs = (0, exports.getEncodedAxisRefs)(seriesOption.encode);
|
|
261
|
+
for (const [dataIndex, row] of source.rows.entries()) {
|
|
262
|
+
if (scannedPoints >= MAX_SCANNED_POINTS) {
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
scannedPoints += 1;
|
|
266
|
+
if (seriesIndex === hoveredSeriesIndex &&
|
|
267
|
+
dataIndex === hovered.dataIndex) {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
const xDistance = axisDistance((0, exports.readEncodedValue)(row, refs.x, source.dimensionNames), hoveredX, tolerances.x);
|
|
271
|
+
const yDistance = axisDistance((0, exports.readEncodedValue)(row, refs.y, source.dimensionNames), hoveredY, tolerances.y);
|
|
272
|
+
if (xDistance === undefined || yDistance === undefined) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const distance = Math.hypot(xDistance, yDistance);
|
|
276
|
+
if (distance > 1) {
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
neighbors.push({
|
|
280
|
+
distance,
|
|
281
|
+
point: {
|
|
282
|
+
color: typeof seriesOption.color === 'string'
|
|
283
|
+
? seriesOption.color
|
|
284
|
+
: undefined,
|
|
285
|
+
dataIndex,
|
|
286
|
+
dimensionNames: source.dimensionNames,
|
|
287
|
+
encode: seriesOption.encode,
|
|
288
|
+
seriesIndex,
|
|
289
|
+
seriesName: seriesOption.name,
|
|
290
|
+
value: row,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
neighbors.sort((first, second) => first.distance - second.distance);
|
|
296
|
+
return [
|
|
297
|
+
hovered,
|
|
298
|
+
...neighbors.slice(0, Math.max(maxPoints - 1, 0)).map(({ point }) => point),
|
|
299
|
+
];
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=scatter-tooltip-points.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scatter-tooltip-points.js","sourceRoot":"","sources":["../../../../src/charts/utils/scatter-tooltip-points.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 { ChartProps, EchartsSeries } from './chart-types';\n\ntype TooltipEncode = Record<string, unknown> | undefined;\n\n/**\n * A scatter point as the tooltip needs it. ECharts tooltip params already have\n * this shape, so the hovered point and the points found around it are\n * interchangeable.\n */\nexport type ScatterTooltipPoint = {\n color?: string;\n dataIndex?: number;\n dimensionNames?: string[];\n encode?: TooltipEncode;\n name?: string;\n seriesIndex?: number;\n seriesName?: string;\n value?: unknown;\n};\n\n/** The part of the ECharts instance the scatter tooltip reads. */\nexport type ScatterTooltipChart = {\n convertFromPixel(\n finder: { seriesIndex: number },\n value: number[],\n ): number | number[];\n convertToPixel(\n finder: { seriesIndex: number },\n value: unknown[],\n ): number | number[];\n};\n\ntype ScatterSeriesLike = {\n color?: unknown;\n data?: unknown;\n datasetIndex?: number;\n dimensions?: unknown;\n encode?: TooltipEncode;\n name?: string;\n symbolSize?: unknown;\n type?: string;\n};\n\ntype DatasetLike = {\n dimensions?: unknown;\n source?: unknown;\n};\n\n/**\n * Scanning stops past this many points so a dense chart cannot turn every hover\n * into a long walk over the dataset.\n */\nconst MAX_SCANNED_POINTS = 20000;\n\n/** Symbol width ECharts falls back to when a series sets no numeric size. */\nconst DEFAULT_SYMBOL_SIZE = 10;\n\nconst toArray = <T>(value: T | T[] | undefined): T[] => {\n if (value === undefined) {\n return [];\n }\n\n return Array.isArray(value) ? value : [value];\n};\n\nexport const encodeRefs = (\n encode: TooltipEncode,\n key: string,\n): Array<number | string> => {\n if (encode === undefined) {\n return [];\n }\n\n const raw = encode[key];\n const refs = Array.isArray(raw) ? raw : [raw];\n\n return refs.filter(\n (ref): ref is number | string =>\n typeof ref === 'number' || typeof ref === 'string',\n );\n};\n\nexport const readEncodedValue = (\n value: unknown,\n ref: number | string,\n dimensionNames?: string[],\n): unknown => {\n if (Array.isArray(value)) {\n if (typeof ref === 'number') {\n return value[ref];\n }\n\n const dimensionIndex = dimensionNames?.indexOf(ref);\n\n return dimensionIndex !== undefined && dimensionIndex >= 0\n ? value[dimensionIndex]\n : undefined;\n }\n\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n\n if (typeof ref === 'string' && ref in record) {\n return record[ref];\n }\n\n if (typeof ref === 'number') {\n const dimensionName = dimensionNames?.[ref];\n\n if (dimensionName !== undefined && dimensionName in record) {\n return record[dimensionName];\n }\n }\n }\n\n return undefined;\n};\n\nexport const encodedDimensionLabel = (\n ref: number | string,\n dimensionNames: string[] | undefined,\n fallback: string,\n): string => {\n if (typeof ref === 'string') {\n return ref;\n }\n\n const dimensionName = dimensionNames?.[ref];\n\n if (typeof dimensionName === 'string' && dimensionName.length > 0) {\n return dimensionName;\n }\n\n return fallback;\n};\n\n/**\n * Dimensions holding the unique per-point value: `encode.tooltip` first, then\n * `encode.itemName`, and finally any dimension the axes do not already use.\n */\nexport const extraTooltipRefs = (\n point: ScatterTooltipPoint,\n): Array<number | string> => {\n const xRefs = encodeRefs(point.encode, 'x');\n const yRefs = encodeRefs(point.encode, 'y');\n const isAxisRef = (ref: number | string) =>\n xRefs.includes(ref) || yRefs.includes(ref);\n\n const tooltipRefs = encodeRefs(point.encode, 'tooltip').filter(\n (ref) => !isAxisRef(ref),\n );\n\n if (tooltipRefs.length > 0) {\n return tooltipRefs;\n }\n\n const itemNameRefs = encodeRefs(point.encode, 'itemName');\n\n if (itemNameRefs.length > 0) {\n return itemNameRefs;\n }\n\n if (Array.isArray(point.value) && point.value.length > 2) {\n const usedIndices = new Set(\n [...xRefs, ...yRefs].filter(\n (ref): ref is number => typeof ref === 'number',\n ),\n );\n\n if (usedIndices.size === 0) {\n usedIndices.add(0);\n usedIndices.add(1);\n }\n\n return point.value.flatMap((_value, index) =>\n usedIndices.has(index) ? [] : [index],\n );\n }\n\n return [];\n};\n\nexport const getEncodedAxisRefs = (encode: TooltipEncode) => ({\n // oxlint-disable-next-line id-length\n x: encodeRefs(encode, 'x')[0] ?? 0,\n // oxlint-disable-next-line id-length\n y: encodeRefs(encode, 'y')[0] ?? 1,\n});\n\nconst toStringArray = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === 'string')\n ? value\n : undefined;\n\nconst isHeaderRow = (row: unknown): boolean =>\n Array.isArray(row) &&\n row.length > 0 &&\n row.every((cell) => typeof cell === 'string');\n\ntype ScatterSource = {\n dimensionNames?: string[];\n rows: unknown[];\n};\n\n/**\n * Resolves the rows a series draws, together with the dimension names its\n * `encode` refers to. Rows are aligned with ECharts' data indices, so a sniffed\n * header row is dropped the way ECharts drops it.\n */\nconst resolveSeriesSource = (\n series: ScatterSeriesLike,\n datasets: DatasetLike[],\n): ScatterSource | undefined => {\n const inlineData = Array.isArray(series.data) ? series.data : undefined;\n const dataset =\n inlineData === undefined ? datasets[series.datasetIndex ?? 0] : undefined;\n const rows =\n inlineData ?? (Array.isArray(dataset?.source) ? dataset.source : undefined);\n\n if (rows === undefined) {\n return undefined;\n }\n\n const declaredDimensions = toStringArray(\n series.dimensions ?? dataset?.dimensions,\n );\n\n if (declaredDimensions !== undefined) {\n return { dimensionNames: declaredDimensions, rows };\n }\n\n if (isHeaderRow(rows[0]) && !isHeaderRow(rows[1])) {\n return { dimensionNames: rows[0] as string[], rows: rows.slice(1) };\n }\n\n return { rows };\n};\n\nconst toNumericValue = (value: unknown): number | undefined => {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (value instanceof Date) {\n return value.getTime();\n }\n\n if (typeof value === 'string') {\n const numeric = Number(value);\n\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n\n const time = Date.parse(value);\n\n return Number.isFinite(time) ? time : undefined;\n }\n\n return undefined;\n};\n\n/**\n * Distance from the hovered value along one axis, as a share of the tolerance.\n * Values that cannot be compared numerically, such as category labels, only\n * count as near when they are identical.\n */\nconst axisDistance = (\n value: unknown,\n hoveredValue: unknown,\n tolerance: number,\n): number | undefined => {\n const numeric = toNumericValue(value);\n const hoveredNumeric = toNumericValue(hoveredValue);\n\n if (numeric === undefined || hoveredNumeric === undefined) {\n return value === hoveredValue ? 0 : undefined;\n }\n\n if (tolerance <= 0) {\n return numeric === hoveredNumeric ? 0 : undefined;\n }\n\n return (numeric - hoveredNumeric) / tolerance;\n};\n\nconst isCoordinatePair = (value: number | number[]): value is number[] =>\n Array.isArray(value) &&\n value.length >= 2 &&\n Number.isFinite(value[0]) &&\n Number.isFinite(value[1]);\n\n/**\n * Converts a pixel radius around the hovered point into a distance on each\n * axis, so points can be compared in data space instead of converting every\n * one of them to pixels.\n */\nconst getAxisTolerances = (\n chart: ScatterTooltipChart,\n seriesIndex: number,\n hoveredValue: unknown[],\n radius: number,\n) => {\n const finder = { seriesIndex };\n const pixel = chart.convertToPixel(finder, hoveredValue);\n\n if (!isCoordinatePair(pixel)) {\n return undefined;\n }\n\n const origin = chart.convertFromPixel(finder, [pixel[0], pixel[1]]);\n const offset = chart.convertFromPixel(finder, [\n pixel[0] + radius,\n pixel[1] + radius,\n ]);\n\n if (!isCoordinatePair(origin) || !isCoordinatePair(offset)) {\n return undefined;\n }\n\n return {\n // oxlint-disable-next-line id-length\n x: Math.abs(offset[0] - origin[0]),\n // oxlint-disable-next-line id-length\n y: Math.abs(offset[1] - origin[1]),\n };\n};\n\n/**\n * Widest scatter symbol in the chart, which doubles as the radius in which\n * points are considered to overlap the hovered one.\n */\nexport function getScatterSymbolSize(series: EchartsSeries): number {\n const sizes = toArray(series as ScatterSeriesLike | ScatterSeriesLike[])\n .filter((seriesOption) => seriesOption?.type === 'scatter')\n .map((seriesOption) =>\n typeof seriesOption.symbolSize === 'number' &&\n Number.isFinite(seriesOption.symbolSize)\n ? seriesOption.symbolSize\n : DEFAULT_SYMBOL_SIZE,\n );\n\n return sizes.length > 0 ? Math.max(...sizes) : DEFAULT_SYMBOL_SIZE;\n}\n\ntype FindNearbyScatterPointsParams = {\n chart: ScatterTooltipChart | undefined;\n dataset: ChartProps['dataset'];\n hovered: ScatterTooltipPoint;\n legendSelected?: Record<string, boolean>;\n maxPoints: number;\n radius: number;\n series: EchartsSeries;\n};\n\n/**\n * Collects the points whose symbols overlap the hovered one, closest first,\n * with the hovered point always leading.\n *\n * Distances are measured in data space against a tolerance derived from the\n * pixel radius (ECharts `convertToPixel` / `convertFromPixel`), which keeps the\n * scan to plain arithmetic per point and works on value, time, and log axes\n * alike.\n */\nexport function findNearbyScatterPoints({\n chart,\n dataset,\n hovered,\n legendSelected,\n maxPoints,\n radius,\n series,\n}: FindNearbyScatterPointsParams): ScatterTooltipPoint[] {\n const hoveredSeriesIndex = hovered.seriesIndex;\n\n if (chart === undefined || hoveredSeriesIndex === undefined) {\n return [hovered];\n }\n\n const hoveredRefs = getEncodedAxisRefs(hovered.encode);\n const hoveredX = readEncodedValue(\n hovered.value,\n hoveredRefs.x,\n hovered.dimensionNames,\n );\n const hoveredY = readEncodedValue(\n hovered.value,\n hoveredRefs.y,\n hovered.dimensionNames,\n );\n const tolerances = getAxisTolerances(\n chart,\n hoveredSeriesIndex,\n [hoveredX, hoveredY],\n radius,\n );\n\n if (tolerances === undefined) {\n return [hovered];\n }\n\n const seriesList = toArray(series) as ScatterSeriesLike[];\n const datasets = toArray(dataset) as DatasetLike[];\n const neighbors: Array<{ distance: number; point: ScatterTooltipPoint }> = [];\n let scannedPoints = 0;\n\n for (const [seriesIndex, seriesOption] of seriesList.entries()) {\n if (\n seriesOption?.type !== 'scatter' ||\n legendSelected?.[seriesOption.name ?? ''] === false\n ) {\n continue;\n }\n\n const source = resolveSeriesSource(seriesOption, datasets);\n\n if (source === undefined) {\n continue;\n }\n\n const refs = getEncodedAxisRefs(seriesOption.encode);\n\n for (const [dataIndex, row] of source.rows.entries()) {\n if (scannedPoints >= MAX_SCANNED_POINTS) {\n break;\n }\n\n scannedPoints += 1;\n\n if (\n seriesIndex === hoveredSeriesIndex &&\n dataIndex === hovered.dataIndex\n ) {\n continue;\n }\n\n const xDistance = axisDistance(\n readEncodedValue(row, refs.x, source.dimensionNames),\n hoveredX,\n tolerances.x,\n );\n const yDistance = axisDistance(\n readEncodedValue(row, refs.y, source.dimensionNames),\n hoveredY,\n tolerances.y,\n );\n\n if (xDistance === undefined || yDistance === undefined) {\n continue;\n }\n\n const distance = Math.hypot(xDistance, yDistance);\n\n if (distance > 1) {\n continue;\n }\n\n neighbors.push({\n distance,\n point: {\n color:\n typeof seriesOption.color === 'string'\n ? seriesOption.color\n : undefined,\n dataIndex,\n dimensionNames: source.dimensionNames,\n encode: seriesOption.encode,\n seriesIndex,\n seriesName: seriesOption.name,\n value: row,\n },\n });\n }\n }\n\n neighbors.sort((first, second) => first.distance - second.distance);\n\n return [\n hovered,\n ...neighbors.slice(0, Math.max(maxPoints - 1, 0)).map(({ point }) => point),\n ];\n}\n"]}
|
|
@@ -32,7 +32,7 @@ const defaultColors = Object.values(base_1.tokens.categorical);
|
|
|
32
32
|
const mergeSeries = (series, theme = 'light', userOption, palette) => {
|
|
33
33
|
const colors = palette !== null && palette !== void 0 ? palette : defaultColors;
|
|
34
34
|
return series.map((option, index = 0) => {
|
|
35
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
35
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
36
36
|
if (option === undefined) {
|
|
37
37
|
return {};
|
|
38
38
|
}
|
|
@@ -63,7 +63,7 @@ const mergeSeries = (series, theme = 'light', userOption, palette) => {
|
|
|
63
63
|
// Emphasis is enabled and used to apply the scale effect when hovering the pie chart slices.
|
|
64
64
|
emphasis: Object.assign({ disabled: false, focus: 'self', scale: true, scaleSize: 5 }, option.emphasis), itemStyle: Object.assign({ borderColor: base_1.tokens.theme[theme].color.neutral.bg.weak, borderWidth: 1 }, option.itemStyle), label: Object.assign({ backgroundColor: 'transparent', color: base_1.tokens.theme[theme].color.neutral.text.weak, formatter: '{d}%' }, option.label), labelLine: Object.assign({ length: 5, show: true }, option.labelLine), tooltip: Object.assign({ trigger: 'item', confine: true,
|
|
65
65
|
// Reset the default tooltip css styling
|
|
66
|
-
padding: 0, borderRadius: 0, borderWidth: 0, extraCssText:
|
|
66
|
+
padding: 0, borderRadius: 0, borderWidth: 0, extraCssText: defaults_1.tooltipExtraCssText, formatter: function (params) {
|
|
67
67
|
var _a, _b;
|
|
68
68
|
const paramsArray = Array.isArray(params) ? params : [params];
|
|
69
69
|
const firstParam = paramsArray[0];
|
|
@@ -72,14 +72,24 @@ const mergeSeries = (series, theme = 'light', userOption, palette) => {
|
|
|
72
72
|
: firstParam.value), indentSquareColor: firstParam.color }, (_b = firstParam === null || firstParam === void 0 ? void 0 : firstParam.value[0]) !== null && _b !== void 0 ? _b : firstParam.seriesName) }))}`;
|
|
73
73
|
} }, option.tooltip) });
|
|
74
74
|
}
|
|
75
|
+
if (option.type === 'scatter') {
|
|
76
|
+
// `emptyCircle` always fills with white, so the interior is a real
|
|
77
|
+
// circle painted with the theme's surface color. The ring is the border,
|
|
78
|
+
// drawn on top of that fill. Hover replaces the interior with the
|
|
79
|
+
// series color and leaves the ring in place. `focus` stays 'none':
|
|
80
|
+
// any other value blurs the series, and blur wins over emphasis, so
|
|
81
|
+
// the circle would never fill.
|
|
82
|
+
const interiorColor = base_1.tokens.theme[theme].color.neutral.bg.weak;
|
|
83
|
+
return Object.assign(Object.assign({ color, symbol: 'circle', symbolSize: 10 }, option), { itemStyle: Object.assign({ borderColor: color, borderWidth: 2, color: interiorColor }, option.itemStyle), emphasis: Object.assign(Object.assign({ disabled: false, focus: 'none' }, option.emphasis), { itemStyle: Object.assign({ borderColor: color, color }, (_e = option.emphasis) === null || _e === void 0 ? void 0 : _e.itemStyle) }) });
|
|
84
|
+
}
|
|
75
85
|
if (option.type === 'bar') {
|
|
76
86
|
const valueFormatter = (0, chart_tooltip_formatter_1.getTooltipValueFormatter)(userOption);
|
|
77
|
-
return Object.assign(Object.assign({ barMaxWidth: 16 }, option), { blur: Object.assign({ itemStyle: Object.assign({ opacity: 0.3 }, (
|
|
78
|
-
emphasis: Object.assign({ disabled: true, lineStyle: Object.assign({ width: 20 }, (
|
|
79
|
-
lineStyle: Object.assign({ width: 20 }, (
|
|
87
|
+
return Object.assign(Object.assign({ barMaxWidth: 16 }, option), { blur: Object.assign({ itemStyle: Object.assign({ opacity: 0.3 }, (_f = option.blur) === null || _f === void 0 ? void 0 : _f.itemStyle) }, option.blur), emphasis: Object.assign({ disabled: true, focus: 'series' }, option.emphasis), itemStyle: Object.assign({ borderWidth: 20, color }, option.itemStyle), markLine: {
|
|
88
|
+
emphasis: Object.assign({ disabled: true, lineStyle: Object.assign({ width: 20 }, (_h = (_g = option.markLine) === null || _g === void 0 ? void 0 : _g.emphasis) === null || _h === void 0 ? void 0 : _h.lineStyle) }, (_j = option.markLine) === null || _j === void 0 ? void 0 : _j.emphasis),
|
|
89
|
+
lineStyle: Object.assign({ width: 20 }, (_k = option.markLine) === null || _k === void 0 ? void 0 : _k.lineStyle),
|
|
80
90
|
}, tooltip: Object.assign({ trigger: 'axis', confine: true,
|
|
81
91
|
// Reset the default tooltip css styling
|
|
82
|
-
padding: 0, borderRadius: 0, borderWidth: 0, extraCssText:
|
|
92
|
+
padding: 0, borderRadius: 0, borderWidth: 0, extraCssText: defaults_1.tooltipExtraCssText, formatter: function (params) {
|
|
83
93
|
var _a;
|
|
84
94
|
const paramsArray = Array.isArray(params) ? params : [params];
|
|
85
95
|
const firstParam = paramsArray[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-option-utils.js","sourceRoot":"","sources":["../../../../src/charts/utils/user-option-utils.tsx"],"names":[],"mappings":";;;;AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,0CAAyC;AAEzC,6CAAkD;AAElD,kDAA+C;AAC/C,uEAAqE;AAOrE,yCAA8D;AAC9D,iDAAkD;AAElD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,aAAM,CAAC,WAAW,CAAC,CAAC;AAWjD,MAAM,WAAW,GAAG,CACzB,MAAoB,EACpB,QAA0B,OAAO,EACjC,UAGC,EACD,OAAoB,EACL,EAAE;IACjB,MAAM,MAAM,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,aAAa,CAAC;IAExC,OAAO,MAAM,CAAC,GAAG,CACf,CACE,MAGuC,EACvC,QAAgB,CAAC,EACH,EAAE;;QAChB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB,CAAC,CAAC,CAAC,MAAA,MAAM,CAAC,KAAK,mCAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAEpD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACpC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;YACpC,mEAAmE;YACnE,0EAA0E;YAC1E,MAAM,iBAAiB,GAAG,iBAAiB,gBAAgB,EAAE,CAAC;YAC9D,qCACE,UAAU,EAAE,CAAC,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,2CAAgC,CAAC,SAAS,IAClD,MAAM,KACT,SAAS,kBACP,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,CAAC,IACL,MAAM,CAAC,SAAS,GAErB,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;oBACJ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;oBAC/B,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;iBAChC,IACD;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;YACpD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAEvD,qCACE,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,EACb,KAAK,EACL,MAAM,EAAE,MAAM,IACX,MAAM,KACT,SAAS,kBACP,IAAI,EAAE,OAAgB,EACtB,KAAK,EAAE,CAAC,IACL,MAAM,CAAC,SAAS,GAErB,QAAQ,8CACN,QAAQ,EAAE,IAAI,EACd,KAAK,EAAE,QAAQ,IACZ,MAAM,CAAC,QAAQ,KAClB,SAAS,kBACP,WAAW,EAAE,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EACtD,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACpC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,EAC3B,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACvC,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IACpC,MAAA,MAAM,CAAC,QAAQ,0CAAE,SAAS,GAE/B,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KACnB,MAAM,CAAC,QAAQ,KAEpB;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAA,kDAAwB,EAAC,UAAU,CAAC,CAAC;YAE5D,qCACE,iBAAiB,EAAE,GAAG,EACtB,aAAa,EAAE,OAAO,EACtB,YAAY,EAAE,QAAQ,IACnB,MAAM;gBACT,wDAAwD;gBACxD,+FAA+F;gBAC/F,IAAI,kBACF,SAAS,kBACP,OAAO,EAAE,CAAC,IACP,MAAA,MAAM,CAAC,IAAI,0CAAE,SAAS,GAE3B,KAAK,kBACH,OAAO,EAAE,CAAC,IACP,MAAA,MAAM,CAAC,IAAI,0CAAE,KAAK,KAEpB,MAAM,CAAC,IAAI;gBAEhB,6FAA6F;gBAC7F,QAAQ,kBACN,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,IAAI,EACX,SAAS,EAAE,CAAC,IACT,MAAM,CAAC,QAAQ,GAEpB,SAAS,kBACP,WAAW,EAAE,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EACtD,WAAW,EAAE,CAAC,IACX,MAAM,CAAC,SAAS,GAErB,KAAK,kBACH,eAAe,EAAE,aAAa,EAC9B,KAAK,EAAE,aAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAClD,SAAS,EAAE,MAAM,IACd,MAAM,CAAC,KAAK,GAEjB,SAAS,kBACP,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,IAAI,IACP,MAAM,CAAC,SAAS,GAErB,OAAO,kBACL,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI;oBACb,wCAAwC;oBACxC,OAAO,EAAE,CAAC,EACV,YAAY,EAAE,CAAC,EACf,WAAW,EAAE,CAAC,EACd,YAAY,EAAE,kDAAkD,EAChE,SAAS,EAAE,UAAU,MAAe;;wBAClC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;wBAClC,OAAO,GAAG,IAAA,uBAAc,EACtB,iCAAM,SAAS,EAAC,0BAA0B,YACxC,uBAAC,2BAAY,CAAC,OAAO,IAEnB,cAAc,EACZ,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,CAAC,CAAC,mCAAI,UAAU,CAAC,UAAU,EAE/C,eAAe,EAAE,cAAc,CAC7B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;oCAC7B,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;oCACrB,CAAC,CAAC,UAAU,CAAC,KAAK,CACrB,EACD,iBAAiB,EAAE,UAAU,CAAC,KAAK,IAT9B,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,CAAC,CAAC,mCAAI,UAAU,CAAC,UAAU,CAUlD,GACG,CACR,EAAE,CAAC;oBACN,CAAC,IACE,MAAM,CAAC,OAAO,KAEnB;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,cAAc,GAAG,IAAA,kDAAwB,EAAC,UAAU,CAAC,CAAC;YAE5D,qCACE,WAAW,EAAE,EAAE,IACZ,MAAM,KACT,IAAI,kBACF,SAAS,kBACP,OAAO,EAAE,GAAG,IACT,MAAA,MAAM,CAAC,IAAI,0CAAE,SAAS,KAExB,MAAM,CAAC,IAAI,GAEhB,QAAQ,kBACN,QAAQ,EAAE,IAAI,EACd,KAAK,EAAE,QAAQ,IACZ,MAAM,CAAC,QAAQ,GAEpB,SAAS,kBACP,WAAW,EAAE,EAAE,EACf,KAAK,IACF,MAAM,CAAC,SAAS,GAErB,QAAQ,EAAE;oBACR,QAAQ,kBACN,QAAQ,EAAE,IAAI,EACd,SAAS,kBACP,KAAK,EAAE,EAAE,IACN,MAAA,MAAA,MAAM,CAAC,QAAQ,0CAAE,QAAQ,0CAAE,SAAS,KAEtC,MAAA,MAAM,CAAC,QAAQ,0CAAE,QAAQ,CAC7B;oBACD,SAAS,kBACP,KAAK,EAAE,EAAE,IACN,MAAA,MAAM,CAAC,QAAQ,0CAAE,SAAS,CAC9B;iBACF,EACD,OAAO,kBACL,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI;oBACb,wCAAwC;oBACxC,OAAO,EAAE,CAAC,EACV,YAAY,EAAE,CAAC,EACf,WAAW,EAAE,CAAC,EACd,YAAY,EAAE,kDAAkD,EAChE,SAAS,EAAE,UAAU,MAAe;;wBAClC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;wBAClC,OAAO,GAAG,IAAA,uBAAc,EACtB,kCAAM,SAAS,EAAC,0BAA0B,aACxC,uBAAC,2BAAY,CAAC,KAAK,cAAE,UAAU,CAAC,IAAI,GAAsB,EAC1D,uBAAC,2BAAY,CAAC,OAAO,IAEnB,cAAc,EAAE,UAAU,CAAC,UAAU,EACrC,eAAe,EAAE,cAAc,CAC7B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;wCAC7B,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;wCACrB,CAAC,CAAC,UAAU,CAAC,KAAK,CACrB,EACD,iBAAiB,EAAE,UAAU,CAAC,KAAK,IAP9B,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,CAAC,CAAC,mCAAI,UAAU,CAAC,UAAU,CAQlD,IACG,CACR,EAAE,CAAC;oBACN,CAAC,IACE,MAAM,CAAC,OAAO,KAEnB;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CACF,CAAC;AACJ,CAAC,CAAC;AA1OW,QAAA,WAAW,eA0OtB;AAEK,MAAM,UAAU,GAAG,CACxB,KAA6B,EAC7B,QAA0B,OAAO,EACT,EAAE;;IAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAA,kBAAU,EAAC,IAAI,EAAE,KAAK,CAAC,CACE,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,gCACb,KAAK,KACR,SAAS,kBACP,SAAS,EAAE;gBACT,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,sBAAsB;gBACnC,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,uCAAuC;gBAC7C,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE,wCAAwC;aAC/C,EACD,MAAM,EAAE,EAAE,EACV,QAAQ,EAAE,UAAU,IACjB,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,GAErB,QAAQ,kBACN,SAAS,oBACJ,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,SAAS,KAE5B,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,GAEpB,QAAQ,gDACH,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,KAClB,SAAS,oBACJ,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,SAAS,GAE/B,IAAI,EAAE,IAAI,KACP,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,GAEpB,SAAS,kBAAI,IAAI,EAAE,KAAK,IAAK,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,IACzB,CAAC;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,gCACb,SAAS,KACZ,SAAS,kBACP,WAAW,EAAE,IAAI,IACd,SAAS,CAAC,SAAS,IAEJ,CAAC;QAEvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACnD,MAAM,cAAc,GAClB,KAAK,CAAC,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC,SAAS;YAC/C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS;YAC3B,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,UAAU,GAAG,gCACd,SAAS,KACZ,SAAS,kCACJ,SAAS,CAAC,SAAS,KACtB,SAAS,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,+BAAgB,MAE3B,CAAC;QAEvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,gCACjB,SAAS,KACZ,SAAS,kBACP,KAAK,EAAE,EAAE,IACN,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,GAEzB,QAAQ,kBACN,cAAc,EAAE,IAAI,IACjB,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,IAEJ,CAAC;QACvB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AA5FW,QAAA,UAAU,cA4FrB;AAEK,MAAM,UAAU,GAAG,CACxB,KAA6B,EAC7B,QAA0B,OAAO,EACT,EAAE;;IAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAA,kBAAU,EAAC,IAAI,EAAE,KAAK,CAAC,CACE,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,GAAG,gCACb,KAAK,KACR,SAAS,kBACP,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,UAAU,IACjB,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,GAErB,QAAQ,kCACH,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,KAClB,SAAS,oBACJ,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,SAAS,GAE/B,IAAI,EAAE,IAAI,KAEZ,QAAQ,gCACN,IAAI,EAAE,KAAK,IACR,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,KAClB,SAAS,kBACP,KAAK,EAAE,CAAC,IACL,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,0CAAE,SAAS,MAGjC,SAAS,kBAAI,IAAI,EAAE,IAAI,IAAK,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,IACxB,CAAC;IAEvB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,gCACb,SAAS,KACZ,SAAS,kBACP,WAAW,EAAE,IAAI,IACd,SAAS,CAAC,SAAS,GAExB,SAAS,kBAAI,IAAI,EAAE,KAAK,IAAK,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,IAC7B,CAAC;QAEvB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACnD,MAAM,cAAc,GAClB,KAAK,CAAC,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC,SAAS;YAC/C,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS;YAC3B,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,UAAU,GAAG,gCACd,SAAS,KACZ,SAAS,gCACP,WAAW,EAAE,IAAI,IACd,SAAS,CAAC,SAAS,KACtB,SAAS,EAAE,cAAc,aAAd,cAAc,cAAd,cAAc,GAAI,+BAAgB,KAE/C,SAAS,kBAAI,IAAI,EAAE,KAAK,IAAK,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,IAC7B,CAAC;QAEvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,aAAa,GAAG,gCACjB,SAAS,KACZ,SAAS,kBACP,KAAK,EAAE,GAAG,IACP,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,IAEL,CAAC;QAEvB,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAnFW,QAAA,UAAU,cAmFrB;AAiBF,MAAM,oBAAoB,GAAG,CAAC,SAAkB,EAAY,EAAE;IAC5D,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE;YACjD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAC/B,QAA0C,EACtB,EAAE;IACtB,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,EAAE,CAAC;QAC/D,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,YAAY,GAChB,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,CAAC;IAEzE,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL,YAAY,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC;YACvD,YAAY,EAAE,oBAAoB,CAAC,QAAQ,CAAC,UAAU,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU;QACnC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;QACzC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,qBAAqB,GAAG,CACnC,QAAmC,EACf,EAAE;IACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,OAAO,GAAuB,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAE3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAvBW,QAAA,qBAAqB,yBAuBhC;AAEF;;;GAGG;AACI,MAAM,gBAAgB,GAAG,CAC9B,QAA0C,EACjC,EAAE;IACX,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC;IACxC,CAAC;IAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnD,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC;AAC9E,CAAC,CAAC;AAdW,QAAA,gBAAgB,oBAc3B;AAEF;;;;;;GAMG;AACH,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D,MAAM,mBAAmB,GAAG,CAC1B,IAAqD,EACrD,SAAkB,EACa,EAAE;IACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAqC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GACT,OAAO,SAAS,KAAK,QAAQ;QAC3B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ;YAC5D,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACd,CAAC,CAAC,CAAC,CAAC;IAEV,OAAO,IAAI,CAAC,KAAK,CAAkC,CAAC;AACtD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,0BAA0B,GAAG,CACjC,QAA8B,EAC9B,IAAmC,EACf,EAAE;IACtB,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IAEtD,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,aAAa;QAC9B,CAAC,CAAC,mBAAmB,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC;QACvD,CAAC,CAAC,mBAAmB,CAAC,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,MAAK,SAAS;QACnC,0BAA0B,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC,CAAC;AAEK,MAAM,aAAa,GAAG,CAC3B,QAAmC,EACnC,IAAwB,EACG,EAAE;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7B,IAAA,qBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,CACC,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,CAAC;IAC7C,MAAM,QAAQ,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,MAAK,QAAQ,CAAC;IAE7C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,0BAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,IAAA,wBAAgB,EAAC,QAAQ,CAAC;YAC/C,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC1B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE/B,mEACK,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC,GAC5C,cAAc,KACjB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,KACX,QAAQ,EACX;IACJ,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,0EAA0E;QAC1E,wDAAwD;QACxD,gDAAgD;QAChD,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACnD,MAAM,qBAAqB,GACzB,QAAQ,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAEvE,mDACE,UAAU,EAAE,MAAM,IACf,CAAC,qBAAqB,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACjD,gBAAgB,EAAE,KAAK,KACpB,QAAQ,EACX;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AA3CW,QAAA,aAAa,iBA2CxB;AAMF,MAAM,sBAAsB,GAAG,CAC7B,UAAyC,EAChC,EAAE;IACX,OAAO,CACL,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,MAAK,SAAS;QAC9B,0BAA0B,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CACrD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC9B,IAAqD,EACrD,WAA6B,EACpB,EAAE;IACX,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAExD,OAAO,CACL,WAAW,CAAC,MAAM,GAAG,CAAC;YACtB,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE;gBAC/B,OAAO,sBAAsB,CAAC,UAA+B,CAAC,CAAC;YACjE,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE;QACrC,OAAO,sBAAsB,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,CAChC,OAAwC,EACxC,YAAsC,EACtC,YAAsC,EAClB,EAAE;IACtB,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC,CAAC;AAEK,MAAM,YAAY,GAAG,CAC1B,OAAiC,EACjC,OAA6B,EACH,EAAE;;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5B,IAAA,oBAAY,EAAC,MAAM,EAAE,OAAO,CAAC,CACF,CAAC;IAChC,CAAC;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,UAAU,GACd,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,MAAM,YAAY,GAA6B,UAAU;QACvD,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY;QACzD,CAAC,CAAC,KAAK,CAAC;IACV,MAAM,YAAY,GAChB,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC;IAC1D,MAAM,UAAU,GAAG,yBAAyB,CAC1C,OAAO,EACP,YAAY,EACZ,YAAY,CACb,CAAC;IAEF,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,4EACH,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC,GAC5C,CAAC,YAAY,KAAK,KAAK,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,KAC3D,UAAU,EAAE,YAAY,KACrB,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,0CAAE,QAAQ,KAC7B,IAAI,EAAE;oBACJ,+BAA+B;oBAC/B,yDAAyD;oBACzD,IAAI,EAAE,GAAG;oBACT,IAAI,EAAE,GAAG;iBACV,EACD,IAAI,EAAE,IAAI,GACX;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AA5CW,QAAA,YAAY,gBA4CvB","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 { type EChartsOption, type SeriesOption } from 'echarts';\nimport { renderToString } from 'react-dom/server';\n\nimport { ChartTooltip } from '../ChartTooltip';\nimport { getTooltipValueFormatter } from './chart-tooltip-formatter';\nimport {\n type EchartsSeries,\n type HexColor,\n type NeedleSeries,\n type ThresholdLineSeriesOption,\n} from './chart-types';\nimport { defaultThresholdLineSeriesOption } from './defaults';\nimport { formatNumberEnUS } from './format-utils';\n\nconst defaultColors = Object.values(tokens.categorical);\n\ntype SingleXAxisOption = Exclude<\n NonNullable<EChartsOption['xAxis']>,\n unknown[]\n>;\ntype SingleYAxisOption = Exclude<\n NonNullable<EChartsOption['yAxis']>,\n unknown[]\n>;\n\nexport const mergeSeries = (\n series: NeedleSeries,\n theme: 'light' | 'dark' = 'light',\n userOption?: Omit<\n EChartsOption,\n 'series' | 'dataset' | 'legend' | 'xAxis' | 'yAxis'\n >,\n palette?: HexColor[],\n): EchartsSeries => {\n const colors = palette ?? defaultColors;\n\n return series.map(\n (\n option:\n | SeriesOption\n | ThresholdLineSeriesOption<'warning'>\n | ThresholdLineSeriesOption<'danger'>,\n index: number = 0,\n ): SeriesOption => {\n if (option === undefined) {\n return {};\n }\n\n const color = Array.isArray(option.color)\n ? option.color[index]\n : (option.color ?? colors[index % colors.length]);\n\n if (option.type === 'thresholdLine') {\n const { notificationType } = option;\n // Needed to differentiate between normal lines and threshold lines\n // as we are unable to inject custom properties into echarts series lines.\n const thresholdLineName = `thresholdLine-${notificationType}`;\n return {\n symbolSize: 9,\n symbol: 'none',\n condition: defaultThresholdLineSeriesOption.condition,\n ...option,\n lineStyle: {\n type: 'dashed',\n width: 2,\n ...option.lineStyle,\n },\n name: thresholdLineName,\n type: 'line',\n data: [\n [option.xAxis[0], option.yAxis],\n [option.xAxis[1], option.yAxis],\n ],\n };\n }\n\n if (option.type === 'line') {\n const shadow = tokens.theme[theme].boxShadow.raised;\n const shadowParts = shadow.split(/ (?=\\d+px|rgba?\\()/);\n\n return {\n type: 'line',\n symbolSize: 9,\n color,\n symbol: 'none',\n ...option,\n lineStyle: {\n type: 'solid' as const,\n width: 2,\n ...option.lineStyle,\n },\n emphasis: {\n disabled: true,\n focus: 'series',\n ...option.emphasis,\n itemStyle: {\n borderColor: tokens.theme[theme].color.neutral.bg.weak,\n shadowBlur: parseInt(shadowParts[2]),\n shadowColor: shadowParts[4],\n shadowOffsetX: parseInt(shadowParts[0]),\n shadowOffsetY: parseInt(shadowParts[1]),\n ...option.emphasis?.itemStyle,\n },\n label: { show: false },\n ...option.emphasis,\n },\n };\n }\n\n if (option.type === 'pie') {\n const valueFormatter = getTooltipValueFormatter(userOption);\n\n return {\n animationDuration: 600,\n animationType: 'scale',\n selectedMode: 'single',\n ...option,\n // Blur opacity is set to 1 to prevent other slices from\n // being opacitated when hovering a slice where the emphasis is enabled (used for scale effect)\n blur: {\n itemStyle: {\n opacity: 1,\n ...option.blur?.itemStyle,\n },\n label: {\n opacity: 1,\n ...option.blur?.label,\n },\n ...option.blur,\n },\n // Emphasis is enabled and used to apply the scale effect when hovering the pie chart slices.\n emphasis: {\n disabled: false,\n focus: 'self',\n scale: true,\n scaleSize: 5,\n ...option.emphasis,\n },\n itemStyle: {\n borderColor: tokens.theme[theme].color.neutral.bg.weak,\n borderWidth: 1,\n ...option.itemStyle,\n },\n label: {\n backgroundColor: 'transparent',\n color: tokens.theme[theme].color.neutral.text.weak,\n formatter: '{d}%',\n ...option.label,\n },\n labelLine: {\n length: 5,\n show: true,\n ...option.labelLine,\n },\n tooltip: {\n trigger: 'item',\n confine: true,\n // Reset the default tooltip css styling\n padding: 0,\n borderRadius: 0,\n borderWidth: 0,\n extraCssText: 'box-shadow: none; background-color: transparent;',\n formatter: function (params: unknown) {\n const paramsArray = Array.isArray(params) ? params : [params];\n const firstParam = paramsArray[0];\n return `${renderToString(\n <span className=\"ndl-charts-chart-tooltip\">\n <ChartTooltip.Content\n key={firstParam?.value[0] ?? firstParam.seriesName}\n leadingElement={\n firstParam?.value[0] ?? firstParam.seriesName\n }\n trailingElement={valueFormatter(\n Array.isArray(firstParam.value)\n ? firstParam.value[1]\n : firstParam.value,\n )}\n indentSquareColor={firstParam.color}\n />\n </span>,\n )}`;\n },\n ...option.tooltip,\n },\n };\n }\n\n if (option.type === 'bar') {\n const valueFormatter = getTooltipValueFormatter(userOption);\n\n return {\n barMaxWidth: 16,\n ...option,\n blur: {\n itemStyle: {\n opacity: 0.3,\n ...option.blur?.itemStyle,\n },\n ...option.blur,\n },\n emphasis: {\n disabled: true,\n focus: 'series',\n ...option.emphasis,\n },\n itemStyle: {\n borderWidth: 20,\n color,\n ...option.itemStyle,\n },\n markLine: {\n emphasis: {\n disabled: true,\n lineStyle: {\n width: 20,\n ...option.markLine?.emphasis?.lineStyle,\n },\n ...option.markLine?.emphasis,\n },\n lineStyle: {\n width: 20,\n ...option.markLine?.lineStyle,\n },\n },\n tooltip: {\n trigger: 'axis',\n confine: true,\n // Reset the default tooltip css styling\n padding: 0,\n borderRadius: 0,\n borderWidth: 0,\n extraCssText: 'box-shadow: none; background-color: transparent;',\n formatter: function (params: unknown) {\n const paramsArray = Array.isArray(params) ? params : [params];\n const firstParam = paramsArray[0];\n return `${renderToString(\n <span className=\"ndl-charts-chart-tooltip\">\n <ChartTooltip.Title>{firstParam.name}</ChartTooltip.Title>\n <ChartTooltip.Content\n key={firstParam?.value[0] ?? firstParam.seriesName}\n leadingElement={firstParam.seriesName}\n trailingElement={valueFormatter(\n Array.isArray(firstParam.value)\n ? firstParam.value[1]\n : firstParam.value,\n )}\n indentSquareColor={firstParam.color}\n />\n </span>,\n )}`;\n },\n ...option.tooltip,\n },\n };\n }\n\n return option;\n },\n );\n};\n\nexport const mergeXAxis = (\n xAxis: EChartsOption['xAxis'],\n theme: 'light' | 'dark' = 'light',\n): EChartsOption['xAxis'] => {\n if (xAxis === undefined) {\n return [];\n }\n\n if (Array.isArray(xAxis)) {\n return xAxis.map((axis) =>\n mergeXAxis(axis, theme),\n ) as EChartsOption['xAxis'];\n }\n\n const baseXAxis = {\n ...xAxis,\n axisLabel: {\n formatter: {\n day: '{dd} {MMM}',\n hour: '{HH}:{mm}',\n millisecond: '{hh}:{mm}:{ss} {SSS}',\n minute: '{HH}:{mm}',\n month: '{MMM}',\n none: '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}',\n second: '{HH}:{mm}:{ss}',\n year: '{yearStyle|{yyyy}}\\n{monthStyle|{MMM}}',\n },\n margin: 16,\n overflow: 'truncate',\n ...xAxis?.axisLabel,\n },\n axisLine: {\n lineStyle: {\n ...xAxis?.axisLine?.lineStyle,\n },\n ...xAxis?.axisLine,\n },\n axisTick: {\n ...xAxis?.axisTick,\n lineStyle: {\n ...xAxis?.axisTick?.lineStyle,\n },\n show: true,\n ...xAxis?.axisTick,\n },\n splitLine: { show: false, ...xAxis?.splitLine },\n } as SingleXAxisOption;\n\n if (xAxis.type === 'time') {\n const timeXAxis = {\n ...baseXAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseXAxis.axisLabel,\n },\n } as SingleXAxisOption;\n\n return timeXAxis;\n }\n\n if (xAxis.type === 'value' || xAxis.type === 'log') {\n const xAxisFormatter =\n xAxis.axisLabel && 'formatter' in xAxis.axisLabel\n ? xAxis.axisLabel.formatter\n : undefined;\n const valueXAxis = {\n ...baseXAxis,\n axisLabel: {\n ...baseXAxis.axisLabel,\n formatter: xAxisFormatter ?? formatNumberEnUS,\n },\n } as SingleXAxisOption;\n\n return valueXAxis;\n }\n\n if (xAxis.type === 'category') {\n const categoryXAxis = {\n ...baseXAxis,\n axisLabel: {\n width: 80,\n ...baseXAxis?.axisLabel,\n },\n axisTick: {\n alignWithLabel: true,\n ...baseXAxis?.axisTick,\n },\n } as SingleXAxisOption;\n return categoryXAxis;\n }\n\n return baseXAxis;\n};\n\nexport const mergeYAxis = (\n yAxis: EChartsOption['yAxis'],\n theme: 'light' | 'dark' = 'light',\n): EChartsOption['yAxis'] => {\n if (yAxis === undefined) {\n return [];\n }\n\n if (Array.isArray(yAxis)) {\n return yAxis.map((axis) =>\n mergeYAxis(axis, theme),\n ) as EChartsOption['yAxis'];\n }\n\n const baseYAxis = {\n ...yAxis,\n axisLabel: {\n margin: 8,\n overflow: 'truncate',\n ...yAxis?.axisLabel,\n },\n axisLine: {\n ...yAxis?.axisLine,\n lineStyle: {\n ...yAxis?.axisLine?.lineStyle,\n },\n show: true,\n },\n axisTick: {\n show: false,\n ...yAxis?.axisTick,\n lineStyle: {\n width: 1,\n ...yAxis?.axisTick?.lineStyle,\n },\n },\n splitLine: { show: true, ...yAxis?.splitLine },\n } as SingleYAxisOption;\n\n if (yAxis.type === 'time') {\n const timeYAxis = {\n ...baseYAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseYAxis.axisLabel,\n },\n splitLine: { show: false, ...baseYAxis?.splitLine },\n } as SingleYAxisOption;\n\n return timeYAxis;\n }\n\n if (yAxis.type === 'value' || yAxis.type === 'log') {\n const yAxisFormatter =\n yAxis.axisLabel && 'formatter' in yAxis.axisLabel\n ? yAxis.axisLabel.formatter\n : undefined;\n const valueYAxis = {\n ...baseYAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseYAxis.axisLabel,\n formatter: yAxisFormatter ?? formatNumberEnUS,\n },\n splitLine: { show: false, ...baseYAxis?.splitLine },\n } as SingleYAxisOption;\n\n return valueYAxis;\n }\n\n if (yAxis.type === 'category') {\n const categoryYAxis = {\n ...baseYAxis,\n axisLabel: {\n width: 100,\n ...baseYAxis?.axisLabel,\n },\n } as SingleYAxisOption;\n\n return categoryYAxis;\n }\n\n return baseYAxis;\n};\n\ntype SingleDataZoomOption = Exclude<\n NonNullable<EChartsOption['dataZoom']>,\n unknown[]\n>;\n\ntype MergeDataZoomAxes = {\n xAxis?: EChartsOption['xAxis'];\n yAxis?: EChartsOption['yAxis'];\n};\n\nexport type DataZoomTargetAxes = {\n xAxisIndices: number[];\n yAxisIndices: number[];\n};\n\nconst normalizeAxisIndices = (axisIndex: unknown): number[] => {\n if (typeof axisIndex === 'number') {\n return [axisIndex];\n }\n\n if (Array.isArray(axisIndex)) {\n return axisIndex.filter((index): index is number => {\n return typeof index === 'number';\n });\n }\n\n return [];\n};\n\n/**\n * Resolves the axes a single dataZoom entry targets, mirroring ECharts' own\n * resolution order: explicit `xAxisIndex`/`yAxisIndex` win (`false` meaning\n * \"not this axis\"); when no index is given, `orient: 'vertical'` targets the\n * first y-axis and horizontal/unset targets the first x-axis.\n */\nconst getSingleDataZoomTargets = (\n dataZoom: SingleDataZoomOption | undefined,\n): DataZoomTargetAxes => {\n if (dataZoom?.type !== 'slider' && dataZoom?.type !== 'inside') {\n return { xAxisIndices: [], yAxisIndices: [] };\n }\n\n const hasAxisIndex =\n dataZoom.xAxisIndex !== undefined || dataZoom.yAxisIndex !== undefined;\n\n if (hasAxisIndex) {\n return {\n xAxisIndices: normalizeAxisIndices(dataZoom.xAxisIndex),\n yAxisIndices: normalizeAxisIndices(dataZoom.yAxisIndex),\n };\n }\n\n return dataZoom.orient === 'vertical'\n ? { xAxisIndices: [], yAxisIndices: [0] }\n : { xAxisIndices: [0], yAxisIndices: [] };\n};\n\n/**\n * Union of the axis indices targeted by all slider/inside entries in a\n * dataZoom config, using the same per-entry resolution as ECharts (explicit\n * axis indices first, then orientation).\n */\nexport const getDataZoomTargetAxes = (\n dataZoom: EChartsOption['dataZoom'],\n): DataZoomTargetAxes => {\n const entries = Array.isArray(dataZoom) ? dataZoom : [dataZoom];\n const targets: DataZoomTargetAxes = { xAxisIndices: [], yAxisIndices: [] };\n\n for (const entry of entries) {\n const entryTargets = getSingleDataZoomTargets(entry);\n\n for (const index of entryTargets.xAxisIndices) {\n if (!targets.xAxisIndices.includes(index)) {\n targets.xAxisIndices.push(index);\n }\n }\n\n for (const index of entryTargets.yAxisIndices) {\n if (!targets.yAxisIndices.includes(index)) {\n targets.yAxisIndices.push(index);\n }\n }\n }\n\n return targets;\n};\n\n/**\n * A slider is vertical when the consumer sets `orient: 'vertical'`, or when it\n * only targets a y-axis, which makes ECharts infer the vertical orientation.\n */\nexport const isVerticalSlider = (\n dataZoom: SingleDataZoomOption | undefined,\n): boolean => {\n if (dataZoom?.type !== 'slider') {\n return false;\n }\n\n if (dataZoom.orient !== undefined) {\n return dataZoom.orient === 'vertical';\n }\n\n const targets = getSingleDataZoomTargets(dataZoom);\n\n return targets.yAxisIndices.length > 0 && targets.xAxisIndices.length === 0;\n};\n\n/**\n * Axis types where windowing (`filterMode: 'none'`) beats ECharts' default\n * data filtering. Filtering a continuous axis removes whole data items outside\n * the window, which makes bars and points vanish instead of clipping them.\n * Category axes keep the `'filter'` default so paging through categories still\n * rescales the opposite value axis to the visible data.\n */\nconst WINDOWED_FILTER_AXIS_TYPES = ['log', 'time', 'value'];\n\nconst getSingleAxisOption = (\n axis: EChartsOption['xAxis'] | EChartsOption['yAxis'],\n axisIndex: unknown,\n): { type?: string } | undefined => {\n if (!Array.isArray(axis)) {\n return axis as { type?: string } | undefined;\n }\n\n const index =\n typeof axisIndex === 'number'\n ? axisIndex\n : Array.isArray(axisIndex) && typeof axisIndex[0] === 'number'\n ? axisIndex[0]\n : 0;\n\n return axis[index] as { type?: string } | undefined;\n};\n\n/**\n * Resolves the slider's target axis the way ECharts does (explicit axis index\n * first, then orientation) and returns `'none'` when that axis is continuous.\n * Returns `undefined` (keep ECharts' `'filter'` default) for category axes and\n * for sliders that target both axes at once.\n */\nconst getSliderDefaultFilterMode = (\n dataZoom: SingleDataZoomOption,\n axes: MergeDataZoomAxes | undefined,\n): 'none' | undefined => {\n const targets = getSingleDataZoomTargets(dataZoom);\n const isXAxisTarget = targets.xAxisIndices.length > 0;\n const isYAxisTarget = targets.yAxisIndices.length > 0;\n\n if (isXAxisTarget === isYAxisTarget) {\n return undefined;\n }\n\n const targetAxis = isYAxisTarget\n ? getSingleAxisOption(axes?.yAxis, dataZoom.yAxisIndex)\n : getSingleAxisOption(axes?.xAxis, dataZoom.xAxisIndex);\n\n return targetAxis?.type !== undefined &&\n WINDOWED_FILTER_AXIS_TYPES.includes(targetAxis.type)\n ? 'none'\n : undefined;\n};\n\nexport const mergeDataZoom = (\n dataZoom: EChartsOption['dataZoom'],\n axes?: MergeDataZoomAxes,\n): EChartsOption['dataZoom'] => {\n if (Array.isArray(dataZoom)) {\n return dataZoom.map((option) =>\n mergeDataZoom(option, axes),\n ) as EChartsOption['dataZoom'];\n }\n\n const isSlider = dataZoom?.type === 'slider';\n const isInside = dataZoom?.type === 'inside';\n\n if (isSlider) {\n const filterMode = getSliderDefaultFilterMode(dataZoom, axes);\n const layoutDefaults = isVerticalSlider(dataZoom)\n ? { right: 10, width: 28 }\n : { bottom: 10, height: 28 };\n\n return {\n ...(filterMode !== undefined && { filterMode }),\n ...layoutDefaults,\n show: true,\n type: 'slider',\n ...dataZoom,\n };\n } else if (isInside) {\n // Only pin the default x-axis binding on entries that actually target the\n // x-axis; y-targeting entries (explicit `yAxisIndex` or\n // `orient: 'vertical'`) keep their own binding.\n const targets = getSingleDataZoomTargets(dataZoom);\n const hasDefaultXAxisTarget =\n dataZoom.xAxisIndex === undefined && targets.xAxisIndices.length > 0;\n\n return {\n filterMode: 'none',\n ...(hasDefaultXAxisTarget && { xAxisIndex: [0] }),\n zoomOnMouseWheel: false,\n ...dataZoom,\n };\n }\n\n return dataZoom;\n};\n\ntype MergeToolboxContext = MergeDataZoomAxes & {\n dataZoom?: EChartsOption['dataZoom'];\n};\n\nconst isContinuousAxisOption = (\n axisOption: { type?: string } | undefined,\n): boolean => {\n return (\n axisOption?.type !== undefined &&\n WINDOWED_FILTER_AXIS_TYPES.includes(axisOption.type)\n );\n};\n\nconst areTargetAxesContinuous = (\n axis: EChartsOption['xAxis'] | EChartsOption['yAxis'],\n axisIndices: number[] | 'all',\n): boolean => {\n if (axisIndices === 'all') {\n const axisOptions = Array.isArray(axis) ? axis : [axis];\n\n return (\n axisOptions.length > 0 &&\n axisOptions.every((axisOption) => {\n return isContinuousAxisOption(axisOption as { type?: string });\n })\n );\n }\n\n return axisIndices.every((axisIndex) => {\n return isContinuousAxisOption(getSingleAxisOption(axis, axisIndex));\n });\n};\n\n/**\n * Returns `'none'` when every axis targeted by the drag-to-zoom brush is\n * continuous (`value`/`time`/`log`), matching the slider rule: filtering a\n * continuous axis removes whole data items outside the selection instead of\n * clipping them. Category (or unknown) targets keep ECharts' `'filter'`\n * default.\n */\nconst getBrushDefaultFilterMode = (\n context: MergeToolboxContext | undefined,\n xAxisTargets: number[] | 'all' | false,\n yAxisTargets: number[] | 'all' | false,\n): 'none' | undefined => {\n const checks: boolean[] = [];\n\n if (xAxisTargets !== false) {\n checks.push(areTargetAxesContinuous(context?.xAxis, xAxisTargets));\n }\n\n if (yAxisTargets !== false) {\n checks.push(areTargetAxesContinuous(context?.yAxis, yAxisTargets));\n }\n\n return checks.length > 0 && checks.every(Boolean) ? 'none' : undefined;\n};\n\nexport const mergeToolbox = (\n toolbox: EChartsOption['toolbox'],\n context?: MergeToolboxContext,\n): EChartsOption['toolbox'] => {\n if (Array.isArray(toolbox)) {\n return toolbox.map((option) =>\n mergeToolbox(option, context),\n ) as EChartsOption['toolbox'];\n }\n\n // The drag-to-zoom brush follows the axes the dataZoom config targets, so\n // zoom direction is configured in one place. Without any dataZoom config it\n // keeps the historical default: all x-axes on, y off.\n const targets = getDataZoomTargetAxes(context?.dataZoom);\n const hasTargets =\n targets.xAxisIndices.length > 0 || targets.yAxisIndices.length > 0;\n const xAxisTargets: number[] | 'all' | false = hasTargets\n ? targets.xAxisIndices.length > 0 && targets.xAxisIndices\n : 'all';\n const yAxisTargets: number[] | false =\n targets.yAxisIndices.length > 0 && targets.yAxisIndices;\n const filterMode = getBrushDefaultFilterMode(\n context,\n xAxisTargets,\n yAxisTargets,\n );\n\n return {\n feature: {\n dataZoom: {\n ...(filterMode !== undefined && { filterMode }),\n ...(xAxisTargets !== 'all' && { xAxisIndex: xAxisTargets }),\n yAxisIndex: yAxisTargets,\n ...toolbox?.feature?.dataZoom,\n icon: {\n // This hack removes the icons.\n // Due to: https://github.com/apache/echarts/issues/10274\n back: '-',\n zoom: '-',\n },\n show: true,\n },\n },\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"user-option-utils.js","sourceRoot":"","sources":["../../../../src/charts/utils/user-option-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 { type EChartsOption, type SeriesOption } from 'echarts';\nimport { renderToString } from 'react-dom/server';\n\nimport { ChartTooltip } from '../ChartTooltip';\nimport { getTooltipValueFormatter } from './chart-tooltip-formatter';\nimport {\n type EchartsSeries,\n type HexColor,\n type NeedleSeries,\n type ThresholdLineSeriesOption,\n} from './chart-types';\nimport {\n defaultThresholdLineSeriesOption,\n tooltipExtraCssText,\n} from './defaults';\nimport { formatNumberEnUS } from './format-utils';\n\nconst defaultColors = Object.values(tokens.categorical);\n\ntype SingleXAxisOption = Exclude<\n NonNullable<EChartsOption['xAxis']>,\n unknown[]\n>;\ntype SingleYAxisOption = Exclude<\n NonNullable<EChartsOption['yAxis']>,\n unknown[]\n>;\n\nexport const mergeSeries = (\n series: NeedleSeries,\n theme: 'light' | 'dark' = 'light',\n userOption?: Omit<\n EChartsOption,\n 'series' | 'dataset' | 'legend' | 'xAxis' | 'yAxis'\n >,\n palette?: HexColor[],\n): EchartsSeries => {\n const colors = palette ?? defaultColors;\n\n return series.map(\n (\n option:\n | SeriesOption\n | ThresholdLineSeriesOption<'warning'>\n | ThresholdLineSeriesOption<'danger'>,\n index: number = 0,\n ): SeriesOption => {\n if (option === undefined) {\n return {};\n }\n\n const color = Array.isArray(option.color)\n ? option.color[index]\n : (option.color ?? colors[index % colors.length]);\n\n if (option.type === 'thresholdLine') {\n const { notificationType } = option;\n // Needed to differentiate between normal lines and threshold lines\n // as we are unable to inject custom properties into echarts series lines.\n const thresholdLineName = `thresholdLine-${notificationType}`;\n return {\n symbolSize: 9,\n symbol: 'none',\n condition: defaultThresholdLineSeriesOption.condition,\n ...option,\n lineStyle: {\n type: 'dashed',\n width: 2,\n ...option.lineStyle,\n },\n name: thresholdLineName,\n type: 'line',\n data: [\n [option.xAxis[0], option.yAxis],\n [option.xAxis[1], option.yAxis],\n ],\n };\n }\n\n if (option.type === 'line') {\n const shadow = tokens.theme[theme].boxShadow.raised;\n const shadowParts = shadow.split(/ (?=\\d+px|rgba?\\()/);\n\n return {\n type: 'line',\n symbolSize: 9,\n color,\n symbol: 'none',\n ...option,\n lineStyle: {\n type: 'solid' as const,\n width: 2,\n ...option.lineStyle,\n },\n emphasis: {\n disabled: true,\n focus: 'series',\n ...option.emphasis,\n itemStyle: {\n borderColor: tokens.theme[theme].color.neutral.bg.weak,\n shadowBlur: parseInt(shadowParts[2]),\n shadowColor: shadowParts[4],\n shadowOffsetX: parseInt(shadowParts[0]),\n shadowOffsetY: parseInt(shadowParts[1]),\n ...option.emphasis?.itemStyle,\n },\n label: { show: false },\n ...option.emphasis,\n },\n };\n }\n\n if (option.type === 'pie') {\n const valueFormatter = getTooltipValueFormatter(userOption);\n\n return {\n animationDuration: 600,\n animationType: 'scale',\n selectedMode: 'single',\n ...option,\n // Blur opacity is set to 1 to prevent other slices from\n // being opacitated when hovering a slice where the emphasis is enabled (used for scale effect)\n blur: {\n itemStyle: {\n opacity: 1,\n ...option.blur?.itemStyle,\n },\n label: {\n opacity: 1,\n ...option.blur?.label,\n },\n ...option.blur,\n },\n // Emphasis is enabled and used to apply the scale effect when hovering the pie chart slices.\n emphasis: {\n disabled: false,\n focus: 'self',\n scale: true,\n scaleSize: 5,\n ...option.emphasis,\n },\n itemStyle: {\n borderColor: tokens.theme[theme].color.neutral.bg.weak,\n borderWidth: 1,\n ...option.itemStyle,\n },\n label: {\n backgroundColor: 'transparent',\n color: tokens.theme[theme].color.neutral.text.weak,\n formatter: '{d}%',\n ...option.label,\n },\n labelLine: {\n length: 5,\n show: true,\n ...option.labelLine,\n },\n tooltip: {\n trigger: 'item',\n confine: true,\n // Reset the default tooltip css styling\n padding: 0,\n borderRadius: 0,\n borderWidth: 0,\n extraCssText: tooltipExtraCssText,\n formatter: function (params: unknown) {\n const paramsArray = Array.isArray(params) ? params : [params];\n const firstParam = paramsArray[0];\n return `${renderToString(\n <span className=\"ndl-charts-chart-tooltip\">\n <ChartTooltip.Content\n key={firstParam?.value[0] ?? firstParam.seriesName}\n leadingElement={\n firstParam?.value[0] ?? firstParam.seriesName\n }\n trailingElement={valueFormatter(\n Array.isArray(firstParam.value)\n ? firstParam.value[1]\n : firstParam.value,\n )}\n indentSquareColor={firstParam.color}\n />\n </span>,\n )}`;\n },\n ...option.tooltip,\n },\n };\n }\n\n if (option.type === 'scatter') {\n // `emptyCircle` always fills with white, so the interior is a real\n // circle painted with the theme's surface color. The ring is the border,\n // drawn on top of that fill. Hover replaces the interior with the\n // series color and leaves the ring in place. `focus` stays 'none':\n // any other value blurs the series, and blur wins over emphasis, so\n // the circle would never fill.\n const interiorColor = tokens.theme[theme].color.neutral.bg.weak;\n\n return {\n color,\n symbol: 'circle',\n symbolSize: 10,\n ...option,\n itemStyle: {\n borderColor: color,\n borderWidth: 2,\n color: interiorColor,\n ...option.itemStyle,\n },\n emphasis: {\n disabled: false,\n focus: 'none',\n ...option.emphasis,\n itemStyle: {\n borderColor: color,\n color,\n ...option.emphasis?.itemStyle,\n },\n },\n };\n }\n\n if (option.type === 'bar') {\n const valueFormatter = getTooltipValueFormatter(userOption);\n\n return {\n barMaxWidth: 16,\n ...option,\n blur: {\n itemStyle: {\n opacity: 0.3,\n ...option.blur?.itemStyle,\n },\n ...option.blur,\n },\n emphasis: {\n disabled: true,\n focus: 'series',\n ...option.emphasis,\n },\n itemStyle: {\n borderWidth: 20,\n color,\n ...option.itemStyle,\n },\n markLine: {\n emphasis: {\n disabled: true,\n lineStyle: {\n width: 20,\n ...option.markLine?.emphasis?.lineStyle,\n },\n ...option.markLine?.emphasis,\n },\n lineStyle: {\n width: 20,\n ...option.markLine?.lineStyle,\n },\n },\n tooltip: {\n trigger: 'axis',\n confine: true,\n // Reset the default tooltip css styling\n padding: 0,\n borderRadius: 0,\n borderWidth: 0,\n extraCssText: tooltipExtraCssText,\n formatter: function (params: unknown) {\n const paramsArray = Array.isArray(params) ? params : [params];\n const firstParam = paramsArray[0];\n return `${renderToString(\n <span className=\"ndl-charts-chart-tooltip\">\n <ChartTooltip.Title>{firstParam.name}</ChartTooltip.Title>\n <ChartTooltip.Content\n key={firstParam?.value[0] ?? firstParam.seriesName}\n leadingElement={firstParam.seriesName}\n trailingElement={valueFormatter(\n Array.isArray(firstParam.value)\n ? firstParam.value[1]\n : firstParam.value,\n )}\n indentSquareColor={firstParam.color}\n />\n </span>,\n )}`;\n },\n ...option.tooltip,\n },\n };\n }\n\n return option;\n },\n );\n};\n\nexport const mergeXAxis = (\n xAxis: EChartsOption['xAxis'],\n theme: 'light' | 'dark' = 'light',\n): EChartsOption['xAxis'] => {\n if (xAxis === undefined) {\n return [];\n }\n\n if (Array.isArray(xAxis)) {\n return xAxis.map((axis) =>\n mergeXAxis(axis, theme),\n ) as EChartsOption['xAxis'];\n }\n\n const baseXAxis = {\n ...xAxis,\n axisLabel: {\n formatter: {\n day: '{dd} {MMM}',\n hour: '{HH}:{mm}',\n millisecond: '{hh}:{mm}:{ss} {SSS}',\n minute: '{HH}:{mm}',\n month: '{MMM}',\n none: '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}',\n second: '{HH}:{mm}:{ss}',\n year: '{yearStyle|{yyyy}}\\n{monthStyle|{MMM}}',\n },\n margin: 16,\n overflow: 'truncate',\n ...xAxis?.axisLabel,\n },\n axisLine: {\n lineStyle: {\n ...xAxis?.axisLine?.lineStyle,\n },\n ...xAxis?.axisLine,\n },\n axisTick: {\n ...xAxis?.axisTick,\n lineStyle: {\n ...xAxis?.axisTick?.lineStyle,\n },\n show: true,\n ...xAxis?.axisTick,\n },\n splitLine: { show: false, ...xAxis?.splitLine },\n } as SingleXAxisOption;\n\n if (xAxis.type === 'time') {\n const timeXAxis = {\n ...baseXAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseXAxis.axisLabel,\n },\n } as SingleXAxisOption;\n\n return timeXAxis;\n }\n\n if (xAxis.type === 'value' || xAxis.type === 'log') {\n const xAxisFormatter =\n xAxis.axisLabel && 'formatter' in xAxis.axisLabel\n ? xAxis.axisLabel.formatter\n : undefined;\n const valueXAxis = {\n ...baseXAxis,\n axisLabel: {\n ...baseXAxis.axisLabel,\n formatter: xAxisFormatter ?? formatNumberEnUS,\n },\n } as SingleXAxisOption;\n\n return valueXAxis;\n }\n\n if (xAxis.type === 'category') {\n const categoryXAxis = {\n ...baseXAxis,\n axisLabel: {\n width: 80,\n ...baseXAxis?.axisLabel,\n },\n axisTick: {\n alignWithLabel: true,\n ...baseXAxis?.axisTick,\n },\n } as SingleXAxisOption;\n return categoryXAxis;\n }\n\n return baseXAxis;\n};\n\nexport const mergeYAxis = (\n yAxis: EChartsOption['yAxis'],\n theme: 'light' | 'dark' = 'light',\n): EChartsOption['yAxis'] => {\n if (yAxis === undefined) {\n return [];\n }\n\n if (Array.isArray(yAxis)) {\n return yAxis.map((axis) =>\n mergeYAxis(axis, theme),\n ) as EChartsOption['yAxis'];\n }\n\n const baseYAxis = {\n ...yAxis,\n axisLabel: {\n margin: 8,\n overflow: 'truncate',\n ...yAxis?.axisLabel,\n },\n axisLine: {\n ...yAxis?.axisLine,\n lineStyle: {\n ...yAxis?.axisLine?.lineStyle,\n },\n show: true,\n },\n axisTick: {\n show: false,\n ...yAxis?.axisTick,\n lineStyle: {\n width: 1,\n ...yAxis?.axisTick?.lineStyle,\n },\n },\n splitLine: { show: true, ...yAxis?.splitLine },\n } as SingleYAxisOption;\n\n if (yAxis.type === 'time') {\n const timeYAxis = {\n ...baseYAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseYAxis.axisLabel,\n },\n splitLine: { show: false, ...baseYAxis?.splitLine },\n } as SingleYAxisOption;\n\n return timeYAxis;\n }\n\n if (yAxis.type === 'value' || yAxis.type === 'log') {\n const yAxisFormatter =\n yAxis.axisLabel && 'formatter' in yAxis.axisLabel\n ? yAxis.axisLabel.formatter\n : undefined;\n const valueYAxis = {\n ...baseYAxis,\n axisLabel: {\n hideOverlap: true,\n ...baseYAxis.axisLabel,\n formatter: yAxisFormatter ?? formatNumberEnUS,\n },\n splitLine: { show: false, ...baseYAxis?.splitLine },\n } as SingleYAxisOption;\n\n return valueYAxis;\n }\n\n if (yAxis.type === 'category') {\n const categoryYAxis = {\n ...baseYAxis,\n axisLabel: {\n width: 100,\n ...baseYAxis?.axisLabel,\n },\n } as SingleYAxisOption;\n\n return categoryYAxis;\n }\n\n return baseYAxis;\n};\n\ntype SingleDataZoomOption = Exclude<\n NonNullable<EChartsOption['dataZoom']>,\n unknown[]\n>;\n\ntype MergeDataZoomAxes = {\n xAxis?: EChartsOption['xAxis'];\n yAxis?: EChartsOption['yAxis'];\n};\n\nexport type DataZoomTargetAxes = {\n xAxisIndices: number[];\n yAxisIndices: number[];\n};\n\nconst normalizeAxisIndices = (axisIndex: unknown): number[] => {\n if (typeof axisIndex === 'number') {\n return [axisIndex];\n }\n\n if (Array.isArray(axisIndex)) {\n return axisIndex.filter((index): index is number => {\n return typeof index === 'number';\n });\n }\n\n return [];\n};\n\n/**\n * Resolves the axes a single dataZoom entry targets, mirroring ECharts' own\n * resolution order: explicit `xAxisIndex`/`yAxisIndex` win (`false` meaning\n * \"not this axis\"); when no index is given, `orient: 'vertical'` targets the\n * first y-axis and horizontal/unset targets the first x-axis.\n */\nconst getSingleDataZoomTargets = (\n dataZoom: SingleDataZoomOption | undefined,\n): DataZoomTargetAxes => {\n if (dataZoom?.type !== 'slider' && dataZoom?.type !== 'inside') {\n return { xAxisIndices: [], yAxisIndices: [] };\n }\n\n const hasAxisIndex =\n dataZoom.xAxisIndex !== undefined || dataZoom.yAxisIndex !== undefined;\n\n if (hasAxisIndex) {\n return {\n xAxisIndices: normalizeAxisIndices(dataZoom.xAxisIndex),\n yAxisIndices: normalizeAxisIndices(dataZoom.yAxisIndex),\n };\n }\n\n return dataZoom.orient === 'vertical'\n ? { xAxisIndices: [], yAxisIndices: [0] }\n : { xAxisIndices: [0], yAxisIndices: [] };\n};\n\n/**\n * Union of the axis indices targeted by all slider/inside entries in a\n * dataZoom config, using the same per-entry resolution as ECharts (explicit\n * axis indices first, then orientation).\n */\nexport const getDataZoomTargetAxes = (\n dataZoom: EChartsOption['dataZoom'],\n): DataZoomTargetAxes => {\n const entries = Array.isArray(dataZoom) ? dataZoom : [dataZoom];\n const targets: DataZoomTargetAxes = { xAxisIndices: [], yAxisIndices: [] };\n\n for (const entry of entries) {\n const entryTargets = getSingleDataZoomTargets(entry);\n\n for (const index of entryTargets.xAxisIndices) {\n if (!targets.xAxisIndices.includes(index)) {\n targets.xAxisIndices.push(index);\n }\n }\n\n for (const index of entryTargets.yAxisIndices) {\n if (!targets.yAxisIndices.includes(index)) {\n targets.yAxisIndices.push(index);\n }\n }\n }\n\n return targets;\n};\n\n/**\n * A slider is vertical when the consumer sets `orient: 'vertical'`, or when it\n * only targets a y-axis, which makes ECharts infer the vertical orientation.\n */\nexport const isVerticalSlider = (\n dataZoom: SingleDataZoomOption | undefined,\n): boolean => {\n if (dataZoom?.type !== 'slider') {\n return false;\n }\n\n if (dataZoom.orient !== undefined) {\n return dataZoom.orient === 'vertical';\n }\n\n const targets = getSingleDataZoomTargets(dataZoom);\n\n return targets.yAxisIndices.length > 0 && targets.xAxisIndices.length === 0;\n};\n\n/**\n * Axis types where windowing (`filterMode: 'none'`) beats ECharts' default\n * data filtering. Filtering a continuous axis removes whole data items outside\n * the window, which makes bars and points vanish instead of clipping them.\n * Category axes keep the `'filter'` default so paging through categories still\n * rescales the opposite value axis to the visible data.\n */\nconst WINDOWED_FILTER_AXIS_TYPES = ['log', 'time', 'value'];\n\nconst getSingleAxisOption = (\n axis: EChartsOption['xAxis'] | EChartsOption['yAxis'],\n axisIndex: unknown,\n): { type?: string } | undefined => {\n if (!Array.isArray(axis)) {\n return axis as { type?: string } | undefined;\n }\n\n const index =\n typeof axisIndex === 'number'\n ? axisIndex\n : Array.isArray(axisIndex) && typeof axisIndex[0] === 'number'\n ? axisIndex[0]\n : 0;\n\n return axis[index] as { type?: string } | undefined;\n};\n\n/**\n * Resolves the slider's target axis the way ECharts does (explicit axis index\n * first, then orientation) and returns `'none'` when that axis is continuous.\n * Returns `undefined` (keep ECharts' `'filter'` default) for category axes and\n * for sliders that target both axes at once.\n */\nconst getSliderDefaultFilterMode = (\n dataZoom: SingleDataZoomOption,\n axes: MergeDataZoomAxes | undefined,\n): 'none' | undefined => {\n const targets = getSingleDataZoomTargets(dataZoom);\n const isXAxisTarget = targets.xAxisIndices.length > 0;\n const isYAxisTarget = targets.yAxisIndices.length > 0;\n\n if (isXAxisTarget === isYAxisTarget) {\n return undefined;\n }\n\n const targetAxis = isYAxisTarget\n ? getSingleAxisOption(axes?.yAxis, dataZoom.yAxisIndex)\n : getSingleAxisOption(axes?.xAxis, dataZoom.xAxisIndex);\n\n return targetAxis?.type !== undefined &&\n WINDOWED_FILTER_AXIS_TYPES.includes(targetAxis.type)\n ? 'none'\n : undefined;\n};\n\nexport const mergeDataZoom = (\n dataZoom: EChartsOption['dataZoom'],\n axes?: MergeDataZoomAxes,\n): EChartsOption['dataZoom'] => {\n if (Array.isArray(dataZoom)) {\n return dataZoom.map((option) =>\n mergeDataZoom(option, axes),\n ) as EChartsOption['dataZoom'];\n }\n\n const isSlider = dataZoom?.type === 'slider';\n const isInside = dataZoom?.type === 'inside';\n\n if (isSlider) {\n const filterMode = getSliderDefaultFilterMode(dataZoom, axes);\n const layoutDefaults = isVerticalSlider(dataZoom)\n ? { right: 10, width: 28 }\n : { bottom: 10, height: 28 };\n\n return {\n ...(filterMode !== undefined && { filterMode }),\n ...layoutDefaults,\n show: true,\n type: 'slider',\n ...dataZoom,\n };\n } else if (isInside) {\n // Only pin the default x-axis binding on entries that actually target the\n // x-axis; y-targeting entries (explicit `yAxisIndex` or\n // `orient: 'vertical'`) keep their own binding.\n const targets = getSingleDataZoomTargets(dataZoom);\n const hasDefaultXAxisTarget =\n dataZoom.xAxisIndex === undefined && targets.xAxisIndices.length > 0;\n\n return {\n filterMode: 'none',\n ...(hasDefaultXAxisTarget && { xAxisIndex: [0] }),\n zoomOnMouseWheel: false,\n ...dataZoom,\n };\n }\n\n return dataZoom;\n};\n\ntype MergeToolboxContext = MergeDataZoomAxes & {\n dataZoom?: EChartsOption['dataZoom'];\n};\n\nconst isContinuousAxisOption = (\n axisOption: { type?: string } | undefined,\n): boolean => {\n return (\n axisOption?.type !== undefined &&\n WINDOWED_FILTER_AXIS_TYPES.includes(axisOption.type)\n );\n};\n\nconst areTargetAxesContinuous = (\n axis: EChartsOption['xAxis'] | EChartsOption['yAxis'],\n axisIndices: number[] | 'all',\n): boolean => {\n if (axisIndices === 'all') {\n const axisOptions = Array.isArray(axis) ? axis : [axis];\n\n return (\n axisOptions.length > 0 &&\n axisOptions.every((axisOption) => {\n return isContinuousAxisOption(axisOption as { type?: string });\n })\n );\n }\n\n return axisIndices.every((axisIndex) => {\n return isContinuousAxisOption(getSingleAxisOption(axis, axisIndex));\n });\n};\n\n/**\n * Returns `'none'` when every axis targeted by the drag-to-zoom brush is\n * continuous (`value`/`time`/`log`), matching the slider rule: filtering a\n * continuous axis removes whole data items outside the selection instead of\n * clipping them. Category (or unknown) targets keep ECharts' `'filter'`\n * default.\n */\nconst getBrushDefaultFilterMode = (\n context: MergeToolboxContext | undefined,\n xAxisTargets: number[] | 'all' | false,\n yAxisTargets: number[] | 'all' | false,\n): 'none' | undefined => {\n const checks: boolean[] = [];\n\n if (xAxisTargets !== false) {\n checks.push(areTargetAxesContinuous(context?.xAxis, xAxisTargets));\n }\n\n if (yAxisTargets !== false) {\n checks.push(areTargetAxesContinuous(context?.yAxis, yAxisTargets));\n }\n\n return checks.length > 0 && checks.every(Boolean) ? 'none' : undefined;\n};\n\nexport const mergeToolbox = (\n toolbox: EChartsOption['toolbox'],\n context?: MergeToolboxContext,\n): EChartsOption['toolbox'] => {\n if (Array.isArray(toolbox)) {\n return toolbox.map((option) =>\n mergeToolbox(option, context),\n ) as EChartsOption['toolbox'];\n }\n\n // The drag-to-zoom brush follows the axes the dataZoom config targets, so\n // zoom direction is configured in one place. Without any dataZoom config it\n // keeps the historical default: all x-axes on, y off.\n const targets = getDataZoomTargetAxes(context?.dataZoom);\n const hasTargets =\n targets.xAxisIndices.length > 0 || targets.yAxisIndices.length > 0;\n const xAxisTargets: number[] | 'all' | false = hasTargets\n ? targets.xAxisIndices.length > 0 && targets.xAxisIndices\n : 'all';\n const yAxisTargets: number[] | false =\n targets.yAxisIndices.length > 0 && targets.yAxisIndices;\n const filterMode = getBrushDefaultFilterMode(\n context,\n xAxisTargets,\n yAxisTargets,\n );\n\n return {\n feature: {\n dataZoom: {\n ...(filterMode !== undefined && { filterMode }),\n ...(xAxisTargets !== 'all' && { xAxisIndex: xAxisTargets }),\n yAxisIndex: yAxisTargets,\n ...toolbox?.feature?.dataZoom,\n icon: {\n // This hack removes the icons.\n // Due to: https://github.com/apache/echarts/issues/10274\n back: '-',\n zoom: '-',\n },\n show: true,\n },\n },\n };\n};\n"]}
|
|
@@ -35,9 +35,13 @@ import classNames from 'classnames';
|
|
|
35
35
|
export const ChartTooltipComponent = function ChartTooltipComponent({ children, isOpen, style, anchorPosition, ref, }) {
|
|
36
36
|
return (_jsx(Popover, { isOpen: isOpen, anchorPosition: anchorPosition, placement: "middle-end-middle-start", children: _jsx(Popover.Content, { ref: ref, style: style, children: children }) }));
|
|
37
37
|
};
|
|
38
|
-
const ChartTooltipTitle = function ChartTooltipTitle({ children, ref, }) {
|
|
38
|
+
const ChartTooltipTitle = function ChartTooltipTitle({ children, indentSquareColor, ref, }) {
|
|
39
39
|
const classes = classNames(`ndl-charts-chart-tooltip-title`);
|
|
40
|
-
|
|
40
|
+
const title = (_jsx(Typography, { ref: ref, variant: "body-small", className: classes, children: children }));
|
|
41
|
+
if (indentSquareColor === undefined) {
|
|
42
|
+
return title;
|
|
43
|
+
}
|
|
44
|
+
return (_jsxs("div", { className: "ndl-charts-chart-tooltip-title-line", children: [_jsx("div", { className: "ndl-charts-chart-tooltip-title-indent-square", style: { backgroundColor: indentSquareColor } }), title] }));
|
|
41
45
|
};
|
|
42
46
|
const ChartTooltipContent = function ChartTooltipContent({ leadingElement, trailingElement, indentSquareColor, notifications, ref, }) {
|
|
43
47
|
const classes = classNames(`ndl-charts-chart-tooltip-content`);
|