@perses-dev/timeseries-chart-plugin 0.12.1 → 0.13.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__mf/css/async/826.85c2cbf6.css +1 -0
- package/__mf/font/inter-cyrillic-300-normal.432f2b21.woff +0 -0
- package/__mf/font/inter-cyrillic-300-normal.9da91009.woff2 +0 -0
- package/__mf/font/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
- package/__mf/font/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
- package/__mf/font/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
- package/__mf/font/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
- package/__mf/font/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
- package/__mf/font/inter-cyrillic-600-normal.c3987adc.woff +0 -0
- package/__mf/font/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
- package/__mf/font/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
- package/__mf/font/inter-cyrillic-900-normal.f285bd7a.woff2 +0 -0
- package/__mf/font/inter-cyrillic-900-normal.ffbd8a3a.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-300-normal.95bb9038.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-300-normal.cfc143a9.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
- package/__mf/font/inter-cyrillic-ext-900-normal.9970ddb5.woff +0 -0
- package/__mf/font/inter-cyrillic-ext-900-normal.a0d59adc.woff2 +0 -0
- package/__mf/font/inter-greek-300-normal.0d7be683.woff2 +0 -0
- package/__mf/font/inter-greek-300-normal.8f0b988e.woff +0 -0
- package/__mf/font/inter-greek-400-normal.cc58c11b.woff +0 -0
- package/__mf/font/inter-greek-400-normal.d7020e3c.woff2 +0 -0
- package/__mf/font/inter-greek-500-normal.d9a33207.woff +0 -0
- package/__mf/font/inter-greek-500-normal.f41f43db.woff2 +0 -0
- package/__mf/font/inter-greek-600-normal.4ec0c1c1.woff +0 -0
- package/__mf/font/inter-greek-600-normal.cc532937.woff2 +0 -0
- package/__mf/font/inter-greek-700-normal.5ec6c758.woff +0 -0
- package/__mf/font/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
- package/__mf/font/inter-greek-900-normal.46b66369.woff2 +0 -0
- package/__mf/font/inter-greek-900-normal.9ae3a3c5.woff +0 -0
- package/__mf/font/inter-greek-ext-300-normal.10247a66.woff2 +0 -0
- package/__mf/font/inter-greek-ext-300-normal.4668e5cb.woff +0 -0
- package/__mf/font/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
- package/__mf/font/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
- package/__mf/font/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
- package/__mf/font/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
- package/__mf/font/inter-greek-ext-600-normal.089a95ee.woff +0 -0
- package/__mf/font/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
- package/__mf/font/inter-greek-ext-700-normal.31f1075d.woff +0 -0
- package/__mf/font/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
- package/__mf/font/inter-greek-ext-900-normal.531bcee7.woff +0 -0
- package/__mf/font/inter-greek-ext-900-normal.8a9b36b9.woff2 +0 -0
- package/__mf/font/inter-latin-300-normal.15fb600d.woff2 +0 -0
- package/__mf/font/inter-latin-300-normal.6f95f590.woff +0 -0
- package/__mf/font/inter-latin-400-normal.2c7a775c.woff +0 -0
- package/__mf/font/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
- package/__mf/font/inter-latin-500-normal.b7b43ace.woff2 +0 -0
- package/__mf/font/inter-latin-500-normal.cb4c8ceb.woff +0 -0
- package/__mf/font/inter-latin-600-normal.8fb1a964.woff2 +0 -0
- package/__mf/font/inter-latin-600-normal.ce0f5f43.woff +0 -0
- package/__mf/font/inter-latin-700-normal.953b7aa5.woff2 +0 -0
- package/__mf/font/inter-latin-700-normal.9c21d4dc.woff +0 -0
- package/__mf/font/inter-latin-900-normal.2a8028ec.woff2 +0 -0
- package/__mf/font/inter-latin-900-normal.fa252135.woff +0 -0
- package/__mf/font/inter-latin-ext-300-normal.167cc8c9.woff2 +0 -0
- package/__mf/font/inter-latin-ext-300-normal.f695be66.woff +0 -0
- package/__mf/font/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
- package/__mf/font/inter-latin-ext-400-normal.4edcaace.woff +0 -0
- package/__mf/font/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
- package/__mf/font/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
- package/__mf/font/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
- package/__mf/font/inter-latin-ext-600-normal.49faa47a.woff +0 -0
- package/__mf/font/inter-latin-ext-700-normal.93534b50.woff +0 -0
- package/__mf/font/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
- package/__mf/font/inter-latin-ext-900-normal.0efdb307.woff +0 -0
- package/__mf/font/inter-latin-ext-900-normal.9c0fc2c7.woff2 +0 -0
- package/__mf/font/inter-vietnamese-300-normal.aad496d8.woff +0 -0
- package/__mf/font/inter-vietnamese-300-normal.ad9ef503.woff2 +0 -0
- package/__mf/font/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
- package/__mf/font/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
- package/__mf/font/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
- package/__mf/font/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
- package/__mf/font/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
- package/__mf/font/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
- package/__mf/font/inter-vietnamese-700-normal.bc68b199.woff +0 -0
- package/__mf/font/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
- package/__mf/font/inter-vietnamese-900-normal.2b782045.woff +0 -0
- package/__mf/font/inter-vietnamese-900-normal.e639b65a.woff2 +0 -0
- package/__mf/js/TimeSeriesChart.7df900ef.js +7 -0
- package/__mf/js/async/121.df4898d6.js +2 -0
- package/__mf/js/async/177.56f1be10.js +1 -0
- package/__mf/js/async/192.beef3a1a.js +1 -0
- package/__mf/js/async/2.c3740bb9.js +1 -0
- package/__mf/js/async/235.c24f24f7.js +1 -0
- package/__mf/js/async/274.d112354f.js +2 -0
- package/__mf/js/async/356.9f551c8a.js +1 -0
- package/__mf/js/async/366.084dd32e.js +24 -0
- package/__mf/js/async/377.7ec764e5.js +2 -0
- package/__mf/js/async/{544.4dd63985.js.LICENSE.txt → 377.7ec764e5.js.LICENSE.txt} +1 -1
- package/__mf/js/async/392.2350fb02.js +2 -0
- package/__mf/js/async/470.a4fd777e.js +2 -0
- package/__mf/js/async/491.6f81cf51.js +1 -0
- package/__mf/js/async/558.401fb679.js +1 -0
- package/__mf/js/async/587.c12780da.js +1 -0
- package/__mf/js/async/588.6662e16a.js +1 -0
- package/__mf/js/async/616.52acb1b4.js +1 -0
- package/__mf/js/async/702.de247ad8.js +2 -0
- package/__mf/js/async/71.84e486c9.js +1 -0
- package/__mf/js/async/721.88bf4be4.js +110 -0
- package/__mf/js/async/{390.ad50daba.js.LICENSE.txt → 721.88bf4be4.js.LICENSE.txt} +1 -1
- package/__mf/js/async/78.91de282a.js +1 -0
- package/__mf/js/async/826.c7b150c6.js +7 -0
- package/__mf/js/async/{472.fd3069f0.js.LICENSE.txt → 826.c7b150c6.js.LICENSE.txt} +19 -1
- package/__mf/js/async/873.9aad328a.js +1 -0
- package/__mf/js/async/891.18ba0e56.js +38 -0
- package/__mf/js/async/941.c0e2d25e.js +2 -0
- package/__mf/js/async/945.1a85358e.js +1 -0
- package/__mf/js/async/968.6de5fa7c.js +1 -0
- package/__mf/js/async/978.5c14e175.js +1 -0
- package/__mf/js/async/__federation_expose_TimeSeriesChart.0329eb0a.js +1 -0
- package/__mf/js/async/lib-router.1934857d.js +2 -0
- package/__mf/js/main.496219f9.js +7 -0
- package/lib/QuerySettingsEditor.d.ts.map +1 -1
- package/lib/QuerySettingsEditor.js +179 -167
- package/lib/QuerySettingsEditor.js.map +1 -1
- package/lib/TimeSeriesChartBase.d.ts.map +1 -1
- package/lib/TimeSeriesChartBase.js +12 -10
- package/lib/TimeSeriesChartBase.js.map +1 -1
- package/lib/cjs/QuerySettingsEditor.js +177 -165
- package/lib/cjs/TimeSeriesChartBase.js +10 -8
- package/lib/cjs/utils/timezone-formatter.js +48 -0
- package/lib/utils/timezone-formatter.d.ts +5 -0
- package/lib/utils/timezone-formatter.d.ts.map +1 -0
- package/lib/utils/timezone-formatter.js +42 -0
- package/lib/utils/timezone-formatter.js.map +1 -0
- package/mf-manifest.json +63 -52
- package/mf-stats.json +75 -56
- package/package.json +3 -3
- package/__mf/css/async/442.d3010b86.css +0 -1
- package/__mf/css/async/61.d3010b86.css +0 -1
- package/__mf/css/async/823.d3010b86.css +0 -1
- package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
- package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
- package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
- package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
- package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
- package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
- package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
- package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
- package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
- package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
- package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
- package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
- package/__mf/js/TimeSeriesChart.734ed3ec.js +0 -6
- package/__mf/js/async/121.a742c022.js +0 -2
- package/__mf/js/async/177.97e14ed0.js +0 -1
- package/__mf/js/async/192.30450189.js +0 -1
- package/__mf/js/async/2.68ee9e1b.js +0 -1
- package/__mf/js/async/235.a53a2591.js +0 -1
- package/__mf/js/async/274.8e8950b6.js +0 -2
- package/__mf/js/async/356.dee0f34a.js +0 -1
- package/__mf/js/async/390.ad50daba.js +0 -110
- package/__mf/js/async/392.550376f0.js +0 -2
- package/__mf/js/async/470.4c93905a.js +0 -2
- package/__mf/js/async/472.fd3069f0.js +0 -7
- package/__mf/js/async/489.8bb61ec9.js +0 -1
- package/__mf/js/async/491.35fc6280.js +0 -1
- package/__mf/js/async/544.4dd63985.js +0 -2
- package/__mf/js/async/558.5a41ebcc.js +0 -1
- package/__mf/js/async/587.40becf9b.js +0 -1
- package/__mf/js/async/588.33924c3f.js +0 -1
- package/__mf/js/async/616.6d37f37b.js +0 -1
- package/__mf/js/async/634.8646a5de.js +0 -24
- package/__mf/js/async/702.5d93a78a.js +0 -2
- package/__mf/js/async/71.e481dbdb.js +0 -1
- package/__mf/js/async/78.362ece9d.js +0 -1
- package/__mf/js/async/867.12a42f78.js +0 -38
- package/__mf/js/async/873.11e0e15e.js +0 -1
- package/__mf/js/async/941.5331fb70.js +0 -2
- package/__mf/js/async/968.2ea36b8a.js +0 -1
- package/__mf/js/async/978.844227d5.js +0 -1
- package/__mf/js/async/__federation_expose_TimeSeriesChart.54276867.js +0 -1
- package/__mf/js/async/lib-router.9730f5e9.js +0 -2
- package/__mf/js/main.22e0e85a.js +0 -6
- /package/__mf/js/async/{121.a742c022.js.LICENSE.txt → 121.df4898d6.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{274.8e8950b6.js.LICENSE.txt → 274.d112354f.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{634.8646a5de.js.LICENSE.txt → 366.084dd32e.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{392.550376f0.js.LICENSE.txt → 392.2350fb02.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{470.4c93905a.js.LICENSE.txt → 470.a4fd777e.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{702.5d93a78a.js.LICENSE.txt → 702.de247ad8.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{941.5331fb70.js.LICENSE.txt → 941.c0e2d25e.js.LICENSE.txt} +0 -0
- /package/__mf/js/async/{lib-router.9730f5e9.js.LICENSE.txt → lib-router.1934857d.js.LICENSE.txt} +0 -0
|
@@ -12,14 +12,14 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
import { Box, Button, IconButton, Menu, MenuItem, Slider, Stack, TextField, ToggleButton, ToggleButtonGroup, Typography, useTheme } from '@mui/material';
|
|
15
|
-
import {
|
|
15
|
+
import { FormatControls, OptionsColorPicker } from '@perses-dev/components';
|
|
16
16
|
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
17
17
|
import DeleteIcon from 'mdi-material-ui/DeleteOutline';
|
|
18
18
|
import AddIcon from 'mdi-material-ui/Plus';
|
|
19
19
|
import CloseIcon from 'mdi-material-ui/Close';
|
|
20
20
|
import { produce } from 'immer';
|
|
21
21
|
import { useQueryCountContext } from '@perses-dev/plugin-system';
|
|
22
|
-
import { DEFAULT_AREA_OPACITY,
|
|
22
|
+
import { DEFAULT_AREA_OPACITY, LINE_STYLE_CONFIG, OPACITY_CONFIG } from './time-series-chart-model';
|
|
23
23
|
const DEFAULT_COLOR_VALUE = '#555';
|
|
24
24
|
const NO_INDEX_AVAILABLE = -1; // invalid array index value used to represent the fact that no query index is available
|
|
25
25
|
export function QuerySettingsEditor(props) {
|
|
@@ -156,19 +156,20 @@ export function QuerySettingsEditor(props) {
|
|
|
156
156
|
qs.areaOpacity = undefined;
|
|
157
157
|
});
|
|
158
158
|
};
|
|
159
|
-
const
|
|
159
|
+
const addFormat = (i)=>{
|
|
160
160
|
updateQuerySettings(i, (qs)=>{
|
|
161
161
|
qs.format = {
|
|
162
|
-
unit: 'decimal'
|
|
162
|
+
unit: 'decimal',
|
|
163
|
+
shortValues: true
|
|
163
164
|
};
|
|
164
165
|
});
|
|
165
166
|
};
|
|
166
|
-
const
|
|
167
|
+
const removeFormat = (i)=>{
|
|
167
168
|
updateQuerySettings(i, (qs)=>{
|
|
168
169
|
qs.format = undefined;
|
|
169
170
|
});
|
|
170
171
|
};
|
|
171
|
-
const
|
|
172
|
+
const handleFormatChange = (i, format)=>{
|
|
172
173
|
updateQuerySettings(i, (qs)=>{
|
|
173
174
|
qs.format = format;
|
|
174
175
|
});
|
|
@@ -232,9 +233,9 @@ export function QuerySettingsEditor(props) {
|
|
|
232
233
|
onRemoveLineStyle: ()=>removeLineStyle(i),
|
|
233
234
|
onAddAreaOpacity: ()=>addAreaOpacity(i),
|
|
234
235
|
onRemoveAreaOpacity: ()=>removeAreaOpacity(i),
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
onAddFormat: ()=>addFormat(i),
|
|
237
|
+
onRemoveFormat: ()=>removeFormat(i),
|
|
238
|
+
onFormatChange: (format)=>handleFormatChange(i, format)
|
|
238
239
|
}, i)),
|
|
239
240
|
queryCount > 0 && firstAvailableQueryIndex !== NO_INDEX_AVAILABLE && /*#__PURE__*/ _jsx(Button, {
|
|
240
241
|
variant: "contained",
|
|
@@ -248,7 +249,7 @@ export function QuerySettingsEditor(props) {
|
|
|
248
249
|
]
|
|
249
250
|
});
|
|
250
251
|
}
|
|
251
|
-
function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity, format }, availableQueryIndexes, onQueryIndexChange, onColorModeChange, onColorValueChange, onLineStyleChange, onAreaOpacityChange, onDelete, inputRef, onAddColor: onAddColor, onRemoveColor: onRemoveColor, onAddLineStyle, onRemoveLineStyle, onAddAreaOpacity, onRemoveAreaOpacity,
|
|
252
|
+
function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity, format }, availableQueryIndexes, onQueryIndexChange, onColorModeChange, onColorValueChange, onLineStyleChange, onAreaOpacityChange, onDelete, inputRef, onAddColor: onAddColor, onRemoveColor: onRemoveColor, onAddLineStyle, onRemoveLineStyle, onAddAreaOpacity, onRemoveAreaOpacity, onAddFormat, onRemoveFormat, onFormatChange }) {
|
|
252
253
|
// current query index should also be selectable
|
|
253
254
|
const selectableQueryIndexes = availableQueryIndexes.concat(queryIndex).sort((a, b)=>a - b);
|
|
254
255
|
// State for dropdown menu
|
|
@@ -272,9 +273,9 @@ function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue
|
|
|
272
273
|
action: onAddAreaOpacity
|
|
273
274
|
});
|
|
274
275
|
if (format === undefined) options.push({
|
|
275
|
-
key: '
|
|
276
|
-
label: '
|
|
277
|
-
action:
|
|
276
|
+
key: 'format',
|
|
277
|
+
label: 'Format',
|
|
278
|
+
action: onAddFormat
|
|
278
279
|
});
|
|
279
280
|
return options;
|
|
280
281
|
}, [
|
|
@@ -285,7 +286,7 @@ function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue
|
|
|
285
286
|
onAddColor,
|
|
286
287
|
onAddLineStyle,
|
|
287
288
|
onAddAreaOpacity,
|
|
288
|
-
|
|
289
|
+
onAddFormat
|
|
289
290
|
]);
|
|
290
291
|
const handleAddMenuClick = (event)=>{
|
|
291
292
|
if (availableOptions.length === 1 && availableOptions[0]) {
|
|
@@ -303,172 +304,183 @@ function QuerySettingsInput({ querySettings: { queryIndex, colorMode, colorValue
|
|
|
303
304
|
action();
|
|
304
305
|
handleMenuClose();
|
|
305
306
|
};
|
|
306
|
-
return /*#__PURE__*/
|
|
307
|
+
return /*#__PURE__*/ _jsxs(Stack, {
|
|
307
308
|
sx: {
|
|
308
309
|
borderBottom: '1px solid',
|
|
309
310
|
borderColor: 'divider',
|
|
310
311
|
borderRadius: 1,
|
|
311
|
-
p: 2
|
|
312
|
+
p: 2,
|
|
313
|
+
display: 'flex',
|
|
314
|
+
flexWrap: 'nowrap',
|
|
315
|
+
flexDirection: 'row'
|
|
312
316
|
},
|
|
313
|
-
children:
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
},
|
|
330
|
-
children: selectableQueryIndexes.map((qi)=>/*#__PURE__*/ _jsxs(MenuItem, {
|
|
331
|
-
value: qi,
|
|
332
|
-
children: [
|
|
333
|
-
"#",
|
|
334
|
-
qi + 1
|
|
335
|
-
]
|
|
336
|
-
}, `query-${qi}`))
|
|
337
|
-
}),
|
|
338
|
-
colorMode && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
339
|
-
label: "Color",
|
|
340
|
-
onRemove: onRemoveColor,
|
|
341
|
-
children: [
|
|
342
|
-
/*#__PURE__*/ _jsxs(TextField, {
|
|
343
|
-
select: true,
|
|
344
|
-
value: colorMode,
|
|
345
|
-
onChange: onColorModeChange,
|
|
346
|
-
size: "small",
|
|
347
|
-
sx: {
|
|
348
|
-
flexGrow: 1
|
|
349
|
-
},
|
|
350
|
-
children: [
|
|
351
|
-
/*#__PURE__*/ _jsx(MenuItem, {
|
|
352
|
-
value: "fixed-single",
|
|
353
|
-
children: "Fixed (single)"
|
|
354
|
-
}),
|
|
355
|
-
/*#__PURE__*/ _jsx(MenuItem, {
|
|
356
|
-
value: "fixed",
|
|
357
|
-
children: "Fixed"
|
|
358
|
-
})
|
|
359
|
-
]
|
|
360
|
-
}),
|
|
361
|
-
/*#__PURE__*/ _jsx(OptionsColorPicker, {
|
|
362
|
-
label: `Query n°${queryIndex + 1}`,
|
|
363
|
-
color: colorValue || DEFAULT_COLOR_VALUE,
|
|
364
|
-
onColorChange: onColorValueChange
|
|
365
|
-
})
|
|
366
|
-
]
|
|
367
|
-
}),
|
|
368
|
-
lineStyle && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
369
|
-
label: "Line Style",
|
|
370
|
-
onRemove: onRemoveLineStyle,
|
|
371
|
-
children: [
|
|
372
|
-
/*#__PURE__*/ _jsx(ToggleButtonGroup, {
|
|
373
|
-
color: "primary",
|
|
374
|
-
exclusive: true,
|
|
375
|
-
value: lineStyle,
|
|
376
|
-
onChange: (__, newValue)=>{
|
|
377
|
-
if (newValue !== null) {
|
|
378
|
-
onLineStyleChange(newValue);
|
|
379
|
-
}
|
|
380
|
-
},
|
|
381
|
-
size: "small",
|
|
382
|
-
children: Object.entries(LINE_STYLE_CONFIG).map(([styleValue, config])=>/*#__PURE__*/ _jsx(ToggleButton, {
|
|
383
|
-
value: styleValue,
|
|
384
|
-
"aria-label": `${styleValue} line style`,
|
|
385
|
-
children: config.label
|
|
386
|
-
}, styleValue))
|
|
387
|
-
}),
|
|
388
|
-
/*#__PURE__*/ _jsx(Box, {
|
|
389
|
-
sx: {
|
|
390
|
-
flexGrow: 1
|
|
391
|
-
}
|
|
392
|
-
})
|
|
393
|
-
]
|
|
394
|
-
}),
|
|
395
|
-
areaOpacity !== undefined && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
396
|
-
label: "Opacity",
|
|
397
|
-
onRemove: onRemoveAreaOpacity,
|
|
398
|
-
children: [
|
|
399
|
-
/*#__PURE__*/ _jsx(Box, {}),
|
|
400
|
-
/*#__PURE__*/ _jsx(Slider, {
|
|
401
|
-
value: areaOpacity,
|
|
402
|
-
valueLabelDisplay: "auto",
|
|
403
|
-
step: OPACITY_CONFIG.step,
|
|
404
|
-
marks: true,
|
|
405
|
-
min: OPACITY_CONFIG.min,
|
|
406
|
-
max: OPACITY_CONFIG.max,
|
|
407
|
-
onChange: onAreaOpacityChange,
|
|
408
|
-
sx: {
|
|
409
|
-
flexGrow: 1
|
|
410
|
-
}
|
|
411
|
-
})
|
|
412
|
-
]
|
|
413
|
-
}),
|
|
414
|
-
format !== undefined && /*#__PURE__*/ _jsx(SettingsSection, {
|
|
415
|
-
label: "Unit",
|
|
416
|
-
onRemove: onRemoveUnit,
|
|
417
|
-
children: /*#__PURE__*/ _jsx(Box, {
|
|
317
|
+
children: [
|
|
318
|
+
/*#__PURE__*/ _jsxs(Stack, {
|
|
319
|
+
direction: "row",
|
|
320
|
+
alignItems: "center",
|
|
321
|
+
sx: {
|
|
322
|
+
flexWrap: 'wrap',
|
|
323
|
+
gap: 2,
|
|
324
|
+
flexGrow: 1
|
|
325
|
+
},
|
|
326
|
+
children: [
|
|
327
|
+
/*#__PURE__*/ _jsx(TextField, {
|
|
328
|
+
select: true,
|
|
329
|
+
inputRef: inputRef,
|
|
330
|
+
value: queryIndex,
|
|
331
|
+
label: "Query",
|
|
332
|
+
onChange: onQueryIndexChange,
|
|
418
333
|
sx: {
|
|
419
|
-
minWidth: '
|
|
334
|
+
minWidth: '75px'
|
|
420
335
|
},
|
|
421
|
-
children:
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
336
|
+
children: selectableQueryIndexes.map((qi)=>/*#__PURE__*/ _jsxs(MenuItem, {
|
|
337
|
+
value: qi,
|
|
338
|
+
children: [
|
|
339
|
+
"#",
|
|
340
|
+
qi + 1
|
|
341
|
+
]
|
|
342
|
+
}, `query-${qi}`))
|
|
343
|
+
}),
|
|
344
|
+
colorMode && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
345
|
+
label: "Color",
|
|
346
|
+
onRemove: onRemoveColor,
|
|
347
|
+
children: [
|
|
348
|
+
/*#__PURE__*/ _jsxs(TextField, {
|
|
349
|
+
select: true,
|
|
350
|
+
value: colorMode,
|
|
351
|
+
onChange: onColorModeChange,
|
|
352
|
+
size: "small",
|
|
353
|
+
sx: {
|
|
354
|
+
flexGrow: 1
|
|
355
|
+
},
|
|
356
|
+
children: [
|
|
357
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
358
|
+
value: "fixed-single",
|
|
359
|
+
children: "Fixed (single)"
|
|
360
|
+
}),
|
|
361
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
362
|
+
value: "fixed",
|
|
363
|
+
children: "Fixed"
|
|
364
|
+
})
|
|
365
|
+
]
|
|
366
|
+
}),
|
|
367
|
+
/*#__PURE__*/ _jsx(OptionsColorPicker, {
|
|
368
|
+
label: `Query n°${queryIndex + 1}`,
|
|
369
|
+
color: colorValue || DEFAULT_COLOR_VALUE,
|
|
370
|
+
onColorChange: onColorValueChange
|
|
371
|
+
})
|
|
372
|
+
]
|
|
373
|
+
}),
|
|
374
|
+
lineStyle && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
375
|
+
label: "Line Style",
|
|
376
|
+
onRemove: onRemoveLineStyle,
|
|
377
|
+
children: [
|
|
378
|
+
/*#__PURE__*/ _jsx(ToggleButtonGroup, {
|
|
379
|
+
color: "primary",
|
|
380
|
+
exclusive: true,
|
|
381
|
+
value: lineStyle,
|
|
382
|
+
onChange: (__, newValue)=>{
|
|
383
|
+
if (newValue !== null) {
|
|
384
|
+
onLineStyleChange(newValue);
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
size: "small",
|
|
388
|
+
children: Object.entries(LINE_STYLE_CONFIG).map(([styleValue, config])=>/*#__PURE__*/ _jsx(ToggleButton, {
|
|
389
|
+
value: styleValue,
|
|
390
|
+
"aria-label": `${styleValue} line style`,
|
|
391
|
+
children: config.label
|
|
392
|
+
}, styleValue))
|
|
393
|
+
}),
|
|
394
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
395
|
+
sx: {
|
|
396
|
+
flexGrow: 1
|
|
397
|
+
}
|
|
398
|
+
})
|
|
399
|
+
]
|
|
400
|
+
}),
|
|
401
|
+
areaOpacity !== undefined && /*#__PURE__*/ _jsxs(SettingsSection, {
|
|
402
|
+
label: "Opacity",
|
|
403
|
+
onRemove: onRemoveAreaOpacity,
|
|
404
|
+
children: [
|
|
405
|
+
/*#__PURE__*/ _jsx(Box, {}),
|
|
406
|
+
/*#__PURE__*/ _jsx(Slider, {
|
|
407
|
+
value: areaOpacity,
|
|
408
|
+
valueLabelDisplay: "auto",
|
|
409
|
+
step: OPACITY_CONFIG.step,
|
|
410
|
+
marks: true,
|
|
411
|
+
min: OPACITY_CONFIG.min,
|
|
412
|
+
max: OPACITY_CONFIG.max,
|
|
413
|
+
onChange: onAreaOpacityChange,
|
|
414
|
+
sx: {
|
|
415
|
+
flexGrow: 1
|
|
416
|
+
}
|
|
417
|
+
})
|
|
418
|
+
]
|
|
419
|
+
}),
|
|
420
|
+
format !== undefined && /*#__PURE__*/ _jsx(SettingsSection, {
|
|
421
|
+
label: "Format",
|
|
422
|
+
onRemove: onRemoveFormat,
|
|
423
|
+
children: /*#__PURE__*/ _jsx(Box, {
|
|
424
|
+
sx: {
|
|
425
|
+
minWidth: '180px',
|
|
426
|
+
display: 'flex',
|
|
427
|
+
gap: 1,
|
|
428
|
+
flexDirection: 'column'
|
|
441
429
|
},
|
|
442
|
-
children:
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
},
|
|
447
|
-
children: [
|
|
448
|
-
/*#__PURE__*/ _jsx(AddIcon, {
|
|
449
|
-
sx: {
|
|
450
|
-
mr: 1,
|
|
451
|
-
fontSize: '1rem'
|
|
452
|
-
}
|
|
453
|
-
}),
|
|
454
|
-
option.label
|
|
455
|
-
]
|
|
456
|
-
}, option.key))
|
|
430
|
+
children: /*#__PURE__*/ _jsx(FormatControls, {
|
|
431
|
+
value: format,
|
|
432
|
+
onChange: onFormatChange
|
|
433
|
+
})
|
|
457
434
|
})
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
435
|
+
}),
|
|
436
|
+
availableOptions.length > 0 && /*#__PURE__*/ _jsxs(_Fragment, {
|
|
437
|
+
children: [
|
|
438
|
+
/*#__PURE__*/ _jsx(IconButton, {
|
|
439
|
+
onClick: handleAddMenuClick,
|
|
440
|
+
"aria-label": "Add option",
|
|
441
|
+
children: /*#__PURE__*/ _jsx(AddIcon, {})
|
|
442
|
+
}),
|
|
443
|
+
/*#__PURE__*/ _jsx(Menu, {
|
|
444
|
+
anchorEl: anchorEl,
|
|
445
|
+
open: Boolean(anchorEl),
|
|
446
|
+
onClose: handleMenuClose,
|
|
447
|
+
anchorOrigin: {
|
|
448
|
+
vertical: 'bottom',
|
|
449
|
+
horizontal: 'left'
|
|
450
|
+
},
|
|
451
|
+
children: availableOptions.map((option)=>/*#__PURE__*/ _jsxs(MenuItem, {
|
|
452
|
+
onClick: ()=>handleMenuItemClick(option.action),
|
|
453
|
+
sx: {
|
|
454
|
+
minWidth: '120px'
|
|
455
|
+
},
|
|
456
|
+
children: [
|
|
457
|
+
/*#__PURE__*/ _jsx(AddIcon, {
|
|
458
|
+
sx: {
|
|
459
|
+
mr: 1,
|
|
460
|
+
fontSize: '1rem'
|
|
461
|
+
}
|
|
462
|
+
}),
|
|
463
|
+
option.label
|
|
464
|
+
]
|
|
465
|
+
}, option.key))
|
|
466
|
+
})
|
|
467
|
+
]
|
|
468
|
+
})
|
|
469
|
+
]
|
|
470
|
+
}),
|
|
471
|
+
/*#__PURE__*/ _jsx(Box, {
|
|
472
|
+
sx: {
|
|
473
|
+
display: 'flex',
|
|
474
|
+
alignItems: 'center',
|
|
475
|
+
justifyContent: 'center'
|
|
476
|
+
},
|
|
477
|
+
children: /*#__PURE__*/ _jsx(IconButton, {
|
|
466
478
|
"aria-label": `delete settings for query n°${queryIndex + 1}`,
|
|
467
479
|
onClick: onDelete,
|
|
468
480
|
children: /*#__PURE__*/ _jsx(DeleteIcon, {})
|
|
469
481
|
})
|
|
470
|
-
|
|
471
|
-
|
|
482
|
+
})
|
|
483
|
+
]
|
|
472
484
|
});
|
|
473
485
|
}
|
|
474
486
|
// Reusable section component
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/QuerySettingsEditor.tsx"],"sourcesContent":["// Copyright 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, UnitSelector } from '@perses-dev/components';\nimport { FormatOptions } from '@perses-dev/core';\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[]): void => {\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 addUnit = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = { unit: 'decimal' };\n });\n };\n\n const removeUnit = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = undefined;\n });\n };\n\n const handleUnitChange = (i: number, format?: FormatOptions): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = format;\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 onAddUnit={() => addUnit(i)}\n onRemoveUnit={() => removeUnit(i)}\n onUnitChange={(format) => handleUnitChange(i, format)}\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 onAddUnit: () => void;\n onRemoveUnit: () => void;\n onUnitChange: (format?: FormatOptions) => void;\n}\n\nfunction QuerySettingsInput({\n querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity, format },\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 onAddUnit,\n onRemoveUnit,\n onUnitChange,\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 if (format === undefined) options.push({ key: 'unit', label: 'Unit', action: onAddUnit });\n return options;\n }, [colorMode, lineStyle, areaOpacity, format, onAddColor, onAddLineStyle, onAddAreaOpacity, onAddUnit]);\n\n const handleAddMenuClick = (event: React.MouseEvent<HTMLElement>): void => {\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 = (): void => {\n setAnchorEl(null);\n };\n\n const handleMenuItemClick = (action: () => void): void => {\n action();\n handleMenuClose();\n };\n\n return (\n <Stack sx={{ borderBottom: '1px solid', borderColor: 'divider', borderRadius: 1, p: 2 }}>\n <Stack direction=\"row\" alignItems=\"center\" sx={{ flexWrap: 'wrap', gap: 2 }}>\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 {/* Unit section */}\n {format !== undefined && (\n <SettingsSection label=\"Unit\" onRemove={onRemoveUnit}>\n <Box sx={{ minWidth: '180px' }}>\n <UnitSelector value={format} onChange={onUnitChange} />\n </Box>\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","UnitSelector","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","addUnit","format","unit","removeUnit","handleUnitChange","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","onAddUnit","onRemoveUnit","onUnitChange","variant","startIcon","sx","marginTop","onClick","selectableQueryIndexes","concat","sort","a","b","anchorEl","setAnchorEl","availableOptions","options","key","label","action","handleAddMenuClick","currentTarget","handleMenuClose","handleMenuItemClick","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","spacing","border"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/QuerySettingsEditor.tsx"],"sourcesContent":["// Copyright 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 { FormatControls, OptionsColorPicker } from '@perses-dev/components';\nimport { FormatOptions } from '@perses-dev/core';\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 DEFAULT_AREA_OPACITY,\n LINE_STYLE_CONFIG,\n OPACITY_CONFIG,\n QuerySettingsOptions,\n TimeSeriesChartOptions,\n TimeSeriesChartOptionsEditorProps,\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[]): void => {\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 addFormat = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = { unit: 'decimal', shortValues: true };\n });\n };\n\n const removeFormat = (i: number): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = undefined;\n });\n };\n\n const handleFormatChange = (i: number, format?: FormatOptions): void => {\n updateQuerySettings(i, (qs) => {\n qs.format = format;\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 onAddFormat={() => addFormat(i)}\n onRemoveFormat={() => removeFormat(i)}\n onFormatChange={(format) => handleFormatChange(i, format)}\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 onAddFormat: () => void;\n onRemoveFormat: () => void;\n onFormatChange: (format?: FormatOptions) => void;\n}\n\nfunction QuerySettingsInput({\n querySettings: { queryIndex, colorMode, colorValue, lineStyle, areaOpacity, format },\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 onAddFormat,\n onRemoveFormat,\n onFormatChange,\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 if (format === undefined) options.push({ key: 'format', label: 'Format', action: onAddFormat });\n return options;\n }, [colorMode, lineStyle, areaOpacity, format, onAddColor, onAddLineStyle, onAddAreaOpacity, onAddFormat]);\n\n const handleAddMenuClick = (event: React.MouseEvent<HTMLElement>): void => {\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 = (): void => {\n setAnchorEl(null);\n };\n\n const handleMenuItemClick = (action: () => void): void => {\n action();\n handleMenuClose();\n };\n\n return (\n <Stack\n sx={{\n borderBottom: '1px solid',\n borderColor: 'divider',\n borderRadius: 1,\n p: 2,\n display: 'flex',\n flexWrap: 'nowrap',\n flexDirection: 'row',\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" sx={{ flexWrap: 'wrap', gap: 2, flexGrow: 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 {/* Format section */}\n {format !== undefined && (\n <SettingsSection label=\"Format\" onRemove={onRemoveFormat}>\n <Box sx={{ minWidth: '180px', display: 'flex', gap: 1, flexDirection: 'column' }}>\n <FormatControls value={format} onChange={onFormatChange} />\n </Box>\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 </Stack>\n {/* Delete Button for this query settings */}\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <IconButton aria-label={`delete settings for query n°${queryIndex + 1}`} onClick={onDelete}>\n <DeleteIcon />\n </IconButton>\n </Box>\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","FormatControls","OptionsColorPicker","React","useEffect","useMemo","useRef","useState","DeleteIcon","AddIcon","CloseIcon","produce","useQueryCountContext","DEFAULT_AREA_OPACITY","LINE_STYLE_CONFIG","OPACITY_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","addFormat","format","unit","shortValues","removeFormat","handleFormatChange","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","onAddFormat","onRemoveFormat","onFormatChange","variant","startIcon","sx","marginTop","onClick","selectableQueryIndexes","concat","sort","a","b","anchorEl","setAnchorEl","availableOptions","options","key","label","action","handleAddMenuClick","currentTarget","handleMenuClose","handleMenuItemClick","borderBottom","borderColor","borderRadius","p","display","flexWrap","flexDirection","direction","alignItems","gap","flexGrow","select","minWidth","qi","SettingsSection","onRemove","size","onColorChange","exclusive","__","Object","entries","styleValue","config","aria-label","valueLabelDisplay","step","marks","min","max","open","Boolean","onClose","anchorOrigin","vertical","horizontal","option","mr","fontSize","justifyContent","children","theme","position","top","left","backgroundColor","palette","background","code","px","zIndex","spacing","border"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeSeriesChartBase.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChartBase.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAc,UAAU,
|
|
1
|
+
{"version":3,"file":"TimeSeriesChartBase.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChartBase.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAc,UAAU,EAA0E,MAAM,OAAO,CAAC;AAIvH,OAAO,EAAsB,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,oBAAoB,EAErB,MAAM,SAAS,CAAC;AAejB,OAAO,EACL,aAAa,EAab,sBAAsB,EAEtB,aAAa,EAGb,aAAa,EACd,MAAM,wBAAwB,CAAC;AAmBhC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,aAAa,EAAE,sBAAsB,CAAC;IACtC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAAC;IACtD,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;OAEG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,oCAAoC,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;CAC1F;AAED,eAAO,MAAM,mBAAmB,0GAkX9B,CAAC"}
|