@perses-dev/dashboards 0.0.0-snapshot-time-range-height-80d08fc → 0.0.0-snapshot-embed-import-errors-8906900

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 (108) hide show
  1. package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +19 -5
  2. package/dist/cjs/components/DeletePanelDialog/DeletePanelDialog.js +2 -0
  3. package/dist/cjs/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +2 -0
  4. package/dist/cjs/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js +74 -0
  5. package/dist/cjs/components/{UnsavedChangesConfirmationDialog → DiscardChangesConfirmationDialog}/index.js +1 -1
  6. package/dist/cjs/components/DownloadButton/DownloadButton.js +2 -8
  7. package/dist/cjs/components/GridLayout/GridTitle.js +38 -22
  8. package/dist/cjs/components/Panel/PanelHeader.js +59 -26
  9. package/dist/cjs/components/PanelDrawer/PanelDrawer.js +29 -8
  10. package/dist/cjs/components/PanelDrawer/PanelEditorForm.js +11 -6
  11. package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +2 -8
  12. package/dist/cjs/components/ToolbarIconButton/ToolbarIconButton.js +35 -0
  13. package/dist/cjs/components/ToolbarIconButton/index.js +28 -0
  14. package/dist/cjs/components/Variables/VariableEditor.js +19 -3
  15. package/dist/cjs/components/Variables/VariableList.js +1 -1
  16. package/dist/cjs/components/index.js +2 -1
  17. package/dist/cjs/context/DashboardProvider/DashboardProvider.js +2 -0
  18. package/dist/cjs/context/DashboardProvider/dashboard-provider-api.js +10 -1
  19. package/dist/cjs/context/DashboardProvider/discard-changes-dialog-slice.js +33 -0
  20. package/dist/cjs/context/TemplateVariableProvider/TemplateVariableProvider.js +7 -7
  21. package/dist/cjs/views/ViewDashboard/DashboardApp.js +14 -14
  22. package/dist/cjs/views/ViewDashboard/ViewDashboard.js +2 -1
  23. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts +2 -0
  24. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
  25. package/dist/components/DashboardToolbar/DashboardToolbar.js +20 -6
  26. package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
  27. package/dist/components/DeletePanelDialog/DeletePanelDialog.js +2 -0
  28. package/dist/components/DeletePanelDialog/DeletePanelDialog.js.map +1 -1
  29. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.d.ts.map +1 -1
  30. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +2 -0
  31. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js.map +1 -1
  32. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.d.ts +3 -0
  33. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.d.ts.map +1 -0
  34. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js +63 -0
  35. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js.map +1 -0
  36. package/dist/components/DiscardChangesConfirmationDialog/index.d.ts +2 -0
  37. package/dist/components/DiscardChangesConfirmationDialog/index.d.ts.map +1 -0
  38. package/dist/components/{UnsavedChangesConfirmationDialog → DiscardChangesConfirmationDialog}/index.js +1 -1
  39. package/dist/components/{UnsavedChangesConfirmationDialog → DiscardChangesConfirmationDialog}/index.js.map +1 -1
  40. package/dist/components/DownloadButton/DownloadButton.js +2 -8
  41. package/dist/components/DownloadButton/DownloadButton.js.map +1 -1
  42. package/dist/components/GridLayout/GridTitle.d.ts.map +1 -1
  43. package/dist/components/GridLayout/GridTitle.js +38 -22
  44. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  45. package/dist/components/Panel/PanelHeader.d.ts.map +1 -1
  46. package/dist/components/Panel/PanelHeader.js +61 -28
  47. package/dist/components/Panel/PanelHeader.js.map +1 -1
  48. package/dist/components/PanelDrawer/PanelDrawer.d.ts.map +1 -1
  49. package/dist/components/PanelDrawer/PanelDrawer.js +32 -11
  50. package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
  51. package/dist/components/PanelDrawer/PanelEditorForm.d.ts +1 -1
  52. package/dist/components/PanelDrawer/PanelEditorForm.d.ts.map +1 -1
  53. package/dist/components/PanelDrawer/PanelEditorForm.js +12 -7
  54. package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
  55. package/dist/components/TimeRangeControls/TimeRangeControls.d.ts.map +1 -1
  56. package/dist/components/TimeRangeControls/TimeRangeControls.js +2 -8
  57. package/dist/components/TimeRangeControls/TimeRangeControls.js.map +1 -1
  58. package/dist/components/ToolbarIconButton/ToolbarIconButton.d.ts +6 -0
  59. package/dist/components/ToolbarIconButton/ToolbarIconButton.d.ts.map +1 -0
  60. package/dist/components/ToolbarIconButton/ToolbarIconButton.js +29 -0
  61. package/dist/components/ToolbarIconButton/ToolbarIconButton.js.map +1 -0
  62. package/dist/components/ToolbarIconButton/index.d.ts +2 -0
  63. package/dist/components/ToolbarIconButton/index.d.ts.map +1 -0
  64. package/dist/components/ToolbarIconButton/index.js +15 -0
  65. package/dist/components/ToolbarIconButton/index.js.map +1 -0
  66. package/dist/components/Variables/VariableEditor.d.ts.map +1 -1
  67. package/dist/components/Variables/VariableEditor.js +19 -3
  68. package/dist/components/Variables/VariableEditor.js.map +1 -1
  69. package/dist/components/Variables/VariableList.d.ts.map +1 -1
  70. package/dist/components/Variables/VariableList.js +1 -1
  71. package/dist/components/Variables/VariableList.js.map +1 -1
  72. package/dist/components/index.d.ts +2 -1
  73. package/dist/components/index.d.ts.map +1 -1
  74. package/dist/components/index.js +2 -1
  75. package/dist/components/index.js.map +1 -1
  76. package/dist/context/DashboardProvider/DashboardProvider.d.ts +2 -1
  77. package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
  78. package/dist/context/DashboardProvider/DashboardProvider.js +2 -0
  79. package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
  80. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +5 -0
  81. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
  82. package/dist/context/DashboardProvider/dashboard-provider-api.js +8 -0
  83. package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
  84. package/dist/context/DashboardProvider/discard-changes-dialog-slice.d.ts +15 -0
  85. package/dist/context/DashboardProvider/discard-changes-dialog-slice.d.ts.map +1 -0
  86. package/dist/context/DashboardProvider/discard-changes-dialog-slice.js +27 -0
  87. package/dist/context/DashboardProvider/discard-changes-dialog-slice.js.map +1 -0
  88. package/dist/context/DashboardProvider/index.d.ts +1 -0
  89. package/dist/context/DashboardProvider/index.d.ts.map +1 -1
  90. package/dist/context/DashboardProvider/index.js.map +1 -1
  91. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js +7 -7
  92. package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js.map +1 -1
  93. package/dist/views/ViewDashboard/DashboardApp.d.ts +1 -0
  94. package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
  95. package/dist/views/ViewDashboard/DashboardApp.js +16 -16
  96. package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
  97. package/dist/views/ViewDashboard/ViewDashboard.d.ts +1 -0
  98. package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
  99. package/dist/views/ViewDashboard/ViewDashboard.js +2 -1
  100. package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
  101. package/package.json +4 -4
  102. package/dist/cjs/components/UnsavedChangesConfirmationDialog/UnsavedChangesConfirmationDialog.js +0 -67
  103. package/dist/components/UnsavedChangesConfirmationDialog/UnsavedChangesConfirmationDialog.d.ts +0 -8
  104. package/dist/components/UnsavedChangesConfirmationDialog/UnsavedChangesConfirmationDialog.d.ts.map +0 -1
  105. package/dist/components/UnsavedChangesConfirmationDialog/UnsavedChangesConfirmationDialog.js +0 -56
  106. package/dist/components/UnsavedChangesConfirmationDialog/UnsavedChangesConfirmationDialog.js.map +0 -1
  107. package/dist/components/UnsavedChangesConfirmationDialog/index.d.ts +0 -2
  108. package/dist/components/UnsavedChangesConfirmationDialog/index.d.ts.map +0 -1
@@ -24,6 +24,7 @@ const _pencilOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-materia
24
24
  const _plusBoxOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/PlusBoxOutline"));
25
25
  const _chartBoxPlusOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ChartBoxPlusOutline"));
26
26
  const _components = require("@perses-dev/components");
27
+ const _react = require("react");
27
28
  const _context = require("../../context");
28
29
  const _variables = require("../Variables");
29
30
  const _timeRangeControls = require("../TimeRangeControls");
@@ -34,16 +35,28 @@ function _interopRequireDefault(obj) {
34
35
  };
35
36
  }
36
37
  const DashboardToolbar = (props)=>{
37
- const { dashboardName , dashboardTitleComponent , initialVariableIsSticky , isReadonly , onEditButtonClick , onCancelButtonClick , } = props;
38
+ const { dashboardName , dashboardTitleComponent , initialVariableIsSticky , isReadonly , onEditButtonClick , onCancelButtonClick , onSave , } = props;
38
39
  const { isEditMode , setEditMode } = (0, _context.useEditMode)();
40
+ const [isSavingDashboard, setSavingDashboard] = (0, _react.useState)(false);
41
+ const dashboard = (0, _context.useDashboard)();
39
42
  const { openAddPanelGroup , openAddPanel } = (0, _context.useDashboardActions)();
40
43
  const isLaptopSize = (0, _material.useMediaQuery)((0, _material.useTheme)().breakpoints.up('sm'));
41
44
  const dashboardTitle = dashboardTitleComponent ? dashboardTitleComponent : /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Typography, {
42
45
  variant: "h2",
43
46
  children: dashboardName
44
47
  });
45
- const onSave = ()=>{
46
- setEditMode(false);
48
+ const onSaveButtonClick = ()=>{
49
+ if (onSave !== undefined) {
50
+ setSavingDashboard(true);
51
+ onSave(dashboard.dashboard).then(()=>{
52
+ setSavingDashboard(false);
53
+ setEditMode(false);
54
+ }).catch(()=>{
55
+ setSavingDashboard(false);
56
+ });
57
+ } else {
58
+ setEditMode(false);
59
+ }
47
60
  };
48
61
  return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
49
62
  children: isEditMode ? /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
@@ -72,8 +85,8 @@ const DashboardToolbar = (props)=>{
72
85
  }),
73
86
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
74
87
  variant: "contained",
75
- onClick: onSave,
76
- disabled: isReadonly,
88
+ onClick: onSaveButtonClick,
89
+ disabled: isReadonly || isSavingDashboard,
77
90
  children: "Save"
78
91
  }),
79
92
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
@@ -147,6 +160,7 @@ const DashboardToolbar = (props)=>{
147
160
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_downloadButton.DownloadButton, {}),
148
161
  isLaptopSize && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
149
162
  variant: "outlined",
163
+ color: "secondary",
150
164
  startIcon: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencilOutline.default, {}),
151
165
  onClick: onEditButtonClick,
152
166
  sx: {
@@ -63,6 +63,7 @@ const DeletePanelForm = ({ deletePanelDialog })=>{
63
63
  onSubmit: handleDelete,
64
64
  children: [
65
65
  /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogContent, {
66
+ dividers: true,
66
67
  sx: {
67
68
  width: '500px'
68
69
  },
@@ -82,6 +83,7 @@ const DeletePanelForm = ({ deletePanelDialog })=>{
82
83
  children: "Delete"
83
84
  }),
84
85
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
86
+ variant: "outlined",
85
87
  onClick: ()=>closeDeletePanelDialog(),
86
88
  children: "Cancel"
87
89
  })
@@ -59,6 +59,7 @@ const DeletePanelGroupDialog = ()=>{
59
59
  onSubmit: handleDelete,
60
60
  children: [
61
61
  /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogContent, {
62
+ dividers: true,
62
63
  sx: {
63
64
  width: '500px'
64
65
  },
@@ -76,6 +77,7 @@ const DeletePanelGroupDialog = ()=>{
76
77
  children: "Delete"
77
78
  }),
78
79
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
80
+ variant: "outlined",
79
81
  onClick: ()=>closeDeletePanelGroupDialog(),
80
82
  children: "Cancel"
81
83
  })
@@ -0,0 +1,74 @@
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
+ Object.defineProperty(exports, "DiscardChangesConfirmationDialog", {
18
+ enumerable: true,
19
+ get: ()=>DiscardChangesConfirmationDialog
20
+ });
21
+ const _jsxRuntime = require("react/jsx-runtime");
22
+ const _material = require("@mui/material");
23
+ const _close = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Close"));
24
+ const _context = require("../../context");
25
+ function _interopRequireDefault(obj) {
26
+ return obj && obj.__esModule ? obj : {
27
+ default: obj
28
+ };
29
+ }
30
+ const DiscardChangesConfirmationDialog = ()=>{
31
+ const { discardChangesConfirmationDialog: dialog } = (0, _context.useDiscardChangesConfirmationDialog)();
32
+ const isOpen = dialog !== undefined;
33
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Dialog, {
34
+ open: isOpen,
35
+ children: dialog !== undefined && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
36
+ children: [
37
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.DialogTitle, {
38
+ children: "Discard Changes"
39
+ }),
40
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
41
+ "aria-label": "Close",
42
+ onClick: dialog.onCancel,
43
+ sx: (theme)=>({
44
+ position: 'absolute',
45
+ top: theme.spacing(0.5),
46
+ right: theme.spacing(0.5)
47
+ }),
48
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_close.default, {})
49
+ }),
50
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.DialogContent, {
51
+ dividers: true,
52
+ sx: {
53
+ width: '500px'
54
+ },
55
+ children: dialog.description || 'You have unsaved changes in this dashboard. Are you sure you want to discard these changes? Changes cannot be recovered.'
56
+ }),
57
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.DialogActions, {
58
+ children: [
59
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
60
+ variant: "contained",
61
+ onClick: dialog.onDiscardChanges,
62
+ children: "Discard Changes"
63
+ }),
64
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
65
+ variant: "outlined",
66
+ onClick: dialog.onCancel,
67
+ children: "Cancel"
68
+ })
69
+ ]
70
+ })
71
+ ]
72
+ })
73
+ });
74
+ };
@@ -14,7 +14,7 @@
14
14
  Object.defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
- _exportStar(require("./UnsavedChangesConfirmationDialog"), exports);
17
+ _exportStar(require("./DiscardChangesConfirmationDialog"), exports);
18
18
  function _exportStar(from, to) {
19
19
  Object.keys(from).forEach(function(k) {
20
20
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
@@ -21,8 +21,8 @@ Object.defineProperty(exports, "DownloadButton", {
21
21
  const _jsxRuntime = require("react/jsx-runtime");
22
22
  const _react = /*#__PURE__*/ _interopRequireWildcard(require("react"));
23
23
  const _downloadOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/DownloadOutline"));
24
- const _material = require("@mui/material");
25
24
  const _context = require("../../context");
25
+ const _toolbarIconButton = require("../ToolbarIconButton");
26
26
  function _interopRequireDefault(obj) {
27
27
  return obj && obj.__esModule ? obj : {
28
28
  default: obj
@@ -86,7 +86,7 @@ function DownloadButton() {
86
86
  };
87
87
  return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
88
88
  children: [
89
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(DownloadIconButton, {
89
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_toolbarIconButton.ToolbarIconButton, {
90
90
  title: "Download JSON",
91
91
  onClick: onDownloadButtonClick,
92
92
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_downloadOutline.default, {})
@@ -101,9 +101,3 @@ function DownloadButton() {
101
101
  ]
102
102
  });
103
103
  }
104
- const DownloadIconButton = (0, _material.styled)(_material.IconButton)(({ theme })=>({
105
- border: `1px solid ${theme.palette.grey[300]}`,
106
- borderRadius: theme.shape.borderRadius,
107
- padding: '4px',
108
- color: theme.palette.grey[900]
109
- }));
@@ -27,6 +27,7 @@ const _pencilOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-materia
27
27
  const _arrowUp = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ArrowUp"));
28
28
  const _arrowDown = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/ArrowDown"));
29
29
  const _deleteOutline = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/DeleteOutline"));
30
+ const _components = require("@perses-dev/components");
30
31
  const _context = require("../../context");
31
32
  function _interopRequireDefault(obj) {
32
33
  return obj && obj.__esModule ? obj : {
@@ -64,32 +65,47 @@ function GridTitle(props) {
64
65
  direction: "row",
65
66
  marginLeft: "auto",
66
67
  children: [
67
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
68
- "aria-label": `add panel to group ${title}`,
69
- onClick: openAddPanel,
70
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_chartBoxPlusOutline.default, {})
68
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
69
+ description: `Add a new panel to ${title}`,
70
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
71
+ "aria-label": `add panel to group ${title}`,
72
+ onClick: openAddPanel,
73
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_chartBoxPlusOutline.default, {})
74
+ })
71
75
  }),
72
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
73
- "aria-label": `edit group ${title}`,
74
- onClick: openEditPanelGroup,
75
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencilOutline.default, {})
76
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
77
+ description: "Edit",
78
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
79
+ "aria-label": `edit group ${title}`,
80
+ onClick: openEditPanelGroup,
81
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencilOutline.default, {})
82
+ })
76
83
  }),
77
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
78
- "aria-label": `delete group ${title}`,
79
- onClick: ()=>openDeletePanelGroupDialog(panelGroupId),
80
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_deleteOutline.default, {})
84
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
85
+ description: "Delete",
86
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
87
+ "aria-label": `delete group ${title}`,
88
+ onClick: ()=>openDeletePanelGroupDialog(panelGroupId),
89
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_deleteOutline.default, {})
90
+ })
81
91
  }),
82
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
83
- "aria-label": `move group ${title} down`,
84
- disabled: moveDown === undefined,
85
- onClick: moveDown,
86
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowDown.default, {})
92
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
93
+ description: "Move panel group down",
94
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
95
+ "aria-label": `move group ${title} down`,
96
+ disabled: moveDown === undefined,
97
+ onClick: moveDown,
98
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowDown.default, {})
99
+ })
87
100
  }),
88
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
89
- "aria-label": `move group ${title} up`,
90
- disabled: moveUp === undefined,
91
- onClick: moveUp,
92
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowUp.default, {})
101
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
102
+ description: "Move panel group up",
103
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.IconButton, {
104
+ "aria-label": `move group ${title} up`,
105
+ disabled: moveUp === undefined,
106
+ onClick: moveUp,
107
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_arrowUp.default, {})
108
+ })
93
109
  })
94
110
  ]
95
111
  })
@@ -33,49 +33,62 @@ function _interopRequireDefault(obj) {
33
33
  function PanelHeader({ id , title , description , editHandlers , isHovered , sx , ...rest }) {
34
34
  const titleElementId = `${id}-title`;
35
35
  const descriptionTooltipId = `${id}-description`;
36
- let action = undefined;
36
+ let actions = undefined;
37
37
  if (editHandlers !== undefined) {
38
38
  // If there are edit handlers, always just show the edit buttons
39
- action = /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_material.Stack, {
40
- direction: "row",
41
- spacing: 0.5,
42
- alignItems: "center",
39
+ actions = /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
43
40
  children: [
44
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
45
- "aria-label": `edit panel ${title}`,
46
- size: "small",
47
- onClick: editHandlers.onEditPanelClick,
48
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencilOutline.default, {})
41
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
42
+ description: "Edit",
43
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
44
+ "aria-label": `edit panel ${title}`,
45
+ size: "small",
46
+ onClick: editHandlers.onEditPanelClick,
47
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_pencilOutline.default, {
48
+ fontSize: "inherit"
49
+ })
50
+ })
49
51
  }),
50
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
51
- "aria-label": `delete panel ${title}`,
52
- size: "small",
53
- onClick: editHandlers.onDeletePanelClick,
54
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_deleteOutline.default, {})
52
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
53
+ description: "Delete",
54
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
55
+ "aria-label": `delete panel ${title}`,
56
+ size: "small",
57
+ onClick: editHandlers.onDeletePanelClick,
58
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_deleteOutline.default, {
59
+ fontSize: "inherit"
60
+ })
61
+ })
55
62
  }),
56
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
57
- "aria-label": `move panel ${title}`,
58
- size: "small",
59
- children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_dragVertical.default, {
60
- className: "drag-handle",
61
- sx: {
62
- cursor: 'grab'
63
- }
63
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
64
+ description: "Drag and drop panel to reorganize",
65
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
66
+ "aria-label": `move panel ${title}`,
67
+ size: "small",
68
+ children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_dragVertical.default, {
69
+ className: "drag-handle",
70
+ sx: {
71
+ cursor: 'grab'
72
+ },
73
+ fontSize: "inherit"
74
+ })
64
75
  })
65
76
  })
66
77
  ]
67
78
  });
68
79
  } else if (description !== undefined && isHovered) {
69
80
  // If there aren't edit handlers and we have a description, show a button with a tooltip for the panel description
70
- action = /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
81
+ actions = /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.InfoTooltip, {
71
82
  id: descriptionTooltipId,
72
83
  description: description,
73
- placement: _components.TooltipPlacement.Bottom,
84
+ enterDelay: 100,
74
85
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderIconButton, {
75
86
  "aria-label": "Panel Description",
87
+ size: "small",
76
88
  children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_informationOutline.default, {
77
89
  "aria-describedby": "info-tooltip",
78
90
  "aria-hidden": false,
91
+ fontSize: "inherit",
79
92
  sx: {
80
93
  color: (theme)=>theme.palette.grey[700]
81
94
  }
@@ -103,12 +116,24 @@ function PanelHeader({ id , title , description , editHandlers , isHovered , sx
103
116
  },
104
117
  children: title
105
118
  }),
106
- action: action,
119
+ action: /*#__PURE__*/ (0, _jsxRuntime.jsx)(HeaderActionWrapper, {
120
+ direction: "row",
121
+ spacing: 0.25,
122
+ alignItems: "center",
123
+ children: actions
124
+ }),
107
125
  sx: (0, _components.combineSx)((theme)=>({
108
126
  padding: theme.spacing(1),
109
127
  borderBottom: `solid 1px ${theme.palette.divider}`,
110
128
  '.MuiCardHeader-content': {
111
129
  overflow: 'hidden'
130
+ },
131
+ '.MuiCardHeader-action': {
132
+ // Overriding the negative margins from MUI's defaults, so we
133
+ // can vertically center the icons. Moving these values to a wrapper
134
+ // inside the action in `HeaderActionWrapper` below.
135
+ // https://github.com/mui/material-ui/blob/master/packages/mui-material/src/CardHeader/CardHeader.js#L56-L58
136
+ margin: 'auto'
112
137
  }
113
138
  }), sx),
114
139
  ...rest
@@ -118,3 +143,11 @@ const HeaderIconButton = (0, _material.styled)(_material.IconButton)(({ theme }
118
143
  borderRadius: theme.shape.borderRadius,
119
144
  padding: '4px'
120
145
  }));
146
+ const HeaderActionWrapper = (0, _material.styled)(_material.Stack)(()=>({
147
+ // Adding back the negative margins from MUI's defaults for actions, so we
148
+ // avoid increasing the header size when actions are present while also being
149
+ // able to vertically center the actions.
150
+ // https://github.com/mui/material-ui/blob/master/packages/mui-material/src/CardHeader/CardHeader.js#L56-L58
151
+ marginTop: -4,
152
+ marginBottom: -4
153
+ }));
@@ -1,4 +1,4 @@
1
- // Copyright 2022 The Perses Authors
1
+ /* eslint-disable @typescript-eslint/no-empty-function */ // Copyright 2022 The Perses Authors
2
2
  // Licensed under the Apache License, Version 2.0 (the "License");
3
3
  // you may not use this file except in compliance with the License.
4
4
  // You may obtain a copy of the License at
@@ -26,9 +26,27 @@ const _context = require("../../context");
26
26
  const _panelEditorForm = require("./PanelEditorForm");
27
27
  const PanelDrawer = ()=>{
28
28
  const panelEditor = (0, _context.usePanelEditor)();
29
+ const { openDiscardChangesConfirmationDialog , closeDiscardChangesConfirmationDialog } = (0, _context.useDiscardChangesConfirmationDialog)();
30
+ const [values, setValues] = (0, _react.useState)(undefined);
29
31
  // When the user clicks close, start closing but don't call the store yet to keep values stable during animtation
30
32
  const [isClosing, setIsClosing] = (0, _react.useState)(false);
31
- const handleClose = ()=>setIsClosing(true);
33
+ const handleClose = ()=>{
34
+ const isModified = JSON.stringify(panelEditor === null || panelEditor === void 0 ? void 0 : panelEditor.initialValues) !== JSON.stringify(values);
35
+ if (isModified) {
36
+ openDiscardChangesConfirmationDialog({
37
+ onDiscardChanges: ()=>{
38
+ closeDiscardChangesConfirmationDialog();
39
+ setIsClosing(true);
40
+ },
41
+ onCancel: ()=>{
42
+ closeDiscardChangesConfirmationDialog();
43
+ },
44
+ description: 'You have unapplied changes in this panel. Are you sure you want to discard these changes? Changes cannot be recovered.'
45
+ });
46
+ } else {
47
+ setIsClosing(true);
48
+ }
49
+ };
32
50
  // Don't call closeDrawer on the store until the Drawer has completely transitioned out
33
51
  const handleExited = ()=>{
34
52
  panelEditor === null || panelEditor === void 0 ? void 0 : panelEditor.close();
@@ -36,14 +54,17 @@ const PanelDrawer = ()=>{
36
54
  };
37
55
  // Drawer is open if we have a model and we're not transitioning out
38
56
  const isOpen = panelEditor !== undefined && isClosing === false;
39
- const handleSubmit = (values)=>{
57
+ const handleSubmit = ()=>{
40
58
  // This shouldn't happen since we don't render the submit button until we have a model, but check to make TS happy
41
- if (panelEditor === undefined) {
59
+ if (panelEditor === undefined || values === undefined) {
42
60
  throw new Error('Cannot apply changes');
43
61
  }
44
62
  panelEditor.applyChanges(values);
45
- handleClose();
63
+ setIsClosing(true);
46
64
  };
65
+ const handleChange = (0, _react.useCallback)((values)=>{
66
+ setValues(values);
67
+ }, []);
47
68
  return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_components.Drawer, {
48
69
  isOpen: isOpen,
49
70
  onClose: handleClose,
@@ -75,7 +96,7 @@ const PanelDrawer = ()=>{
75
96
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
76
97
  type: "submit",
77
98
  variant: "contained",
78
- form: _panelEditorForm.panelEditorFormId,
99
+ onClick: handleSubmit,
79
100
  children: panelEditor.mode === 'Add' ? 'Add' : 'Apply'
80
101
  }),
81
102
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Button, {
@@ -89,8 +110,8 @@ const PanelDrawer = ()=>{
89
110
  ]
90
111
  }),
91
112
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_panelEditorForm.PanelEditorForm, {
92
- onSubmit: handleSubmit,
93
- initialValues: panelEditor.initialValues
113
+ initialValues: panelEditor.initialValues,
114
+ onChange: handleChange
94
115
  })
95
116
  ]
96
117
  })
@@ -33,7 +33,7 @@ const _context = require("../../context");
33
33
  const _panelPreview = require("./PanelPreview");
34
34
  function PanelEditorForm(props) {
35
35
  var ref;
36
- const { initialValues , onSubmit } = props;
36
+ const { initialValues , onChange } = props;
37
37
  const panelGroups = (0, _context.useListPanelGroups)();
38
38
  const [name, setName] = (0, _react.useState)(initialValues.name);
39
39
  const [description, setDescription] = (0, _react.useState)(initialValues.description);
@@ -60,8 +60,7 @@ function PanelEditorForm(props) {
60
60
  }
61
61
  setGroupId(value);
62
62
  };
63
- const handleSubmit = (e)=>{
64
- e.preventDefault();
63
+ (0, _react.useEffect)(()=>{
65
64
  const values = {
66
65
  name,
67
66
  description,
@@ -69,14 +68,20 @@ function PanelEditorForm(props) {
69
68
  kind,
70
69
  spec
71
70
  };
72
- onSubmit(values);
73
- };
71
+ onChange(values);
72
+ }, [
73
+ name,
74
+ description,
75
+ groupId,
76
+ kind,
77
+ spec,
78
+ onChange
79
+ ]);
74
80
  var _title, ref1;
75
81
  return(// Grid maxHeight allows user to scroll inside Drawer to see all content
76
82
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_material.Box, {
77
83
  component: "form",
78
84
  id: panelEditorFormId,
79
- onSubmit: handleSubmit,
80
85
  sx: {
81
86
  flex: 1,
82
87
  overflowY: 'scroll',
@@ -26,11 +26,11 @@ _export(exports, {
26
26
  });
27
27
  const _jsxRuntime = require("react/jsx-runtime");
28
28
  const _refresh = /*#__PURE__*/ _interopRequireDefault(require("mdi-material-ui/Refresh"));
29
- const _material = require("@mui/material");
30
29
  const _components = require("@perses-dev/components");
31
30
  const _pluginSystem = require("@perses-dev/plugin-system");
32
31
  const _core = require("@perses-dev/core");
33
32
  const _context = require("../../context");
33
+ const _toolbarIconButton = require("../ToolbarIconButton");
34
34
  function _interopRequireDefault(obj) {
35
35
  return obj && obj.__esModule ? obj : {
36
36
  default: obj
@@ -117,7 +117,7 @@ function TimeRangeControls({ heightPx }) {
117
117
  onChange: setTimeRange,
118
118
  height: height
119
119
  }),
120
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(RefreshIconButton, {
120
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_toolbarIconButton.ToolbarIconButton, {
121
121
  "aria-label": "Refresh Dashboard",
122
122
  onClick: refresh,
123
123
  sx: {
@@ -128,9 +128,3 @@ function TimeRangeControls({ heightPx }) {
128
128
  ]
129
129
  });
130
130
  }
131
- const RefreshIconButton = (0, _material.styled)(_material.IconButton)(({ theme })=>({
132
- border: `1px solid ${theme.palette.grey[300]}`,
133
- borderRadius: theme.shape.borderRadius,
134
- padding: theme.spacing(0.5),
135
- color: theme.palette.grey[900]
136
- }));
@@ -0,0 +1,35 @@
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
+ Object.defineProperty(exports, "ToolbarIconButton", {
18
+ enumerable: true,
19
+ get: ()=>ToolbarIconButton
20
+ });
21
+ const _jsxRuntime = require("react/jsx-runtime");
22
+ const _material = require("@mui/material");
23
+ function ToolbarIconButton(props) {
24
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(IconButton, {
25
+ variant: "outlined",
26
+ color: "secondary",
27
+ ...props
28
+ });
29
+ }
30
+ const IconButton = (0, _material.styled)(_material.Button)(({ theme })=>({
31
+ // Using a button with some adjusted styles because it is easier to inherit
32
+ // styling and variants from themes than with an IconButton.
33
+ padding: theme.spacing(0.5),
34
+ minWidth: 'auto'
35
+ }));
@@ -0,0 +1,28 @@
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("./ToolbarIconButton"), exports);
18
+ function _exportStar(from, to) {
19
+ Object.keys(from).forEach(function(k) {
20
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
21
+ enumerable: true,
22
+ get: function() {
23
+ return from[k];
24
+ }
25
+ });
26
+ });
27
+ return from;
28
+ }