@perses-dev/timeseries-chart-plugin 0.12.1 → 0.13.0-beta.1

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 (205) hide show
  1. package/__mf/css/async/907.85c2cbf6.css +1 -0
  2. package/__mf/font/inter-cyrillic-300-normal.432f2b21.woff +0 -0
  3. package/__mf/font/inter-cyrillic-300-normal.9da91009.woff2 +0 -0
  4. package/__mf/font/inter-cyrillic-400-normal.372704ff.woff2 +0 -0
  5. package/__mf/font/inter-cyrillic-400-normal.a6b6ef6f.woff +0 -0
  6. package/__mf/font/inter-cyrillic-500-normal.7c15bba8.woff2 +0 -0
  7. package/__mf/font/inter-cyrillic-500-normal.b9f8c929.woff +0 -0
  8. package/__mf/font/inter-cyrillic-600-normal.2f42892a.woff2 +0 -0
  9. package/__mf/font/inter-cyrillic-600-normal.c3987adc.woff +0 -0
  10. package/__mf/font/inter-cyrillic-700-normal.93eba3c3.woff +0 -0
  11. package/__mf/font/inter-cyrillic-700-normal.e9e5b2dc.woff2 +0 -0
  12. package/__mf/font/inter-cyrillic-900-normal.f285bd7a.woff2 +0 -0
  13. package/__mf/font/inter-cyrillic-900-normal.ffbd8a3a.woff +0 -0
  14. package/__mf/font/inter-cyrillic-ext-300-normal.95bb9038.woff2 +0 -0
  15. package/__mf/font/inter-cyrillic-ext-300-normal.cfc143a9.woff +0 -0
  16. package/__mf/font/inter-cyrillic-ext-400-normal.2a31c04b.woff +0 -0
  17. package/__mf/font/inter-cyrillic-ext-400-normal.f572b170.woff2 +0 -0
  18. package/__mf/font/inter-cyrillic-ext-500-normal.5a6bb1da.woff +0 -0
  19. package/__mf/font/inter-cyrillic-ext-500-normal.fe0d9b14.woff2 +0 -0
  20. package/__mf/font/inter-cyrillic-ext-600-normal.ecbdecad.woff +0 -0
  21. package/__mf/font/inter-cyrillic-ext-600-normal.f7b3c15b.woff2 +0 -0
  22. package/__mf/font/inter-cyrillic-ext-700-normal.4b4022a6.woff +0 -0
  23. package/__mf/font/inter-cyrillic-ext-700-normal.74b516d2.woff2 +0 -0
  24. package/__mf/font/inter-cyrillic-ext-900-normal.9970ddb5.woff +0 -0
  25. package/__mf/font/inter-cyrillic-ext-900-normal.a0d59adc.woff2 +0 -0
  26. package/__mf/font/inter-greek-300-normal.0d7be683.woff2 +0 -0
  27. package/__mf/font/inter-greek-300-normal.8f0b988e.woff +0 -0
  28. package/__mf/font/inter-greek-400-normal.cc58c11b.woff +0 -0
  29. package/__mf/font/inter-greek-400-normal.d7020e3c.woff2 +0 -0
  30. package/__mf/font/inter-greek-500-normal.d9a33207.woff +0 -0
  31. package/__mf/font/inter-greek-500-normal.f41f43db.woff2 +0 -0
  32. package/__mf/font/inter-greek-600-normal.4ec0c1c1.woff +0 -0
  33. package/__mf/font/inter-greek-600-normal.cc532937.woff2 +0 -0
  34. package/__mf/font/inter-greek-700-normal.5ec6c758.woff +0 -0
  35. package/__mf/font/inter-greek-700-normal.97f0eeeb.woff2 +0 -0
  36. package/__mf/font/inter-greek-900-normal.46b66369.woff2 +0 -0
  37. package/__mf/font/inter-greek-900-normal.9ae3a3c5.woff +0 -0
  38. package/__mf/font/inter-greek-ext-300-normal.10247a66.woff2 +0 -0
  39. package/__mf/font/inter-greek-ext-300-normal.4668e5cb.woff +0 -0
  40. package/__mf/font/inter-greek-ext-400-normal.4ce1df5d.woff2 +0 -0
  41. package/__mf/font/inter-greek-ext-400-normal.88ede1ea.woff +0 -0
  42. package/__mf/font/inter-greek-ext-500-normal.7a4aa726.woff +0 -0
  43. package/__mf/font/inter-greek-ext-500-normal.cbd51e2d.woff2 +0 -0
  44. package/__mf/font/inter-greek-ext-600-normal.089a95ee.woff +0 -0
  45. package/__mf/font/inter-greek-ext-600-normal.1f33d317.woff2 +0 -0
  46. package/__mf/font/inter-greek-ext-700-normal.31f1075d.woff +0 -0
  47. package/__mf/font/inter-greek-ext-700-normal.827cd618.woff2 +0 -0
  48. package/__mf/font/inter-greek-ext-900-normal.531bcee7.woff +0 -0
  49. package/__mf/font/inter-greek-ext-900-normal.8a9b36b9.woff2 +0 -0
  50. package/__mf/font/inter-latin-300-normal.15fb600d.woff2 +0 -0
  51. package/__mf/font/inter-latin-300-normal.6f95f590.woff +0 -0
  52. package/__mf/font/inter-latin-400-normal.2c7a775c.woff +0 -0
  53. package/__mf/font/inter-latin-400-normal.ef6d3f52.woff2 +0 -0
  54. package/__mf/font/inter-latin-500-normal.b7b43ace.woff2 +0 -0
  55. package/__mf/font/inter-latin-500-normal.cb4c8ceb.woff +0 -0
  56. package/__mf/font/inter-latin-600-normal.8fb1a964.woff2 +0 -0
  57. package/__mf/font/inter-latin-600-normal.ce0f5f43.woff +0 -0
  58. package/__mf/font/inter-latin-700-normal.953b7aa5.woff2 +0 -0
  59. package/__mf/font/inter-latin-700-normal.9c21d4dc.woff +0 -0
  60. package/__mf/font/inter-latin-900-normal.2a8028ec.woff2 +0 -0
  61. package/__mf/font/inter-latin-900-normal.fa252135.woff +0 -0
  62. package/__mf/font/inter-latin-ext-300-normal.167cc8c9.woff2 +0 -0
  63. package/__mf/font/inter-latin-ext-300-normal.f695be66.woff +0 -0
  64. package/__mf/font/inter-latin-ext-400-normal.32a25442.woff2 +0 -0
  65. package/__mf/font/inter-latin-ext-400-normal.4edcaace.woff +0 -0
  66. package/__mf/font/inter-latin-ext-500-normal.a19a84a6.woff +0 -0
  67. package/__mf/font/inter-latin-ext-500-normal.d9b491de.woff2 +0 -0
  68. package/__mf/font/inter-latin-ext-600-normal.38b075d8.woff2 +0 -0
  69. package/__mf/font/inter-latin-ext-600-normal.49faa47a.woff +0 -0
  70. package/__mf/font/inter-latin-ext-700-normal.93534b50.woff +0 -0
  71. package/__mf/font/inter-latin-ext-700-normal.b63daa1a.woff2 +0 -0
  72. package/__mf/font/inter-latin-ext-900-normal.0efdb307.woff +0 -0
  73. package/__mf/font/inter-latin-ext-900-normal.9c0fc2c7.woff2 +0 -0
  74. package/__mf/font/inter-vietnamese-300-normal.aad496d8.woff +0 -0
  75. package/__mf/font/inter-vietnamese-300-normal.ad9ef503.woff2 +0 -0
  76. package/__mf/font/inter-vietnamese-400-normal.a9dd2faf.woff +0 -0
  77. package/__mf/font/inter-vietnamese-400-normal.de4fc44f.woff2 +0 -0
  78. package/__mf/font/inter-vietnamese-500-normal.7c0a695f.woff2 +0 -0
  79. package/__mf/font/inter-vietnamese-500-normal.a3a73b95.woff +0 -0
  80. package/__mf/font/inter-vietnamese-600-normal.9d518599.woff2 +0 -0
  81. package/__mf/font/inter-vietnamese-600-normal.c5ce3fcb.woff +0 -0
  82. package/__mf/font/inter-vietnamese-700-normal.bc68b199.woff +0 -0
  83. package/__mf/font/inter-vietnamese-700-normal.faf12809.woff2 +0 -0
  84. package/__mf/font/inter-vietnamese-900-normal.2b782045.woff +0 -0
  85. package/__mf/font/inter-vietnamese-900-normal.e639b65a.woff2 +0 -0
  86. package/__mf/js/TimeSeriesChart.f9dd142d.js +7 -0
  87. package/__mf/js/async/121.df4898d6.js +2 -0
  88. package/__mf/js/async/177.56f1be10.js +1 -0
  89. package/__mf/js/async/187.2cc43fac.js +24 -0
  90. package/__mf/js/async/192.beef3a1a.js +1 -0
  91. package/__mf/js/async/2.c3740bb9.js +1 -0
  92. package/__mf/js/async/235.c24f24f7.js +1 -0
  93. package/__mf/js/async/274.d112354f.js +2 -0
  94. package/__mf/js/async/356.9f551c8a.js +1 -0
  95. package/__mf/js/async/392.2350fb02.js +2 -0
  96. package/__mf/js/async/470.a4fd777e.js +2 -0
  97. package/__mf/js/async/491.6f81cf51.js +1 -0
  98. package/__mf/js/async/568.cdcaf97d.js +1 -0
  99. package/__mf/js/async/587.c12780da.js +1 -0
  100. package/__mf/js/async/588.6662e16a.js +1 -0
  101. package/__mf/js/async/616.52acb1b4.js +1 -0
  102. package/__mf/js/async/681.8d61b348.js +110 -0
  103. package/__mf/js/async/681.8d61b348.js.LICENSE.txt +27 -0
  104. package/__mf/js/async/702.de247ad8.js +2 -0
  105. package/__mf/js/async/71.84e486c9.js +1 -0
  106. package/__mf/js/async/724.3439df06.js +1 -0
  107. package/__mf/js/async/78.91de282a.js +1 -0
  108. package/__mf/js/async/780.12a33d06.js +39 -0
  109. package/__mf/js/async/{390.ad50daba.js.LICENSE.txt → 780.12a33d06.js.LICENSE.txt} +11 -23
  110. package/__mf/js/async/873.9aad328a.js +1 -0
  111. package/__mf/js/async/907.5ce8f69d.js +7 -0
  112. package/__mf/js/async/{472.fd3069f0.js.LICENSE.txt → 907.5ce8f69d.js.LICENSE.txt} +19 -1
  113. package/__mf/js/async/941.c0e2d25e.js +2 -0
  114. package/__mf/js/async/968.6de5fa7c.js +1 -0
  115. package/__mf/js/async/978.5c14e175.js +1 -0
  116. package/__mf/js/async/__federation_expose_TimeSeriesChart.d1167045.js +1 -0
  117. package/__mf/js/async/lib-router.1934857d.js +2 -0
  118. package/__mf/js/main.2bb9f3e3.js +7 -0
  119. package/lib/QuerySettingsEditor.d.ts.map +1 -1
  120. package/lib/QuerySettingsEditor.js +179 -167
  121. package/lib/QuerySettingsEditor.js.map +1 -1
  122. package/lib/TimeSeriesChartBase.d.ts +2 -2
  123. package/lib/TimeSeriesChartBase.d.ts.map +1 -1
  124. package/lib/TimeSeriesChartBase.js +12 -11
  125. package/lib/TimeSeriesChartBase.js.map +1 -1
  126. package/lib/TimeSeriesChartPanel.d.ts +1 -1
  127. package/lib/TimeSeriesChartPanel.d.ts.map +1 -1
  128. package/lib/TimeSeriesChartPanel.js +2 -3
  129. package/lib/TimeSeriesChartPanel.js.map +1 -1
  130. package/lib/cjs/QuerySettingsEditor.js +177 -165
  131. package/lib/cjs/TimeSeriesChartBase.js +13 -12
  132. package/lib/cjs/TimeSeriesChartPanel.js +4 -5
  133. package/lib/cjs/utils/data-transform.js +1 -2
  134. package/lib/cjs/utils/timezone-formatter.js +48 -0
  135. package/lib/test/mock-query-results.d.ts +1 -1
  136. package/lib/test/mock-query-results.js.map +1 -1
  137. package/lib/time-series-chart-model.d.ts +2 -1
  138. package/lib/time-series-chart-model.d.ts.map +1 -1
  139. package/lib/time-series-chart-model.js.map +1 -1
  140. package/lib/utils/data-transform.d.ts +2 -2
  141. package/lib/utils/data-transform.d.ts.map +1 -1
  142. package/lib/utils/data-transform.js +1 -2
  143. package/lib/utils/data-transform.js.map +1 -1
  144. package/lib/utils/timezone-formatter.d.ts +5 -0
  145. package/lib/utils/timezone-formatter.d.ts.map +1 -0
  146. package/lib/utils/timezone-formatter.js +42 -0
  147. package/lib/utils/timezone-formatter.js.map +1 -0
  148. package/mf-manifest.json +62 -52
  149. package/mf-stats.json +74 -56
  150. package/package.json +4 -4
  151. package/__mf/css/async/442.d3010b86.css +0 -1
  152. package/__mf/css/async/61.d3010b86.css +0 -1
  153. package/__mf/css/async/823.d3010b86.css +0 -1
  154. package/__mf/font/lato-all-300-normal.322bdf14.woff +0 -0
  155. package/__mf/font/lato-all-400-normal.63513b00.woff +0 -0
  156. package/__mf/font/lato-all-700-normal.bb27db94.woff +0 -0
  157. package/__mf/font/lato-all-900-normal.a27049a3.woff +0 -0
  158. package/__mf/font/lato-latin-300-normal.c5195215.woff2 +0 -0
  159. package/__mf/font/lato-latin-400-normal.b7ffde23.woff2 +0 -0
  160. package/__mf/font/lato-latin-700-normal.d5eb20bc.woff2 +0 -0
  161. package/__mf/font/lato-latin-900-normal.d884a71c.woff2 +0 -0
  162. package/__mf/font/lato-latin-ext-300-normal.abcc64a9.woff2 +0 -0
  163. package/__mf/font/lato-latin-ext-400-normal.6ebed106.woff2 +0 -0
  164. package/__mf/font/lato-latin-ext-700-normal.8697d1d5.woff2 +0 -0
  165. package/__mf/font/lato-latin-ext-900-normal.20a2b415.woff2 +0 -0
  166. package/__mf/js/TimeSeriesChart.734ed3ec.js +0 -6
  167. package/__mf/js/async/121.a742c022.js +0 -2
  168. package/__mf/js/async/177.97e14ed0.js +0 -1
  169. package/__mf/js/async/192.30450189.js +0 -1
  170. package/__mf/js/async/2.68ee9e1b.js +0 -1
  171. package/__mf/js/async/235.a53a2591.js +0 -1
  172. package/__mf/js/async/274.8e8950b6.js +0 -2
  173. package/__mf/js/async/356.dee0f34a.js +0 -1
  174. package/__mf/js/async/390.ad50daba.js +0 -110
  175. package/__mf/js/async/392.550376f0.js +0 -2
  176. package/__mf/js/async/470.4c93905a.js +0 -2
  177. package/__mf/js/async/472.fd3069f0.js +0 -7
  178. package/__mf/js/async/489.8bb61ec9.js +0 -1
  179. package/__mf/js/async/491.35fc6280.js +0 -1
  180. package/__mf/js/async/544.4dd63985.js +0 -2
  181. package/__mf/js/async/544.4dd63985.js.LICENSE.txt +0 -15
  182. package/__mf/js/async/558.5a41ebcc.js +0 -1
  183. package/__mf/js/async/587.40becf9b.js +0 -1
  184. package/__mf/js/async/588.33924c3f.js +0 -1
  185. package/__mf/js/async/616.6d37f37b.js +0 -1
  186. package/__mf/js/async/634.8646a5de.js +0 -24
  187. package/__mf/js/async/702.5d93a78a.js +0 -2
  188. package/__mf/js/async/71.e481dbdb.js +0 -1
  189. package/__mf/js/async/78.362ece9d.js +0 -1
  190. package/__mf/js/async/867.12a42f78.js +0 -38
  191. package/__mf/js/async/873.11e0e15e.js +0 -1
  192. package/__mf/js/async/941.5331fb70.js +0 -2
  193. package/__mf/js/async/968.2ea36b8a.js +0 -1
  194. package/__mf/js/async/978.844227d5.js +0 -1
  195. package/__mf/js/async/__federation_expose_TimeSeriesChart.54276867.js +0 -1
  196. package/__mf/js/async/lib-router.9730f5e9.js +0 -2
  197. package/__mf/js/main.22e0e85a.js +0 -6
  198. /package/__mf/js/async/{121.a742c022.js.LICENSE.txt → 121.df4898d6.js.LICENSE.txt} +0 -0
  199. /package/__mf/js/async/{634.8646a5de.js.LICENSE.txt → 187.2cc43fac.js.LICENSE.txt} +0 -0
  200. /package/__mf/js/async/{274.8e8950b6.js.LICENSE.txt → 274.d112354f.js.LICENSE.txt} +0 -0
  201. /package/__mf/js/async/{392.550376f0.js.LICENSE.txt → 392.2350fb02.js.LICENSE.txt} +0 -0
  202. /package/__mf/js/async/{470.4c93905a.js.LICENSE.txt → 470.a4fd777e.js.LICENSE.txt} +0 -0
  203. /package/__mf/js/async/{702.5d93a78a.js.LICENSE.txt → 702.de247ad8.js.LICENSE.txt} +0 -0
  204. /package/__mf/js/async/{941.5331fb70.js.LICENSE.txt → 941.c0e2d25e.js.LICENSE.txt} +0 -0
  205. /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 { OptionsColorPicker, UnitSelector } from '@perses-dev/components';
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, OPACITY_CONFIG, LINE_STYLE_CONFIG } from './time-series-chart-model';
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 addUnit = (i)=>{
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 removeUnit = (i)=>{
167
+ const removeFormat = (i)=>{
167
168
  updateQuerySettings(i, (qs)=>{
168
169
  qs.format = undefined;
169
170
  });
170
171
  };
171
- const handleUnitChange = (i, format)=>{
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
- onAddUnit: ()=>addUnit(i),
236
- onRemoveUnit: ()=>removeUnit(i),
237
- onUnitChange: (format)=>handleUnitChange(i, format)
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, onAddUnit, onRemoveUnit, onUnitChange }) {
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: 'unit',
276
- label: 'Unit',
277
- action: onAddUnit
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
- onAddUnit
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__*/ _jsx(Stack, {
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: /*#__PURE__*/ _jsxs(Stack, {
314
- direction: "row",
315
- alignItems: "center",
316
- sx: {
317
- flexWrap: 'wrap',
318
- gap: 2
319
- },
320
- children: [
321
- /*#__PURE__*/ _jsx(TextField, {
322
- select: true,
323
- inputRef: inputRef,
324
- value: queryIndex,
325
- label: "Query",
326
- onChange: onQueryIndexChange,
327
- sx: {
328
- minWidth: '75px'
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: '180px'
334
+ minWidth: '75px'
420
335
  },
421
- children: /*#__PURE__*/ _jsx(UnitSelector, {
422
- value: format,
423
- onChange: onUnitChange
424
- })
425
- })
426
- }),
427
- availableOptions.length > 0 && /*#__PURE__*/ _jsxs(_Fragment, {
428
- children: [
429
- /*#__PURE__*/ _jsx(IconButton, {
430
- onClick: handleAddMenuClick,
431
- "aria-label": "Add option",
432
- children: /*#__PURE__*/ _jsx(AddIcon, {})
433
- }),
434
- /*#__PURE__*/ _jsx(Menu, {
435
- anchorEl: anchorEl,
436
- open: Boolean(anchorEl),
437
- onClose: handleMenuClose,
438
- anchorOrigin: {
439
- vertical: 'bottom',
440
- horizontal: 'left'
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: availableOptions.map((option)=>/*#__PURE__*/ _jsxs(MenuItem, {
443
- onClick: ()=>handleMenuItemClick(option.action),
444
- sx: {
445
- minWidth: '120px'
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
- /*#__PURE__*/ _jsx(Box, {
461
- sx: {
462
- flexGrow: 1
463
- }
464
- }),
465
- /*#__PURE__*/ _jsx(IconButton, {
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, FormatOptions, 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 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,7 +1,7 @@
1
1
  import { MouseEvent } from 'react';
2
- import { TimeScale, FormatOptions, TimeSeries } from '@perses-dev/core';
3
2
  import type { EChartsCoreOption, GridComponentOption, YAXisComponentOption } from 'echarts';
4
- import { ChartInstance, TimeChartSeriesMapping, TooltipConfig, ZoomEventData } from '@perses-dev/components';
3
+ import { ChartInstance, FormatOptions, TimeChartSeriesMapping, TooltipConfig, ZoomEventData } from '@perses-dev/components';
4
+ import { TimeScale, TimeSeries } from '@perses-dev/spec';
5
5
  export interface TimeChartProps {
6
6
  height: number;
7
7
  data: TimeSeries[];
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSeriesChartBase.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChartBase.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAc,UAAU,EAA6D,MAAM,OAAO,CAAC;AAK1G,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,EAcb,sBAAsB,EAEtB,aAAa,EAGb,aAAa,EACd,MAAM,wBAAwB,CAAC;AAkBhC,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,0GA6W9B,CAAC"}
1
+ {"version":3,"file":"TimeSeriesChartBase.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesChartBase.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAc,UAAU,EAA0E,MAAM,OAAO,CAAC;AAKvH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEnB,oBAAoB,EAErB,MAAM,SAAS,CAAC;AAejB,OAAO,EACL,aAAa,EAQb,aAAa,EAOb,sBAAsB,EAEtB,aAAa,EAGb,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAkBzD,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"}