@perses-dev/dashboards 0.10.0 → 0.11.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 (193) hide show
  1. package/dist/cjs/components/Dashboard.js +4 -5
  2. package/dist/cjs/components/DashboardToolbar.js +11 -5
  3. package/dist/cjs/components/GridLayout/GridItemContent.js +3 -11
  4. package/dist/cjs/components/GridLayout/GridLayout.js +8 -6
  5. package/dist/cjs/components/GridLayout/GridTitle.js +9 -11
  6. package/dist/cjs/components/Panel/DeletePanelDialog.js +12 -8
  7. package/dist/cjs/components/Panel/Panel.js +4 -13
  8. package/dist/cjs/components/Panel/Panel.test.js +4 -3
  9. package/dist/cjs/components/PanelDrawer/PanelDrawer.js +1 -1
  10. package/dist/cjs/components/PanelDrawer/PanelDrawer.test.js +3 -3
  11. package/dist/cjs/components/PanelDrawer/PanelEditorForm.js +21 -15
  12. package/dist/cjs/components/PanelDrawer/PanelPreview.js +9 -3
  13. package/dist/cjs/components/PanelGroupDialog/DeletePanelGroupDialog.js +13 -11
  14. package/dist/cjs/components/PanelGroupDialog/PanelGroupDialog.js +70 -111
  15. package/dist/cjs/components/PanelGroupDialog/PanelGroupDialog.test.js +22 -16
  16. package/dist/cjs/components/PanelGroupDialog/PanelGroupEditorForm.js +92 -0
  17. package/dist/cjs/components/PanelGroupDialog/index.js +29 -0
  18. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +8 -11
  19. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.test.js +20 -13
  20. package/dist/cjs/components/Variables/Variable.js +1 -0
  21. package/dist/cjs/components/Variables/VariableEditor.js +33 -0
  22. package/dist/cjs/components/Variables/VariableList.js +0 -1
  23. package/dist/cjs/components/index.js +1 -0
  24. package/dist/cjs/context/DashboardProvider/DashboardProvider.js +20 -8
  25. package/dist/cjs/context/DashboardProvider/dashboard-provider-api.js +122 -29
  26. package/dist/cjs/context/DashboardProvider/{panel-editing-slice.js → panel-editor-slice.js} +32 -13
  27. package/dist/cjs/context/DashboardProvider/panel-group-editor-slice.js +102 -0
  28. package/dist/cjs/context/DashboardProvider/panel-group-slice.js +187 -17
  29. package/dist/cjs/context/TimeRangeProvider.js +20 -44
  30. package/dist/cjs/context/index.js +1 -1
  31. package/dist/cjs/context/useDashboardSpec.js +61 -0
  32. package/dist/cjs/index.js +1 -0
  33. package/dist/cjs/test/render.js +25 -5
  34. package/dist/cjs/test/setup-tests.js +4 -1
  35. package/dist/cjs/test/testDashboard.js +11 -10
  36. package/dist/cjs/utils/index.js +28 -0
  37. package/dist/cjs/utils/time-range-params.js +145 -0
  38. package/dist/cjs/views/ViewDashboard/DashboardApp.js +2 -4
  39. package/dist/cjs/views/ViewDashboard/ViewDashboard.js +5 -22
  40. package/dist/cjs/views/ViewDashboard/tests/panelGroups.test.js +42 -93
  41. package/dist/components/Dashboard.js +5 -6
  42. package/dist/components/Dashboard.js.map +1 -1
  43. package/dist/components/DashboardToolbar.d.ts.map +1 -1
  44. package/dist/components/DashboardToolbar.js +13 -7
  45. package/dist/components/DashboardToolbar.js.map +1 -1
  46. package/dist/components/GridLayout/GridItemContent.d.ts +2 -4
  47. package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
  48. package/dist/components/GridLayout/GridItemContent.js +4 -12
  49. package/dist/components/GridLayout/GridItemContent.js.map +1 -1
  50. package/dist/components/GridLayout/GridLayout.d.ts +2 -3
  51. package/dist/components/GridLayout/GridLayout.d.ts.map +1 -1
  52. package/dist/components/GridLayout/GridLayout.js +9 -7
  53. package/dist/components/GridLayout/GridLayout.js.map +1 -1
  54. package/dist/components/GridLayout/GridTitle.d.ts +2 -1
  55. package/dist/components/GridLayout/GridTitle.d.ts.map +1 -1
  56. package/dist/components/GridLayout/GridTitle.js +10 -12
  57. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  58. package/dist/components/Panel/DeletePanelDialog.d.ts +1 -1
  59. package/dist/components/Panel/DeletePanelDialog.d.ts.map +1 -1
  60. package/dist/components/Panel/DeletePanelDialog.js +13 -9
  61. package/dist/components/Panel/DeletePanelDialog.js.map +1 -1
  62. package/dist/components/Panel/Panel.d.ts +2 -2
  63. package/dist/components/Panel/Panel.d.ts.map +1 -1
  64. package/dist/components/Panel/Panel.js +5 -14
  65. package/dist/components/Panel/Panel.js.map +1 -1
  66. package/dist/components/Panel/Panel.test.d.ts +1 -1
  67. package/dist/components/Panel/Panel.test.d.ts.map +1 -1
  68. package/dist/components/Panel/Panel.test.js +4 -3
  69. package/dist/components/Panel/Panel.test.js.map +1 -1
  70. package/dist/components/PanelDrawer/PanelDrawer.js +2 -2
  71. package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
  72. package/dist/components/PanelDrawer/PanelDrawer.test.js +3 -3
  73. package/dist/components/PanelDrawer/PanelDrawer.test.js.map +1 -1
  74. package/dist/components/PanelDrawer/PanelEditorForm.d.ts +1 -1
  75. package/dist/components/PanelDrawer/PanelEditorForm.d.ts.map +1 -1
  76. package/dist/components/PanelDrawer/PanelEditorForm.js +22 -16
  77. package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
  78. package/dist/components/PanelDrawer/PanelPreview.d.ts +2 -2
  79. package/dist/components/PanelDrawer/PanelPreview.d.ts.map +1 -1
  80. package/dist/components/PanelDrawer/PanelPreview.js +9 -3
  81. package/dist/components/PanelDrawer/PanelPreview.js.map +1 -1
  82. package/dist/components/PanelGroupDialog/DeletePanelGroupDialog.d.ts +1 -2
  83. package/dist/components/PanelGroupDialog/DeletePanelGroupDialog.d.ts.map +1 -1
  84. package/dist/components/PanelGroupDialog/DeletePanelGroupDialog.js +13 -11
  85. package/dist/components/PanelGroupDialog/DeletePanelGroupDialog.js.map +1 -1
  86. package/dist/components/PanelGroupDialog/PanelGroupDialog.d.ts +4 -2
  87. package/dist/components/PanelGroupDialog/PanelGroupDialog.d.ts.map +1 -1
  88. package/dist/components/PanelGroupDialog/PanelGroupDialog.js +73 -112
  89. package/dist/components/PanelGroupDialog/PanelGroupDialog.js.map +1 -1
  90. package/dist/components/PanelGroupDialog/PanelGroupDialog.test.js +21 -15
  91. package/dist/components/PanelGroupDialog/PanelGroupDialog.test.js.map +1 -1
  92. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.d.ts +12 -0
  93. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.d.ts.map +1 -0
  94. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js +82 -0
  95. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js.map +1 -0
  96. package/dist/components/PanelGroupDialog/index.d.ts +3 -0
  97. package/dist/components/PanelGroupDialog/index.d.ts.map +1 -0
  98. package/dist/components/PanelGroupDialog/index.js +16 -0
  99. package/dist/components/PanelGroupDialog/index.js.map +1 -0
  100. package/dist/components/TimeRangeControls/TimeRangeControls.d.ts.map +1 -1
  101. package/dist/components/TimeRangeControls/TimeRangeControls.js +11 -14
  102. package/dist/components/TimeRangeControls/TimeRangeControls.js.map +1 -1
  103. package/dist/components/TimeRangeControls/TimeRangeControls.test.js +21 -14
  104. package/dist/components/TimeRangeControls/TimeRangeControls.test.js.map +1 -1
  105. package/dist/components/Variables/Variable.js +1 -0
  106. package/dist/components/Variables/Variable.js.map +1 -1
  107. package/dist/components/Variables/VariableEditor.d.ts.map +1 -1
  108. package/dist/components/Variables/VariableEditor.js +33 -0
  109. package/dist/components/Variables/VariableEditor.js.map +1 -1
  110. package/dist/components/Variables/VariableList.js +0 -1
  111. package/dist/components/Variables/VariableList.js.map +1 -1
  112. package/dist/components/index.d.ts +1 -0
  113. package/dist/components/index.d.ts.map +1 -1
  114. package/dist/components/index.js +1 -0
  115. package/dist/components/index.js.map +1 -1
  116. package/dist/context/DashboardProvider/DashboardProvider.d.ts +7 -5
  117. package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
  118. package/dist/context/DashboardProvider/DashboardProvider.js +19 -7
  119. package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
  120. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +64 -22
  121. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
  122. package/dist/context/DashboardProvider/dashboard-provider-api.js +133 -26
  123. package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
  124. package/dist/context/DashboardProvider/index.d.ts +2 -0
  125. package/dist/context/DashboardProvider/index.d.ts.map +1 -1
  126. package/dist/context/DashboardProvider/index.js.map +1 -1
  127. package/dist/context/DashboardProvider/{panel-editing-slice.d.ts → panel-editor-slice.d.ts} +28 -13
  128. package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -0
  129. package/dist/context/DashboardProvider/{panel-editing-slice.js → panel-editor-slice.js} +33 -14
  130. package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -0
  131. package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts +40 -0
  132. package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts.map +1 -0
  133. package/dist/context/DashboardProvider/panel-group-editor-slice.js +96 -0
  134. package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -0
  135. package/dist/context/DashboardProvider/panel-group-slice.d.ts +75 -10
  136. package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
  137. package/dist/context/DashboardProvider/panel-group-slice.js +189 -17
  138. package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
  139. package/dist/context/TimeRangeProvider.d.ts +9 -2
  140. package/dist/context/TimeRangeProvider.d.ts.map +1 -1
  141. package/dist/context/TimeRangeProvider.js +15 -43
  142. package/dist/context/TimeRangeProvider.js.map +1 -1
  143. package/dist/context/index.d.ts +1 -1
  144. package/dist/context/index.d.ts.map +1 -1
  145. package/dist/context/index.js +1 -1
  146. package/dist/context/index.js.map +1 -1
  147. package/dist/context/useDashboardSpec.d.ts +3 -0
  148. package/dist/context/useDashboardSpec.d.ts.map +1 -0
  149. package/dist/context/useDashboardSpec.js +55 -0
  150. package/dist/context/useDashboardSpec.js.map +1 -0
  151. package/dist/index.d.ts +1 -0
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +1 -0
  154. package/dist/index.js.map +1 -1
  155. package/dist/test/render.d.ts +2 -1
  156. package/dist/test/render.d.ts.map +1 -1
  157. package/dist/test/render.js +25 -5
  158. package/dist/test/render.js.map +1 -1
  159. package/dist/test/setup-tests.d.ts.map +1 -1
  160. package/dist/test/setup-tests.js +4 -0
  161. package/dist/test/setup-tests.js.map +1 -1
  162. package/dist/test/testDashboard.d.ts.map +1 -1
  163. package/dist/test/testDashboard.js +11 -10
  164. package/dist/test/testDashboard.js.map +1 -1
  165. package/dist/utils/index.d.ts +2 -0
  166. package/dist/utils/index.d.ts.map +1 -0
  167. package/dist/utils/index.js +15 -0
  168. package/dist/utils/index.js.map +1 -0
  169. package/dist/utils/time-range-params.d.ts +25 -0
  170. package/dist/utils/time-range-params.d.ts.map +1 -0
  171. package/dist/utils/time-range-params.js +137 -0
  172. package/dist/utils/time-range-params.js.map +1 -0
  173. package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
  174. package/dist/views/ViewDashboard/DashboardApp.js +1 -3
  175. package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
  176. package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
  177. package/dist/views/ViewDashboard/ViewDashboard.js +5 -22
  178. package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
  179. package/dist/views/ViewDashboard/tests/panelGroups.test.js +45 -96
  180. package/dist/views/ViewDashboard/tests/panelGroups.test.js.map +1 -1
  181. package/package.json +5 -4
  182. package/dist/cjs/context/DashboardProvider/layout-slice.js +0 -200
  183. package/dist/cjs/context/QueryStringProvider.js +0 -89
  184. package/dist/context/DashboardProvider/layout-slice.d.ts +0 -57
  185. package/dist/context/DashboardProvider/layout-slice.d.ts.map +0 -1
  186. package/dist/context/DashboardProvider/layout-slice.js +0 -196
  187. package/dist/context/DashboardProvider/layout-slice.js.map +0 -1
  188. package/dist/context/DashboardProvider/panel-editing-slice.d.ts.map +0 -1
  189. package/dist/context/DashboardProvider/panel-editing-slice.js.map +0 -1
  190. package/dist/context/QueryStringProvider.d.ts +0 -13
  191. package/dist/context/QueryStringProvider.d.ts.map +0 -1
  192. package/dist/context/QueryStringProvider.js +0 -40
  193. package/dist/context/QueryStringProvider.js.map +0 -1
@@ -14,129 +14,88 @@
14
14
  Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
- Object.defineProperty(exports, "default", {
17
+ Object.defineProperty(exports, "PanelGroupDialog", {
18
18
  enumerable: true,
19
- get: ()=>_default
19
+ get: ()=>PanelGroupDialog
20
20
  });
21
21
  const _jsxRuntime = require("react/jsx-runtime");
22
- const _react = require("react");
23
22
  const _material = require("@mui/material");
24
23
  const _close = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Close"));
24
+ const _react = require("react");
25
25
  const _context = require("../../context");
26
+ const _panelGroupEditorForm = require("./PanelGroupEditorForm");
26
27
  function _interopRequireDefault(obj) {
27
28
  return obj && obj.__esModule ? obj : {
28
29
  default: obj
29
30
  };
30
31
  }
31
- const PanelGroupDialog = ()=>{
32
- var ref, ref1;
33
- const { layouts , updatePanelGroup } = (0, _context.useLayouts)();
34
- const { panelGroupDialog , closePanelGroupDialog } = (0, _context.usePanelGroupDialog)();
35
- const groupIndex = panelGroupDialog === null || panelGroupDialog === void 0 ? void 0 : panelGroupDialog.groupIndex;
36
- const isEditingPanelGroup = groupIndex !== undefined;
37
- const [isCollapsed, setIsCollapsed] = (0, _react.useState)(isEditingPanelGroup && ((ref = layouts[groupIndex]) === null || ref === void 0 ? void 0 : ref.isCollapsed));
38
- const [name, setName] = (0, _react.useState)(isEditingPanelGroup ? (ref1 = layouts[groupIndex]) === null || ref1 === void 0 ? void 0 : ref1.title : '');
39
- const handleSubmit = (e)=>{
40
- var ref;
41
- e.preventDefault();
42
- var ref1;
43
- const newGroup = {
44
- isCollapsed,
45
- title: name !== null && name !== void 0 ? name : '',
46
- items: groupIndex === undefined ? [] : (ref1 = (ref = layouts[groupIndex]) === null || ref === void 0 ? void 0 : ref.items) !== null && ref1 !== void 0 ? ref1 : []
47
- };
48
- updatePanelGroup(newGroup, groupIndex);
49
- closePanelGroupDialog();
32
+ function PanelGroupDialog() {
33
+ const panelGroupEditor = (0, _context.usePanelGroupEditor)();
34
+ // When the user clicks close, start closing but don't call the store yet to keep values stable during animtation
35
+ const [isClosing, setIsClosing] = (0, _react.useState)(false);
36
+ const handleClose = ()=>setIsClosing(true);
37
+ // Don't call close on the store until the Dialog has completely transitioned out
38
+ const handleExited = ()=>{
39
+ panelGroupEditor === null || panelGroupEditor === void 0 ? void 0 : panelGroupEditor.close();
40
+ setIsClosing(false);
50
41
  };
51
- const handleSelectCollapsedStateChange = (e)=>{
52
- const isCollapsed = e.target.value === 'Close';
53
- setIsCollapsed(isCollapsed);
42
+ // Dialog is open if we have a model and we're not transitioning out
43
+ const isOpen = panelGroupEditor !== undefined && isClosing === false;
44
+ const handleSubmit = (values)=>{
45
+ // This shouldn't happen since we don't render the submit button until we have a model, but check to make TS happy
46
+ if (panelGroupEditor === undefined) {
47
+ throw new Error('Cannot apply changes');
48
+ }
49
+ panelGroupEditor.applyChanges(values);
50
+ handleClose();
54
51
  };
55
- return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Dialog, {
56
- open: panelGroupDialog !== undefined,
57
- children: [
58
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.DialogTitle, {
59
- children: "Panel Group"
60
- }),
61
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
62
- "aria-label": "Close",
63
- onClick: ()=>closePanelGroupDialog(),
64
- sx: (theme)=>({
65
- position: 'absolute',
66
- top: theme.spacing(0.5),
67
- right: theme.spacing(0.5)
68
- }),
69
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_close.default, {})
70
- }),
71
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)("form", {
72
- onSubmit: handleSubmit,
73
- children: [
74
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.DialogContent, {
75
- sx: {
76
- width: '500px'
77
- },
78
- children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
79
- spacing: 2,
80
- children: [
81
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.FormControl, {
82
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
83
- required: true,
84
- label: "Name",
85
- variant: "outlined",
86
- value: name,
87
- onChange: (e)=>setName(e.target.value)
88
- })
89
- }),
90
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
91
- sx: {
92
- display: 'flex',
93
- alignItems: 'center',
94
- width: '100%',
95
- justifyContent: 'space-between'
96
- },
97
- children: [
98
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.InputLabel, {
99
- children: "Collapse State"
100
- }),
101
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Select, {
102
- required: true,
103
- displayEmpty: true,
104
- labelId: "select-collapse-state",
105
- size: "small",
106
- value: isCollapsed ? 'Close' : 'Open',
107
- onChange: handleSelectCollapsedStateChange,
108
- children: [
109
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.MenuItem, {
110
- value: 'Open',
111
- children: "Open"
112
- }, 'open'),
113
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.MenuItem, {
114
- value: 'Close',
115
- children: "Close"
116
- }, 'close')
117
- ]
118
- })
119
- ]
120
- })
121
- ]
122
- })
123
- }),
124
- /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogActions, {
125
- children: [
126
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
127
- variant: "contained",
128
- type: "submit",
129
- children: isEditingPanelGroup ? 'Apply' : 'Add'
130
- }),
131
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
132
- onClick: ()=>closePanelGroupDialog(),
133
- children: "Cancel"
134
- })
135
- ]
52
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Dialog, {
53
+ open: isOpen,
54
+ TransitionProps: {
55
+ onExited: handleExited
56
+ },
57
+ children: panelGroupEditor !== undefined && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
58
+ children: [
59
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogTitle, {
60
+ children: [
61
+ panelGroupEditor.mode,
62
+ " Panel Group"
63
+ ]
64
+ }),
65
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
66
+ "aria-label": "Close",
67
+ onClick: panelGroupEditor.close,
68
+ sx: (theme)=>({
69
+ position: 'absolute',
70
+ top: theme.spacing(0.5),
71
+ right: theme.spacing(0.5)
72
+ }),
73
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_close.default, {})
74
+ }),
75
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.DialogContent, {
76
+ sx: {
77
+ width: '500px'
78
+ },
79
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_panelGroupEditorForm.PanelGroupEditorForm, {
80
+ initialValues: panelGroupEditor.initialValues,
81
+ onSubmit: handleSubmit
136
82
  })
137
- ]
138
- })
139
- ]
83
+ }),
84
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogActions, {
85
+ children: [
86
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
87
+ variant: "contained",
88
+ type: "submit",
89
+ form: _panelGroupEditorForm.panelGroupEditorFormId,
90
+ children: panelGroupEditor.mode === 'Edit' ? 'Apply' : 'Add'
91
+ }),
92
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
93
+ onClick: panelGroupEditor.close,
94
+ children: "Cancel"
95
+ })
96
+ ]
97
+ })
98
+ ]
99
+ })
140
100
  });
141
- };
142
- const _default = PanelGroupDialog;
101
+ }
@@ -21,7 +21,7 @@ const _testUtils = require("react-dom/test-utils");
21
21
  const _context = require("../../context");
22
22
  const _test = require("../../test");
23
23
  const _testDashboard = /*#__PURE__*/ _interopRequireDefault(require("../../test/testDashboard"));
24
- const _panelGroupDialog = /*#__PURE__*/ _interopRequireDefault(require("./PanelGroupDialog"));
24
+ const _panelGroupDialog = require("./PanelGroupDialog");
25
25
  function _interopRequireDefault(obj) {
26
26
  return obj && obj.__esModule ? obj : {
27
27
  default: obj
@@ -37,7 +37,7 @@ describe('Add Panel Group', ()=>{
37
37
  },
38
38
  children: [
39
39
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(DashboardProviderSpy, {}),
40
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_panelGroupDialog.default, {})
40
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_panelGroupDialog.PanelGroupDialog, {})
41
41
  ]
42
42
  }));
43
43
  const { value: storeApi } = store;
@@ -49,33 +49,39 @@ describe('Add Panel Group', ()=>{
49
49
  it('should add new panel group', async ()=>{
50
50
  const storeApi = renderDialog();
51
51
  // Open the dialog for a new panel group
52
- (0, _testUtils.act)(()=>storeApi.getState().openPanelGroupDialog());
52
+ (0, _testUtils.act)(()=>storeApi.getState().openAddPanelGroup());
53
53
  const nameInput = await _react.screen.findByLabelText(/Name/);
54
54
  _userEvent.default.type(nameInput, 'New Panel Group');
55
55
  _userEvent.default.click(_react.screen.getByText('Add'));
56
- const layouts = storeApi.getState().layouts;
57
- expect(layouts).toContainEqual({
58
- id: 3,
59
- title: 'New Panel Group',
60
- isCollapsed: false,
61
- items: []
56
+ // TODO: Figure out how to test this without coupling to the store state
57
+ const panelGroups = storeApi.getState().panelGroups;
58
+ expect(panelGroups).toMatchObject({
59
+ '3': {
60
+ id: 3,
61
+ title: 'New Panel Group',
62
+ isCollapsed: false,
63
+ items: []
64
+ }
62
65
  });
63
66
  });
64
67
  it('should edit existing panel group', async ()=>{
65
68
  var ref;
66
69
  const storeApi = renderDialog();
67
70
  // Open the dialog for an existing panel group
68
- (0, _testUtils.act)(()=>storeApi.getState().openPanelGroupDialog(0));
71
+ (0, _testUtils.act)(()=>storeApi.getState().openEditPanelGroup(0));
69
72
  const nameInput = await _react.screen.findByLabelText(/Name/);
70
73
  _userEvent.default.clear(nameInput);
71
74
  _userEvent.default.type(nameInput, 'New Name');
72
75
  _userEvent.default.click(_react.screen.getByText('Apply'));
73
- const layouts = storeApi.getState().layouts;
74
- expect(layouts).toContainEqual({
75
- id: 0,
76
- title: 'New Name',
77
- isCollapsed: false,
78
- items: (ref = _testDashboard.default.spec.layouts[0]) === null || ref === void 0 ? void 0 : ref.spec.items
76
+ // TODO: Figure out how to test this without coupling to the store state
77
+ const panelGroups = storeApi.getState().panelGroups;
78
+ expect(panelGroups).toMatchObject({
79
+ '0': {
80
+ id: 0,
81
+ title: 'New Name',
82
+ isCollapsed: false,
83
+ items: (ref = _testDashboard.default.spec.layouts[0]) === null || ref === void 0 ? void 0 : ref.spec.items
84
+ }
79
85
  });
80
86
  });
81
87
  });
@@ -0,0 +1,92 @@
1
+ // Copyright 2022 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ function _export(target, all) {
18
+ for(var name in all)Object.defineProperty(target, name, {
19
+ enumerable: true,
20
+ get: all[name]
21
+ });
22
+ }
23
+ _export(exports, {
24
+ PanelGroupEditorForm: ()=>PanelGroupEditorForm,
25
+ panelGroupEditorFormId: ()=>panelGroupEditorFormId
26
+ });
27
+ const _jsxRuntime = require("react/jsx-runtime");
28
+ const _react = require("react");
29
+ const _material = require("@mui/material");
30
+ function PanelGroupEditorForm(props) {
31
+ const { initialValues , onSubmit } = props;
32
+ const [title, setTitle] = (0, _react.useState)(initialValues.title);
33
+ const [isCollapsed, setIsCollapsed] = (0, _react.useState)(initialValues.isCollapsed);
34
+ const handleCollapsedChange = (e)=>{
35
+ const next = e.target.value;
36
+ setIsCollapsed(next === 'Closed');
37
+ };
38
+ const handleSubmit = (e)=>{
39
+ e.preventDefault();
40
+ onSubmit({
41
+ title,
42
+ isCollapsed
43
+ });
44
+ };
45
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)("form", {
46
+ id: panelGroupEditorFormId,
47
+ onSubmit: handleSubmit,
48
+ children: [
49
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.FormControl, {
50
+ fullWidth: true,
51
+ margin: "normal",
52
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.TextField, {
53
+ required: true,
54
+ label: "Name",
55
+ variant: "outlined",
56
+ value: title,
57
+ onChange: (e)=>setTitle(e.target.value)
58
+ })
59
+ }),
60
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.FormControl, {
61
+ fullWidth: true,
62
+ margin: "normal",
63
+ children: [
64
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.InputLabel, {
65
+ id: "select-collapse-state",
66
+ children: "Collapse State"
67
+ }),
68
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Select, {
69
+ required: true,
70
+ displayEmpty: true,
71
+ labelId: "select-collapse-state",
72
+ label: "Collapse State",
73
+ size: "small",
74
+ value: isCollapsed ? 'Closed' : 'Open',
75
+ onChange: handleCollapsedChange,
76
+ children: [
77
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.MenuItem, {
78
+ value: "Open",
79
+ children: "Open"
80
+ }),
81
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.MenuItem, {
82
+ value: "Closed",
83
+ children: "Closed"
84
+ })
85
+ ]
86
+ })
87
+ ]
88
+ })
89
+ ]
90
+ });
91
+ }
92
+ const panelGroupEditorFormId = 'panel-group-editor-form';
@@ -0,0 +1,29 @@
1
+ // Copyright 2022 The Perses Authors
2
+ // Licensed under the Apache License, Version 2.0 (the "License");
3
+ // you may not use this file except in compliance with the License.
4
+ // You may obtain a copy of the License at
5
+ //
6
+ // http://www.apache.org/licenses/LICENSE-2.0
7
+ //
8
+ // Unless required by applicable law or agreed to in writing, software
9
+ // distributed under the License is distributed on an "AS IS" BASIS,
10
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ // See the License for the specific language governing permissions and
12
+ // limitations under the License.
13
+ "use strict";
14
+ Object.defineProperty(exports, "__esModule", {
15
+ value: true
16
+ });
17
+ _exportStar(require("./PanelGroupDialog"), exports);
18
+ _exportStar(require("./DeletePanelGroupDialog"), exports);
19
+ function _exportStar(from, to) {
20
+ Object.keys(from).forEach(function(k) {
21
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
22
+ enumerable: true,
23
+ get: function() {
24
+ return from[k];
25
+ }
26
+ });
27
+ });
28
+ return from;
29
+ }
@@ -29,7 +29,6 @@ const _react = require("react");
29
29
  const _material = require("@mui/material");
30
30
  const _components = require("@perses-dev/components");
31
31
  const _core = require("@perses-dev/core");
32
- const _pluginSystem = require("@perses-dev/plugin-system");
33
32
  const _context = require("../../context");
34
33
  const TIME_OPTIONS = [
35
34
  {
@@ -88,14 +87,14 @@ const TIME_OPTIONS = [
88
87
  }
89
88
  ];
90
89
  function TimeRangeControls() {
91
- const { timeRange , setTimeRange } = (0, _pluginSystem.useTimeRange)();
92
- const dashboardDefaultTimeRange = (0, _context.useDefaultTimeRange)();
93
- const { queryString } = (0, _pluginSystem.useQueryString)();
94
- const defaultTimeRange = (0, _core.getDefaultTimeRange)(dashboardDefaultTimeRange, queryString);
95
- // selected form value can be relative or absolute, timeRange from plugin-system is only absolute
96
- const [selectedTimeRange, setSelectedTimeRange] = (0, _react.useState)(defaultTimeRange);
90
+ const { timeRange , setTimeRange } = (0, _context.useDashboardTimeRange)();
97
91
  const [showCustomDateSelector, setShowCustomDateSelector] = (0, _react.useState)(false);
98
92
  const anchorEl = (0, _react.useRef)();
93
+ const convertedTimeRange = (0, _react.useMemo)(()=>{
94
+ return (0, _core.isRelativeTimeRange)(timeRange) ? (0, _core.toAbsoluteTimeRange)(timeRange) : timeRange;
95
+ }, [
96
+ timeRange
97
+ ]);
99
98
  return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
100
99
  direction: "row",
101
100
  spacing: 1,
@@ -112,10 +111,9 @@ function TimeRangeControls() {
112
111
  padding: theme.spacing(2)
113
112
  }),
114
113
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.AbsoluteTimePicker, {
115
- initialTimeRange: timeRange,
114
+ initialTimeRange: convertedTimeRange,
116
115
  onChange: (timeRange)=>{
117
116
  setTimeRange(timeRange);
118
- setSelectedTimeRange(timeRange);
119
117
  setShowCustomDateSelector(false);
120
118
  }
121
119
  })
@@ -126,7 +124,7 @@ function TimeRangeControls() {
126
124
  ref: anchorEl,
127
125
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.TimeRangeSelector, {
128
126
  timeOptions: TIME_OPTIONS,
129
- value: selectedTimeRange,
127
+ value: timeRange,
130
128
  onSelectChange: (event)=>{
131
129
  const duration = event.target.value;
132
130
  const relativeTimeInput = {
@@ -134,7 +132,6 @@ function TimeRangeControls() {
134
132
  end: new Date()
135
133
  };
136
134
  setTimeRange(relativeTimeInput);
137
- setSelectedTimeRange(relativeTimeInput);
138
135
  setShowCustomDateSelector(false);
139
136
  },
140
137
  onCustomClick: ()=>{
@@ -15,8 +15,9 @@ Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  const _jsxRuntime = require("react/jsx-runtime");
18
+ const _reactRouter = require("react-router");
19
+ const _history = require("history");
18
20
  const _userEvent = /*#__PURE__*/ _interopRequireDefault(require("@testing-library/user-event"));
19
- const _core = require("@perses-dev/core");
20
21
  const _react = require("@testing-library/react");
21
22
  const _test = require("../../test");
22
23
  const _testDashboard = /*#__PURE__*/ _interopRequireDefault(require("../../test/testDashboard"));
@@ -27,31 +28,37 @@ function _interopRequireDefault(obj) {
27
28
  default: obj
28
29
  };
29
30
  }
31
+ const history = (0, _history.createMemoryHistory)({
32
+ initialEntries: [
33
+ (0, _reactRouter.generatePath)('/dashboards/:id', {
34
+ id: 'test'
35
+ })
36
+ ]
37
+ });
30
38
  describe('TimeRangeControls', ()=>{
31
39
  let initialState;
40
+ const testDefaultTimeRange = {
41
+ pastDuration: _testDashboard.default.spec.duration
42
+ };
32
43
  beforeEach(()=>{
33
44
  initialState = {
34
45
  dashboardSpec: _testDashboard.default.spec
35
46
  };
36
47
  });
37
48
  const renderTimeRangeControls = ()=>{
38
- const queryString = new URLSearchParams();
39
- const defaultTimeRange = (0, _core.getDefaultTimeRange)(initialState.dashboardSpec.duration, queryString);
40
- (0, _test.renderWithContext)(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_context.QueryStringProvider, {
41
- queryString: queryString,
42
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_context.DashboardProvider, {
43
- initialState: initialState,
44
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_context.TimeRangeProvider, {
45
- initialTimeRange: defaultTimeRange,
46
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_timeRangeControls.TimeRangeControls, {})
47
- })
49
+ (0, _test.renderWithContext)(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_context.DashboardProvider, {
50
+ initialState: initialState,
51
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_context.TimeRangeProvider, {
52
+ timeRange: testDefaultTimeRange,
53
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_timeRangeControls.TimeRangeControls, {})
48
54
  })
49
- }));
55
+ }), undefined, history);
50
56
  };
51
57
  it('should render correct initial relative time shortcut', async ()=>{
52
58
  renderTimeRangeControls();
53
- expect(_react.screen.getByText('Last 1 day')).toBeInTheDocument();
59
+ expect(_react.screen.getByText('Last 5 minutes')).toBeInTheDocument();
54
60
  });
61
+ // TODO: fix setTimeRange no-op, test query params
55
62
  it('should be able to select the first option', ()=>{
56
63
  renderTimeRangeControls();
57
64
  const dateButton = _react.screen.getByRole('button');
@@ -154,6 +154,7 @@ function ListVariable({ name }) {
154
154
  return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {
155
155
  display: 'flex',
156
156
  children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.FormControl, {
157
+ fullWidth: true,
157
158
  children: [
158
159
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.InputLabel, {
159
160
  id: name,
@@ -24,6 +24,8 @@ const _material = require("@mui/material");
24
24
  const _useImmer = require("use-immer");
25
25
  const _pencil = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Pencil"));
26
26
  const _trashCan = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/TrashCan"));
27
+ const _arrowUp = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ArrowUp"));
28
+ const _arrowDown = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ArrowDown"));
27
29
  const _variableEditorForm = require("./VariableEditorForm");
28
30
  function _interopRequireDefault(obj) {
29
31
  return obj && obj.__esModule ? obj : {
@@ -64,6 +66,27 @@ function VariableEditor(props) {
64
66
  v.spec.display.hidden = visible === false;
65
67
  });
66
68
  };
69
+ const changeVariableOrder = (index, direction)=>{
70
+ setVariableDefinitions((draft)=>{
71
+ if (direction === 'up') {
72
+ const prevElement = draft[index - 1];
73
+ const currentElement = draft[index];
74
+ if (index === 0 || !prevElement || !currentElement) {
75
+ return;
76
+ }
77
+ draft[index - 1] = currentElement;
78
+ draft[index] = prevElement;
79
+ } else {
80
+ const nextElement = draft[index + 1];
81
+ const currentElement1 = draft[index];
82
+ if (index === draft.length - 1 || !nextElement || !currentElement1) {
83
+ return;
84
+ }
85
+ draft[index + 1] = currentElement1;
86
+ draft[index] = nextElement;
87
+ }
88
+ });
89
+ };
67
90
  return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
68
91
  p: 4,
69
92
  children: [
@@ -173,6 +196,16 @@ function VariableEditor(props) {
173
196
  /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.TableCell, {
174
197
  align: "right",
175
198
  children: [
199
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
200
+ onClick: ()=>changeVariableOrder(idx, 'up'),
201
+ disabled: idx === 0,
202
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowUp.default, {})
203
+ }),
204
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
205
+ onClick: ()=>changeVariableOrder(idx, 'down'),
206
+ disabled: idx === variableDefinitions.length - 1,
207
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowDown.default, {})
208
+ }),
176
209
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
177
210
  onClick: ()=>setVariableEditIdx(idx),
178
211
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencil.default, {})
@@ -39,7 +39,6 @@ function TemplateVariableList() {
39
39
  const showVariables = isEditMode ? showVariablesInEditMode : true;
40
40
  const { setVariableDefinitions } = (0, _context.useTemplateVariableActions)();
41
41
  return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Box, {
42
- m: 2,
43
42
  children: [
44
43
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Drawer, {
45
44
  anchor: 'right',
@@ -18,6 +18,7 @@ _exportStar(require("./Dashboard"), exports);
18
18
  _exportStar(require("./GridLayout"), exports);
19
19
  _exportStar(require("./Panel"), exports);
20
20
  _exportStar(require("./PanelDrawer"), exports);
21
+ _exportStar(require("./PanelGroupDialog"), exports);
21
22
  _exportStar(require("./TimeRangeControls"), exports);
22
23
  _exportStar(require("./Variables"), exports);
23
24
  function _exportStar(from, to) {
@@ -31,9 +31,9 @@ const _middleware = require("zustand/middleware");
31
31
  const _immer = require("zustand/middleware/immer");
32
32
  const _shallow = /*#__PURE__*/ _interopRequireDefault(require("zustand/shallow"));
33
33
  const _react = require("react");
34
+ const _panelGroupEditorSlice = require("./panel-group-editor-slice");
34
35
  const _panelGroupSlice = require("./panel-group-slice");
35
- const _layoutSlice = require("./layout-slice");
36
- const _panelEditingSlice = require("./panel-editing-slice");
36
+ const _panelEditorSlice = require("./panel-editor-slice");
37
37
  function _interopRequireDefault(obj) {
38
38
  return obj && obj.__esModule ? obj : {
39
39
  default: obj
@@ -51,16 +51,28 @@ function DashboardProvider(props) {
51
51
  const { children , initialState: { dashboardSpec , isEditMode } , } = props;
52
52
  const { layouts , panels } = dashboardSpec;
53
53
  const dashboardStore = (0, _zustand.createStore)()((0, _immer.immer)((0, _middleware.devtools)((...args)=>{
54
- const [set] = args;
54
+ const [set, get] = args;
55
55
  return {
56
- ...(0, _panelGroupSlice.createPanelGroupSlice)(...args),
57
- ...(0, _layoutSlice.createLayoutSlice)(layouts)(...args),
58
- ...(0, _panelEditingSlice.createPanelEditorSlice)(panels)(...args),
59
- defaultTimeRange: dashboardSpec.duration,
56
+ ...(0, _panelGroupEditorSlice.createPanelGroupEditorSlice)(...args),
57
+ ...(0, _panelGroupSlice.createPanelGroupSlice)(layouts)(...args),
58
+ ...(0, _panelEditorSlice.createPanelEditorSlice)(panels)(...args),
59
+ defaultTimeRange: {
60
+ pastDuration: dashboardSpec.duration
61
+ },
60
62
  isEditMode: !!isEditMode,
61
63
  setEditMode: (isEditMode)=>set({
62
64
  isEditMode
63
- })
65
+ }),
66
+ reset: ()=>{
67
+ const { resetPanels , resetPanelGroups } = get();
68
+ resetPanels();
69
+ resetPanelGroups();
70
+ },
71
+ save: ()=>{
72
+ const { savePanels , savePanelGroups } = get();
73
+ savePanels();
74
+ savePanelGroups();
75
+ }
64
76
  };
65
77
  })));
66
78
  return /*#__PURE__*/ (0, _jsxRuntime.jsx)(DashboardContext.Provider, {