@perses-dev/plugin-system 0.38.0 → 0.40.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.
Files changed (274) hide show
  1. package/dist/cjs/components/CalculationSelector/CalculationSelector.js +6 -4
  2. package/dist/cjs/components/CalculationSelector/index.js +10 -8
  3. package/dist/cjs/components/DatasourceEditorForm/DatasourceEditorForm.js +380 -0
  4. package/dist/cjs/components/DatasourceEditorForm/index.js +30 -0
  5. package/dist/cjs/components/DatasourceSelect.js +119 -21
  6. package/dist/cjs/components/LegendOptionsEditor/LegendOptionsEditor.js +18 -16
  7. package/dist/cjs/components/LegendOptionsEditor/index.js +10 -8
  8. package/dist/cjs/components/OptionsEditorRadios/OptionsEditorRadios.js +69 -0
  9. package/dist/cjs/components/OptionsEditorRadios/index.js +30 -0
  10. package/dist/cjs/components/{OptionsEditorTabs/TabPanel.js → OptionsEditorTabPanel/OptionsEditorTabPanel.js} +8 -6
  11. package/dist/cjs/components/OptionsEditorTabPanel/index.js +30 -0
  12. package/dist/cjs/components/OptionsEditorTabs/OptionsEditorTabs.js +10 -8
  13. package/dist/cjs/components/OptionsEditorTabs/index.js +10 -8
  14. package/dist/cjs/components/PanelSpecEditor/PanelSpecEditor.js +13 -11
  15. package/dist/cjs/components/PanelSpecEditor/index.js +10 -8
  16. package/dist/cjs/components/PluginEditor/PluginEditor.js +24 -31
  17. package/dist/cjs/components/PluginEditor/index.js +11 -9
  18. package/dist/cjs/components/PluginEditor/plugin-editor-api.js +5 -3
  19. package/dist/cjs/components/PluginKindSelect/PluginKindSelect.js +23 -12
  20. package/dist/cjs/components/PluginKindSelect/index.js +10 -8
  21. package/dist/cjs/components/PluginRegistry/PluginRegistry.js +11 -9
  22. package/dist/cjs/components/PluginRegistry/index.js +10 -8
  23. package/dist/cjs/components/PluginRegistry/plugin-indexes.js +6 -2
  24. package/dist/cjs/components/PluginSpecEditor/PluginSpecEditor.js +6 -4
  25. package/dist/cjs/components/PluginSpecEditor/index.js +10 -8
  26. package/dist/cjs/components/TimeSeriesQueryEditor/TimeSeriesQueryEditor.js +15 -13
  27. package/dist/cjs/components/TimeSeriesQueryEditor/TimeSeriesQueryInput.js +21 -19
  28. package/dist/cjs/components/TimeSeriesQueryEditor/index.js +10 -8
  29. package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +256 -166
  30. package/dist/cjs/components/Variables/VariableEditorForm/VariablePreview.js +32 -28
  31. package/dist/cjs/components/Variables/VariableEditorForm/index.js +11 -9
  32. package/dist/cjs/components/Variables/VariableEditorForm/variable-editor-form-model.js +28 -32
  33. package/dist/cjs/components/Variables/index.js +11 -9
  34. package/dist/cjs/components/Variables/variable-model.js +17 -9
  35. package/dist/cjs/components/index.js +22 -18
  36. package/dist/cjs/constants/index.js +10 -8
  37. package/dist/cjs/constants/user-interface-text.js +3 -1
  38. package/dist/cjs/index.js +16 -13
  39. package/dist/cjs/model/index.js +17 -15
  40. package/dist/cjs/model/legend.js +32 -20
  41. package/dist/cjs/model/panels.js +2 -2
  42. package/dist/cjs/model/plugin-base.js +2 -2
  43. package/dist/cjs/model/plugin-loading.js +3 -1
  44. package/dist/cjs/runtime/DataQueriesProvider/DataQueriesProvider.js +55 -35
  45. package/dist/cjs/runtime/DataQueriesProvider/index.js +11 -9
  46. package/dist/cjs/runtime/DataQueriesProvider/model.js +61 -0
  47. package/dist/cjs/runtime/TimeRangeProvider/TimeRangeProvider.js +19 -11
  48. package/dist/cjs/runtime/TimeRangeProvider/index.js +11 -9
  49. package/dist/cjs/runtime/TimeRangeProvider/query-params.js +36 -18
  50. package/dist/cjs/runtime/builtin-variables.js +81 -0
  51. package/dist/cjs/runtime/datasources.js +29 -11
  52. package/dist/cjs/runtime/index.js +16 -13
  53. package/dist/cjs/runtime/plugin-registry.js +41 -11
  54. package/dist/cjs/runtime/template-variables.js +96 -4
  55. package/dist/cjs/runtime/time-series-queries.js +39 -27
  56. package/dist/cjs/stories/shared-utils/decorators/WithDataQueries.js +7 -5
  57. package/dist/cjs/stories/shared-utils/decorators/WithPluginRegistry.js +16 -14
  58. package/dist/cjs/stories/shared-utils/decorators/WithPluginSystemBuiltinVariables.js +42 -0
  59. package/dist/cjs/stories/shared-utils/decorators/WithPluginSystemDatasourceStore.js +19 -13
  60. package/dist/cjs/stories/shared-utils/decorators/WithPluginSystemTemplateVariables.js +6 -4
  61. package/dist/cjs/stories/shared-utils/decorators/WithTimeRange.js +7 -5
  62. package/dist/cjs/stories/shared-utils/decorators/index.js +15 -12
  63. package/dist/cjs/stories/shared-utils/index.js +10 -8
  64. package/dist/cjs/test/index.js +11 -8
  65. package/dist/cjs/test/mock-data.js +57 -0
  66. package/dist/cjs/test/render.js +13 -11
  67. package/dist/cjs/test/test-plugins/bert/index.js +14 -10
  68. package/dist/cjs/test/test-plugins/ernie/index.js +13 -9
  69. package/dist/cjs/test/test-plugins/index.js +11 -9
  70. package/dist/cjs/test-utils/index.js +10 -8
  71. package/dist/cjs/test-utils/mock-plugin-registry.js +8 -4
  72. package/dist/cjs/utils/action.js +43 -0
  73. package/dist/cjs/utils/index.js +11 -8
  74. package/dist/cjs/utils/variables.js +26 -8
  75. package/dist/cjs/validation/datasource.js +30 -0
  76. package/dist/cjs/validation/index.js +32 -0
  77. package/dist/cjs/validation/resource.js +24 -0
  78. package/dist/cjs/validation/variable.js +29 -0
  79. package/dist/components/CalculationSelector/CalculationSelector.js.map +1 -1
  80. package/dist/components/CalculationSelector/index.js.map +1 -1
  81. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.d.ts +15 -0
  82. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.d.ts.map +1 -0
  83. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js +333 -0
  84. package/dist/components/DatasourceEditorForm/DatasourceEditorForm.js.map +1 -0
  85. package/dist/components/DatasourceEditorForm/index.d.ts +2 -0
  86. package/dist/components/DatasourceEditorForm/index.d.ts.map +1 -0
  87. package/dist/components/DatasourceEditorForm/index.js +15 -0
  88. package/dist/components/DatasourceEditorForm/index.js.map +1 -0
  89. package/dist/components/DatasourceSelect.d.ts +5 -0
  90. package/dist/components/DatasourceSelect.d.ts.map +1 -1
  91. package/dist/components/DatasourceSelect.js +102 -19
  92. package/dist/components/DatasourceSelect.js.map +1 -1
  93. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.js +2 -2
  94. package/dist/components/LegendOptionsEditor/LegendOptionsEditor.js.map +1 -1
  95. package/dist/components/LegendOptionsEditor/index.js.map +1 -1
  96. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.d.ts +16 -0
  97. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.d.ts.map +1 -0
  98. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.js +61 -0
  99. package/dist/components/OptionsEditorRadios/OptionsEditorRadios.js.map +1 -0
  100. package/dist/components/OptionsEditorRadios/index.d.ts +2 -0
  101. package/dist/components/OptionsEditorRadios/index.d.ts.map +1 -0
  102. package/dist/components/OptionsEditorRadios/index.js +15 -0
  103. package/dist/components/OptionsEditorRadios/index.js.map +1 -0
  104. package/dist/components/OptionsEditorTabPanel/OptionsEditorTabPanel.d.ts +9 -0
  105. package/dist/components/OptionsEditorTabPanel/OptionsEditorTabPanel.d.ts.map +1 -0
  106. package/dist/components/{OptionsEditorTabs/TabPanel.js → OptionsEditorTabPanel/OptionsEditorTabPanel.js} +2 -2
  107. package/dist/components/OptionsEditorTabPanel/OptionsEditorTabPanel.js.map +1 -0
  108. package/dist/components/OptionsEditorTabPanel/index.d.ts +2 -0
  109. package/dist/components/OptionsEditorTabPanel/index.d.ts.map +1 -0
  110. package/dist/components/OptionsEditorTabPanel/index.js +15 -0
  111. package/dist/components/OptionsEditorTabPanel/index.js.map +1 -0
  112. package/dist/components/OptionsEditorTabs/OptionsEditorTabs.js +2 -2
  113. package/dist/components/OptionsEditorTabs/OptionsEditorTabs.js.map +1 -1
  114. package/dist/components/OptionsEditorTabs/index.js.map +1 -1
  115. package/dist/components/PanelSpecEditor/PanelSpecEditor.js +2 -2
  116. package/dist/components/PanelSpecEditor/PanelSpecEditor.js.map +1 -1
  117. package/dist/components/PanelSpecEditor/index.js.map +1 -1
  118. package/dist/components/PluginEditor/PluginEditor.js +15 -24
  119. package/dist/components/PluginEditor/PluginEditor.js.map +1 -1
  120. package/dist/components/PluginEditor/index.js.map +1 -1
  121. package/dist/components/PluginEditor/plugin-editor-api.d.ts +1 -1
  122. package/dist/components/PluginEditor/plugin-editor-api.js +2 -2
  123. package/dist/components/PluginEditor/plugin-editor-api.js.map +1 -1
  124. package/dist/components/PluginKindSelect/PluginKindSelect.d.ts +3 -3
  125. package/dist/components/PluginKindSelect/PluginKindSelect.d.ts.map +1 -1
  126. package/dist/components/PluginKindSelect/PluginKindSelect.js +21 -12
  127. package/dist/components/PluginKindSelect/PluginKindSelect.js.map +1 -1
  128. package/dist/components/PluginKindSelect/index.js.map +1 -1
  129. package/dist/components/PluginRegistry/PluginRegistry.js +3 -3
  130. package/dist/components/PluginRegistry/PluginRegistry.js.map +1 -1
  131. package/dist/components/PluginRegistry/index.js.map +1 -1
  132. package/dist/components/PluginRegistry/plugin-indexes.js.map +1 -1
  133. package/dist/components/PluginSpecEditor/PluginSpecEditor.js.map +1 -1
  134. package/dist/components/PluginSpecEditor/index.js.map +1 -1
  135. package/dist/components/TimeSeriesQueryEditor/TimeSeriesQueryEditor.js +4 -4
  136. package/dist/components/TimeSeriesQueryEditor/TimeSeriesQueryEditor.js.map +1 -1
  137. package/dist/components/TimeSeriesQueryEditor/TimeSeriesQueryInput.js +1 -1
  138. package/dist/components/TimeSeriesQueryEditor/TimeSeriesQueryInput.js.map +1 -1
  139. package/dist/components/TimeSeriesQueryEditor/index.js.map +1 -1
  140. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts +10 -7
  141. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts.map +1 -1
  142. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +200 -112
  143. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
  144. package/dist/components/Variables/VariableEditorForm/VariablePreview.js.map +1 -1
  145. package/dist/components/Variables/VariableEditorForm/index.js.map +1 -1
  146. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.d.ts +5 -4
  147. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.d.ts.map +1 -1
  148. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js +22 -30
  149. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js.map +1 -1
  150. package/dist/components/Variables/index.js.map +1 -1
  151. package/dist/components/Variables/variable-model.js +3 -3
  152. package/dist/components/Variables/variable-model.js.map +1 -1
  153. package/dist/components/index.d.ts +2 -0
  154. package/dist/components/index.d.ts.map +1 -1
  155. package/dist/components/index.js +2 -0
  156. package/dist/components/index.js.map +1 -1
  157. package/dist/constants/index.js.map +1 -1
  158. package/dist/constants/user-interface-text.js.map +1 -1
  159. package/dist/index.d.ts +1 -0
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +1 -0
  162. package/dist/index.js.map +1 -1
  163. package/dist/model/datasource.d.ts +2 -1
  164. package/dist/model/datasource.d.ts.map +1 -1
  165. package/dist/model/datasource.js.map +1 -1
  166. package/dist/model/index.js.map +1 -1
  167. package/dist/model/legend.d.ts +1 -1
  168. package/dist/model/legend.d.ts.map +1 -1
  169. package/dist/model/legend.js +14 -14
  170. package/dist/model/legend.js.map +1 -1
  171. package/dist/model/panels.js.map +1 -1
  172. package/dist/model/plugin-base.js.map +1 -1
  173. package/dist/model/plugin-loading.js.map +1 -1
  174. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.d.ts +5 -5
  175. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.d.ts.map +1 -1
  176. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.js +40 -28
  177. package/dist/runtime/DataQueriesProvider/DataQueriesProvider.js.map +1 -1
  178. package/dist/runtime/DataQueriesProvider/index.js.map +1 -1
  179. package/dist/runtime/DataQueriesProvider/model.d.ts +17 -12
  180. package/dist/runtime/DataQueriesProvider/model.d.ts.map +1 -1
  181. package/dist/runtime/DataQueriesProvider/model.js +47 -1
  182. package/dist/runtime/DataQueriesProvider/model.js.map +1 -1
  183. package/dist/runtime/TimeRangeProvider/TimeRangeProvider.js.map +1 -1
  184. package/dist/runtime/TimeRangeProvider/index.js.map +1 -1
  185. package/dist/runtime/TimeRangeProvider/query-params.js +1 -1
  186. package/dist/runtime/TimeRangeProvider/query-params.js.map +1 -1
  187. package/dist/runtime/builtin-variables.d.ts +11 -0
  188. package/dist/runtime/builtin-variables.d.ts.map +1 -0
  189. package/dist/runtime/builtin-variables.js +59 -0
  190. package/dist/runtime/builtin-variables.js.map +1 -0
  191. package/dist/runtime/datasources.d.ts +14 -6
  192. package/dist/runtime/datasources.d.ts.map +1 -1
  193. package/dist/runtime/datasources.js +13 -6
  194. package/dist/runtime/datasources.js.map +1 -1
  195. package/dist/runtime/index.d.ts +1 -0
  196. package/dist/runtime/index.d.ts.map +1 -1
  197. package/dist/runtime/index.js +1 -0
  198. package/dist/runtime/index.js.map +1 -1
  199. package/dist/runtime/plugin-registry.d.ts +2 -0
  200. package/dist/runtime/plugin-registry.d.ts.map +1 -1
  201. package/dist/runtime/plugin-registry.js +19 -2
  202. package/dist/runtime/plugin-registry.js.map +1 -1
  203. package/dist/runtime/template-variables.d.ts +62 -2
  204. package/dist/runtime/template-variables.d.ts.map +1 -1
  205. package/dist/runtime/template-variables.js +83 -1
  206. package/dist/runtime/template-variables.js.map +1 -1
  207. package/dist/runtime/time-series-queries.d.ts +3 -3
  208. package/dist/runtime/time-series-queries.d.ts.map +1 -1
  209. package/dist/runtime/time-series-queries.js +14 -12
  210. package/dist/runtime/time-series-queries.js.map +1 -1
  211. package/dist/stories/shared-utils/decorators/WithDataQueries.js.map +1 -1
  212. package/dist/stories/shared-utils/decorators/WithPluginRegistry.js.map +1 -1
  213. package/dist/stories/shared-utils/decorators/WithPluginSystemBuiltinVariables.d.ts +13 -0
  214. package/dist/stories/shared-utils/decorators/WithPluginSystemBuiltinVariables.d.ts.map +1 -0
  215. package/dist/stories/shared-utils/decorators/WithPluginSystemBuiltinVariables.js +39 -0
  216. package/dist/stories/shared-utils/decorators/WithPluginSystemBuiltinVariables.js.map +1 -0
  217. package/dist/stories/shared-utils/decorators/WithPluginSystemDatasourceStore.d.ts.map +1 -1
  218. package/dist/stories/shared-utils/decorators/WithPluginSystemDatasourceStore.js +11 -7
  219. package/dist/stories/shared-utils/decorators/WithPluginSystemDatasourceStore.js.map +1 -1
  220. package/dist/stories/shared-utils/decorators/WithPluginSystemTemplateVariables.js.map +1 -1
  221. package/dist/stories/shared-utils/decorators/WithTimeRange.js.map +1 -1
  222. package/dist/stories/shared-utils/decorators/index.d.ts +1 -0
  223. package/dist/stories/shared-utils/decorators/index.d.ts.map +1 -1
  224. package/dist/stories/shared-utils/decorators/index.js +1 -0
  225. package/dist/stories/shared-utils/decorators/index.js.map +1 -1
  226. package/dist/stories/shared-utils/index.js.map +1 -1
  227. package/dist/test/index.d.ts +1 -0
  228. package/dist/test/index.d.ts.map +1 -1
  229. package/dist/test/index.js +1 -0
  230. package/dist/test/index.js.map +1 -1
  231. package/dist/test/mock-data.d.ts +3 -0
  232. package/dist/test/mock-data.d.ts.map +1 -0
  233. package/dist/test/mock-data.js +49 -0
  234. package/dist/test/mock-data.js.map +1 -0
  235. package/dist/test/render.js +2 -2
  236. package/dist/test/render.js.map +1 -1
  237. package/dist/test/setup-tests.js.map +1 -1
  238. package/dist/test/test-plugins/bert/index.js.map +1 -1
  239. package/dist/test/test-plugins/ernie/index.js.map +1 -1
  240. package/dist/test/test-plugins/index.js.map +1 -1
  241. package/dist/test-utils/index.js.map +1 -1
  242. package/dist/test-utils/mock-plugin-registry.js +2 -2
  243. package/dist/test-utils/mock-plugin-registry.js.map +1 -1
  244. package/dist/utils/action.d.ts +4 -0
  245. package/dist/utils/action.d.ts.map +1 -0
  246. package/dist/utils/action.js +27 -0
  247. package/dist/utils/action.js.map +1 -0
  248. package/dist/utils/index.d.ts +1 -0
  249. package/dist/utils/index.d.ts.map +1 -1
  250. package/dist/utils/index.js +1 -0
  251. package/dist/utils/index.js.map +1 -1
  252. package/dist/utils/variables.d.ts.map +1 -1
  253. package/dist/utils/variables.js +17 -5
  254. package/dist/utils/variables.js.map +1 -1
  255. package/dist/validation/datasource.d.ts +19 -0
  256. package/dist/validation/datasource.d.ts.map +1 -0
  257. package/dist/validation/datasource.js +22 -0
  258. package/dist/validation/datasource.js.map +1 -0
  259. package/dist/validation/index.d.ts +4 -0
  260. package/dist/validation/index.d.ts.map +1 -0
  261. package/dist/validation/index.js +17 -0
  262. package/dist/validation/index.js.map +1 -0
  263. package/dist/validation/resource.d.ts +3 -0
  264. package/dist/validation/resource.d.ts.map +1 -0
  265. package/dist/validation/resource.js +16 -0
  266. package/dist/validation/resource.js.map +1 -0
  267. package/dist/validation/variable.d.ts +19 -0
  268. package/dist/validation/variable.d.ts.map +1 -0
  269. package/dist/validation/variable.js +21 -0
  270. package/dist/validation/variable.js.map +1 -0
  271. package/package.json +8 -6
  272. package/dist/components/OptionsEditorTabs/TabPanel.d.ts +0 -9
  273. package/dist/components/OptionsEditorTabs/TabPanel.d.ts.map +0 -1
  274. package/dist/components/OptionsEditorTabs/TabPanel.js.map +0 -1
@@ -12,42 +12,29 @@
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
14
  import React, { useCallback, useMemo, useState } from 'react';
15
- import { Box, Typography, Switch, TextField, Grid, FormControl, FormControlLabel, InputLabel, MenuItem, Button, Stack, ClickAwayListener, Divider, Select, capitalize } from '@mui/material';
15
+ import { Box, Typography, Switch, TextField, Grid, FormControlLabel, MenuItem, Button, Stack, ClickAwayListener, Divider } from '@mui/material';
16
16
  import { useImmer } from 'use-immer';
17
17
  import { DiscardChangesConfirmationDialog, ErrorBoundary } from '@perses-dev/components';
18
+ import { Controller, FormProvider, useForm } from 'react-hook-form';
19
+ import { zodResolver } from '@hookform/resolvers/zod';
20
+ import { getSubmitText, getTitleAction } from '../../../utils';
18
21
  import { VARIABLE_TYPES } from '../variable-model';
19
22
  import { PluginEditor } from '../../PluginEditor';
23
+ import { variableEditValidationSchema } from '../../../validation';
20
24
  import { VariableListPreview, VariablePreview } from './VariablePreview';
21
25
  import { getVariableDefinitionFromState, getInitialState } from './variable-editor-form-model';
22
- // TODO: Replace with proper validation library
23
- function getValidation(state) {
24
- /** Name validation */ let name = null;
25
- if (!state.name) {
26
- name = 'Name is required';
27
- }
28
- // name can only contain alphanumeric characters and underscores and no spaces
29
- if (state.name && !/^[a-zA-Z0-9_-]+$/.test(state.name)) {
30
- name = 'Name can only contain alphanumeric characters, underscores, and dashes';
31
- }
32
- return {
33
- name,
34
- isValid: !name
35
- };
36
- }
37
26
  function FallbackPreview() {
38
27
  return /*#__PURE__*/ _jsx("div", {
39
28
  children: "Error previewing values"
40
29
  });
41
30
  }
42
- export function VariableEditForm(props) {
43
- const { initialVariableDefinition , onChange , onCancel , action ='update' } = props;
31
+ export function VariableEditorForm(props) {
32
+ const { initialVariableDefinition , initialAction , isDraft , isReadonly , onSave , onClose , onDelete } = props;
44
33
  const initialState = getInitialState(initialVariableDefinition);
45
34
  const [state, setState] = useImmer(initialState);
46
- const validation = useMemo(()=>getValidation(state), [
47
- state
48
- ]);
49
- const [isDiscardDialogStateOpened, setDiscardDialogStateOpened] = useState(false);
35
+ const [isDiscardDialogOpened, setDiscardDialogOpened] = useState(false);
50
36
  const [previewKey, setPreviewKey] = useState(0);
37
+ const [action, setAction] = useState(initialAction);
51
38
  const refreshPreview = ()=>{
52
39
  setPreviewKey((prev)=>prev + 1);
53
40
  };
@@ -60,32 +47,35 @@ export function VariableEditForm(props) {
60
47
  }, [
61
48
  previewKey
62
49
  ]);
63
- const title = useMemo(()=>{
64
- if (action === 'read') return 'View Variable';
65
- if (action === 'create') return 'Create Variable';
66
- if (action === 'update') return 'Edit Variable';
67
- return '';
68
- }, [
69
- action
70
- ]);
50
+ const titleAction = getTitleAction(action, isDraft);
51
+ const submitText = getSubmitText(action, isDraft);
52
+ const form = useForm({
53
+ resolver: zodResolver(variableEditValidationSchema),
54
+ mode: 'onBlur',
55
+ defaultValues: state
56
+ });
57
+ const processForm = ()=>{
58
+ onSave(getVariableDefinitionFromState(state));
59
+ };
71
60
  // When user click on cancel, several possibilities:
72
61
  // - create action: ask for discard approval
73
62
  // - update action: ask for discard approval if changed
74
63
  // - read action: don´t ask for discard approval
75
64
  const handleCancel = useCallback(()=>{
76
- if (action === 'create' || action === 'update' && JSON.stringify(initialState) !== JSON.stringify(state)) {
77
- setDiscardDialogStateOpened(true);
65
+ if (JSON.stringify(initialState) !== JSON.stringify(state)) {
66
+ setDiscardDialogOpened(true);
78
67
  } else {
79
- onCancel();
68
+ onClose();
80
69
  }
81
70
  }, [
82
71
  state,
83
72
  initialState,
84
- action,
85
- setDiscardDialogStateOpened,
86
- onCancel
73
+ setDiscardDialogOpened,
74
+ onClose
87
75
  ]);
88
- return /*#__PURE__*/ _jsxs(_Fragment, {
76
+ var _state_textVariableFields_constant;
77
+ return /*#__PURE__*/ _jsxs(FormProvider, {
78
+ ...form,
89
79
  children: [
90
80
  /*#__PURE__*/ _jsxs(Box, {
91
81
  sx: {
@@ -95,32 +85,68 @@ export function VariableEditForm(props) {
95
85
  borderBottom: (theme)=>`1px solid ${theme.palette.divider}`
96
86
  },
97
87
  children: [
98
- /*#__PURE__*/ _jsx(Typography, {
88
+ /*#__PURE__*/ _jsxs(Typography, {
99
89
  variant: "h2",
100
- children: title
90
+ children: [
91
+ titleAction,
92
+ " Variable"
93
+ ]
101
94
  }),
102
- /*#__PURE__*/ _jsxs(Stack, {
95
+ /*#__PURE__*/ _jsx(Stack, {
103
96
  direction: "row",
104
97
  spacing: 1,
105
98
  sx: {
106
99
  marginLeft: 'auto'
107
100
  },
108
- children: [
109
- action !== 'read' && /*#__PURE__*/ _jsx(Button, {
110
- disabled: !validation.isValid,
111
- variant: "contained",
112
- onClick: ()=>{
113
- onChange(getVariableDefinitionFromState(state));
114
- },
115
- children: capitalize(action)
116
- }),
117
- /*#__PURE__*/ _jsx(Button, {
118
- color: "secondary",
119
- variant: "outlined",
120
- onClick: handleCancel,
121
- children: action === 'read' ? 'Close' : 'Cancel'
122
- })
123
- ]
101
+ children: action === 'read' ? /*#__PURE__*/ _jsxs(_Fragment, {
102
+ children: [
103
+ /*#__PURE__*/ _jsx(Button, {
104
+ disabled: isReadonly,
105
+ variant: "contained",
106
+ onClick: ()=>setAction('update'),
107
+ children: "Edit"
108
+ }),
109
+ /*#__PURE__*/ _jsx(Button, {
110
+ color: "error",
111
+ variant: "outlined",
112
+ onClick: onDelete,
113
+ children: "Delete"
114
+ }),
115
+ /*#__PURE__*/ _jsx(Divider, {
116
+ orientation: "vertical",
117
+ flexItem: true,
118
+ sx: (theme)=>({
119
+ borderColor: theme.palette.grey['500'],
120
+ '&.MuiDivider-root': {
121
+ marginLeft: 2,
122
+ marginRight: 1
123
+ }
124
+ })
125
+ }),
126
+ /*#__PURE__*/ _jsx(Button, {
127
+ color: "secondary",
128
+ variant: "outlined",
129
+ onClick: onClose,
130
+ children: "Close"
131
+ })
132
+ ]
133
+ }) : /*#__PURE__*/ _jsxs(_Fragment, {
134
+ children: [
135
+ /*#__PURE__*/ _jsx(Button, {
136
+ type: "submit",
137
+ variant: "contained",
138
+ disabled: !form.formState.isValid,
139
+ onClick: form.handleSubmit(processForm),
140
+ children: submitText
141
+ }),
142
+ /*#__PURE__*/ _jsx(Button, {
143
+ color: "secondary",
144
+ variant: "outlined",
145
+ onClick: handleCancel,
146
+ children: "Cancel"
147
+ })
148
+ ]
149
+ })
124
150
  })
125
151
  ]
126
152
  }),
@@ -138,19 +164,30 @@ export function VariableEditForm(props) {
138
164
  /*#__PURE__*/ _jsx(Grid, {
139
165
  item: true,
140
166
  xs: 8,
141
- children: /*#__PURE__*/ _jsx(TextField, {
142
- required: true,
143
- error: !!validation.name,
144
- fullWidth: true,
145
- label: "Name",
146
- value: state.name,
147
- helperText: validation.name,
148
- InputProps: {
149
- readOnly: action === 'update' || action === 'read'
150
- },
151
- onChange: (v)=>{
152
- setState((draft)=>{
153
- draft.name = v.target.value;
167
+ children: /*#__PURE__*/ _jsx(Controller, {
168
+ name: "name",
169
+ render: ({ field , fieldState })=>{
170
+ var _fieldState_error;
171
+ /*#__PURE__*/ return _jsx(TextField, {
172
+ ...field,
173
+ required: true,
174
+ fullWidth: true,
175
+ label: "Name",
176
+ InputLabelProps: {
177
+ shrink: action === 'read' ? true : undefined
178
+ },
179
+ InputProps: {
180
+ disabled: action === 'update',
181
+ readOnly: action === 'read'
182
+ },
183
+ error: !!fieldState.error,
184
+ helperText: (_fieldState_error = fieldState.error) === null || _fieldState_error === void 0 ? void 0 : _fieldState_error.message,
185
+ onChange: (event)=>{
186
+ field.onChange(event);
187
+ setState((draft)=>{
188
+ draft.name = event.target.value;
189
+ });
190
+ }
154
191
  });
155
192
  }
156
193
  })
@@ -158,16 +195,28 @@ export function VariableEditForm(props) {
158
195
  /*#__PURE__*/ _jsx(Grid, {
159
196
  item: true,
160
197
  xs: 4,
161
- children: /*#__PURE__*/ _jsx(TextField, {
162
- fullWidth: true,
163
- label: "Display Label",
164
- value: state.title || '',
165
- InputProps: {
166
- readOnly: action === 'read'
167
- },
168
- onChange: (v)=>{
169
- setState((draft)=>{
170
- draft.title = v.target.value;
198
+ children: /*#__PURE__*/ _jsx(Controller, {
199
+ name: "title",
200
+ render: ({ field , fieldState })=>{
201
+ var _fieldState_error;
202
+ /*#__PURE__*/ return _jsx(TextField, {
203
+ ...field,
204
+ fullWidth: true,
205
+ label: "Display Label",
206
+ InputLabelProps: {
207
+ shrink: action === 'read' ? true : undefined
208
+ },
209
+ InputProps: {
210
+ readOnly: action === 'read'
211
+ },
212
+ error: !!fieldState.error,
213
+ helperText: (_fieldState_error = fieldState.error) === null || _fieldState_error === void 0 ? void 0 : _fieldState_error.message,
214
+ onChange: (event)=>{
215
+ field.onChange(event);
216
+ setState((draft)=>{
217
+ draft.title = event.target.value;
218
+ });
219
+ }
171
220
  });
172
221
  }
173
222
  })
@@ -175,16 +224,28 @@ export function VariableEditForm(props) {
175
224
  /*#__PURE__*/ _jsx(Grid, {
176
225
  item: true,
177
226
  xs: 8,
178
- children: /*#__PURE__*/ _jsx(TextField, {
179
- fullWidth: true,
180
- label: "Description",
181
- value: state.description,
182
- InputProps: {
183
- readOnly: action === 'read'
184
- },
185
- onChange: (v)=>{
186
- setState((draft)=>{
187
- draft.description = v.target.value;
227
+ children: /*#__PURE__*/ _jsx(Controller, {
228
+ name: "description",
229
+ render: ({ field , fieldState })=>{
230
+ var _fieldState_error;
231
+ /*#__PURE__*/ return _jsx(TextField, {
232
+ ...field,
233
+ fullWidth: true,
234
+ label: "Description",
235
+ InputLabelProps: {
236
+ shrink: action === 'read' ? true : undefined
237
+ },
238
+ InputProps: {
239
+ readOnly: action === 'read'
240
+ },
241
+ error: !!fieldState.error,
242
+ helperText: (_fieldState_error = fieldState.error) === null || _fieldState_error === void 0 ? void 0 : _fieldState_error.message,
243
+ onChange: (event)=>{
244
+ field.onChange(event);
245
+ setState((draft)=>{
246
+ draft.description = event.target.value;
247
+ });
248
+ }
188
249
  });
189
250
  }
190
251
  })
@@ -192,30 +253,35 @@ export function VariableEditForm(props) {
192
253
  /*#__PURE__*/ _jsx(Grid, {
193
254
  item: true,
194
255
  xs: 4,
195
- children: /*#__PURE__*/ _jsxs(FormControl, {
196
- fullWidth: true,
197
- children: [
198
- /*#__PURE__*/ _jsx(InputLabel, {
199
- id: "variable-type-select-label",
200
- children: "Type"
201
- }),
202
- /*#__PURE__*/ _jsx(Select, {
203
- labelId: "variable-type-select-label",
204
- id: "variable-type-select",
256
+ children: /*#__PURE__*/ _jsx(Controller, {
257
+ name: "kind",
258
+ render: ({ field , fieldState })=>{
259
+ var _fieldState_error;
260
+ /*#__PURE__*/ return _jsx(TextField, {
261
+ select: true,
262
+ ...field,
263
+ fullWidth: true,
205
264
  label: "Type",
206
- value: state.kind,
207
- readOnly: action === 'read',
208
- onChange: (v)=>{
265
+ InputLabelProps: {
266
+ shrink: action === 'read' ? true : undefined
267
+ },
268
+ InputProps: {
269
+ readOnly: action === 'read'
270
+ },
271
+ error: !!fieldState.error,
272
+ helperText: (_fieldState_error = fieldState.error) === null || _fieldState_error === void 0 ? void 0 : _fieldState_error.message,
273
+ onChange: (event)=>{
274
+ field.onChange(event);
209
275
  setState((draft)=>{
210
- draft.kind = v.target.value;
276
+ draft.kind = event.target.value;
211
277
  });
212
278
  },
213
279
  children: VARIABLE_TYPES.map((v)=>/*#__PURE__*/ _jsx(MenuItem, {
214
280
  value: v.kind,
215
281
  children: v.label
216
282
  }, v.kind))
217
- })
218
- ]
283
+ });
284
+ }
219
285
  })
220
286
  })
221
287
  ]
@@ -241,6 +307,9 @@ export function VariableEditForm(props) {
241
307
  /*#__PURE__*/ _jsx(TextField, {
242
308
  label: "Value",
243
309
  value: state.textVariableFields.value,
310
+ InputLabelProps: {
311
+ shrink: action === 'read' ? true : undefined
312
+ },
244
313
  InputProps: {
245
314
  readOnly: action === 'read'
246
315
  },
@@ -249,6 +318,19 @@ export function VariableEditForm(props) {
249
318
  draft.textVariableFields.value = v.target.value;
250
319
  });
251
320
  }
321
+ }),
322
+ /*#__PURE__*/ _jsx(FormControlLabel, {
323
+ control: /*#__PURE__*/ _jsx(Switch, {
324
+ checked: (_state_textVariableFields_constant = state.textVariableFields.constant) !== null && _state_textVariableFields_constant !== void 0 ? _state_textVariableFields_constant : false,
325
+ readOnly: action === 'read',
326
+ onChange: (e)=>{
327
+ if (action === 'read') return; // ReadOnly prop is not blocking user interaction...
328
+ setState((draft)=>{
329
+ draft.textVariableFields.constant = e.target.checked;
330
+ });
331
+ }
332
+ }),
333
+ label: "Constant"
252
334
  })
253
335
  ]
254
336
  })
@@ -302,7 +384,10 @@ export function VariableEditForm(props) {
302
384
  /*#__PURE__*/ _jsx(Stack, {
303
385
  children: /*#__PURE__*/ _jsx(TextField, {
304
386
  label: "Capturing Regexp Filter",
305
- value: state.listVariableFields.capturing_regexp || '',
387
+ value: state.listVariableFields.capturingRegexp || '',
388
+ InputLabelProps: {
389
+ shrink: action === 'read' ? true : undefined
390
+ },
306
391
  InputProps: {
307
392
  readOnly: action === 'read'
308
393
  },
@@ -310,9 +395,9 @@ export function VariableEditForm(props) {
310
395
  setState((draft)=>{
311
396
  if (e.target.value) {
312
397
  // TODO: do a better fix, if empty string => it should skip the filter
313
- draft.listVariableFields.capturing_regexp = e.target.value;
398
+ draft.listVariableFields.capturingRegexp = e.target.value;
314
399
  } else {
315
- draft.listVariableFields.capturing_regexp = undefined;
400
+ draft.listVariableFields.capturingRegexp = undefined;
316
401
  }
317
402
  });
318
403
  },
@@ -374,6 +459,9 @@ export function VariableEditForm(props) {
374
459
  state.listVariableFields.allowAll && /*#__PURE__*/ _jsx(TextField, {
375
460
  label: "Custom All Value",
376
461
  value: state.listVariableFields.customAllValue,
462
+ InputLabelProps: {
463
+ shrink: action === 'read' ? true : undefined
464
+ },
377
465
  InputProps: {
378
466
  readOnly: action === 'read'
379
467
  },
@@ -398,13 +486,13 @@ export function VariableEditForm(props) {
398
486
  }),
399
487
  /*#__PURE__*/ _jsx(DiscardChangesConfirmationDialog, {
400
488
  description: "Are you sure you want to discard these changes? Changes cannot be recovered.",
401
- isOpen: isDiscardDialogStateOpened,
489
+ isOpen: isDiscardDialogOpened,
402
490
  onCancel: ()=>{
403
- setDiscardDialogStateOpened(false);
491
+ setDiscardDialogOpened(false);
404
492
  },
405
493
  onDiscardChanges: ()=>{
406
- setDiscardDialogStateOpened(false);
407
- onCancel();
494
+ setDiscardDialogOpened(false);
495
+ onClose();
408
496
  }
409
497
  })
410
498
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { useCallback, useMemo, useState } from 'react';\nimport {\n Box,\n Typography,\n Switch,\n TextField,\n Grid,\n FormControl,\n FormControlLabel,\n InputLabel,\n MenuItem,\n Button,\n Stack,\n ClickAwayListener,\n Divider,\n Select,\n capitalize,\n} from '@mui/material';\nimport { useImmer } from 'use-immer';\nimport { VariableDefinition, ListVariableDefinition } from '@perses-dev/core';\nimport { DiscardChangesConfirmationDialog, ErrorBoundary } from '@perses-dev/components';\nimport { VARIABLE_TYPES } from '../variable-model';\nimport { PluginEditor } from '../../PluginEditor';\nimport { VariableListPreview, VariablePreview } from './VariablePreview';\nimport { VariableEditorState, getVariableDefinitionFromState, getInitialState } from './variable-editor-form-model';\n\n// TODO: Replace with proper validation library\nfunction getValidation(state: ReturnType<typeof getInitialState>) {\n /** Name validation */\n let name = null;\n if (!state.name) {\n name = 'Name is required';\n }\n // name can only contain alphanumeric characters and underscores and no spaces\n if (state.name && !/^[a-zA-Z0-9_-]+$/.test(state.name)) {\n name = 'Name can only contain alphanumeric characters, underscores, and dashes';\n }\n\n return {\n name,\n isValid: !name,\n };\n}\n\nfunction FallbackPreview() {\n return <div>Error previewing values</div>;\n}\n\nexport type Action = 'create' | 'read' | 'update';\n\ninterface VariableEditFormProps {\n initialVariableDefinition: VariableDefinition;\n onChange: (def: VariableDefinition) => void;\n onCancel: () => void;\n action?: Action;\n}\n\nexport function VariableEditForm(props: VariableEditFormProps) {\n const { initialVariableDefinition, onChange, onCancel, action = 'update' } = props;\n const initialState = getInitialState(initialVariableDefinition);\n const [state, setState] = useImmer(initialState);\n const validation = useMemo(() => getValidation(state), [state]);\n const [isDiscardDialogStateOpened, setDiscardDialogStateOpened] = useState<boolean>(false);\n const [previewKey, setPreviewKey] = useState(0);\n\n const refreshPreview = () => {\n setPreviewKey((prev) => prev + 1);\n };\n\n /** We use the `previewKey` that we increment to know when to explicitly update the\n * spec that will be used for preview. The reason why we do this is to avoid\n * having to re-fetch the values when the user is still editing the spec.\n */\n const previewSpec = useMemo(() => {\n return getVariableDefinitionFromState(state) as ListVariableDefinition;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [previewKey]);\n\n const title = useMemo(() => {\n if (action === 'read') return 'View Variable';\n if (action === 'create') return 'Create Variable';\n if (action === 'update') return 'Edit Variable';\n return '';\n }, [action]);\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n const handleCancel = useCallback(() => {\n if (action === 'create' || (action === 'update' && JSON.stringify(initialState) !== JSON.stringify(state))) {\n setDiscardDialogStateOpened(true);\n } else {\n onCancel();\n }\n }, [state, initialState, action, setDiscardDialogStateOpened, onCancel]);\n\n return (\n <>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{title}</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action !== 'read' && (\n <Button\n disabled={!validation.isValid}\n variant=\"contained\"\n onClick={() => {\n onChange(getVariableDefinitionFromState(state));\n }}\n >\n {capitalize(action)}\n </Button>\n )}\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n {action === 'read' ? 'Close' : 'Cancel'}\n </Button>\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={8}>\n <TextField\n required\n error={!!validation.name}\n fullWidth\n label=\"Name\"\n value={state.name}\n helperText={validation.name}\n InputProps={{\n readOnly: action === 'update' || action === 'read',\n }}\n onChange={(v) => {\n setState((draft) => {\n draft.name = v.target.value;\n });\n }}\n />\n </Grid>\n <Grid item xs={4}>\n <TextField\n fullWidth\n label=\"Display Label\"\n value={state.title || ''}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(v) => {\n setState((draft) => {\n draft.title = v.target.value;\n });\n }}\n />\n </Grid>\n <Grid item xs={8}>\n <TextField\n fullWidth\n label=\"Description\"\n value={state.description}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(v) => {\n setState((draft) => {\n draft.description = v.target.value;\n });\n }}\n />\n </Grid>\n <Grid item xs={4}>\n <FormControl fullWidth>\n <InputLabel id=\"variable-type-select-label\">Type</InputLabel>\n <Select\n labelId=\"variable-type-select-label\"\n id=\"variable-type-select\"\n label=\"Type\"\n value={state.kind}\n readOnly={action === 'read'}\n onChange={(v) => {\n setState((draft) => {\n draft.kind = v.target.value as VariableEditorState['kind'];\n });\n }}\n >\n {VARIABLE_TYPES.map((v) => (\n <MenuItem key={v.kind} value={v.kind}>\n {v.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </Grid>\n </Grid>\n\n <Divider />\n\n {state.kind === 'TextVariable' && (\n <>\n <Typography py={1} variant=\"subtitle1\">\n Text Options\n </Typography>\n <Stack spacing={2}>\n <Box>\n <VariablePreview values={[state.textVariableFields.value]} />\n </Box>\n <TextField\n label=\"Value\"\n value={state.textVariableFields.value}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(v) => {\n setState((draft) => {\n draft.textVariableFields.value = v.target.value;\n });\n }}\n />\n </Stack>\n </>\n )}\n\n {state.kind === 'ListVariable' && (\n <>\n <Typography py={1} variant=\"subtitle1\">\n List Options\n </Typography>\n <Stack spacing={2} mb={2}>\n {state.listVariableFields.plugin.kind ? (\n <Box>\n <ErrorBoundary FallbackComponent={FallbackPreview} resetKeys={[previewSpec]}>\n <VariableListPreview definition={previewSpec} onRefresh={refreshPreview} />\n </ErrorBoundary>\n </Box>\n ) : (\n <VariablePreview isLoading={true} />\n )}\n\n <Stack>\n {/** Hack?: Cool technique to refresh the preview to simulate onBlur event */}\n <ClickAwayListener onClickAway={() => refreshPreview()}>\n <Box />\n </ClickAwayListener>\n {/** */}\n <PluginEditor\n width=\"100%\"\n pluginType=\"Variable\"\n pluginKindLabel=\"Source\"\n value={state.listVariableFields.plugin}\n isReadonly={action === 'read'}\n onChange={(val) => {\n setState((draft) => {\n draft.listVariableFields.plugin = val;\n });\n }}\n />\n </Stack>\n\n <Stack>\n <TextField\n label=\"Capturing Regexp Filter\"\n value={state.listVariableFields.capturing_regexp || ''}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(e) => {\n setState((draft) => {\n if (e.target.value) {\n // TODO: do a better fix, if empty string => it should skip the filter\n draft.listVariableFields.capturing_regexp = e.target.value;\n } else {\n draft.listVariableFields.capturing_regexp = undefined;\n }\n });\n }}\n helperText=\"Optional, if you want to filter on captured result.\"\n />\n </Stack>\n </Stack>\n\n <Divider />\n\n <Typography py={1} variant=\"subtitle1\">\n Dropdown Options\n </Typography>\n <Stack spacing=\"2\">\n <Stack>\n <FormControlLabel\n control={\n <Switch\n checked={state.listVariableFields.allowMultiple}\n readOnly={action === 'read'}\n onChange={(e) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n setState((draft) => {\n draft.listVariableFields.allowMultiple = e.target.checked;\n });\n }}\n />\n }\n label=\"Allow Multiple Values\"\n />\n <Typography variant=\"caption\">Enables multiple values to be selected at the same time</Typography>\n </Stack>\n <Stack>\n <FormControlLabel\n control={\n <Switch\n checked={state.listVariableFields.allowAll}\n readOnly={action === 'read'}\n onChange={(e) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n setState((draft) => {\n draft.listVariableFields.allowAll = e.target.checked;\n });\n }}\n />\n }\n label=\"Allow All option\"\n />\n <Typography mb={1} variant=\"caption\">\n Enables an option to include all variable values\n </Typography>\n {state.listVariableFields.allowAll && (\n <TextField\n label=\"Custom All Value\"\n value={state.listVariableFields.customAllValue}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(e) => {\n setState((draft) => {\n if (e.target.value) {\n draft.listVariableFields.customAllValue = e.target.value;\n } else {\n draft.listVariableFields.customAllValue = undefined;\n }\n });\n }}\n helperText=\"When All is selected, this value will be used\"\n />\n )}\n </Stack>\n </Stack>\n </>\n )}\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard these changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogStateOpened}\n onCancel={() => {\n setDiscardDialogStateOpened(false);\n }}\n onDiscardChanges={() => {\n setDiscardDialogStateOpened(false);\n onCancel();\n }}\n />\n </>\n );\n}\n"],"names":["React","useCallback","useMemo","useState","Box","Typography","Switch","TextField","Grid","FormControl","FormControlLabel","InputLabel","MenuItem","Button","Stack","ClickAwayListener","Divider","Select","capitalize","useImmer","DiscardChangesConfirmationDialog","ErrorBoundary","VARIABLE_TYPES","PluginEditor","VariableListPreview","VariablePreview","getVariableDefinitionFromState","getInitialState","getValidation","state","name","test","isValid","FallbackPreview","div","VariableEditForm","props","initialVariableDefinition","onChange","onCancel","action","initialState","setState","validation","isDiscardDialogStateOpened","setDiscardDialogStateOpened","previewKey","setPreviewKey","refreshPreview","prev","previewSpec","title","handleCancel","JSON","stringify","sx","display","alignItems","padding","theme","spacing","borderBottom","palette","divider","variant","direction","marginLeft","disabled","onClick","color","overflowY","container","mb","item","xs","required","error","fullWidth","label","value","helperText","InputProps","readOnly","v","draft","target","description","id","labelId","kind","map","py","values","textVariableFields","listVariableFields","plugin","FallbackComponent","resetKeys","definition","onRefresh","isLoading","onClickAway","width","pluginType","pluginKindLabel","isReadonly","val","capturing_regexp","e","undefined","control","checked","allowMultiple","allowAll","customAllValue","isOpen","onDiscardChanges"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, { DispatchWithoutAction, useCallback, useMemo, useState } from 'react';\nimport {\n Box,\n Typography,\n Switch,\n TextField,\n Grid,\n FormControlLabel,\n MenuItem,\n Button,\n Stack,\n ClickAwayListener,\n Divider,\n} from '@mui/material';\nimport { useImmer } from 'use-immer';\nimport { VariableDefinition, ListVariableDefinition } from '@perses-dev/core';\nimport { DiscardChangesConfirmationDialog, ErrorBoundary } from '@perses-dev/components';\nimport { Controller, FormProvider, SubmitHandler, useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { Action, getSubmitText, getTitleAction } from '../../../utils';\nimport { VARIABLE_TYPES } from '../variable-model';\nimport { PluginEditor } from '../../PluginEditor';\nimport { variableEditValidationSchema, VariableEditValidationType } from '../../../validation';\nimport { VariableListPreview, VariablePreview } from './VariablePreview';\nimport { VariableEditorState, getVariableDefinitionFromState, getInitialState } from './variable-editor-form-model';\n\nfunction FallbackPreview() {\n return <div>Error previewing values</div>;\n}\n\ninterface VariableEditorFormProps {\n initialVariableDefinition: VariableDefinition;\n initialAction: Action;\n isDraft: boolean;\n isReadonly?: boolean;\n onSave: (def: VariableDefinition) => void;\n onClose: () => void;\n onDelete?: DispatchWithoutAction;\n}\n\nexport function VariableEditorForm(props: VariableEditorFormProps) {\n const { initialVariableDefinition, initialAction, isDraft, isReadonly, onSave, onClose, onDelete } = props;\n\n const initialState = getInitialState(initialVariableDefinition);\n const [state, setState] = useImmer(initialState);\n const [isDiscardDialogOpened, setDiscardDialogOpened] = useState<boolean>(false);\n const [previewKey, setPreviewKey] = useState(0);\n const [action, setAction] = useState(initialAction);\n\n const refreshPreview = () => {\n setPreviewKey((prev) => prev + 1);\n };\n\n /** We use the `previewKey` that we increment to know when to explicitly update the\n * spec that will be used for preview. The reason why we do this is to avoid\n * having to re-fetch the values when the user is still editing the spec.\n */\n const previewSpec = useMemo(() => {\n return getVariableDefinitionFromState(state) as ListVariableDefinition;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [previewKey]);\n\n const titleAction = getTitleAction(action, isDraft);\n const submitText = getSubmitText(action, isDraft);\n\n const form = useForm<VariableEditValidationType>({\n resolver: zodResolver(variableEditValidationSchema),\n mode: 'onBlur',\n defaultValues: state,\n });\n\n const processForm: SubmitHandler<VariableEditValidationType> = () => {\n onSave(getVariableDefinitionFromState(state));\n };\n\n // When user click on cancel, several possibilities:\n // - create action: ask for discard approval\n // - update action: ask for discard approval if changed\n // - read action: don´t ask for discard approval\n const handleCancel = useCallback(() => {\n if (JSON.stringify(initialState) !== JSON.stringify(state)) {\n setDiscardDialogOpened(true);\n } else {\n onClose();\n }\n }, [state, initialState, setDiscardDialogOpened, onClose]);\n\n return (\n <FormProvider {...form}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: (theme) => theme.spacing(1, 2),\n borderBottom: (theme) => `1px solid ${theme.palette.divider}`,\n }}\n >\n <Typography variant=\"h2\">{titleAction} Variable</Typography>\n <Stack direction=\"row\" spacing={1} sx={{ marginLeft: 'auto' }}>\n {action === 'read' ? (\n <>\n <Button disabled={isReadonly} variant=\"contained\" onClick={() => setAction('update')}>\n Edit\n </Button>\n <Button color=\"error\" variant=\"outlined\" onClick={onDelete}>\n Delete\n </Button>\n <Divider\n orientation=\"vertical\"\n flexItem\n sx={(theme) => ({\n borderColor: theme.palette.grey['500'],\n '&.MuiDivider-root': {\n marginLeft: 2,\n marginRight: 1,\n },\n })}\n />\n <Button color=\"secondary\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </>\n ) : (\n <>\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={!form.formState.isValid}\n onClick={form.handleSubmit(processForm)}\n >\n {submitText}\n </Button>\n <Button color=\"secondary\" variant=\"outlined\" onClick={handleCancel}>\n Cancel\n </Button>\n </>\n )}\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Grid container spacing={2} mb={2}>\n <Grid item xs={8}>\n <Controller\n name=\"name\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n required\n fullWidth\n label=\"Name\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n disabled: action === 'update',\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n onChange={(event) => {\n field.onChange(event);\n setState((draft) => {\n draft.name = event.target.value;\n });\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n name=\"title\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Display Label\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n onChange={(event) => {\n field.onChange(event);\n setState((draft) => {\n draft.title = event.target.value;\n });\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={8}>\n <Controller\n name=\"description\"\n render={({ field, fieldState }) => (\n <TextField\n {...field}\n fullWidth\n label=\"Description\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n onChange={(event) => {\n field.onChange(event);\n setState((draft) => {\n draft.description = event.target.value;\n });\n }}\n />\n )}\n />\n </Grid>\n <Grid item xs={4}>\n <Controller\n name=\"kind\"\n render={({ field, fieldState }) => (\n <TextField\n select\n {...field}\n fullWidth\n label=\"Type\"\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n error={!!fieldState.error}\n helperText={fieldState.error?.message}\n onChange={(event) => {\n field.onChange(event);\n setState((draft) => {\n draft.kind = event.target.value as VariableEditorState['kind'];\n });\n }}\n >\n {VARIABLE_TYPES.map((v) => (\n <MenuItem key={v.kind} value={v.kind}>\n {v.label}\n </MenuItem>\n ))}\n </TextField>\n )}\n />\n </Grid>\n </Grid>\n\n <Divider />\n\n {state.kind === 'TextVariable' && (\n <>\n <Typography py={1} variant=\"subtitle1\">\n Text Options\n </Typography>\n <Stack spacing={2}>\n <Box>\n <VariablePreview values={[state.textVariableFields.value]} />\n </Box>\n <TextField\n label=\"Value\"\n value={state.textVariableFields.value}\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(v) => {\n setState((draft) => {\n draft.textVariableFields.value = v.target.value;\n });\n }}\n />\n <FormControlLabel\n control={\n <Switch\n checked={state.textVariableFields.constant ?? false}\n readOnly={action === 'read'}\n onChange={(e) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n setState((draft) => {\n draft.textVariableFields.constant = e.target.checked;\n });\n }}\n />\n }\n label=\"Constant\"\n />\n </Stack>\n </>\n )}\n\n {state.kind === 'ListVariable' && (\n <>\n <Typography py={1} variant=\"subtitle1\">\n List Options\n </Typography>\n <Stack spacing={2} mb={2}>\n {state.listVariableFields.plugin.kind ? (\n <Box>\n <ErrorBoundary FallbackComponent={FallbackPreview} resetKeys={[previewSpec]}>\n <VariableListPreview definition={previewSpec} onRefresh={refreshPreview} />\n </ErrorBoundary>\n </Box>\n ) : (\n <VariablePreview isLoading={true} />\n )}\n\n <Stack>\n {/** Hack?: Cool technique to refresh the preview to simulate onBlur event */}\n <ClickAwayListener onClickAway={() => refreshPreview()}>\n <Box />\n </ClickAwayListener>\n {/** */}\n <PluginEditor\n width=\"100%\"\n pluginType=\"Variable\"\n pluginKindLabel=\"Source\"\n value={state.listVariableFields.plugin}\n isReadonly={action === 'read'}\n onChange={(val) => {\n setState((draft) => {\n draft.listVariableFields.plugin = val;\n });\n }}\n />\n </Stack>\n\n <Stack>\n <TextField\n label=\"Capturing Regexp Filter\"\n value={state.listVariableFields.capturingRegexp || ''}\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(e) => {\n setState((draft) => {\n if (e.target.value) {\n // TODO: do a better fix, if empty string => it should skip the filter\n draft.listVariableFields.capturingRegexp = e.target.value;\n } else {\n draft.listVariableFields.capturingRegexp = undefined;\n }\n });\n }}\n helperText=\"Optional, if you want to filter on captured result.\"\n />\n </Stack>\n </Stack>\n\n <Divider />\n\n <Typography py={1} variant=\"subtitle1\">\n Dropdown Options\n </Typography>\n <Stack spacing=\"2\">\n <Stack>\n <FormControlLabel\n control={\n <Switch\n checked={state.listVariableFields.allowMultiple}\n readOnly={action === 'read'}\n onChange={(e) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n setState((draft) => {\n draft.listVariableFields.allowMultiple = e.target.checked;\n });\n }}\n />\n }\n label=\"Allow Multiple Values\"\n />\n <Typography variant=\"caption\">Enables multiple values to be selected at the same time</Typography>\n </Stack>\n <Stack>\n <FormControlLabel\n control={\n <Switch\n checked={state.listVariableFields.allowAll}\n readOnly={action === 'read'}\n onChange={(e) => {\n if (action === 'read') return; // ReadOnly prop is not blocking user interaction...\n setState((draft) => {\n draft.listVariableFields.allowAll = e.target.checked;\n });\n }}\n />\n }\n label=\"Allow All option\"\n />\n <Typography mb={1} variant=\"caption\">\n Enables an option to include all variable values\n </Typography>\n {state.listVariableFields.allowAll && (\n <TextField\n label=\"Custom All Value\"\n value={state.listVariableFields.customAllValue}\n InputLabelProps={{ shrink: action === 'read' ? true : undefined }}\n InputProps={{\n readOnly: action === 'read',\n }}\n onChange={(e) => {\n setState((draft) => {\n if (e.target.value) {\n draft.listVariableFields.customAllValue = e.target.value;\n } else {\n draft.listVariableFields.customAllValue = undefined;\n }\n });\n }}\n helperText=\"When All is selected, this value will be used\"\n />\n )}\n </Stack>\n </Stack>\n </>\n )}\n </Box>\n <DiscardChangesConfirmationDialog\n description=\"Are you sure you want to discard these changes? Changes cannot be recovered.\"\n isOpen={isDiscardDialogOpened}\n onCancel={() => {\n setDiscardDialogOpened(false);\n }}\n onDiscardChanges={() => {\n setDiscardDialogOpened(false);\n onClose();\n }}\n />\n </FormProvider>\n );\n}\n"],"names":["React","useCallback","useMemo","useState","Box","Typography","Switch","TextField","Grid","FormControlLabel","MenuItem","Button","Stack","ClickAwayListener","Divider","useImmer","DiscardChangesConfirmationDialog","ErrorBoundary","Controller","FormProvider","useForm","zodResolver","getSubmitText","getTitleAction","VARIABLE_TYPES","PluginEditor","variableEditValidationSchema","VariableListPreview","VariablePreview","getVariableDefinitionFromState","getInitialState","FallbackPreview","div","VariableEditorForm","props","initialVariableDefinition","initialAction","isDraft","isReadonly","onSave","onClose","onDelete","initialState","state","setState","isDiscardDialogOpened","setDiscardDialogOpened","previewKey","setPreviewKey","action","setAction","refreshPreview","prev","previewSpec","titleAction","submitText","form","resolver","mode","defaultValues","processForm","handleCancel","JSON","stringify","sx","display","alignItems","padding","theme","spacing","borderBottom","palette","divider","variant","direction","marginLeft","disabled","onClick","color","orientation","flexItem","borderColor","grey","marginRight","type","formState","isValid","handleSubmit","overflowY","container","mb","item","xs","name","render","field","fieldState","required","fullWidth","label","InputLabelProps","shrink","undefined","InputProps","readOnly","error","helperText","message","onChange","event","draft","target","value","title","description","select","kind","map","v","py","values","textVariableFields","control","checked","constant","e","listVariableFields","plugin","FallbackComponent","resetKeys","definition","onRefresh","isLoading","onClickAway","width","pluginType","pluginKindLabel","val","capturingRegexp","allowMultiple","allowAll","customAllValue","isOpen","onCancel","onDiscardChanges"],"mappings":"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"}