@perses-dev/timeseries-chart-plugin 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mf/js/TimeSeriesChart.2e93229a.js +5 -0
- package/__mf/js/async/109.f05e61af.js +73 -0
- package/__mf/js/async/{964.719c530c.js → 110.8b9c7f4b.js} +2 -2
- package/__mf/js/async/186.b17dcce5.js +1 -0
- package/__mf/js/async/{547.bb4f1e58.js → 547.a80ef962.js} +2 -2
- package/__mf/js/async/964.e89cbd3b.js +110 -0
- package/__mf/js/async/{580.5f4b0dbd.js → 971.6fcf317e.js} +3 -3
- package/__mf/js/async/__federation_expose_TimeSeriesChart.f017c9e5.js +3 -0
- package/__mf/js/main.25080a30.js +5 -0
- package/lib/GeneralSettingsEditor.d.ts +4 -0
- package/lib/GeneralSettingsEditor.d.ts.map +1 -0
- package/lib/{TimeSeriesChartOptionsEditorSettings.js → GeneralSettingsEditor.js} +3 -14
- package/lib/GeneralSettingsEditor.js.map +1 -0
- package/lib/QuerySettingsEditor.d.ts +3 -17
- package/lib/QuerySettingsEditor.d.ts.map +1 -1
- package/lib/QuerySettingsEditor.js +370 -88
- package/lib/QuerySettingsEditor.js.map +1 -1
- package/lib/TimeSeriesChart.d.ts.map +1 -1
- package/lib/TimeSeriesChart.js +8 -3
- package/lib/TimeSeriesChart.js.map +1 -1
- package/lib/TimeSeriesChartPanel.js +1 -1
- package/lib/TimeSeriesChartPanel.js.map +1 -1
- package/lib/VisualOptionsEditor.d.ts.map +1 -1
- package/lib/VisualOptionsEditor.js +84 -64
- package/lib/VisualOptionsEditor.js.map +1 -1
- package/lib/cjs/{TimeSeriesChartOptionsEditorSettings.js → GeneralSettingsEditor.js} +4 -15
- package/lib/cjs/QuerySettingsEditor.js +410 -95
- package/lib/cjs/TimeSeriesChart.js +8 -3
- package/lib/cjs/TimeSeriesChartPanel.js +1 -1
- package/lib/cjs/VisualOptionsEditor.js +82 -62
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/time-series-chart-model.js +37 -0
- package/lib/cjs/utils/data-transform.js +7 -54
- package/lib/cjs/utils/palette-gen.js +2 -2
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/time-series-chart-model.d.ts +32 -2
- package/lib/time-series-chart-model.d.ts.map +1 -1
- package/lib/time-series-chart-model.js +25 -0
- package/lib/time-series-chart-model.js.map +1 -1
- package/lib/utils/data-transform.d.ts +6 -7
- package/lib/utils/data-transform.d.ts.map +1 -1
- package/lib/utils/data-transform.js +8 -54
- package/lib/utils/data-transform.js.map +1 -1
- package/lib/utils/palette-gen.js +2 -2
- package/lib/utils/palette-gen.js.map +1 -1
- package/mf-manifest.json +14 -14
- package/mf-stats.json +14 -14
- package/package.json +5 -5
- package/__mf/js/TimeSeriesChart.d3742b3b.js +0 -5
- package/__mf/js/async/109.bf4f02fe.js +0 -73
- package/__mf/js/async/133.c48c8cc8.js +0 -110
- package/__mf/js/async/686.0cd9a75c.js +0 -1
- package/__mf/js/async/__federation_expose_TimeSeriesChart.f20a0aca.js +0 -3
- package/__mf/js/main.2c598209.js +0 -5
- package/lib/TimeSeriesChartOptionsEditorSettings.d.ts +0 -4
- package/lib/TimeSeriesChartOptionsEditorSettings.d.ts.map +0 -1
- package/lib/TimeSeriesChartOptionsEditorSettings.js.map +0 -1
- /package/__mf/js/async/{109.bf4f02fe.js.LICENSE.txt → 109.f05e61af.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{964.719c530c.js.LICENSE.txt → 110.8b9c7f4b.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{547.bb4f1e58.js.LICENSE.txt → 547.a80ef962.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{133.c48c8cc8.js.LICENSE.txt → 964.e89cbd3b.js.LICENSE.txt} +0 -0
|
@@ -10,18 +10,26 @@
|
|
|
10
10
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
-
import { IconButton, MenuItem, Stack, TextField, Typography } from '@mui/material';
|
|
15
|
-
import {
|
|
16
|
-
import { useEffect, useMemo, useRef } from 'react';
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
14
|
+
import { Box, Button, IconButton, Menu, MenuItem, Slider, Stack, TextField, ToggleButton, ToggleButtonGroup, Typography, useTheme } from '@mui/material';
|
|
15
|
+
import { OptionsColorPicker } from '@perses-dev/components';
|
|
16
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
17
17
|
import DeleteIcon from 'mdi-material-ui/DeleteOutline';
|
|
18
|
-
import
|
|
18
|
+
import AddIcon from 'mdi-material-ui/Plus';
|
|
19
|
+
import CloseIcon from 'mdi-material-ui/Close';
|
|
19
20
|
import { produce } from 'immer';
|
|
20
21
|
import { useQueryCountContext } from '@perses-dev/plugin-system';
|
|
21
|
-
|
|
22
|
+
import { DEFAULT_AREA_OPACITY, OPACITY_CONFIG, LINE_STYLE_CONFIG } from './time-series-chart-model';
|
|
22
23
|
const DEFAULT_COLOR_VALUE = '#555';
|
|
23
24
|
const NO_INDEX_AVAILABLE = -1; // invalid array index value used to represent the fact that no query index is available
|
|
24
|
-
export function QuerySettingsEditor(
|
|
25
|
+
export function QuerySettingsEditor(props) {
|
|
26
|
+
const { onChange, value } = props;
|
|
27
|
+
const querySettingsList = value.querySettings;
|
|
28
|
+
const handleQuerySettingsChange = (newQuerySettings)=>{
|
|
29
|
+
onChange(produce(value, (draft)=>{
|
|
30
|
+
draft.querySettings = newQuerySettings;
|
|
31
|
+
}));
|
|
32
|
+
};
|
|
25
33
|
// Every time a new query settings input is added, we want to focus the recently added input
|
|
26
34
|
const recentlyAddedInputRef = useRef(null);
|
|
27
35
|
const focusRef = useRef(false);
|
|
@@ -34,7 +42,7 @@ export function QuerySettingsEditor({ querySettingsList, onChange }) {
|
|
|
34
42
|
]);
|
|
35
43
|
const handleQueryIndexChange = (e, i)=>{
|
|
36
44
|
if (querySettingsList !== undefined) {
|
|
37
|
-
|
|
45
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
38
46
|
const querySettings = draft?.[i];
|
|
39
47
|
if (querySettings) {
|
|
40
48
|
querySettings.queryIndex = parseInt(e.target.value);
|
|
@@ -44,11 +52,17 @@ export function QuerySettingsEditor({ querySettingsList, onChange }) {
|
|
|
44
52
|
};
|
|
45
53
|
const handleColorModeChange = (e, i)=>{
|
|
46
54
|
if (querySettingsList !== undefined) {
|
|
47
|
-
|
|
55
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
48
56
|
if (draft !== undefined) {
|
|
49
57
|
const querySettings = draft[i];
|
|
50
58
|
if (querySettings) {
|
|
51
|
-
|
|
59
|
+
const newColorMode = e.target.value;
|
|
60
|
+
if (!newColorMode) {
|
|
61
|
+
querySettings.colorMode = undefined;
|
|
62
|
+
querySettings.colorValue = undefined;
|
|
63
|
+
} else {
|
|
64
|
+
querySettings.colorMode = newColorMode;
|
|
65
|
+
}
|
|
52
66
|
}
|
|
53
67
|
}
|
|
54
68
|
}));
|
|
@@ -56,7 +70,7 @@ export function QuerySettingsEditor({ querySettingsList, onChange }) {
|
|
|
56
70
|
};
|
|
57
71
|
const handleColorValueChange = (colorValue, i)=>{
|
|
58
72
|
if (querySettingsList !== undefined) {
|
|
59
|
-
|
|
73
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
60
74
|
if (draft !== undefined) {
|
|
61
75
|
const querySettings = draft[i];
|
|
62
76
|
if (querySettings) {
|
|
@@ -66,14 +80,82 @@ export function QuerySettingsEditor({ querySettingsList, onChange }) {
|
|
|
66
80
|
}));
|
|
67
81
|
}
|
|
68
82
|
};
|
|
83
|
+
const handleLineStyleChange = (lineStyle, i)=>{
|
|
84
|
+
if (querySettingsList !== undefined) {
|
|
85
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
86
|
+
if (draft !== undefined) {
|
|
87
|
+
const querySettings = draft[i];
|
|
88
|
+
if (querySettings) {
|
|
89
|
+
querySettings.lineStyle = lineStyle;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const handleAreaOpacityChange = (_, sliderValue, i)=>{
|
|
96
|
+
const newValue = Array.isArray(sliderValue) ? sliderValue[0] : sliderValue;
|
|
97
|
+
if (querySettingsList !== undefined) {
|
|
98
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
99
|
+
if (draft !== undefined) {
|
|
100
|
+
const querySettings = draft[i];
|
|
101
|
+
if (querySettings) {
|
|
102
|
+
querySettings.areaOpacity = newValue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
// Helper function to update query settings at a specific index
|
|
109
|
+
const updateQuerySettings = (i, updater)=>{
|
|
110
|
+
if (querySettingsList !== undefined) {
|
|
111
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
112
|
+
const qs = draft[i];
|
|
113
|
+
if (qs) {
|
|
114
|
+
updater(qs);
|
|
115
|
+
}
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
};
|
|
69
119
|
const deleteQuerySettingsInput = (i)=>{
|
|
70
120
|
if (querySettingsList !== undefined) {
|
|
71
121
|
const updatedQuerySettingsList = produce(querySettingsList, (draft)=>{
|
|
72
122
|
draft.splice(i, 1);
|
|
73
123
|
});
|
|
74
|
-
|
|
124
|
+
handleQuerySettingsChange(updatedQuerySettingsList);
|
|
75
125
|
}
|
|
76
126
|
};
|
|
127
|
+
const addColor = (i)=>{
|
|
128
|
+
updateQuerySettings(i, (qs)=>{
|
|
129
|
+
qs.colorMode = 'fixed-single';
|
|
130
|
+
qs.colorValue = DEFAULT_COLOR_VALUE;
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
const removeColor = (i)=>{
|
|
134
|
+
updateQuerySettings(i, (qs)=>{
|
|
135
|
+
qs.colorMode = undefined;
|
|
136
|
+
qs.colorValue = undefined;
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
const addLineStyle = (i)=>{
|
|
140
|
+
updateQuerySettings(i, (qs)=>{
|
|
141
|
+
qs.lineStyle = 'solid';
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
const removeLineStyle = (i)=>{
|
|
145
|
+
updateQuerySettings(i, (qs)=>{
|
|
146
|
+
qs.lineStyle = undefined;
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
const addAreaOpacity = (i)=>{
|
|
150
|
+
updateQuerySettings(i, (qs)=>{
|
|
151
|
+
qs.areaOpacity = DEFAULT_AREA_OPACITY;
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const removeAreaOpacity = (i)=>{
|
|
155
|
+
updateQuerySettings(i, (qs)=>{
|
|
156
|
+
qs.areaOpacity = undefined;
|
|
157
|
+
});
|
|
158
|
+
};
|
|
77
159
|
const queryCount = useQueryCountContext();
|
|
78
160
|
// Compute the list of query indexes for which query settings are not already defined.
|
|
79
161
|
// This is to avoid already-booked indexes to still be selectable in the dropdown(s)
|
|
@@ -93,106 +175,306 @@ export function QuerySettingsEditor({ querySettingsList, onChange }) {
|
|
|
93
175
|
availableQueryIndexes
|
|
94
176
|
]);
|
|
95
177
|
const defaultQuerySettings = {
|
|
96
|
-
queryIndex: firstAvailableQueryIndex
|
|
97
|
-
colorMode: DEFAULT_COLOR_MODE,
|
|
98
|
-
colorValue: DEFAULT_COLOR_VALUE
|
|
178
|
+
queryIndex: firstAvailableQueryIndex
|
|
99
179
|
};
|
|
100
180
|
const addQuerySettingsInput = ()=>{
|
|
101
181
|
focusRef.current = true;
|
|
102
182
|
if (querySettingsList === undefined) {
|
|
103
|
-
|
|
183
|
+
handleQuerySettingsChange([
|
|
104
184
|
defaultQuerySettings
|
|
105
185
|
]);
|
|
106
186
|
} else {
|
|
107
|
-
|
|
187
|
+
handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
|
|
108
188
|
draft.push(defaultQuerySettings);
|
|
109
189
|
}));
|
|
110
190
|
}
|
|
111
191
|
};
|
|
112
|
-
return /*#__PURE__*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
192
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
193
|
+
children: [
|
|
194
|
+
queryCount === 0 ? /*#__PURE__*/ _jsx(Typography, {
|
|
195
|
+
mb: 2,
|
|
196
|
+
fontStyle: "italic",
|
|
197
|
+
children: "No query defined"
|
|
198
|
+
}) : querySettingsList?.length && querySettingsList.map((querySettings, i)=>/*#__PURE__*/ _jsx(QuerySettingsInput, {
|
|
199
|
+
inputRef: i === querySettingsList.length - 1 ? recentlyAddedInputRef : undefined,
|
|
200
|
+
querySettings: querySettings,
|
|
201
|
+
availableQueryIndexes: availableQueryIndexes,
|
|
202
|
+
onQueryIndexChange: (e)=>{
|
|
203
|
+
handleQueryIndexChange(e, i);
|
|
204
|
+
},
|
|
205
|
+
onColorModeChange: (e)=>handleColorModeChange(e, i),
|
|
206
|
+
onColorValueChange: (color)=>handleColorValueChange(color, i),
|
|
207
|
+
onLineStyleChange: (lineStyle)=>handleLineStyleChange(lineStyle, i),
|
|
208
|
+
onAreaOpacityChange: (event, value)=>handleAreaOpacityChange(event, value, i),
|
|
209
|
+
onDelete: ()=>{
|
|
210
|
+
deleteQuerySettingsInput(i);
|
|
211
|
+
},
|
|
212
|
+
onAddColor: ()=>addColor(i),
|
|
213
|
+
onRemoveColor: ()=>removeColor(i),
|
|
214
|
+
onAddLineStyle: ()=>addLineStyle(i),
|
|
215
|
+
onRemoveLineStyle: ()=>removeLineStyle(i),
|
|
216
|
+
onAddAreaOpacity: ()=>addAreaOpacity(i),
|
|
217
|
+
onRemoveAreaOpacity: ()=>removeAreaOpacity(i)
|
|
218
|
+
}, i)),
|
|
219
|
+
queryCount > 0 && firstAvailableQueryIndex !== NO_INDEX_AVAILABLE && /*#__PURE__*/ _jsx(Button, {
|
|
220
|
+
variant: "contained",
|
|
221
|
+
startIcon: /*#__PURE__*/ _jsx(AddIcon, {}),
|
|
222
|
+
sx: {
|
|
223
|
+
marginTop: 1
|
|
224
|
+
},
|
|
119
225
|
onClick: addQuerySettingsInput,
|
|
120
|
-
children:
|
|
226
|
+
children: "Add Query Settings"
|
|
121
227
|
})
|
|
122
|
-
|
|
123
|
-
children: querySettingsList && querySettingsList.length > 0 ? querySettingsList.map((querySettings, i)=>/*#__PURE__*/ _jsx(QuerySettingsInput, {
|
|
124
|
-
inputRef: i === querySettingsList.length - 1 ? recentlyAddedInputRef : undefined,
|
|
125
|
-
querySettings: querySettings,
|
|
126
|
-
availableQueryIndexes: availableQueryIndexes,
|
|
127
|
-
onQueryIndexChange: (e)=>{
|
|
128
|
-
handleQueryIndexChange(e, i);
|
|
129
|
-
},
|
|
130
|
-
onColorModeChange: (e)=>handleColorModeChange(e, i),
|
|
131
|
-
onColorValueChange: (color)=>handleColorValueChange(color, i),
|
|
132
|
-
onDelete: ()=>{
|
|
133
|
-
deleteQuerySettingsInput(i);
|
|
134
|
-
}
|
|
135
|
-
}, i)) : /*#__PURE__*/ _jsx(Typography, {
|
|
136
|
-
mb: 2,
|
|
137
|
-
fontStyle: "italic",
|
|
138
|
-
children: "No query settings defined"
|
|
139
|
-
})
|
|
228
|
+
]
|
|
140
229
|
});
|
|
141
230
|
}
|
|
142
|
-
|
|
231
|
+
function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity }, availableQueryIndexes, onQueryIndexChange, onColorModeChange, onColorValueChange, onLineStyleChange, onAreaOpacityChange, onDelete, inputRef, onAddColor: onAddColor, onRemoveColor: onRemoveColor, onAddLineStyle, onRemoveLineStyle, onAddAreaOpacity, onRemoveAreaOpacity }) {
|
|
143
232
|
// current query index should also be selectable
|
|
144
233
|
const selectableQueryIndexes = availableQueryIndexes.concat(queryIndex).sort((a, b)=>a - b);
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
234
|
+
// State for dropdown menu
|
|
235
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
236
|
+
// Calculate available options
|
|
237
|
+
const availableOptions = useMemo(()=>{
|
|
238
|
+
const options = [];
|
|
239
|
+
if (!colorMode) options.push({
|
|
240
|
+
key: 'color',
|
|
241
|
+
label: 'Color',
|
|
242
|
+
action: onAddColor
|
|
243
|
+
});
|
|
244
|
+
if (!lineStyle) options.push({
|
|
245
|
+
key: 'lineStyle',
|
|
246
|
+
label: 'Line Style',
|
|
247
|
+
action: onAddLineStyle
|
|
248
|
+
});
|
|
249
|
+
if (areaOpacity === undefined) options.push({
|
|
250
|
+
key: 'opacity',
|
|
251
|
+
label: 'Opacity',
|
|
252
|
+
action: onAddAreaOpacity
|
|
253
|
+
});
|
|
254
|
+
return options;
|
|
255
|
+
}, [
|
|
256
|
+
colorMode,
|
|
257
|
+
lineStyle,
|
|
258
|
+
areaOpacity,
|
|
259
|
+
onAddColor,
|
|
260
|
+
onAddLineStyle,
|
|
261
|
+
onAddAreaOpacity
|
|
262
|
+
]);
|
|
263
|
+
const handleAddMenuClick = (event)=>{
|
|
264
|
+
if (availableOptions.length === 1 && availableOptions[0]) {
|
|
265
|
+
// If only one option left, add it directly
|
|
266
|
+
availableOptions[0].action();
|
|
267
|
+
} else {
|
|
268
|
+
// Show dropdown
|
|
269
|
+
setAnchorEl(event.currentTarget);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
const handleMenuClose = ()=>{
|
|
273
|
+
setAnchorEl(null);
|
|
274
|
+
};
|
|
275
|
+
const handleMenuItemClick = (action)=>{
|
|
276
|
+
action();
|
|
277
|
+
handleMenuClose();
|
|
278
|
+
};
|
|
279
|
+
return /*#__PURE__*/ _jsx(Stack, {
|
|
280
|
+
spacing: 2,
|
|
281
|
+
sx: {
|
|
282
|
+
borderBottom: '1px solid',
|
|
283
|
+
borderColor: 'divider',
|
|
284
|
+
borderRadius: 1,
|
|
285
|
+
p: 2
|
|
286
|
+
},
|
|
287
|
+
children: /*#__PURE__*/ _jsxs(Stack, {
|
|
288
|
+
direction: "row",
|
|
289
|
+
alignItems: "center",
|
|
290
|
+
spacing: 1,
|
|
291
|
+
sx: {
|
|
292
|
+
flexWrap: 'wrap',
|
|
293
|
+
gap: 1
|
|
294
|
+
},
|
|
295
|
+
children: [
|
|
296
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
297
|
+
select: true,
|
|
298
|
+
inputRef: inputRef,
|
|
299
|
+
value: queryIndex,
|
|
300
|
+
label: "Query",
|
|
301
|
+
onChange: onQueryIndexChange,
|
|
302
|
+
sx: {
|
|
303
|
+
minWidth: '75px'
|
|
304
|
+
},
|
|
305
|
+
children: selectableQueryIndexes.map((qi)=>/*#__PURE__*/ _jsxs(MenuItem, {
|
|
306
|
+
value: qi,
|
|
307
|
+
children: [
|
|
308
|
+
"#",
|
|
309
|
+
qi + 1
|
|
310
|
+
]
|
|
311
|
+
}, `query-${qi}`))
|
|
312
|
+
}),
|
|
313
|
+
colorMode && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
314
|
+
label: "Color",
|
|
315
|
+
onRemove: onRemoveColor,
|
|
316
|
+
children: [
|
|
317
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
318
|
+
select: true,
|
|
319
|
+
value: colorMode,
|
|
320
|
+
onChange: onColorModeChange,
|
|
321
|
+
size: "small",
|
|
322
|
+
sx: {
|
|
323
|
+
flexGrow: 1
|
|
324
|
+
},
|
|
325
|
+
children: [
|
|
326
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
327
|
+
value: "fixed-single",
|
|
328
|
+
children: "Fixed (single)"
|
|
329
|
+
}),
|
|
330
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
331
|
+
value: "fixed",
|
|
332
|
+
children: "Fixed"
|
|
333
|
+
})
|
|
334
|
+
]
|
|
335
|
+
}),
|
|
336
|
+
/*#__PURE__*/ _jsx(OptionsColorPicker, {
|
|
337
|
+
label: `Query n°${queryIndex + 1}`,
|
|
338
|
+
color: colorValue || DEFAULT_COLOR_VALUE,
|
|
339
|
+
onColorChange: onColorValueChange
|
|
340
|
+
})
|
|
341
|
+
]
|
|
342
|
+
}),
|
|
343
|
+
lineStyle && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
344
|
+
label: "Line Style",
|
|
345
|
+
onRemove: onRemoveLineStyle,
|
|
346
|
+
children: [
|
|
347
|
+
/*#__PURE__*/ _jsx(ToggleButtonGroup, {
|
|
348
|
+
color: "primary",
|
|
349
|
+
exclusive: true,
|
|
350
|
+
value: lineStyle,
|
|
351
|
+
onChange: (__, newValue)=>{
|
|
352
|
+
if (newValue !== null) {
|
|
353
|
+
onLineStyleChange(newValue);
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
size: "small",
|
|
357
|
+
children: Object.entries(LINE_STYLE_CONFIG).map(([styleValue, config])=>/*#__PURE__*/ _jsx(ToggleButton, {
|
|
358
|
+
value: styleValue,
|
|
359
|
+
"aria-label": `${styleValue} line style`,
|
|
360
|
+
children: config.label
|
|
361
|
+
}, styleValue))
|
|
362
|
+
}),
|
|
363
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
364
|
+
sx: {
|
|
365
|
+
flexGrow: 1
|
|
366
|
+
}
|
|
367
|
+
})
|
|
368
|
+
]
|
|
369
|
+
}),
|
|
370
|
+
areaOpacity !== undefined && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
371
|
+
label: "Opacity",
|
|
372
|
+
onRemove: onRemoveAreaOpacity,
|
|
373
|
+
children: [
|
|
374
|
+
/*#__PURE__*/ _jsx(Box, {}),
|
|
375
|
+
/*#__PURE__*/ _jsx(Slider, {
|
|
376
|
+
value: areaOpacity,
|
|
377
|
+
valueLabelDisplay: "auto",
|
|
378
|
+
step: OPACITY_CONFIG.step,
|
|
379
|
+
marks: true,
|
|
380
|
+
min: OPACITY_CONFIG.min,
|
|
381
|
+
max: OPACITY_CONFIG.max,
|
|
382
|
+
onChange: onAreaOpacityChange,
|
|
383
|
+
sx: {
|
|
384
|
+
flexGrow: 1
|
|
385
|
+
}
|
|
386
|
+
})
|
|
387
|
+
]
|
|
388
|
+
}),
|
|
389
|
+
availableOptions.length > 0 && /*#__PURE__*/ _jsxs(_Fragment, {
|
|
390
|
+
children: [
|
|
391
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
392
|
+
onClick: handleAddMenuClick,
|
|
393
|
+
"aria-label": "Add option",
|
|
394
|
+
children: /*#__PURE__*/ _jsx(AddIcon, {})
|
|
395
|
+
}),
|
|
396
|
+
/*#__PURE__*/ _jsx(Menu, {
|
|
397
|
+
anchorEl: anchorEl,
|
|
398
|
+
open: Boolean(anchorEl),
|
|
399
|
+
onClose: handleMenuClose,
|
|
400
|
+
anchorOrigin: {
|
|
401
|
+
vertical: 'bottom',
|
|
402
|
+
horizontal: 'left'
|
|
403
|
+
},
|
|
404
|
+
children: availableOptions.map((option)=>/*#__PURE__*/ _jsxs(MenuItem, {
|
|
405
|
+
onClick: ()=>handleMenuItemClick(option.action),
|
|
406
|
+
sx: {
|
|
407
|
+
minWidth: '120px'
|
|
408
|
+
},
|
|
409
|
+
children: [
|
|
410
|
+
/*#__PURE__*/ _jsx(AddIcon, {
|
|
411
|
+
sx: {
|
|
412
|
+
mr: 1,
|
|
413
|
+
fontSize: '1rem'
|
|
414
|
+
}
|
|
415
|
+
}),
|
|
416
|
+
option.label
|
|
417
|
+
]
|
|
418
|
+
}, option.key))
|
|
419
|
+
})
|
|
420
|
+
]
|
|
421
|
+
}),
|
|
422
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
423
|
+
sx: {
|
|
424
|
+
flexGrow: 1
|
|
425
|
+
}
|
|
426
|
+
}),
|
|
427
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
428
|
+
"aria-label": `delete settings for query n°${queryIndex + 1}`,
|
|
429
|
+
onClick: onDelete,
|
|
430
|
+
children: /*#__PURE__*/ _jsx(DeleteIcon, {})
|
|
431
|
+
})
|
|
432
|
+
]
|
|
433
|
+
})
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
// Reusable section component
|
|
437
|
+
function SettingsSection(props) {
|
|
438
|
+
const { label, children, onRemove } = props;
|
|
439
|
+
const theme = useTheme();
|
|
440
|
+
return /*#__PURE__*/ _jsxs(Box, {
|
|
441
|
+
sx: {
|
|
442
|
+
position: 'relative',
|
|
443
|
+
minWidth: '250px'
|
|
444
|
+
},
|
|
151
445
|
children: [
|
|
152
|
-
/*#__PURE__*/ _jsx(
|
|
153
|
-
|
|
154
|
-
inputRef: inputRef,
|
|
155
|
-
value: queryIndex,
|
|
156
|
-
label: "Query",
|
|
157
|
-
onChange: onQueryIndexChange,
|
|
446
|
+
/*#__PURE__*/ _jsx(Typography, {
|
|
447
|
+
variant: "caption",
|
|
158
448
|
sx: {
|
|
159
|
-
|
|
449
|
+
position: 'absolute',
|
|
450
|
+
top: -8,
|
|
451
|
+
left: 12,
|
|
452
|
+
backgroundColor: theme.palette.background.code,
|
|
453
|
+
px: 0.5,
|
|
454
|
+
color: 'text.secondary',
|
|
455
|
+
zIndex: 1
|
|
160
456
|
},
|
|
161
|
-
children:
|
|
162
|
-
value: queryIndex,
|
|
163
|
-
children: [
|
|
164
|
-
"#",
|
|
165
|
-
queryIndex + 1
|
|
166
|
-
]
|
|
167
|
-
}, `query-${queryIndex}`))
|
|
457
|
+
children: label
|
|
168
458
|
}),
|
|
169
|
-
/*#__PURE__*/ _jsxs(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
459
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
460
|
+
direction: "row",
|
|
461
|
+
alignItems: "center",
|
|
462
|
+
spacing: 1,
|
|
463
|
+
sx: {
|
|
464
|
+
border: '1px solid',
|
|
465
|
+
borderColor: 'divider',
|
|
466
|
+
borderRadius: 1,
|
|
467
|
+
p: 1
|
|
468
|
+
},
|
|
175
469
|
children: [
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
children: "Fixed"
|
|
470
|
+
children,
|
|
471
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
472
|
+
size: "small",
|
|
473
|
+
onClick: onRemove,
|
|
474
|
+
"aria-label": `Remove ${label}`,
|
|
475
|
+
children: /*#__PURE__*/ _jsx(CloseIcon, {})
|
|
183
476
|
})
|
|
184
477
|
]
|
|
185
|
-
}),
|
|
186
|
-
/*#__PURE__*/ _jsx(OptionsColorPicker, {
|
|
187
|
-
label: 'Query n°' + queryIndex,
|
|
188
|
-
color: colorValue,
|
|
189
|
-
onColorChange: onColorValueChange
|
|
190
|
-
}),
|
|
191
|
-
/*#__PURE__*/ _jsx(IconButton, {
|
|
192
|
-
"aria-label": `delete settings for query n°${queryIndex + 1}`,
|
|
193
|
-
size: "small",
|
|
194
|
-
onClick: onDelete,
|
|
195
|
-
children: /*#__PURE__*/ _jsx(DeleteIcon, {})
|
|
196
478
|
})
|
|
197
479
|
]
|
|
198
480
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/QuerySettingsEditor.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { IconButton, MenuItem, Stack, TextField, Typography } from '@mui/material';\nimport { InfoTooltip, OptionsEditorGroup, OptionsColorPicker } from '@perses-dev/components';\nimport { ReactElement, RefObject, useEffect, useMemo, useRef } from 'react';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport PlusIcon from 'mdi-material-ui/Plus';\nimport { produce } from 'immer';\nimport { useQueryCountContext } from '@perses-dev/plugin-system';\nimport { QuerySettingsOptions } from './time-series-chart-model';\n\nconst DEFAULT_COLOR_MODE = 'fixed';\nconst DEFAULT_COLOR_VALUE = '#555';\nconst NO_INDEX_AVAILABLE = -1; // invalid array index value used to represent the fact that no query index is available\n\nexport interface QuerySettingsEditorProps {\n querySettingsList?: QuerySettingsOptions[];\n onChange: (querySettingsList: QuerySettingsOptions[]) => void;\n}\n\nexport function QuerySettingsEditor({ querySettingsList, onChange }: QuerySettingsEditorProps): ReactElement {\n // Every time a new query settings input is added, we want to focus the recently added input\n const recentlyAddedInputRef = useRef<HTMLInputElement | null>(null);\n const focusRef = useRef(false);\n useEffect(() => {\n if (!recentlyAddedInputRef.current || !focusRef.current) return;\n recentlyAddedInputRef.current?.focus();\n focusRef.current = false;\n }, [querySettingsList?.length]);\n\n const handleQueryIndexChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n if (querySettingsList !== undefined) {\n onChange(\n produce(querySettingsList, (draft) => {\n const querySettings = draft?.[i];\n if (querySettings) {\n querySettings.queryIndex = parseInt(e.target.value);\n }\n })\n );\n }\n };\n\n const handleColorModeChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n if (querySettingsList !== undefined) {\n onChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n querySettings.colorMode = e.target.value as QuerySettingsOptions['colorMode'];\n }\n }\n })\n );\n }\n };\n\n const handleColorValueChange = (colorValue: string, i: number): void => {\n if (querySettingsList !== undefined) {\n onChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n querySettings.colorValue = colorValue;\n }\n }\n })\n );\n }\n };\n\n const deleteQuerySettingsInput = (i: number): void => {\n if (querySettingsList !== undefined) {\n const updatedQuerySettingsList = produce(querySettingsList, (draft) => {\n draft.splice(i, 1);\n });\n onChange(updatedQuerySettingsList);\n }\n };\n\n const queryCount = useQueryCountContext();\n\n // Compute the list of query indexes for which query settings are not already defined.\n // This is to avoid already-booked indexes to still be selectable in the dropdown(s)\n const availableQueryIndexes = useMemo(() => {\n const bookedQueryIndexes = querySettingsList?.map((querySettings) => querySettings.queryIndex) ?? [];\n const allQueryIndexes = Array.from({ length: queryCount }, (_, i) => i);\n return allQueryIndexes.filter((_, queryIndex) => !bookedQueryIndexes.includes(queryIndex));\n }, [querySettingsList, queryCount]);\n\n const firstAvailableQueryIndex = useMemo(() => {\n return availableQueryIndexes[0] ?? NO_INDEX_AVAILABLE;\n }, [availableQueryIndexes]);\n\n const defaultQuerySettings: QuerySettingsOptions = {\n queryIndex: firstAvailableQueryIndex,\n colorMode: DEFAULT_COLOR_MODE,\n colorValue: DEFAULT_COLOR_VALUE,\n };\n\n const addQuerySettingsInput = (): void => {\n focusRef.current = true;\n if (querySettingsList === undefined) {\n onChange([defaultQuerySettings]);\n } else {\n onChange(\n produce(querySettingsList, (draft) => {\n draft.push(defaultQuerySettings);\n })\n );\n }\n };\n\n return (\n <OptionsEditorGroup\n title=\"Query settings\"\n icon={\n firstAvailableQueryIndex !== NO_INDEX_AVAILABLE ? (\n <InfoTooltip description=\"Add query settings\">\n <IconButton size=\"small\" aria-label=\"add query settings\" onClick={addQuerySettingsInput}>\n <PlusIcon />\n </IconButton>\n </InfoTooltip>\n ) : null\n }\n >\n {querySettingsList && querySettingsList.length > 0 ? (\n querySettingsList.map((querySettings, i) => (\n <QuerySettingsInput\n inputRef={i === querySettingsList.length - 1 ? recentlyAddedInputRef : undefined}\n key={i}\n querySettings={querySettings}\n availableQueryIndexes={availableQueryIndexes}\n onQueryIndexChange={(e) => {\n handleQueryIndexChange(e, i);\n }}\n onColorModeChange={(e) => handleColorModeChange(e, i)}\n onColorValueChange={(color) => handleColorValueChange(color, i)}\n onDelete={() => {\n deleteQuerySettingsInput(i);\n }}\n />\n ))\n ) : (\n <Typography mb={2} fontStyle=\"italic\">\n No query settings defined\n </Typography>\n )}\n </OptionsEditorGroup>\n );\n}\n\nexport interface QuerySettingsInputProps {\n querySettings: QuerySettingsOptions;\n availableQueryIndexes: number[];\n onQueryIndexChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onColorModeChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onColorValueChange: (colorValue: string) => void;\n onDelete: () => void;\n inputRef?: RefObject<HTMLInputElement | null>;\n}\n\nexport function QuerySettingsInput({\n querySettings: { queryIndex, colorMode, colorValue },\n availableQueryIndexes,\n onQueryIndexChange,\n onColorModeChange,\n onColorValueChange,\n onDelete,\n inputRef,\n}: QuerySettingsInputProps): ReactElement {\n // current query index should also be selectable\n const selectableQueryIndexes = availableQueryIndexes.concat(queryIndex).sort((a, b) => a - b);\n\n return (\n <Stack flex={1} direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\" spacing={1}>\n <TextField\n select\n inputRef={inputRef}\n value={queryIndex}\n label=\"Query\"\n onChange={onQueryIndexChange}\n sx={{ minWidth: '75px' }} // instead of `fullWidth` otherwise it's taking too much space\n >\n {selectableQueryIndexes.map((queryIndex) => (\n <MenuItem key={`query-${queryIndex}`} value={queryIndex}>\n #{queryIndex + 1}\n </MenuItem>\n ))}\n </TextField>\n <TextField select value={colorMode} fullWidth label=\"Color mode\" onChange={onColorModeChange}>\n <MenuItem value=\"fixed-single\">Fixed (single)</MenuItem>\n <MenuItem value=\"fixed\">Fixed</MenuItem>\n </TextField>\n <OptionsColorPicker label={'Query n°' + queryIndex} color={colorValue} onColorChange={onColorValueChange} />\n <IconButton aria-label={`delete settings for query n°${queryIndex + 1}`} size=\"small\" onClick={onDelete}>\n <DeleteIcon />\n </IconButton>\n </Stack>\n );\n}\n"],"names":["IconButton","MenuItem","Stack","TextField","Typography","InfoTooltip","OptionsEditorGroup","OptionsColorPicker","useEffect","useMemo","useRef","DeleteIcon","PlusIcon","produce","useQueryCountContext","DEFAULT_COLOR_MODE","DEFAULT_COLOR_VALUE","NO_INDEX_AVAILABLE","QuerySettingsEditor","querySettingsList","onChange","recentlyAddedInputRef","focusRef","current","focus","length","handleQueryIndexChange","e","i","undefined","draft","querySettings","queryIndex","parseInt","target","value","handleColorModeChange","colorMode","handleColorValueChange","colorValue","deleteQuerySettingsInput","updatedQuerySettingsList","splice","queryCount","availableQueryIndexes","bookedQueryIndexes","map","allQueryIndexes","Array","from","_","filter","includes","firstAvailableQueryIndex","defaultQuerySettings","addQuerySettingsInput","push","title","icon","description","size","aria-label","onClick","QuerySettingsInput","inputRef","onQueryIndexChange","onColorModeChange","onColorValueChange","color","onDelete","mb","fontStyle","selectableQueryIndexes","concat","sort","a","b","flex","direction","alignItems","justifyContent","spacing","select","label","sx","minWidth","fullWidth","onColorChange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/QuerySettingsEditor.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n Box,\n Button,\n IconButton,\n Menu,\n MenuItem,\n Slider,\n Stack,\n TextField,\n ToggleButton,\n ToggleButtonGroup,\n Typography,\n useTheme,\n} from '@mui/material';\nimport { OptionsColorPicker } from '@perses-dev/components';\nimport React, { ReactElement, useEffect, useMemo, useRef, useState } from 'react';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport AddIcon from 'mdi-material-ui/Plus';\nimport CloseIcon from 'mdi-material-ui/Close';\nimport { produce } from 'immer';\nimport { useQueryCountContext } from '@perses-dev/plugin-system';\nimport {\n TimeSeriesChartOptions,\n TimeSeriesChartOptionsEditorProps,\n QuerySettingsOptions,\n DEFAULT_AREA_OPACITY,\n OPACITY_CONFIG,\n LINE_STYLE_CONFIG,\n} from './time-series-chart-model';\n\nconst DEFAULT_COLOR_VALUE = '#555';\nconst NO_INDEX_AVAILABLE = -1; // invalid array index value used to represent the fact that no query index is available\n\nexport function QuerySettingsEditor(props: TimeSeriesChartOptionsEditorProps): ReactElement {\n const { onChange, value } = props;\n const querySettingsList = value.querySettings;\n\n const handleQuerySettingsChange = (newQuerySettings: QuerySettingsOptions[]) => {\n onChange(\n produce(value, (draft: TimeSeriesChartOptions) => {\n draft.querySettings = newQuerySettings;\n })\n );\n };\n // Every time a new query settings input is added, we want to focus the recently added input\n const recentlyAddedInputRef = useRef<HTMLInputElement | null>(null);\n const focusRef = useRef(false);\n useEffect(() => {\n if (!recentlyAddedInputRef.current || !focusRef.current) return;\n recentlyAddedInputRef.current?.focus();\n focusRef.current = false;\n }, [querySettingsList?.length]);\n\n const handleQueryIndexChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n const querySettings = draft?.[i];\n if (querySettings) {\n querySettings.queryIndex = parseInt(e.target.value);\n }\n })\n );\n }\n };\n\n const handleColorModeChange = (e: React.ChangeEvent<HTMLInputElement>, i: number): void => {\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n const newColorMode = e.target.value;\n if (!newColorMode) {\n querySettings.colorMode = undefined;\n querySettings.colorValue = undefined;\n } else {\n querySettings.colorMode = newColorMode as QuerySettingsOptions['colorMode'];\n }\n }\n }\n })\n );\n }\n };\n\n const handleColorValueChange = (colorValue: string, i: number): void => {\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n querySettings.colorValue = colorValue;\n }\n }\n })\n );\n }\n };\n\n const handleLineStyleChange = (lineStyle: string, i: number): void => {\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n querySettings.lineStyle = lineStyle as QuerySettingsOptions['lineStyle'];\n }\n }\n })\n );\n }\n };\n\n const handleAreaOpacityChange = (_: Event, sliderValue: number | number[], i: number): void => {\n const newValue = Array.isArray(sliderValue) ? sliderValue[0] : sliderValue;\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n if (draft !== undefined) {\n const querySettings = draft[i];\n if (querySettings) {\n querySettings.areaOpacity = newValue;\n }\n }\n })\n );\n }\n };\n\n // Helper function to update query settings at a specific index\n const updateQuerySettings = (i: number, updater: (qs: QuerySettingsOptions) => void): void => {\n if (querySettingsList !== undefined) {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n const qs = draft[i];\n if (qs) {\n updater(qs);\n }\n })\n );\n }\n };\n\n const deleteQuerySettingsInput = (i: number): void => {\n if (querySettingsList !== undefined) {\n const updatedQuerySettingsList = produce(querySettingsList, (draft) => {\n draft.splice(i, 1);\n });\n handleQuerySettingsChange(updatedQuerySettingsList);\n }\n };\n\n const addColor = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.colorMode = 'fixed-single';\n qs.colorValue = DEFAULT_COLOR_VALUE;\n });\n };\n\n const removeColor = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.colorMode = undefined;\n qs.colorValue = undefined;\n });\n };\n\n const addLineStyle = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.lineStyle = 'solid';\n });\n };\n\n const removeLineStyle = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.lineStyle = undefined;\n });\n };\n\n const addAreaOpacity = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.areaOpacity = DEFAULT_AREA_OPACITY;\n });\n };\n\n const removeAreaOpacity = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.areaOpacity = undefined;\n });\n };\n\n const queryCount = useQueryCountContext();\n\n // Compute the list of query indexes for which query settings are not already defined.\n // This is to avoid already-booked indexes to still be selectable in the dropdown(s)\n const availableQueryIndexes = useMemo(() => {\n const bookedQueryIndexes = querySettingsList?.map((querySettings) => querySettings.queryIndex) ?? [];\n const allQueryIndexes = Array.from({ length: queryCount }, (_, i) => i);\n return allQueryIndexes.filter((_, queryIndex) => !bookedQueryIndexes.includes(queryIndex));\n }, [querySettingsList, queryCount]);\n\n const firstAvailableQueryIndex = useMemo(() => {\n return availableQueryIndexes[0] ?? NO_INDEX_AVAILABLE;\n }, [availableQueryIndexes]);\n\n const defaultQuerySettings: QuerySettingsOptions = {\n queryIndex: firstAvailableQueryIndex,\n };\n\n const addQuerySettingsInput = (): void => {\n focusRef.current = true;\n if (querySettingsList === undefined) {\n handleQuerySettingsChange([defaultQuerySettings]);\n } else {\n handleQuerySettingsChange(\n produce(querySettingsList, (draft) => {\n draft.push(defaultQuerySettings);\n })\n );\n }\n };\n\n return (\n <Stack>\n {queryCount === 0 ? (\n <Typography mb={2} fontStyle=\"italic\">\n No query defined\n </Typography>\n ) : (\n querySettingsList?.length &&\n querySettingsList.map((querySettings, i) => (\n <QuerySettingsInput\n inputRef={i === querySettingsList.length - 1 ? recentlyAddedInputRef : undefined}\n key={i}\n querySettings={querySettings}\n availableQueryIndexes={availableQueryIndexes}\n onQueryIndexChange={(e) => {\n handleQueryIndexChange(e, i);\n }}\n onColorModeChange={(e) => handleColorModeChange(e, i)}\n onColorValueChange={(color) => handleColorValueChange(color, i)}\n onLineStyleChange={(lineStyle) => handleLineStyleChange(lineStyle, i)}\n onAreaOpacityChange={(event, value) => handleAreaOpacityChange(event, value, i)}\n onDelete={() => {\n deleteQuerySettingsInput(i);\n }}\n onAddColor={() => addColor(i)}\n onRemoveColor={() => removeColor(i)}\n onAddLineStyle={() => addLineStyle(i)}\n onRemoveLineStyle={() => removeLineStyle(i)}\n onAddAreaOpacity={() => addAreaOpacity(i)}\n onRemoveAreaOpacity={() => removeAreaOpacity(i)}\n />\n ))\n )}\n {queryCount > 0 && firstAvailableQueryIndex !== NO_INDEX_AVAILABLE && (\n <Button variant=\"contained\" startIcon={<AddIcon />} sx={{ marginTop: 1 }} onClick={addQuerySettingsInput}>\n Add Query Settings\n </Button>\n )}\n </Stack>\n );\n}\n\ninterface QuerySettingsInputProps {\n querySettings: QuerySettingsOptions;\n availableQueryIndexes: number[];\n onQueryIndexChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onColorModeChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onColorValueChange: (colorValue: string) => void;\n onLineStyleChange: (lineStyle: string) => void;\n onAreaOpacityChange: (event: Event, value: number | number[]) => void;\n onDelete: () => void;\n inputRef?: React.RefObject<HTMLInputElement | null>;\n // Optional control handlers\n onAddColor: () => void;\n onRemoveColor: () => void;\n onAddLineStyle: () => void;\n onRemoveLineStyle: () => void;\n onAddAreaOpacity: () => void;\n onRemoveAreaOpacity: () => void;\n}\n\nfunction QuerySettingsInput({\n querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity },\n availableQueryIndexes,\n onQueryIndexChange,\n onColorModeChange,\n onColorValueChange,\n onLineStyleChange,\n onAreaOpacityChange,\n onDelete,\n inputRef,\n onAddColor: onAddColor,\n onRemoveColor: onRemoveColor,\n onAddLineStyle,\n onRemoveLineStyle,\n onAddAreaOpacity,\n onRemoveAreaOpacity,\n}: QuerySettingsInputProps): ReactElement {\n // current query index should also be selectable\n const selectableQueryIndexes = availableQueryIndexes.concat(queryIndex).sort((a, b) => a - b);\n\n // State for dropdown menu\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n\n // Calculate available options\n const availableOptions = useMemo(() => {\n const options = [];\n if (!colorMode) options.push({ key: 'color', label: 'Color', action: onAddColor });\n if (!lineStyle) options.push({ key: 'lineStyle', label: 'Line Style', action: onAddLineStyle });\n if (areaOpacity === undefined) options.push({ key: 'opacity', label: 'Opacity', action: onAddAreaOpacity });\n return options;\n }, [colorMode, lineStyle, areaOpacity, onAddColor, onAddLineStyle, onAddAreaOpacity]);\n\n const handleAddMenuClick = (event: React.MouseEvent<HTMLElement>) => {\n if (availableOptions.length === 1 && availableOptions[0]) {\n // If only one option left, add it directly\n availableOptions[0].action();\n } else {\n // Show dropdown\n setAnchorEl(event.currentTarget);\n }\n };\n\n const handleMenuClose = () => {\n setAnchorEl(null);\n };\n\n const handleMenuItemClick = (action: () => void) => {\n action();\n handleMenuClose();\n };\n\n return (\n <Stack spacing={2} sx={{ borderBottom: '1px solid', borderColor: 'divider', borderRadius: 1, p: 2 }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1} sx={{ flexWrap: 'wrap', gap: 1 }}>\n {/* Query Index Selection */}\n <TextField\n select\n inputRef={inputRef}\n value={queryIndex}\n label=\"Query\"\n onChange={onQueryIndexChange}\n sx={{ minWidth: '75px' }}\n >\n {selectableQueryIndexes.map((qi) => (\n <MenuItem key={`query-${qi}`} value={qi}>\n #{qi + 1}\n </MenuItem>\n ))}\n </TextField>\n\n {/* Color section */}\n {colorMode && (\n <SettingsSection label=\"Color\" onRemove={onRemoveColor}>\n <TextField select value={colorMode} onChange={onColorModeChange} size=\"small\" sx={{ flexGrow: 1 }}>\n <MenuItem value=\"fixed-single\">Fixed (single)</MenuItem>\n <MenuItem value=\"fixed\">Fixed</MenuItem>\n </TextField>\n <OptionsColorPicker\n label={`Query n°${queryIndex + 1}`}\n color={colorValue || DEFAULT_COLOR_VALUE}\n onColorChange={onColorValueChange}\n />\n </SettingsSection>\n )}\n\n {/* Line Style section */}\n {lineStyle && (\n <SettingsSection label=\"Line Style\" onRemove={onRemoveLineStyle}>\n <ToggleButtonGroup\n color=\"primary\"\n exclusive\n value={lineStyle}\n onChange={(__, newValue) => {\n if (newValue !== null) {\n onLineStyleChange(newValue);\n }\n }}\n size=\"small\"\n >\n {Object.entries(LINE_STYLE_CONFIG).map(([styleValue, config]) => (\n <ToggleButton key={styleValue} value={styleValue} aria-label={`${styleValue} line style`}>\n {config.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n {/* Spacer to push delete button to the right */}\n <Box sx={{ flexGrow: 1 }} />\n </SettingsSection>\n )}\n\n {/* Area Opacity section */}\n {areaOpacity !== undefined && (\n <SettingsSection label=\"Opacity\" onRemove={onRemoveAreaOpacity}>\n {/* Spacer as I don't want to add a prop to SettingsSection for left-padding just for that case.. */}\n <Box />\n <Slider\n value={areaOpacity}\n valueLabelDisplay=\"auto\"\n step={OPACITY_CONFIG.step}\n marks\n min={OPACITY_CONFIG.min}\n max={OPACITY_CONFIG.max}\n onChange={onAreaOpacityChange}\n sx={{ flexGrow: 1 }}\n />\n </SettingsSection>\n )}\n\n {/* Add Options Button - only show if there are available options */}\n {availableOptions.length > 0 && (\n <>\n <IconButton onClick={handleAddMenuClick} aria-label=\"Add option\">\n <AddIcon />\n </IconButton>\n\n {/* Dropdown Menu */}\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={handleMenuClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n >\n {availableOptions.map((option) => (\n <MenuItem\n key={option.key}\n onClick={() => handleMenuItemClick(option.action)}\n sx={{ minWidth: '120px' }}\n >\n <AddIcon sx={{ mr: 1, fontSize: '1rem' }} />\n {option.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n )}\n\n {/* Spacer to push delete button to the right */}\n <Box sx={{ flexGrow: 1 }} />\n\n {/* Delete Button for this query settings */}\n <IconButton aria-label={`delete settings for query n°${queryIndex + 1}`} onClick={onDelete}>\n <DeleteIcon />\n </IconButton>\n </Stack>\n </Stack>\n );\n}\n\ninterface SettingsSectionProps {\n label: string;\n children: React.ReactNode;\n onRemove: () => void;\n}\n\n// Reusable section component\nfunction SettingsSection(props: SettingsSectionProps): ReactElement {\n const { label, children, onRemove } = props;\n const theme = useTheme();\n\n return (\n <Box sx={{ position: 'relative', minWidth: '250px' }}>\n <Typography\n variant=\"caption\"\n sx={{\n position: 'absolute',\n top: -8,\n left: 12,\n backgroundColor: theme.palette.background.code,\n px: 0.5,\n color: 'text.secondary',\n zIndex: 1,\n }}\n >\n {label}\n </Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n spacing={1}\n sx={{\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n p: 1,\n }}\n >\n {children}\n <IconButton size=\"small\" onClick={onRemove} aria-label={`Remove ${label}`}>\n <CloseIcon />\n </IconButton>\n </Stack>\n </Box>\n );\n}\n"],"names":["Box","Button","IconButton","Menu","MenuItem","Slider","Stack","TextField","ToggleButton","ToggleButtonGroup","Typography","useTheme","OptionsColorPicker","React","useEffect","useMemo","useRef","useState","DeleteIcon","AddIcon","CloseIcon","produce","useQueryCountContext","DEFAULT_AREA_OPACITY","OPACITY_CONFIG","LINE_STYLE_CONFIG","DEFAULT_COLOR_VALUE","NO_INDEX_AVAILABLE","QuerySettingsEditor","props","onChange","value","querySettingsList","querySettings","handleQuerySettingsChange","newQuerySettings","draft","recentlyAddedInputRef","focusRef","current","focus","length","handleQueryIndexChange","e","i","undefined","queryIndex","parseInt","target","handleColorModeChange","newColorMode","colorMode","colorValue","handleColorValueChange","handleLineStyleChange","lineStyle","handleAreaOpacityChange","_","sliderValue","newValue","Array","isArray","areaOpacity","updateQuerySettings","updater","qs","deleteQuerySettingsInput","updatedQuerySettingsList","splice","addColor","removeColor","addLineStyle","removeLineStyle","addAreaOpacity","removeAreaOpacity","queryCount","availableQueryIndexes","bookedQueryIndexes","map","allQueryIndexes","from","filter","includes","firstAvailableQueryIndex","defaultQuerySettings","addQuerySettingsInput","push","mb","fontStyle","QuerySettingsInput","inputRef","onQueryIndexChange","onColorModeChange","onColorValueChange","color","onLineStyleChange","onAreaOpacityChange","event","onDelete","onAddColor","onRemoveColor","onAddLineStyle","onRemoveLineStyle","onAddAreaOpacity","onRemoveAreaOpacity","variant","startIcon","sx","marginTop","onClick","selectableQueryIndexes","concat","sort","a","b","anchorEl","setAnchorEl","availableOptions","options","key","label","action","handleAddMenuClick","currentTarget","handleMenuClose","handleMenuItemClick","spacing","borderBottom","borderColor","borderRadius","p","direction","alignItems","flexWrap","gap","select","minWidth","qi","SettingsSection","onRemove","size","flexGrow","onColorChange","exclusive","__","Object","entries","styleValue","config","aria-label","valueLabelDisplay","step","marks","min","max","open","Boolean","onClose","anchorOrigin","vertical","horizontal","option","mr","fontSize","children","theme","position","top","left","backgroundColor","palette","background","code","px","zIndex","border"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SACEA,GAAG,EACHC,MAAM,EACNC,UAAU,EACVC,IAAI,EACJC,QAAQ,EACRC,MAAM,EACNC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,iBAAiB,EACjBC,UAAU,EACVC,QAAQ,QACH,gBAAgB;AACvB,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,OAAOC,SAAuBC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAQ;AAClF,OAAOC,gBAAgB,gCAAgC;AACvD,OAAOC,aAAa,uBAAuB;AAC3C,OAAOC,eAAe,wBAAwB;AAC9C,SAASC,OAAO,QAAQ,QAAQ;AAChC,SAASC,oBAAoB,QAAQ,4BAA4B;AACjE,SAIEC,oBAAoB,EACpBC,cAAc,EACdC,iBAAiB,QACZ,4BAA4B;AAEnC,MAAMC,sBAAsB;AAC5B,MAAMC,qBAAqB,CAAC,GAAG,wFAAwF;AAEvH,OAAO,SAASC,oBAAoBC,KAAwC;IAC1E,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAE,GAAGF;IAC5B,MAAMG,oBAAoBD,MAAME,aAAa;IAE7C,MAAMC,4BAA4B,CAACC;QACjCL,SACET,QAAQU,OAAO,CAACK;YACdA,MAAMH,aAAa,GAAGE;QACxB;IAEJ;IACA,4FAA4F;IAC5F,MAAME,wBAAwBrB,OAAgC;IAC9D,MAAMsB,WAAWtB,OAAO;IACxBF,UAAU;QACR,IAAI,CAACuB,sBAAsBE,OAAO,IAAI,CAACD,SAASC,OAAO,EAAE;QACzDF,sBAAsBE,OAAO,EAAEC;QAC/BF,SAASC,OAAO,GAAG;IACrB,GAAG;QAACP,mBAAmBS;KAAO;IAE9B,MAAMC,yBAAyB,CAACC,GAAwCC;QACtE,IAAIZ,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,MAAMH,gBAAgBG,OAAO,CAACQ,EAAE;gBAChC,IAAIX,eAAe;oBACjBA,cAAca,UAAU,GAAGC,SAASJ,EAAEK,MAAM,CAACjB,KAAK;gBACpD;YACF;QAEJ;IACF;IAEA,MAAMkB,wBAAwB,CAACN,GAAwCC;QACrE,IAAIZ,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,IAAIA,UAAUS,WAAW;oBACvB,MAAMZ,gBAAgBG,KAAK,CAACQ,EAAE;oBAC9B,IAAIX,eAAe;wBACjB,MAAMiB,eAAeP,EAAEK,MAAM,CAACjB,KAAK;wBACnC,IAAI,CAACmB,cAAc;4BACjBjB,cAAckB,SAAS,GAAGN;4BAC1BZ,cAAcmB,UAAU,GAAGP;wBAC7B,OAAO;4BACLZ,cAAckB,SAAS,GAAGD;wBAC5B;oBACF;gBACF;YACF;QAEJ;IACF;IAEA,MAAMG,yBAAyB,CAACD,YAAoBR;QAClD,IAAIZ,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,IAAIA,UAAUS,WAAW;oBACvB,MAAMZ,gBAAgBG,KAAK,CAACQ,EAAE;oBAC9B,IAAIX,eAAe;wBACjBA,cAAcmB,UAAU,GAAGA;oBAC7B;gBACF;YACF;QAEJ;IACF;IAEA,MAAME,wBAAwB,CAACC,WAAmBX;QAChD,IAAIZ,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,IAAIA,UAAUS,WAAW;oBACvB,MAAMZ,gBAAgBG,KAAK,CAACQ,EAAE;oBAC9B,IAAIX,eAAe;wBACjBA,cAAcsB,SAAS,GAAGA;oBAC5B;gBACF;YACF;QAEJ;IACF;IAEA,MAAMC,0BAA0B,CAACC,GAAUC,aAAgCd;QACzE,MAAMe,WAAWC,MAAMC,OAAO,CAACH,eAAeA,WAAW,CAAC,EAAE,GAAGA;QAC/D,IAAI1B,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,IAAIA,UAAUS,WAAW;oBACvB,MAAMZ,gBAAgBG,KAAK,CAACQ,EAAE;oBAC9B,IAAIX,eAAe;wBACjBA,cAAc6B,WAAW,GAAGH;oBAC9B;gBACF;YACF;QAEJ;IACF;IAEA,+DAA+D;IAC/D,MAAMI,sBAAsB,CAACnB,GAAWoB;QACtC,IAAIhC,sBAAsBa,WAAW;YACnCX,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1B,MAAM6B,KAAK7B,KAAK,CAACQ,EAAE;gBACnB,IAAIqB,IAAI;oBACND,QAAQC;gBACV;YACF;QAEJ;IACF;IAEA,MAAMC,2BAA2B,CAACtB;QAChC,IAAIZ,sBAAsBa,WAAW;YACnC,MAAMsB,2BAA2B9C,QAAQW,mBAAmB,CAACI;gBAC3DA,MAAMgC,MAAM,CAACxB,GAAG;YAClB;YACAV,0BAA0BiC;QAC5B;IACF;IAEA,MAAME,WAAW,CAACzB;QAChBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGd,SAAS,GAAG;YACfc,GAAGb,UAAU,GAAG1B;QAClB;IACF;IAEA,MAAM4C,cAAc,CAAC1B;QACnBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGd,SAAS,GAAGN;YACfoB,GAAGb,UAAU,GAAGP;QAClB;IACF;IAEA,MAAM0B,eAAe,CAAC3B;QACpBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGV,SAAS,GAAG;QACjB;IACF;IAEA,MAAMiB,kBAAkB,CAAC5B;QACvBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGV,SAAS,GAAGV;QACjB;IACF;IAEA,MAAM4B,iBAAiB,CAAC7B;QACtBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGH,WAAW,GAAGvC;QACnB;IACF;IAEA,MAAMmD,oBAAoB,CAAC9B;QACzBmB,oBAAoBnB,GAAG,CAACqB;YACtBA,GAAGH,WAAW,GAAGjB;QACnB;IACF;IAEA,MAAM8B,aAAarD;IAEnB,sFAAsF;IACtF,oFAAoF;IACpF,MAAMsD,wBAAwB7D,QAAQ;QACpC,MAAM8D,qBAAqB7C,mBAAmB8C,IAAI,CAAC7C,gBAAkBA,cAAca,UAAU,KAAK,EAAE;QACpG,MAAMiC,kBAAkBnB,MAAMoB,IAAI,CAAC;YAAEvC,QAAQkC;QAAW,GAAG,CAAClB,GAAGb,IAAMA;QACrE,OAAOmC,gBAAgBE,MAAM,CAAC,CAACxB,GAAGX,aAAe,CAAC+B,mBAAmBK,QAAQ,CAACpC;IAChF,GAAG;QAACd;QAAmB2C;KAAW;IAElC,MAAMQ,2BAA2BpE,QAAQ;QACvC,OAAO6D,qBAAqB,CAAC,EAAE,IAAIjD;IACrC,GAAG;QAACiD;KAAsB;IAE1B,MAAMQ,uBAA6C;QACjDtC,YAAYqC;IACd;IAEA,MAAME,wBAAwB;QAC5B/C,SAASC,OAAO,GAAG;QACnB,IAAIP,sBAAsBa,WAAW;YACnCX,0BAA0B;gBAACkD;aAAqB;QAClD,OAAO;YACLlD,0BACEb,QAAQW,mBAAmB,CAACI;gBAC1BA,MAAMkD,IAAI,CAACF;YACb;QAEJ;IACF;IAEA,qBACE,MAAC9E;;YACEqE,eAAe,kBACd,KAACjE;gBAAW6E,IAAI;gBAAGC,WAAU;0BAAS;iBAItCxD,mBAAmBS,UACnBT,kBAAkB8C,GAAG,CAAC,CAAC7C,eAAeW,kBACpC,KAAC6C;oBACCC,UAAU9C,MAAMZ,kBAAkBS,MAAM,GAAG,IAAIJ,wBAAwBQ;oBAEvEZ,eAAeA;oBACf2C,uBAAuBA;oBACvBe,oBAAoB,CAAChD;wBACnBD,uBAAuBC,GAAGC;oBAC5B;oBACAgD,mBAAmB,CAACjD,IAAMM,sBAAsBN,GAAGC;oBACnDiD,oBAAoB,CAACC,QAAUzC,uBAAuByC,OAAOlD;oBAC7DmD,mBAAmB,CAACxC,YAAcD,sBAAsBC,WAAWX;oBACnEoD,qBAAqB,CAACC,OAAOlE,QAAUyB,wBAAwByC,OAAOlE,OAAOa;oBAC7EsD,UAAU;wBACRhC,yBAAyBtB;oBAC3B;oBACAuD,YAAY,IAAM9B,SAASzB;oBAC3BwD,eAAe,IAAM9B,YAAY1B;oBACjCyD,gBAAgB,IAAM9B,aAAa3B;oBACnC0D,mBAAmB,IAAM9B,gBAAgB5B;oBACzC2D,kBAAkB,IAAM9B,eAAe7B;oBACvC4D,qBAAqB,IAAM9B,kBAAkB9B;mBAlBxCA;YAsBV+B,aAAa,KAAKQ,6BAA6BxD,oCAC9C,KAAC1B;gBAAOwG,SAAQ;gBAAYC,yBAAW,KAACvF;gBAAYwF,IAAI;oBAAEC,WAAW;gBAAE;gBAAGC,SAASxB;0BAAuB;;;;AAMlH;AAqBA,SAASI,mBAAmB,EAC1BxD,eAAe,EAAEa,UAAU,EAAEK,SAAS,EAAEC,UAAU,EAAEG,SAAS,EAAEO,WAAW,EAAE,EAC5Ec,qBAAqB,EACrBe,kBAAkB,EAClBC,iBAAiB,EACjBC,kBAAkB,EAClBE,iBAAiB,EACjBC,mBAAmB,EACnBE,QAAQ,EACRR,QAAQ,EACRS,YAAYA,UAAU,EACtBC,eAAeA,aAAa,EAC5BC,cAAc,EACdC,iBAAiB,EACjBC,gBAAgB,EAChBC,mBAAmB,EACK;IACxB,gDAAgD;IAChD,MAAMM,yBAAyBlC,sBAAsBmC,MAAM,CAACjE,YAAYkE,IAAI,CAAC,CAACC,GAAGC,IAAMD,IAAIC;IAE3F,0BAA0B;IAC1B,MAAM,CAACC,UAAUC,YAAY,GAAGnG,SAA6B;IAE7D,8BAA8B;IAC9B,MAAMoG,mBAAmBtG,QAAQ;QAC/B,MAAMuG,UAAU,EAAE;QAClB,IAAI,CAACnE,WAAWmE,QAAQhC,IAAI,CAAC;YAAEiC,KAAK;YAASC,OAAO;YAASC,QAAQtB;QAAW;QAChF,IAAI,CAAC5C,WAAW+D,QAAQhC,IAAI,CAAC;YAAEiC,KAAK;YAAaC,OAAO;YAAcC,QAAQpB;QAAe;QAC7F,IAAIvC,gBAAgBjB,WAAWyE,QAAQhC,IAAI,CAAC;YAAEiC,KAAK;YAAWC,OAAO;YAAWC,QAAQlB;QAAiB;QACzG,OAAOe;IACT,GAAG;QAACnE;QAAWI;QAAWO;QAAaqC;QAAYE;QAAgBE;KAAiB;IAEpF,MAAMmB,qBAAqB,CAACzB;QAC1B,IAAIoB,iBAAiB5E,MAAM,KAAK,KAAK4E,gBAAgB,CAAC,EAAE,EAAE;YACxD,2CAA2C;YAC3CA,gBAAgB,CAAC,EAAE,CAACI,MAAM;QAC5B,OAAO;YACL,gBAAgB;YAChBL,YAAYnB,MAAM0B,aAAa;QACjC;IACF;IAEA,MAAMC,kBAAkB;QACtBR,YAAY;IACd;IAEA,MAAMS,sBAAsB,CAACJ;QAC3BA;QACAG;IACF;IAEA,qBACE,KAACtH;QAAMwH,SAAS;QAAGnB,IAAI;YAAEoB,cAAc;YAAaC,aAAa;YAAWC,cAAc;YAAGC,GAAG;QAAE;kBAChG,cAAA,MAAC5H;YAAM6H,WAAU;YAAMC,YAAW;YAASN,SAAS;YAAGnB,IAAI;gBAAE0B,UAAU;gBAAQC,KAAK;YAAE;;8BAEpF,KAAC/H;oBACCgI,MAAM;oBACN7C,UAAUA;oBACV3D,OAAOe;oBACP0E,OAAM;oBACN1F,UAAU6D;oBACVgB,IAAI;wBAAE6B,UAAU;oBAAO;8BAEtB1B,uBAAuBhC,GAAG,CAAC,CAAC2D,mBAC3B,MAACrI;4BAA6B2B,OAAO0G;;gCAAI;gCACrCA,KAAK;;2BADM,CAAC,MAAM,EAAEA,IAAI;;gBAO/BtF,2BACC,MAACuF;oBAAgBlB,OAAM;oBAAQmB,UAAUvC;;sCACvC,MAAC7F;4BAAUgI,MAAM;4BAACxG,OAAOoB;4BAAWrB,UAAU8D;4BAAmBgD,MAAK;4BAAQjC,IAAI;gCAAEkC,UAAU;4BAAE;;8CAC9F,KAACzI;oCAAS2B,OAAM;8CAAe;;8CAC/B,KAAC3B;oCAAS2B,OAAM;8CAAQ;;;;sCAE1B,KAACnB;4BACC4G,OAAO,CAAC,QAAQ,EAAE1E,aAAa,GAAG;4BAClCgD,OAAO1C,cAAc1B;4BACrBoH,eAAejD;;;;gBAMpBtC,2BACC,MAACmF;oBAAgBlB,OAAM;oBAAamB,UAAUrC;;sCAC5C,KAAC7F;4BACCqF,OAAM;4BACNiD,SAAS;4BACThH,OAAOwB;4BACPzB,UAAU,CAACkH,IAAIrF;gCACb,IAAIA,aAAa,MAAM;oCACrBoC,kBAAkBpC;gCACpB;4BACF;4BACAiF,MAAK;sCAEJK,OAAOC,OAAO,CAACzH,mBAAmBqD,GAAG,CAAC,CAAC,CAACqE,YAAYC,OAAO,iBAC1D,KAAC5I;oCAA8BuB,OAAOoH;oCAAYE,cAAY,GAAGF,WAAW,WAAW,CAAC;8CACrFC,OAAO5B,KAAK;mCADI2B;;sCAMvB,KAACnJ;4BAAI2G,IAAI;gCAAEkC,UAAU;4BAAE;;;;gBAK1B/E,gBAAgBjB,2BACf,MAAC6F;oBAAgBlB,OAAM;oBAAUmB,UAAUnC;;sCAEzC,KAACxG;sCACD,KAACK;4BACC0B,OAAO+B;4BACPwF,mBAAkB;4BAClBC,MAAM/H,eAAe+H,IAAI;4BACzBC,KAAK;4BACLC,KAAKjI,eAAeiI,GAAG;4BACvBC,KAAKlI,eAAekI,GAAG;4BACvB5H,UAAUkE;4BACVW,IAAI;gCAAEkC,UAAU;4BAAE;;;;gBAMvBxB,iBAAiB5E,MAAM,GAAG,mBACzB;;sCACE,KAACvC;4BAAW2G,SAASa;4BAAoB2B,cAAW;sCAClD,cAAA,KAAClI;;sCAIH,KAAChB;4BACCgH,UAAUA;4BACVwC,MAAMC,QAAQzC;4BACd0C,SAASjC;4BACTkC,cAAc;gCACZC,UAAU;gCACVC,YAAY;4BACd;sCAEC3C,iBAAiBvC,GAAG,CAAC,CAACmF,uBACrB,MAAC7J;oCAECyG,SAAS,IAAMgB,oBAAoBoC,OAAOxC,MAAM;oCAChDd,IAAI;wCAAE6B,UAAU;oCAAQ;;sDAExB,KAACrH;4CAAQwF,IAAI;gDAAEuD,IAAI;gDAAGC,UAAU;4CAAO;;wCACtCF,OAAOzC,KAAK;;mCALRyC,OAAO1C,GAAG;;;;8BAazB,KAACvH;oBAAI2G,IAAI;wBAAEkC,UAAU;oBAAE;;8BAGvB,KAAC3I;oBAAWmJ,cAAY,CAAC,4BAA4B,EAAEvG,aAAa,GAAG;oBAAE+D,SAASX;8BAChF,cAAA,KAAChF;;;;;AAKX;AAQA,6BAA6B;AAC7B,SAASwH,gBAAgB7G,KAA2B;IAClD,MAAM,EAAE2F,KAAK,EAAE4C,QAAQ,EAAEzB,QAAQ,EAAE,GAAG9G;IACtC,MAAMwI,QAAQ1J;IAEd,qBACE,MAACX;QAAI2G,IAAI;YAAE2D,UAAU;YAAY9B,UAAU;QAAQ;;0BACjD,KAAC9H;gBACC+F,SAAQ;gBACRE,IAAI;oBACF2D,UAAU;oBACVC,KAAK,CAAC;oBACNC,MAAM;oBACNC,iBAAiBJ,MAAMK,OAAO,CAACC,UAAU,CAACC,IAAI;oBAC9CC,IAAI;oBACJ/E,OAAO;oBACPgF,QAAQ;gBACV;0BAECtD;;0BAEH,MAAClH;gBACC6H,WAAU;gBACVC,YAAW;gBACXN,SAAS;gBACTnB,IAAI;oBACFoE,QAAQ;oBACR/C,aAAa;oBACbC,cAAc;oBACdC,GAAG;gBACL;;oBAECkC;kCACD,KAAClK;wBAAW0I,MAAK;wBAAQ/B,SAAS8B;wBAAUU,cAAY,CAAC,OAAO,EAAE7B,OAAO;kCACvE,cAAA,KAACpG;;;;;;AAKX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeSeriesChart.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChart.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAuC,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"TimeSeriesChart.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChart.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAuC,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAGxG,OAAO,EAAwB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,sBAAsB,EAAE,oBAAoB,CAcrF,CAAC"}
|