@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.
Files changed (64) hide show
  1. package/__mf/js/TimeSeriesChart.2e93229a.js +5 -0
  2. package/__mf/js/async/109.f05e61af.js +73 -0
  3. package/__mf/js/async/{964.719c530c.js → 110.8b9c7f4b.js} +2 -2
  4. package/__mf/js/async/186.b17dcce5.js +1 -0
  5. package/__mf/js/async/{547.bb4f1e58.js → 547.a80ef962.js} +2 -2
  6. package/__mf/js/async/964.e89cbd3b.js +110 -0
  7. package/__mf/js/async/{580.5f4b0dbd.js → 971.6fcf317e.js} +3 -3
  8. package/__mf/js/async/__federation_expose_TimeSeriesChart.f017c9e5.js +3 -0
  9. package/__mf/js/main.25080a30.js +5 -0
  10. package/lib/GeneralSettingsEditor.d.ts +4 -0
  11. package/lib/GeneralSettingsEditor.d.ts.map +1 -0
  12. package/lib/{TimeSeriesChartOptionsEditorSettings.js → GeneralSettingsEditor.js} +3 -14
  13. package/lib/GeneralSettingsEditor.js.map +1 -0
  14. package/lib/QuerySettingsEditor.d.ts +3 -17
  15. package/lib/QuerySettingsEditor.d.ts.map +1 -1
  16. package/lib/QuerySettingsEditor.js +370 -88
  17. package/lib/QuerySettingsEditor.js.map +1 -1
  18. package/lib/TimeSeriesChart.d.ts.map +1 -1
  19. package/lib/TimeSeriesChart.js +8 -3
  20. package/lib/TimeSeriesChart.js.map +1 -1
  21. package/lib/TimeSeriesChartPanel.js +1 -1
  22. package/lib/TimeSeriesChartPanel.js.map +1 -1
  23. package/lib/VisualOptionsEditor.d.ts.map +1 -1
  24. package/lib/VisualOptionsEditor.js +84 -64
  25. package/lib/VisualOptionsEditor.js.map +1 -1
  26. package/lib/cjs/{TimeSeriesChartOptionsEditorSettings.js → GeneralSettingsEditor.js} +4 -15
  27. package/lib/cjs/QuerySettingsEditor.js +410 -95
  28. package/lib/cjs/TimeSeriesChart.js +8 -3
  29. package/lib/cjs/TimeSeriesChartPanel.js +1 -1
  30. package/lib/cjs/VisualOptionsEditor.js +82 -62
  31. package/lib/cjs/index.js +1 -1
  32. package/lib/cjs/time-series-chart-model.js +37 -0
  33. package/lib/cjs/utils/data-transform.js +7 -54
  34. package/lib/cjs/utils/palette-gen.js +2 -2
  35. package/lib/index.d.ts +1 -1
  36. package/lib/index.d.ts.map +1 -1
  37. package/lib/index.js +1 -1
  38. package/lib/index.js.map +1 -1
  39. package/lib/time-series-chart-model.d.ts +32 -2
  40. package/lib/time-series-chart-model.d.ts.map +1 -1
  41. package/lib/time-series-chart-model.js +25 -0
  42. package/lib/time-series-chart-model.js.map +1 -1
  43. package/lib/utils/data-transform.d.ts +6 -7
  44. package/lib/utils/data-transform.d.ts.map +1 -1
  45. package/lib/utils/data-transform.js +8 -54
  46. package/lib/utils/data-transform.js.map +1 -1
  47. package/lib/utils/palette-gen.js +2 -2
  48. package/lib/utils/palette-gen.js.map +1 -1
  49. package/mf-manifest.json +14 -14
  50. package/mf-stats.json +14 -14
  51. package/package.json +5 -5
  52. package/__mf/js/TimeSeriesChart.d3742b3b.js +0 -5
  53. package/__mf/js/async/109.bf4f02fe.js +0 -73
  54. package/__mf/js/async/133.c48c8cc8.js +0 -110
  55. package/__mf/js/async/686.0cd9a75c.js +0 -1
  56. package/__mf/js/async/__federation_expose_TimeSeriesChart.f20a0aca.js +0 -3
  57. package/__mf/js/main.2c598209.js +0 -5
  58. package/lib/TimeSeriesChartOptionsEditorSettings.d.ts +0 -4
  59. package/lib/TimeSeriesChartOptionsEditorSettings.d.ts.map +0 -1
  60. package/lib/TimeSeriesChartOptionsEditorSettings.js.map +0 -1
  61. /package/__mf/js/async/{109.bf4f02fe.js.LICENSE.txt → 109.f05e61af.js.LICENSE.txt} +0 -0
  62. /package/__mf/js/async/{964.719c530c.js.LICENSE.txt → 110.8b9c7f4b.js.LICENSE.txt} +0 -0
  63. /package/__mf/js/async/{547.bb4f1e58.js.LICENSE.txt → 547.a80ef962.js.LICENSE.txt} +0 -0
  64. /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 { InfoTooltip, OptionsEditorGroup, OptionsColorPicker } from '@perses-dev/components';
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 PlusIcon from 'mdi-material-ui/Plus';
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
- const DEFAULT_COLOR_MODE = 'fixed';
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({ querySettingsList, onChange }) {
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
- onChange(produce(querySettingsList, (draft)=>{
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
- onChange(produce(querySettingsList, (draft)=>{
55
+ handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
48
56
  if (draft !== undefined) {
49
57
  const querySettings = draft[i];
50
58
  if (querySettings) {
51
- querySettings.colorMode = e.target.value;
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
- onChange(produce(querySettingsList, (draft)=>{
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
- onChange(updatedQuerySettingsList);
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
- onChange([
183
+ handleQuerySettingsChange([
104
184
  defaultQuerySettings
105
185
  ]);
106
186
  } else {
107
- onChange(produce(querySettingsList, (draft)=>{
187
+ handleQuerySettingsChange(produce(querySettingsList, (draft)=>{
108
188
  draft.push(defaultQuerySettings);
109
189
  }));
110
190
  }
111
191
  };
112
- return /*#__PURE__*/ _jsx(OptionsEditorGroup, {
113
- title: "Query settings",
114
- icon: firstAvailableQueryIndex !== NO_INDEX_AVAILABLE ? /*#__PURE__*/ _jsx(InfoTooltip, {
115
- description: "Add query settings",
116
- children: /*#__PURE__*/ _jsx(IconButton, {
117
- size: "small",
118
- "aria-label": "add query settings",
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: /*#__PURE__*/ _jsx(PlusIcon, {})
226
+ children: "Add Query Settings"
121
227
  })
122
- }) : null,
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
- export function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue }, availableQueryIndexes, onQueryIndexChange, onColorModeChange, onColorValueChange, onDelete, inputRef }) {
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
- return /*#__PURE__*/ _jsxs(Stack, {
146
- flex: 1,
147
- direction: "row",
148
- alignItems: "center",
149
- justifyContent: "space-between",
150
- spacing: 1,
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(TextField, {
153
- select: true,
154
- inputRef: inputRef,
155
- value: queryIndex,
156
- label: "Query",
157
- onChange: onQueryIndexChange,
446
+ /*#__PURE__*/ _jsx(Typography, {
447
+ variant: "caption",
158
448
  sx: {
159
- minWidth: '75px'
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: selectableQueryIndexes.map((queryIndex)=>/*#__PURE__*/ _jsxs(MenuItem, {
162
- value: queryIndex,
163
- children: [
164
- "#",
165
- queryIndex + 1
166
- ]
167
- }, `query-${queryIndex}`))
457
+ children: label
168
458
  }),
169
- /*#__PURE__*/ _jsxs(TextField, {
170
- select: true,
171
- value: colorMode,
172
- fullWidth: true,
173
- label: "Color mode",
174
- onChange: onColorModeChange,
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
- /*#__PURE__*/ _jsx(MenuItem, {
177
- value: "fixed-single",
178
- children: "Fixed (single)"
179
- }),
180
- /*#__PURE__*/ _jsx(MenuItem, {
181
- value: "fixed",
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":"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"}
@@ -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;AAExG,OAAO,EAAwB,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGpF,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,sBAAsB,EAAE,oBAAoB,CAWrF,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"}