@perses-dev/dashboards 0.15.0 → 0.17.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 (86) hide show
  1. package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +8 -12
  2. package/dist/cjs/components/DownloadButton/DownloadButton.js +109 -0
  3. package/dist/cjs/{utils/component-ids.js → components/DownloadButton/index.js} +11 -14
  4. package/dist/cjs/components/GridLayout/GridLayout.js +13 -2
  5. package/dist/cjs/components/GridLayout/GridTitle.js +11 -17
  6. package/dist/cjs/components/Panel/Panel.js +4 -2
  7. package/dist/cjs/components/Panel/PanelHeader.js +54 -50
  8. package/dist/cjs/components/PanelDrawer/PanelDrawer.js +1 -3
  9. package/dist/cjs/components/PanelDrawer/PanelDrawer.test.js +23 -0
  10. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.test.js +3 -1
  11. package/dist/cjs/components/Variables/Variable.js +7 -46
  12. package/dist/cjs/components/Variables/VariableEditor.js +157 -126
  13. package/dist/cjs/components/Variables/VariableEditorForm/VariableEditorForm.js +353 -161
  14. package/dist/cjs/components/Variables/VariableList.js +15 -8
  15. package/dist/cjs/components/Variables/variable-model.js +74 -0
  16. package/dist/cjs/components/index.js +1 -0
  17. package/dist/cjs/context/DashboardProvider/panel-editor-slice.js +40 -15
  18. package/dist/cjs/context/DashboardProvider/panel-group-editor-slice.js +5 -9
  19. package/dist/cjs/context/DashboardProvider/panel-group-slice.js +16 -1
  20. package/dist/cjs/views/ViewDashboard/tests/panelGroups.test.js +15 -21
  21. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
  22. package/dist/components/DashboardToolbar/DashboardToolbar.js +8 -12
  23. package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
  24. package/dist/components/DownloadButton/DownloadButton.d.ts +3 -0
  25. package/dist/components/DownloadButton/DownloadButton.d.ts.map +1 -0
  26. package/dist/components/DownloadButton/DownloadButton.js +60 -0
  27. package/dist/components/DownloadButton/DownloadButton.js.map +1 -0
  28. package/dist/components/DownloadButton/index.d.ts +2 -0
  29. package/dist/components/DownloadButton/index.d.ts.map +1 -0
  30. package/dist/{utils/component-ids.js → components/DownloadButton/index.js} +2 -14
  31. package/dist/components/DownloadButton/index.js.map +1 -0
  32. package/dist/components/GridLayout/GridLayout.d.ts.map +1 -1
  33. package/dist/components/GridLayout/GridLayout.js +13 -2
  34. package/dist/components/GridLayout/GridLayout.js.map +1 -1
  35. package/dist/components/GridLayout/GridTitle.d.ts.map +1 -1
  36. package/dist/components/GridLayout/GridTitle.js +11 -17
  37. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  38. package/dist/components/Panel/Panel.d.ts.map +1 -1
  39. package/dist/components/Panel/Panel.js +4 -2
  40. package/dist/components/Panel/Panel.js.map +1 -1
  41. package/dist/components/Panel/PanelHeader.d.ts.map +1 -1
  42. package/dist/components/Panel/PanelHeader.js +54 -50
  43. package/dist/components/Panel/PanelHeader.js.map +1 -1
  44. package/dist/components/PanelDrawer/PanelDrawer.js +1 -3
  45. package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
  46. package/dist/components/PanelDrawer/PanelDrawer.test.js +23 -0
  47. package/dist/components/PanelDrawer/PanelDrawer.test.js.map +1 -1
  48. package/dist/components/TimeRangeControls/TimeRangeControls.test.js +4 -2
  49. package/dist/components/TimeRangeControls/TimeRangeControls.test.js.map +1 -1
  50. package/dist/components/Variables/Variable.d.ts.map +1 -1
  51. package/dist/components/Variables/Variable.js +8 -47
  52. package/dist/components/Variables/Variable.js.map +1 -1
  53. package/dist/components/Variables/VariableEditor.d.ts.map +1 -1
  54. package/dist/components/Variables/VariableEditor.js +159 -128
  55. package/dist/components/Variables/VariableEditor.js.map +1 -1
  56. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.d.ts.map +1 -1
  57. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js +315 -162
  58. package/dist/components/Variables/VariableEditorForm/VariableEditorForm.js.map +1 -1
  59. package/dist/components/Variables/VariableEditorForm/variable-editor-form-model.js.map +1 -1
  60. package/dist/components/Variables/VariableList.d.ts.map +1 -1
  61. package/dist/components/Variables/VariableList.js +15 -8
  62. package/dist/components/Variables/VariableList.js.map +1 -1
  63. package/dist/components/Variables/variable-model.d.ts +8 -0
  64. package/dist/components/Variables/variable-model.d.ts.map +1 -0
  65. package/dist/components/Variables/variable-model.js +64 -0
  66. package/dist/components/Variables/variable-model.js.map +1 -0
  67. package/dist/components/index.d.ts +1 -0
  68. package/dist/components/index.d.ts.map +1 -1
  69. package/dist/components/index.js +1 -0
  70. package/dist/components/index.js.map +1 -1
  71. package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -1
  72. package/dist/context/DashboardProvider/panel-editor-slice.js +40 -15
  73. package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
  74. package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts.map +1 -1
  75. package/dist/context/DashboardProvider/panel-group-editor-slice.js +5 -9
  76. package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -1
  77. package/dist/context/DashboardProvider/panel-group-slice.d.ts +9 -0
  78. package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
  79. package/dist/context/DashboardProvider/panel-group-slice.js +17 -0
  80. package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
  81. package/dist/views/ViewDashboard/tests/panelGroups.test.js +15 -21
  82. package/dist/views/ViewDashboard/tests/panelGroups.test.js.map +1 -1
  83. package/package.json +4 -4
  84. package/dist/utils/component-ids.d.ts +0 -8
  85. package/dist/utils/component-ids.d.ts.map +0 -1
  86. package/dist/utils/component-ids.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Variables/VariableEditor.tsx"],"sourcesContent":["// Copyright 2022 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 { useState } from 'react';\nimport {\n Button,\n Stack,\n Box,\n TableContainer,\n TableBody,\n TableRow,\n TableCell,\n Table,\n Paper,\n TableHead,\n Switch,\n Typography,\n IconButton,\n} from '@mui/material';\nimport { VariableDefinition } from '@perses-dev/core';\nimport { useImmer } from 'use-immer';\nimport PencilIcon from 'mdi-material-ui/Pencil';\nimport TrashIcon from 'mdi-material-ui/TrashCan';\nimport ArrowUp from 'mdi-material-ui/ArrowUp';\nimport ArrowDown from 'mdi-material-ui/ArrowDown';\n\nimport { VariableEditForm } from './VariableEditorForm';\n\nexport function VariableEditor(props: {\n variableDefinitions: VariableDefinition[];\n onChange: (variableDefinitions: VariableDefinition[]) => void;\n onCancel: () => void;\n}) {\n const [variableDefinitions, setVariableDefinitions] = useImmer(props.variableDefinitions);\n const [variableEditIdx, setVariableEditIdx] = useState<number | null>(null);\n\n const currentEditingVariableDefinition = typeof variableEditIdx === 'number' && variableDefinitions[variableEditIdx];\n\n const removeVariable = (index: number) => {\n setVariableDefinitions((draft) => {\n draft.splice(index, 1);\n });\n };\n\n const addVariable = () => {\n setVariableDefinitions((draft) => {\n draft.push({\n kind: 'TextVariable',\n spec: {\n name: 'NewVariable',\n value: '',\n },\n });\n });\n };\n\n const toggleVariableVisibility = (index: number, visible: boolean) => {\n setVariableDefinitions((draft) => {\n const v = draft[index];\n if (!v) {\n return;\n }\n if (!v.spec.display) {\n v.spec.display = {\n name: v.spec.name,\n hidden: false,\n };\n }\n v.spec.display.hidden = visible === false;\n });\n };\n\n const changeVariableOrder = (index: number, direction: 'up' | 'down') => {\n setVariableDefinitions((draft) => {\n if (direction === 'up') {\n const prevElement = draft[index - 1];\n const currentElement = draft[index];\n if (index === 0 || !prevElement || !currentElement) {\n return;\n }\n draft[index - 1] = currentElement;\n draft[index] = prevElement;\n } else {\n const nextElement = draft[index + 1];\n const currentElement = draft[index];\n if (index === draft.length - 1 || !nextElement || !currentElement) {\n return;\n }\n draft[index + 1] = currentElement;\n draft[index] = nextElement;\n }\n });\n };\n\n return (\n <Box p={4}>\n {currentEditingVariableDefinition && (\n <>\n <Typography variant=\"h3\" mb={2}>\n Edit Variable\n </Typography>\n <VariableEditForm\n initialVariableDefinition={currentEditingVariableDefinition}\n onChange={(definition) => {\n setVariableDefinitions((draft) => {\n draft[variableEditIdx] = definition;\n setVariableEditIdx(null);\n });\n }}\n onCancel={() => setVariableEditIdx(null)}\n />\n </>\n )}\n {!currentEditingVariableDefinition && (\n <>\n <Stack direction=\"row\" spacing={1} justifyContent=\"end\">\n <Button\n disabled={props.variableDefinitions === variableDefinitions}\n variant=\"contained\"\n onClick={() => {\n props.onChange(variableDefinitions);\n }}\n >\n Apply\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => {\n props.onCancel();\n }}\n >\n Cancel\n </Button>\n </Stack>\n <Typography variant=\"h3\" mb={2}>\n Variable List\n </Typography>\n <Stack spacing={2}>\n <TableContainer component={Paper}>\n <Table sx={{ minWidth: 650 }} aria-label=\"simple table\">\n <TableHead>\n <TableRow>\n <TableCell>Visibility</TableCell>\n <TableCell>Variable Name</TableCell>\n <TableCell>Variable Type</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {variableDefinitions.map((v, idx) => (\n <TableRow key={v.spec.name}>\n <TableCell component=\"th\" scope=\"row\">\n <Switch\n checked={v.spec.display?.hidden !== true}\n onChange={(e) => {\n toggleVariableVisibility(idx, e.target.checked);\n }}\n />\n </TableCell>\n <TableCell component=\"th\" scope=\"row\" sx={{ fontWeight: 'bold' }}>\n {v.spec.name}\n </TableCell>\n <TableCell>{v.kind}</TableCell>\n <TableCell align=\"right\">\n <IconButton onClick={() => changeVariableOrder(idx, 'up')} disabled={idx === 0}>\n <ArrowUp />\n </IconButton>\n <IconButton\n onClick={() => changeVariableOrder(idx, 'down')}\n disabled={idx === variableDefinitions.length - 1}\n >\n <ArrowDown />\n </IconButton>\n\n <IconButton onClick={() => setVariableEditIdx(idx)}>\n <PencilIcon />\n </IconButton>\n <IconButton onClick={() => removeVariable(idx)}>\n <TrashIcon />\n </IconButton>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n <Box display=\"flex\">\n <Button onClick={addVariable} variant=\"contained\">\n Add New Variable\n </Button>\n </Box>\n </Stack>\n </>\n )}\n </Box>\n );\n}\n"],"names":["useState","Button","Stack","Box","TableContainer","TableBody","TableRow","TableCell","Table","Paper","TableHead","Switch","Typography","IconButton","useImmer","PencilIcon","TrashIcon","ArrowUp","ArrowDown","VariableEditForm","VariableEditor","props","variableDefinitions","setVariableDefinitions","variableEditIdx","setVariableEditIdx","currentEditingVariableDefinition","removeVariable","index","draft","splice","addVariable","push","kind","spec","name","value","toggleVariableVisibility","visible","v","display","hidden","changeVariableOrder","direction","prevElement","currentElement","nextElement","length","p","variant","mb","initialVariableDefinition","onChange","definition","onCancel","spacing","justifyContent","disabled","onClick","component","sx","minWidth","aria-label","align","map","idx","scope","checked","e","target","fontWeight"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/Variables/VariableEditor.tsx"],"sourcesContent":["// Copyright 2022 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 { useState, useMemo } from 'react';\nimport {\n Button,\n Stack,\n Box,\n TableContainer,\n TableBody,\n TableRow,\n TableCell,\n Table,\n Paper,\n TableHead,\n Switch,\n Typography,\n IconButton,\n Alert,\n} from '@mui/material';\nimport { VariableDefinition } from '@perses-dev/core';\nimport { useImmer } from 'use-immer';\nimport PencilIcon from 'mdi-material-ui/Pencil';\nimport TrashIcon from 'mdi-material-ui/TrashCan';\nimport ArrowUp from 'mdi-material-ui/ArrowUp';\nimport ArrowDown from 'mdi-material-ui/ArrowDown';\n\nimport { VariableEditForm } from './VariableEditorForm';\n\nfunction getValidation(variableDefinitions: VariableDefinition[]) {\n const errors = [];\n\n /** Variable names must be unique */\n const variableNames = variableDefinitions.map((variableDefinition) => variableDefinition.spec.name);\n const uniqueVariableNames = new Set(variableNames);\n if (variableNames.length !== uniqueVariableNames.size) {\n errors.push('Variable names must be unique');\n }\n return {\n errors: errors,\n isValid: errors.length === 0,\n };\n}\n\nexport function VariableEditor(props: {\n variableDefinitions: VariableDefinition[];\n onChange: (variableDefinitions: VariableDefinition[]) => void;\n onCancel: () => void;\n}) {\n const [variableDefinitions, setVariableDefinitions] = useImmer(props.variableDefinitions);\n const [variableEditIdx, setVariableEditIdx] = useState<number | null>(null);\n\n const validation = useMemo(() => getValidation(variableDefinitions), [variableDefinitions]);\n const currentEditingVariableDefinition = typeof variableEditIdx === 'number' && variableDefinitions[variableEditIdx];\n\n const removeVariable = (index: number) => {\n setVariableDefinitions((draft) => {\n draft.splice(index, 1);\n });\n };\n\n const addVariable = () => {\n setVariableDefinitions((draft) => {\n draft.push({\n kind: 'TextVariable',\n spec: {\n name: 'NewVariable',\n value: '',\n },\n });\n });\n };\n\n const toggleVariableVisibility = (index: number, visible: boolean) => {\n setVariableDefinitions((draft) => {\n const v = draft[index];\n if (!v) {\n return;\n }\n if (!v.spec.display) {\n v.spec.display = {\n name: v.spec.name,\n hidden: false,\n };\n }\n v.spec.display.hidden = visible === false;\n });\n };\n\n const changeVariableOrder = (index: number, direction: 'up' | 'down') => {\n setVariableDefinitions((draft) => {\n if (direction === 'up') {\n const prevElement = draft[index - 1];\n const currentElement = draft[index];\n if (index === 0 || !prevElement || !currentElement) {\n return;\n }\n draft[index - 1] = currentElement;\n draft[index] = prevElement;\n } else {\n const nextElement = draft[index + 1];\n const currentElement = draft[index];\n if (index === draft.length - 1 || !nextElement || !currentElement) {\n return;\n }\n draft[index + 1] = currentElement;\n draft[index] = nextElement;\n }\n });\n };\n\n return (\n <>\n {currentEditingVariableDefinition && (\n <VariableEditForm\n initialVariableDefinition={currentEditingVariableDefinition}\n onChange={(definition) => {\n setVariableDefinitions((draft) => {\n draft[variableEditIdx] = definition;\n setVariableEditIdx(null);\n });\n }}\n onCancel={() => setVariableEditIdx(null)}\n />\n )}\n {!currentEditingVariableDefinition && (\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.grey[100]}`,\n }}\n >\n <Typography variant=\"h2\">Template Variables</Typography>\n <Stack direction=\"row\" spacing={1} marginLeft=\"auto\">\n <Button\n disabled={props.variableDefinitions === variableDefinitions || !validation.isValid}\n variant=\"contained\"\n onClick={() => {\n props.onChange(variableDefinitions);\n }}\n >\n Apply\n </Button>\n <Button\n variant=\"outlined\"\n onClick={() => {\n props.onCancel();\n }}\n >\n Cancel\n </Button>\n </Stack>\n </Box>\n <Box padding={2} sx={{ overflowY: 'scroll' }}>\n <Typography variant=\"h3\" mb={2}>\n Variable List\n </Typography>\n <Stack spacing={2}>\n {!validation.isValid &&\n validation.errors.map((error) => (\n <Alert severity=\"error\" key={error}>\n {error}\n </Alert>\n ))}\n <TableContainer component={Paper}>\n <Table sx={{ minWidth: 650 }} aria-label=\"simple table\">\n <TableHead>\n <TableRow>\n <TableCell>Visibility</TableCell>\n <TableCell>Variable Name</TableCell>\n <TableCell>Variable Type</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {variableDefinitions.map((v, idx) => (\n <TableRow key={v.spec.name}>\n <TableCell component=\"th\" scope=\"row\">\n <Switch\n checked={v.spec.display?.hidden !== true}\n onChange={(e) => {\n toggleVariableVisibility(idx, e.target.checked);\n }}\n />\n </TableCell>\n <TableCell component=\"th\" scope=\"row\" sx={{ fontWeight: 'bold' }}>\n {v.spec.name}\n </TableCell>\n <TableCell>{v.kind}</TableCell>\n <TableCell align=\"right\">\n <IconButton onClick={() => changeVariableOrder(idx, 'up')} disabled={idx === 0}>\n <ArrowUp />\n </IconButton>\n <IconButton\n onClick={() => changeVariableOrder(idx, 'down')}\n disabled={idx === variableDefinitions.length - 1}\n >\n <ArrowDown />\n </IconButton>\n\n <IconButton onClick={() => setVariableEditIdx(idx)}>\n <PencilIcon />\n </IconButton>\n <IconButton onClick={() => removeVariable(idx)}>\n <TrashIcon />\n </IconButton>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n <Box display=\"flex\">\n <Button onClick={addVariable} variant=\"contained\">\n Add New Variable\n </Button>\n </Box>\n </Stack>\n </Box>\n </>\n )}\n </>\n );\n}\n"],"names":["useState","useMemo","Button","Stack","Box","TableContainer","TableBody","TableRow","TableCell","Table","Paper","TableHead","Switch","Typography","IconButton","Alert","useImmer","PencilIcon","TrashIcon","ArrowUp","ArrowDown","VariableEditForm","getValidation","variableDefinitions","errors","variableNames","map","variableDefinition","spec","name","uniqueVariableNames","Set","length","size","push","isValid","VariableEditor","props","setVariableDefinitions","variableEditIdx","setVariableEditIdx","validation","currentEditingVariableDefinition","removeVariable","index","draft","splice","addVariable","kind","value","toggleVariableVisibility","visible","v","display","hidden","changeVariableOrder","direction","prevElement","currentElement","nextElement","initialVariableDefinition","onChange","definition","onCancel","sx","alignItems","padding","theme","spacing","borderBottom","palette","grey","variant","marginLeft","disabled","onClick","overflowY","mb","error","severity","component","minWidth","aria-label","align","idx","scope","checked","e","target","fontWeight"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"VariableEditorForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"names":[],"mappings":";AA6BA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWtD,wBAAgB,gBAAgB,CAAC,EAC/B,yBAAyB,EACzB,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,yBAAyB,EAAE,kBAAkB,CAAC;IAC9C,QAAQ,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,eAyJA"}
1
+ {"version":3,"file":"VariableEditorForm.d.ts","sourceRoot":"","sources":["../../../../src/components/Variables/VariableEditorForm/VariableEditorForm.tsx"],"names":[],"mappings":";AAiCA,OAAO,EAAE,kBAAkB,EAA0B,MAAM,kBAAkB,CAAC;AAgE9E,wBAAgB,gBAAgB,CAAC,EAC/B,yBAAyB,EACzB,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,yBAAyB,EAAE,kBAAkB,CAAC;IAC9C,QAAQ,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,eA2MA"}
@@ -11,216 +11,369 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
- import React from 'react';
15
- import { Box, Typography, Switch, TextField, Grid, FormControl, InputLabel, MenuItem, Select, Button, Stack } from '@mui/material';
14
+ import React, { useMemo, useState } from 'react';
15
+ import { Box, Typography, Switch, TextField, Grid, FormControl, InputLabel, MenuItem, Select, Button, Stack, Alert, Chip, IconButton, ClickAwayListener } from '@mui/material';
16
16
  import { useImmer } from 'use-immer';
17
17
  import { PluginEditor } from '@perses-dev/plugin-system';
18
+ import { ErrorBoundary } from '@perses-dev/components';
19
+ import Refresh from 'mdi-material-ui/Refresh';
20
+ import { useListVariablePluginValues } from '../variable-model';
18
21
  import { getVariableDefinitionFromState, getInitialState } from './variable-editor-form-model';
19
22
  const VARIABLE_TYPES = [
20
23
  'ListVariable',
21
24
  'TextVariable'
22
25
  ];
26
+ const DEFAULT_MAX_PREVIEW_VALUES = 50;
27
+ // TODO: Replace with proper validation library
28
+ function getValidation(state) {
29
+ /** Name validation */ let name = null;
30
+ if (!state.name) {
31
+ name = 'Name is required';
32
+ }
33
+ // name can only contain alphanumeric characters and underscores and no spaces
34
+ if (state.name && !/^[a-zA-Z0-9_-]+$/.test(state.name)) {
35
+ name = 'Name can only contain alphanumeric characters, underscores, and dashes';
36
+ }
37
+ return {
38
+ name,
39
+ isValid: !name
40
+ };
41
+ }
23
42
  const SectionHeader = ({ children })=>/*#__PURE__*/ _jsx(Typography, {
24
43
  pb: 2,
25
44
  variant: "subtitle1",
26
45
  children: children
27
46
  });
28
- export function VariableEditForm({ initialVariableDefinition , onChange , onCancel }) {
29
- const [state, setState] = useImmer(getInitialState(initialVariableDefinition));
47
+ function VariableListPreview({ definition }) {
48
+ const { data , isFetching , error } = useListVariablePluginValues(definition);
49
+ const [maxValues, setMaxValues] = useState(DEFAULT_MAX_PREVIEW_VALUES);
50
+ const showAll = ()=>{
51
+ setMaxValues(undefined);
52
+ };
53
+ let notShown = 0;
54
+ if (data && (data === null || data === void 0 ? void 0 : data.length) > 0 && maxValues) {
55
+ notShown = data.length - maxValues;
56
+ }
57
+ const errorMessage = error === null || error === void 0 ? void 0 : error.message;
30
58
  return /*#__PURE__*/ _jsxs(Box, {
31
59
  children: [
32
- /*#__PURE__*/ _jsx(SectionHeader, {
33
- children: "General"
60
+ errorMessage && /*#__PURE__*/ _jsx(Alert, {
61
+ severity: "error",
62
+ children: errorMessage
34
63
  }),
35
- /*#__PURE__*/ _jsxs(Grid, {
36
- container: true,
37
- spacing: 2,
38
- mb: 2,
64
+ isFetching && 'Loading...',
65
+ (data === null || data === void 0 ? void 0 : data.length) === 0 && /*#__PURE__*/ _jsx(Alert, {
66
+ severity: "info",
67
+ children: "No results"
68
+ }),
69
+ /*#__PURE__*/ _jsxs(_Fragment, {
39
70
  children: [
40
- /*#__PURE__*/ _jsx(Grid, {
41
- item: true,
42
- xs: 6,
43
- children: /*#__PURE__*/ _jsx(TextField, {
44
- fullWidth: true,
45
- label: "Name",
46
- value: state.name,
47
- onChange: (v)=>{
48
- setState((draft)=>{
49
- draft.name = v.target.value;
50
- });
51
- }
52
- })
53
- }),
54
- /*#__PURE__*/ _jsx(Grid, {
55
- item: true,
56
- xs: 6,
57
- children: /*#__PURE__*/ _jsxs(FormControl, {
58
- fullWidth: true,
59
- children: [
60
- /*#__PURE__*/ _jsx(InputLabel, {
61
- id: "variable-type-select-label",
62
- children: "Type"
63
- }),
64
- /*#__PURE__*/ _jsx(Select, {
65
- labelId: "variable-type-select-label",
66
- id: "variable-type-select",
67
- label: "Type",
68
- value: state.kind,
69
- onChange: (v)=>{
70
- setState((draft)=>{
71
- draft.kind = v.target.value;
72
- });
73
- },
74
- children: VARIABLE_TYPES.map((v)=>/*#__PURE__*/ _jsx(MenuItem, {
75
- value: v,
76
- children: v
77
- }, v))
78
- })
79
- ]
80
- })
81
- }),
82
- /*#__PURE__*/ _jsx(Grid, {
83
- item: true,
84
- xs: 6,
85
- children: /*#__PURE__*/ _jsx(TextField, {
86
- fullWidth: true,
87
- label: "Label",
88
- value: state.title,
89
- onChange: (v)=>{
90
- setState((draft)=>{
91
- draft.title = v.target.value;
92
- });
93
- }
94
- })
95
- }),
96
- /*#__PURE__*/ _jsx(Grid, {
97
- item: true,
98
- xs: 12,
99
- children: /*#__PURE__*/ _jsx(TextField, {
100
- fullWidth: true,
101
- label: "Description",
102
- value: state.description,
103
- onChange: (v)=>{
104
- setState((draft)=>{
105
- draft.description = v.target.value;
106
- });
107
- }
108
- })
71
+ data === null || data === void 0 ? void 0 : data.slice(0, maxValues).map((val)=>/*#__PURE__*/ _jsx(Chip, {
72
+ sx: {
73
+ mr: 1,
74
+ mb: 1
75
+ },
76
+ size: "small",
77
+ label: val.label
78
+ }, val.value)),
79
+ notShown > 0 && /*#__PURE__*/ _jsx(Chip, {
80
+ onClick: showAll,
81
+ variant: "outlined",
82
+ sx: {
83
+ mr: 1,
84
+ mb: 1
85
+ },
86
+ size: "small",
87
+ label: `+${notShown} more`
109
88
  })
110
89
  ]
111
- }),
112
- state.kind === 'TextVariable' && /*#__PURE__*/ _jsxs(_Fragment, {
90
+ })
91
+ ]
92
+ });
93
+ }
94
+ export function VariableEditForm({ initialVariableDefinition , onChange , onCancel }) {
95
+ const [state, setState] = useImmer(getInitialState(initialVariableDefinition));
96
+ const validation = useMemo(()=>getValidation(state), [
97
+ state
98
+ ]);
99
+ const [previewKey, setPreviewKey] = React.useState(0);
100
+ const refreshPreview = ()=>{
101
+ setPreviewKey((prev)=>prev + 1);
102
+ };
103
+ /** We use the `previewKey` that we increment to know when to explicity update the
104
+ * spec that will be used for preview. The reason why we do this is to avoid
105
+ * having to re-fetch the values when the user is still editing the spec.
106
+ */ const previewSpec = useMemo(()=>{
107
+ return getVariableDefinitionFromState(state);
108
+ // eslint-disable-next-line react-hooks/exhaustive-deps
109
+ }, [
110
+ previewKey
111
+ ]);
112
+ return /*#__PURE__*/ _jsxs(_Fragment, {
113
+ children: [
114
+ /*#__PURE__*/ _jsxs(Box, {
115
+ sx: {
116
+ display: 'flex',
117
+ alignItems: 'center',
118
+ padding: (theme)=>theme.spacing(1, 2),
119
+ borderBottom: (theme)=>`1px solid ${theme.palette.grey[100]}`
120
+ },
113
121
  children: [
114
- /*#__PURE__*/ _jsx(SectionHeader, {
115
- children: "Text Options"
122
+ /*#__PURE__*/ _jsx(Typography, {
123
+ variant: "h2",
124
+ children: "Template Variables / Edit Variable"
116
125
  }),
117
- /*#__PURE__*/ _jsx(Grid, {
118
- container: true,
119
- spacing: 2,
120
- mb: 2,
121
- children: /*#__PURE__*/ _jsx(Grid, {
122
- item: true,
123
- xs: 12,
124
- children: /*#__PURE__*/ _jsx(TextField, {
125
- label: "Value",
126
- value: state.textVariableFields.value,
127
- onChange: (v)=>{
128
- setState((draft)=>{
129
- draft.textVariableFields.value = v.target.value;
130
- });
131
- }
126
+ /*#__PURE__*/ _jsxs(Stack, {
127
+ direction: "row",
128
+ spacing: 1,
129
+ sx: {
130
+ marginLeft: 'auto'
131
+ },
132
+ children: [
133
+ /*#__PURE__*/ _jsx(Button, {
134
+ disabled: !validation.isValid,
135
+ variant: "contained",
136
+ onClick: ()=>{
137
+ onChange(getVariableDefinitionFromState(state));
138
+ },
139
+ children: "Update"
140
+ }),
141
+ /*#__PURE__*/ _jsx(Button, {
142
+ variant: "outlined",
143
+ onClick: ()=>{
144
+ onCancel();
145
+ },
146
+ children: "Cancel"
132
147
  })
133
- })
148
+ ]
134
149
  })
135
150
  ]
136
151
  }),
137
- state.kind === 'ListVariable' && /*#__PURE__*/ _jsxs(_Fragment, {
152
+ /*#__PURE__*/ _jsxs(Box, {
153
+ padding: 2,
154
+ sx: {
155
+ overflowY: 'scroll'
156
+ },
138
157
  children: [
139
- /*#__PURE__*/ _jsx(SectionHeader, {
140
- children: "List Options"
141
- }),
142
- /*#__PURE__*/ _jsx(Grid, {
143
- container: true,
144
- spacing: 2,
158
+ /*#__PURE__*/ _jsx(Typography, {
159
+ variant: "h3",
145
160
  mb: 2,
146
- children: /*#__PURE__*/ _jsx(Grid, {
147
- item: true,
148
- xs: 6,
149
- children: /*#__PURE__*/ _jsx(PluginEditor, {
150
- width: 500,
151
- pluginType: "Variable",
152
- pluginKindLabel: "Source",
153
- value: state.listVariableFields.plugin,
154
- onChange: (val)=>{
155
- setState((draft)=>{
156
- draft.listVariableFields.plugin = val;
157
- });
158
- }
159
- })
160
- })
161
+ children: "Edit Variable"
161
162
  }),
162
163
  /*#__PURE__*/ _jsx(SectionHeader, {
163
- children: "Dropdown Options"
164
+ children: "General"
164
165
  }),
165
166
  /*#__PURE__*/ _jsxs(Grid, {
166
167
  container: true,
167
- spacing: 1,
168
- mb: 1,
168
+ spacing: 2,
169
+ mb: 2,
169
170
  children: [
170
- /*#__PURE__*/ _jsxs(Grid, {
171
+ /*#__PURE__*/ _jsx(Grid, {
172
+ item: true,
173
+ xs: 6,
174
+ children: /*#__PURE__*/ _jsx(TextField, {
175
+ required: true,
176
+ error: !!validation.name,
177
+ fullWidth: true,
178
+ label: "Name",
179
+ value: state.name,
180
+ helperText: validation.name,
181
+ onChange: (v)=>{
182
+ setState((draft)=>{
183
+ draft.name = v.target.value;
184
+ });
185
+ }
186
+ })
187
+ }),
188
+ /*#__PURE__*/ _jsx(Grid, {
189
+ item: true,
190
+ xs: 6,
191
+ children: /*#__PURE__*/ _jsxs(FormControl, {
192
+ fullWidth: true,
193
+ children: [
194
+ /*#__PURE__*/ _jsx(InputLabel, {
195
+ id: "variable-type-select-label",
196
+ children: "Type"
197
+ }),
198
+ /*#__PURE__*/ _jsx(Select, {
199
+ labelId: "variable-type-select-label",
200
+ id: "variable-type-select",
201
+ label: "Type",
202
+ value: state.kind,
203
+ onChange: (v)=>{
204
+ setState((draft)=>{
205
+ draft.kind = v.target.value;
206
+ });
207
+ },
208
+ children: VARIABLE_TYPES.map((v)=>/*#__PURE__*/ _jsx(MenuItem, {
209
+ value: v,
210
+ children: v
211
+ }, v))
212
+ })
213
+ ]
214
+ })
215
+ }),
216
+ /*#__PURE__*/ _jsx(Grid, {
217
+ item: true,
218
+ xs: 6,
219
+ children: /*#__PURE__*/ _jsx(TextField, {
220
+ fullWidth: true,
221
+ label: "Label",
222
+ value: state.title,
223
+ onChange: (v)=>{
224
+ setState((draft)=>{
225
+ draft.title = v.target.value;
226
+ });
227
+ }
228
+ })
229
+ }),
230
+ /*#__PURE__*/ _jsx(Grid, {
171
231
  item: true,
172
232
  xs: 12,
173
- children: [
174
- "Allow Multiple",
175
- /*#__PURE__*/ _jsx(Switch, {
176
- checked: state.listVariableFields.allowMultiple,
177
- onChange: (e)=>{
233
+ children: /*#__PURE__*/ _jsx(TextField, {
234
+ fullWidth: true,
235
+ label: "Description",
236
+ value: state.description,
237
+ onChange: (v)=>{
238
+ setState((draft)=>{
239
+ draft.description = v.target.value;
240
+ });
241
+ }
242
+ })
243
+ })
244
+ ]
245
+ }),
246
+ state.kind === 'TextVariable' && /*#__PURE__*/ _jsxs(_Fragment, {
247
+ children: [
248
+ /*#__PURE__*/ _jsx(SectionHeader, {
249
+ children: "Text Options"
250
+ }),
251
+ /*#__PURE__*/ _jsx(Grid, {
252
+ container: true,
253
+ spacing: 2,
254
+ mb: 2,
255
+ children: /*#__PURE__*/ _jsx(Grid, {
256
+ item: true,
257
+ xs: 12,
258
+ children: /*#__PURE__*/ _jsx(TextField, {
259
+ label: "Value",
260
+ value: state.textVariableFields.value,
261
+ onChange: (v)=>{
178
262
  setState((draft)=>{
179
- draft.listVariableFields.allowMultiple = e.target.checked;
263
+ draft.textVariableFields.value = v.target.value;
180
264
  });
181
265
  }
182
266
  })
267
+ })
268
+ })
269
+ ]
270
+ }),
271
+ state.kind === 'ListVariable' && /*#__PURE__*/ _jsxs(_Fragment, {
272
+ children: [
273
+ /*#__PURE__*/ _jsx(SectionHeader, {
274
+ children: "List Options"
275
+ }),
276
+ /*#__PURE__*/ _jsxs(Grid, {
277
+ container: true,
278
+ spacing: 2,
279
+ mb: 2,
280
+ children: [
281
+ /*#__PURE__*/ _jsxs(Grid, {
282
+ item: true,
283
+ xs: 6,
284
+ children: [
285
+ /*#__PURE__*/ _jsx(ClickAwayListener, {
286
+ onClickAway: ()=>refreshPreview(),
287
+ children: /*#__PURE__*/ _jsx(Box, {})
288
+ }),
289
+ /*#__PURE__*/ _jsx(PluginEditor, {
290
+ width: 500,
291
+ pluginType: "Variable",
292
+ pluginKindLabel: "Source",
293
+ value: state.listVariableFields.plugin,
294
+ onChange: (val)=>{
295
+ setState((draft)=>{
296
+ draft.listVariableFields.plugin = val;
297
+ });
298
+ }
299
+ })
300
+ ]
301
+ }),
302
+ /*#__PURE__*/ _jsx(Grid, {
303
+ item: true,
304
+ xs: 12,
305
+ children: /*#__PURE__*/ _jsxs(ErrorBoundary, {
306
+ FallbackComponent: ()=>/*#__PURE__*/ _jsx("div", {
307
+ children: "Error"
308
+ }),
309
+ children: [
310
+ /*#__PURE__*/ _jsxs(Stack, {
311
+ direction: 'row',
312
+ spacing: 1,
313
+ alignItems: "center",
314
+ children: [
315
+ /*#__PURE__*/ _jsx(Typography, {
316
+ variant: "caption",
317
+ children: "Preview Values"
318
+ }),
319
+ /*#__PURE__*/ _jsx(IconButton, {
320
+ onClick: refreshPreview,
321
+ size: "small",
322
+ children: /*#__PURE__*/ _jsx(Refresh, {})
323
+ })
324
+ ]
325
+ }),
326
+ /*#__PURE__*/ _jsx(VariableListPreview, {
327
+ definition: previewSpec
328
+ })
329
+ ]
330
+ })
331
+ })
183
332
  ]
184
333
  }),
334
+ /*#__PURE__*/ _jsx(SectionHeader, {
335
+ children: "Dropdown Options"
336
+ }),
185
337
  /*#__PURE__*/ _jsxs(Grid, {
186
- item: true,
187
- xs: 12,
338
+ container: true,
339
+ spacing: 1,
340
+ mb: 1,
188
341
  children: [
189
- "Allow All",
190
- /*#__PURE__*/ _jsx(Switch, {
191
- checked: state.listVariableFields.allowAll,
192
- onChange: (e)=>{
193
- setState((draft)=>{
194
- draft.listVariableFields.allowAll = e.target.checked;
195
- });
196
- }
342
+ /*#__PURE__*/ _jsxs(Grid, {
343
+ item: true,
344
+ xs: 12,
345
+ children: [
346
+ "Allow Multiple",
347
+ /*#__PURE__*/ _jsx(Switch, {
348
+ checked: state.listVariableFields.allowMultiple,
349
+ onChange: (e)=>{
350
+ setState((draft)=>{
351
+ draft.listVariableFields.allowMultiple = e.target.checked;
352
+ });
353
+ }
354
+ })
355
+ ]
356
+ }),
357
+ /*#__PURE__*/ _jsxs(Grid, {
358
+ item: true,
359
+ xs: 12,
360
+ children: [
361
+ "Allow All",
362
+ /*#__PURE__*/ _jsx(Switch, {
363
+ checked: state.listVariableFields.allowAll,
364
+ onChange: (e)=>{
365
+ setState((draft)=>{
366
+ draft.listVariableFields.allowAll = e.target.checked;
367
+ });
368
+ }
369
+ })
370
+ ]
197
371
  })
198
372
  ]
199
373
  })
200
374
  ]
201
375
  })
202
376
  ]
203
- }),
204
- /*#__PURE__*/ _jsxs(Stack, {
205
- direction: 'row',
206
- spacing: 2,
207
- justifyContent: "end",
208
- children: [
209
- /*#__PURE__*/ _jsx(Button, {
210
- variant: "contained",
211
- onClick: ()=>{
212
- onChange(getVariableDefinitionFromState(state));
213
- },
214
- children: "Update"
215
- }),
216
- /*#__PURE__*/ _jsx(Button, {
217
- variant: "outlined",
218
- onClick: ()=>{
219
- onCancel();
220
- },
221
- children: "Cancel"
222
- })
223
- ]
224
377
  })
225
378
  ]
226
379
  });