@perses-dev/dashboards 0.50.3 → 0.51.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/dist/cjs/components/Dashboard/Dashboard.js +1 -3
  2. package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +3 -3
  3. package/dist/cjs/components/Datasources/DatasourceEditor.js +2 -5
  4. package/dist/cjs/components/Datasources/EditDatasourcesButton.js +2 -5
  5. package/dist/cjs/components/DeletePanelDialog/DeletePanelDialog.js +2 -0
  6. package/dist/cjs/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +4 -3
  7. package/dist/cjs/components/EditJsonDialog/EditJsonDialog.js +5 -7
  8. package/dist/cjs/components/EmptyDashboard/EmptyDashboard.js +1 -1
  9. package/dist/cjs/components/GridLayout/GridItemContent.js +4 -3
  10. package/dist/cjs/components/GridLayout/GridLayout.js +5 -6
  11. package/dist/cjs/components/GridLayout/GridTitle.js +3 -3
  12. package/dist/cjs/{stories/decorators/constants.js → components/Panel/HeaderIconButton.js} +8 -20
  13. package/dist/cjs/components/Panel/Panel.js +16 -10
  14. package/dist/cjs/components/Panel/PanelActions.js +365 -0
  15. package/dist/cjs/components/Panel/PanelContent.js +59 -13
  16. package/dist/cjs/components/Panel/PanelHeader.js +14 -141
  17. package/dist/cjs/components/Panel/PanelLinks.js +5 -6
  18. package/dist/cjs/components/Panel/PanelPluginLoader.js +56 -0
  19. package/dist/cjs/components/Panel/index.js +1 -0
  20. package/dist/cjs/components/PanelDrawer/PanelDrawer.js +9 -6
  21. package/dist/cjs/components/PanelDrawer/PanelEditorForm.js +17 -33
  22. package/dist/cjs/components/PanelDrawer/PanelPreview.js +4 -5
  23. package/dist/cjs/components/PanelGroupDialog/PanelGroupDialog.js +1 -1
  24. package/dist/cjs/components/QuerySummaryTable/QuerySummaryTable.js +3 -5
  25. package/dist/cjs/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +2 -4
  26. package/dist/cjs/components/Variables/BuiltinVariableAccordions.js +5 -12
  27. package/dist/cjs/components/Variables/Variable.js +20 -35
  28. package/dist/cjs/components/Variables/VariableEditor.js +14 -23
  29. package/dist/cjs/components/Variables/VariableList.js +4 -6
  30. package/dist/cjs/constants/styles.js +12 -0
  31. package/dist/cjs/constants/user-interface-text.js +1 -0
  32. package/dist/cjs/context/DashboardProvider/DashboardProvider.js +5 -6
  33. package/dist/cjs/context/DashboardProvider/DashboardProviderWithQueryParams.js +1 -1
  34. package/dist/cjs/context/DashboardProvider/common.js +2 -2
  35. package/dist/cjs/context/DashboardProvider/dashboard-provider-api.js +13 -3
  36. package/dist/cjs/context/DashboardProvider/delete-panel-slice.js +1 -2
  37. package/dist/cjs/context/DashboardProvider/panel-editor-slice.js +3 -6
  38. package/dist/cjs/context/DashboardProvider/panel-group-editor-slice.js +1 -2
  39. package/dist/cjs/context/DashboardProvider/panel-group-slice.js +3 -4
  40. package/dist/cjs/context/DashboardProvider/view-panel-slice.js +1 -2
  41. package/dist/cjs/context/DatasourceStoreProvider.js +15 -22
  42. package/dist/cjs/context/VariableProvider/VariableProvider.js +12 -20
  43. package/dist/cjs/context/VariableProvider/hydrationUtils.js +3 -6
  44. package/dist/cjs/context/VariableProvider/utils.js +2 -2
  45. package/dist/cjs/test/datasource-provider.js +1 -1
  46. package/dist/cjs/test/plugin-registry.js +8 -3
  47. package/dist/cjs/test/render.js +13 -11
  48. package/dist/cjs/views/ViewDashboard/DashboardApp.js +4 -3
  49. package/dist/cjs/views/ViewDashboard/ViewDashboard.js +5 -5
  50. package/dist/components/Dashboard/Dashboard.js +1 -3
  51. package/dist/components/Dashboard/Dashboard.js.map +1 -1
  52. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts +2 -0
  53. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
  54. package/dist/components/DashboardToolbar/DashboardToolbar.js +3 -3
  55. package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
  56. package/dist/components/Datasources/DatasourceEditor.js +2 -5
  57. package/dist/components/Datasources/DatasourceEditor.js.map +1 -1
  58. package/dist/components/Datasources/EditDatasourcesButton.js +2 -5
  59. package/dist/components/Datasources/EditDatasourcesButton.js.map +1 -1
  60. package/dist/components/DeletePanelDialog/DeletePanelDialog.js +3 -1
  61. package/dist/components/DeletePanelDialog/DeletePanelDialog.js.map +1 -1
  62. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.d.ts.map +1 -1
  63. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +5 -4
  64. package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js.map +1 -1
  65. package/dist/components/DownloadButton/DownloadButton.js.map +1 -1
  66. package/dist/components/EditJsonDialog/EditJsonDialog.js +5 -7
  67. package/dist/components/EditJsonDialog/EditJsonDialog.js.map +1 -1
  68. package/dist/components/EmptyDashboard/EmptyDashboard.js +1 -1
  69. package/dist/components/EmptyDashboard/EmptyDashboard.js.map +1 -1
  70. package/dist/components/GridLayout/GridContainer.js.map +1 -1
  71. package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
  72. package/dist/components/GridLayout/GridItemContent.js +5 -4
  73. package/dist/components/GridLayout/GridItemContent.js.map +1 -1
  74. package/dist/components/GridLayout/GridLayout.js +6 -7
  75. package/dist/components/GridLayout/GridLayout.js.map +1 -1
  76. package/dist/components/GridLayout/GridTitle.js +3 -3
  77. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  78. package/dist/components/Panel/HeaderIconButton.d.ts +5 -0
  79. package/dist/components/Panel/HeaderIconButton.d.ts.map +1 -0
  80. package/dist/{stories/decorators/index.js → components/Panel/HeaderIconButton.js} +7 -6
  81. package/dist/components/Panel/HeaderIconButton.js.map +1 -0
  82. package/dist/components/Panel/Panel.d.ts +7 -2
  83. package/dist/components/Panel/Panel.d.ts.map +1 -1
  84. package/dist/components/Panel/Panel.js +22 -11
  85. package/dist/components/Panel/Panel.js.map +1 -1
  86. package/dist/components/Panel/PanelActions.d.ts +22 -0
  87. package/dist/components/Panel/PanelActions.d.ts.map +1 -0
  88. package/dist/components/Panel/PanelActions.js +352 -0
  89. package/dist/components/Panel/PanelActions.js.map +1 -0
  90. package/dist/components/Panel/PanelContent.d.ts +5 -4
  91. package/dist/components/Panel/PanelContent.d.ts.map +1 -1
  92. package/dist/components/Panel/PanelContent.js +61 -15
  93. package/dist/components/Panel/PanelContent.js.map +1 -1
  94. package/dist/components/Panel/PanelHeader.d.ts +7 -11
  95. package/dist/components/Panel/PanelHeader.d.ts.map +1 -1
  96. package/dist/components/Panel/PanelHeader.js +18 -140
  97. package/dist/components/Panel/PanelHeader.js.map +1 -1
  98. package/dist/components/Panel/PanelLinks.js +5 -6
  99. package/dist/components/Panel/PanelLinks.js.map +1 -1
  100. package/dist/components/Panel/PanelPluginLoader.d.ts +13 -0
  101. package/dist/components/Panel/PanelPluginLoader.d.ts.map +1 -0
  102. package/dist/components/Panel/PanelPluginLoader.js +51 -0
  103. package/dist/components/Panel/PanelPluginLoader.js.map +1 -0
  104. package/dist/components/Panel/index.d.ts +1 -0
  105. package/dist/components/Panel/index.d.ts.map +1 -1
  106. package/dist/components/Panel/index.js +1 -0
  107. package/dist/components/Panel/index.js.map +1 -1
  108. package/dist/components/PanelDrawer/PanelDrawer.d.ts.map +1 -1
  109. package/dist/components/PanelDrawer/PanelDrawer.js +10 -7
  110. package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
  111. package/dist/components/PanelDrawer/PanelEditorForm.js +17 -33
  112. package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
  113. package/dist/components/PanelDrawer/PanelPreview.js +4 -5
  114. package/dist/components/PanelDrawer/PanelPreview.js.map +1 -1
  115. package/dist/components/PanelGroupDialog/PanelGroupDialog.js +1 -1
  116. package/dist/components/PanelGroupDialog/PanelGroupDialog.js.map +1 -1
  117. package/dist/components/QuerySummaryTable/QuerySummaryTable.js +3 -5
  118. package/dist/components/QuerySummaryTable/QuerySummaryTable.js.map +1 -1
  119. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +2 -4
  120. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js.map +1 -1
  121. package/dist/components/SaveDashboardButton/SaveDashboardButton.js.map +1 -1
  122. package/dist/components/Variables/BuiltinVariableAccordions.js +5 -12
  123. package/dist/components/Variables/BuiltinVariableAccordions.js.map +1 -1
  124. package/dist/components/Variables/Variable.js +20 -35
  125. package/dist/components/Variables/Variable.js.map +1 -1
  126. package/dist/components/Variables/VariableEditor.js +14 -23
  127. package/dist/components/Variables/VariableEditor.js.map +1 -1
  128. package/dist/components/Variables/VariableList.js +4 -6
  129. package/dist/components/Variables/VariableList.js.map +1 -1
  130. package/dist/constants/styles.d.ts +3 -0
  131. package/dist/constants/styles.d.ts.map +1 -1
  132. package/dist/constants/styles.js +3 -0
  133. package/dist/constants/styles.js.map +1 -1
  134. package/dist/constants/user-interface-text.d.ts +1 -0
  135. package/dist/constants/user-interface-text.d.ts.map +1 -1
  136. package/dist/constants/user-interface-text.js +1 -0
  137. package/dist/constants/user-interface-text.js.map +1 -1
  138. package/dist/context/DashboardProvider/DashboardProvider.js +5 -6
  139. package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
  140. package/dist/context/DashboardProvider/DashboardProviderWithQueryParams.js +1 -1
  141. package/dist/context/DashboardProvider/DashboardProviderWithQueryParams.js.map +1 -1
  142. package/dist/context/DashboardProvider/common.js +2 -2
  143. package/dist/context/DashboardProvider/common.js.map +1 -1
  144. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +11 -2
  145. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
  146. package/dist/context/DashboardProvider/dashboard-provider-api.js +13 -4
  147. package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
  148. package/dist/context/DashboardProvider/delete-panel-slice.js +1 -2
  149. package/dist/context/DashboardProvider/delete-panel-slice.js.map +1 -1
  150. package/dist/context/DashboardProvider/duplicate-panel-slice.js.map +1 -1
  151. package/dist/context/DashboardProvider/panel-editor-slice.js +3 -6
  152. package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
  153. package/dist/context/DashboardProvider/panel-group-editor-slice.js +1 -2
  154. package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -1
  155. package/dist/context/DashboardProvider/panel-group-slice.d.ts +1 -1
  156. package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
  157. package/dist/context/DashboardProvider/panel-group-slice.js +3 -4
  158. package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
  159. package/dist/context/DashboardProvider/view-panel-slice.js +1 -2
  160. package/dist/context/DashboardProvider/view-panel-slice.js.map +1 -1
  161. package/dist/context/DatasourceStoreProvider.js +15 -22
  162. package/dist/context/DatasourceStoreProvider.js.map +1 -1
  163. package/dist/context/VariableProvider/VariableProvider.js +9 -12
  164. package/dist/context/VariableProvider/VariableProvider.js.map +1 -1
  165. package/dist/context/VariableProvider/hydrationUtils.js +3 -6
  166. package/dist/context/VariableProvider/hydrationUtils.js.map +1 -1
  167. package/dist/context/VariableProvider/query-params.js.map +1 -1
  168. package/dist/context/VariableProvider/utils.js +2 -2
  169. package/dist/context/VariableProvider/utils.js.map +1 -1
  170. package/dist/context/useDashboard.js.map +1 -1
  171. package/dist/test/datasource-provider.d.ts +1 -1
  172. package/dist/test/datasource-provider.d.ts.map +1 -1
  173. package/dist/test/datasource-provider.js +1 -1
  174. package/dist/test/datasource-provider.js.map +1 -1
  175. package/dist/test/plugin-registry.d.ts.map +1 -1
  176. package/dist/test/plugin-registry.js +8 -3
  177. package/dist/test/plugin-registry.js.map +1 -1
  178. package/dist/test/render.d.ts.map +1 -1
  179. package/dist/test/render.js +9 -7
  180. package/dist/test/render.js.map +1 -1
  181. package/dist/utils/panelUtils.js.map +1 -1
  182. package/dist/views/ViewDashboard/DashboardApp.d.ts +2 -0
  183. package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
  184. package/dist/views/ViewDashboard/DashboardApp.js +4 -3
  185. package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
  186. package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
  187. package/dist/views/ViewDashboard/ViewDashboard.js +5 -5
  188. package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
  189. package/package.json +9 -10
  190. package/dist/cjs/stories/decorators/WithDashboard.js +0 -41
  191. package/dist/cjs/stories/decorators/WithDatasourceStore.js +0 -39
  192. package/dist/cjs/stories/decorators/WithVariables.js +0 -37
  193. package/dist/cjs/stories/decorators/index.js +0 -33
  194. package/dist/stories/decorators/WithDashboard.js +0 -33
  195. package/dist/stories/decorators/WithDashboard.js.map +0 -1
  196. package/dist/stories/decorators/WithDatasourceStore.js +0 -31
  197. package/dist/stories/decorators/WithDatasourceStore.js.map +0 -1
  198. package/dist/stories/decorators/WithVariables.js +0 -29
  199. package/dist/stories/decorators/WithVariables.js.map +0 -1
  200. package/dist/stories/decorators/constants.js +0 -31
  201. package/dist/stories/decorators/constants.js.map +0 -1
  202. package/dist/stories/decorators/index.js.map +0 -1
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ import { QueryData } from '@perses-dev/plugin-system';
3
+ import { Link } from '@perses-dev/core';
4
+ export interface PanelActionsProps {
5
+ title: string;
6
+ description?: string;
7
+ descriptionTooltipId: string;
8
+ links?: Link[];
9
+ extra?: React.ReactNode;
10
+ editHandlers?: {
11
+ onEditPanelClick: () => void;
12
+ onDuplicatePanelClick: () => void;
13
+ onDeletePanelClick: () => void;
14
+ };
15
+ readHandlers?: {
16
+ isPanelViewed?: boolean;
17
+ onViewPanelClick: () => void;
18
+ };
19
+ queryResults: QueryData[];
20
+ }
21
+ export declare const PanelActions: React.FC<PanelActionsProps>;
22
+ //# sourceMappingURL=PanelActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelActions.d.ts","sourceRoot":"","sources":["../../../src/components/Panel/PanelActions.tsx"],"names":[],"mappings":";AAuBA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAWxC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE;QACb,gBAAgB,EAAE,MAAM,IAAI,CAAC;QAC7B,qBAAqB,EAAE,MAAM,IAAI,CAAC;QAClC,kBAAkB,EAAE,MAAM,IAAI,CAAC;KAChC,CAAC;IACF,YAAY,CAAC,EAAE;QACb,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AASD,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAqMpD,CAAC"}
@@ -0,0 +1,352 @@
1
+ // Copyright 2025 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
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
+ import { Stack, Box, Popover, CircularProgress, styled } from '@mui/material';
15
+ import { isValidElement, useMemo, useState } from 'react';
16
+ import { InfoTooltip } from '@perses-dev/components';
17
+ import ArrowCollapseIcon from 'mdi-material-ui/ArrowCollapse';
18
+ import ArrowExpandIcon from 'mdi-material-ui/ArrowExpand';
19
+ import PencilIcon from 'mdi-material-ui/PencilOutline';
20
+ import DeleteIcon from 'mdi-material-ui/DeleteOutline';
21
+ import DragIcon from 'mdi-material-ui/DragVertical';
22
+ import ContentCopyIcon from 'mdi-material-ui/ContentCopy';
23
+ import MenuIcon from 'mdi-material-ui/Menu';
24
+ import AlertIcon from 'mdi-material-ui/Alert';
25
+ import InformationOutlineIcon from 'mdi-material-ui/InformationOutline';
26
+ import { ARIA_LABEL_TEXT, HEADER_ACTIONS_CONTAINER_NAME, HEADER_MEDIUM_WIDTH, HEADER_SMALL_WIDTH, TOOLTIP_TEXT } from '../../constants';
27
+ import { HeaderIconButton } from './HeaderIconButton';
28
+ import { PanelLinks } from './PanelLinks';
29
+ const ConditionalBox = styled(Box)({
30
+ display: 'none',
31
+ alignItems: 'center',
32
+ flexGrow: 1,
33
+ justifyContent: 'flex-end'
34
+ });
35
+ export const PanelActions = ({ editHandlers, readHandlers, extra, title, description, descriptionTooltipId, links, queryResults })=>{
36
+ const descriptionAction = useMemo(()=>{
37
+ if (description && description.trim().length > 0) {
38
+ return /*#__PURE__*/ _jsx(InfoTooltip, {
39
+ id: descriptionTooltipId,
40
+ description: description,
41
+ enterDelay: 100,
42
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
43
+ "aria-label": "panel description",
44
+ size: "small",
45
+ children: /*#__PURE__*/ _jsx(InformationOutlineIcon, {
46
+ "aria-describedby": "info-tooltip",
47
+ "aria-hidden": false,
48
+ fontSize: "inherit",
49
+ sx: {
50
+ color: (theme)=>theme.palette.text.secondary
51
+ }
52
+ })
53
+ })
54
+ });
55
+ }
56
+ return undefined;
57
+ }, [
58
+ descriptionTooltipId,
59
+ description
60
+ ]);
61
+ const linksAction = links && links.length > 0 && /*#__PURE__*/ _jsx(PanelLinks, {
62
+ links: links
63
+ });
64
+ const extraActions = editHandlers === undefined && extra;
65
+ const queryStateIndicator = useMemo(()=>{
66
+ const hasData = queryResults.some((q)=>q.data);
67
+ const isFetching = queryResults.some((q)=>q.isFetching);
68
+ const queryErrors = queryResults.filter((q)=>q.error);
69
+ if (isFetching && hasData) {
70
+ // If the panel has no data, the panel content will show the loading overlay.
71
+ // Therefore, show the circular loading indicator only in case the panel doesn't display the loading overlay already.
72
+ return /*#__PURE__*/ _jsx(CircularProgress, {
73
+ "aria-label": "loading",
74
+ size: "1.125rem"
75
+ });
76
+ } else if (queryErrors.length > 0) {
77
+ const errorTexts = queryErrors.map((q)=>q.error).map((e)=>e?.message ?? e?.toString() ?? 'Unknown error') // eslint-disable-line @typescript-eslint/no-explicit-any
78
+ .join('\n');
79
+ return /*#__PURE__*/ _jsx(InfoTooltip, {
80
+ description: errorTexts,
81
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
82
+ "aria-label": "panel errors",
83
+ size: "small",
84
+ children: /*#__PURE__*/ _jsx(AlertIcon, {
85
+ fontSize: "inherit"
86
+ })
87
+ })
88
+ });
89
+ }
90
+ }, [
91
+ queryResults
92
+ ]);
93
+ const readActions = useMemo(()=>{
94
+ if (readHandlers !== undefined) {
95
+ return /*#__PURE__*/ _jsx(InfoTooltip, {
96
+ description: TOOLTIP_TEXT.viewPanel,
97
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
98
+ "aria-label": ARIA_LABEL_TEXT.viewPanel(title),
99
+ size: "small",
100
+ onClick: readHandlers.onViewPanelClick,
101
+ children: readHandlers.isPanelViewed ? /*#__PURE__*/ _jsx(ArrowCollapseIcon, {
102
+ fontSize: "inherit"
103
+ }) : /*#__PURE__*/ _jsx(ArrowExpandIcon, {
104
+ fontSize: "inherit"
105
+ })
106
+ })
107
+ });
108
+ }
109
+ return undefined;
110
+ }, [
111
+ readHandlers,
112
+ title
113
+ ]);
114
+ const editActions = useMemo(()=>{
115
+ if (editHandlers !== undefined) {
116
+ // If there are edit handlers, always just show the edit buttons
117
+ return /*#__PURE__*/ _jsxs(_Fragment, {
118
+ children: [
119
+ /*#__PURE__*/ _jsx(InfoTooltip, {
120
+ description: TOOLTIP_TEXT.editPanel,
121
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
122
+ "aria-label": ARIA_LABEL_TEXT.editPanel(title),
123
+ size: "small",
124
+ onClick: editHandlers.onEditPanelClick,
125
+ children: /*#__PURE__*/ _jsx(PencilIcon, {
126
+ fontSize: "inherit"
127
+ })
128
+ })
129
+ }),
130
+ /*#__PURE__*/ _jsx(InfoTooltip, {
131
+ description: TOOLTIP_TEXT.duplicatePanel,
132
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
133
+ "aria-label": ARIA_LABEL_TEXT.duplicatePanel(title),
134
+ size: "small",
135
+ onClick: editHandlers.onDuplicatePanelClick,
136
+ children: /*#__PURE__*/ _jsx(ContentCopyIcon, {
137
+ fontSize: "inherit",
138
+ sx: {
139
+ // Shrink this icon a little bit to look more consistent
140
+ // with the other icons in the header.
141
+ transform: 'scale(0.925)'
142
+ }
143
+ })
144
+ })
145
+ }),
146
+ /*#__PURE__*/ _jsx(InfoTooltip, {
147
+ description: TOOLTIP_TEXT.deletePanel,
148
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
149
+ "aria-label": ARIA_LABEL_TEXT.deletePanel(title),
150
+ size: "small",
151
+ onClick: editHandlers.onDeletePanelClick,
152
+ children: /*#__PURE__*/ _jsx(DeleteIcon, {
153
+ fontSize: "inherit"
154
+ })
155
+ })
156
+ })
157
+ ]
158
+ });
159
+ }
160
+ return undefined;
161
+ }, [
162
+ editHandlers,
163
+ title
164
+ ]);
165
+ const moveAction = useMemo(()=>{
166
+ if (editActions && !readHandlers?.isPanelViewed) {
167
+ return /*#__PURE__*/ _jsx(InfoTooltip, {
168
+ description: TOOLTIP_TEXT.movePanel,
169
+ children: /*#__PURE__*/ _jsx(HeaderIconButton, {
170
+ "aria-label": ARIA_LABEL_TEXT.movePanel(title),
171
+ size: "small",
172
+ children: /*#__PURE__*/ _jsx(DragIcon, {
173
+ className: "drag-handle",
174
+ sx: {
175
+ cursor: 'grab'
176
+ },
177
+ fontSize: "inherit"
178
+ })
179
+ })
180
+ });
181
+ }
182
+ return undefined;
183
+ }, [
184
+ editActions,
185
+ readHandlers,
186
+ title
187
+ ]);
188
+ const divider = /*#__PURE__*/ _jsx(Box, {
189
+ sx: {
190
+ flexGrow: 1
191
+ }
192
+ });
193
+ // if the panel is in non-editing, non-fullscreen mode, show certain icons only on hover
194
+ const OnHover = ({ children })=>editHandlers === undefined && !readHandlers?.isPanelViewed ? /*#__PURE__*/ _jsx(Box, {
195
+ sx: {
196
+ display: 'var(--panel-hover, none)'
197
+ },
198
+ children: children
199
+ }) : /*#__PURE__*/ _jsx(_Fragment, {
200
+ children: children
201
+ });
202
+ return /*#__PURE__*/ _jsxs(_Fragment, {
203
+ children: [
204
+ /*#__PURE__*/ _jsxs(ConditionalBox, {
205
+ sx: (theme)=>({
206
+ [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).between(0, HEADER_SMALL_WIDTH)]: {
207
+ display: 'flex'
208
+ }
209
+ }),
210
+ children: [
211
+ divider,
212
+ /*#__PURE__*/ _jsxs(OnHover, {
213
+ children: [
214
+ /*#__PURE__*/ _jsxs(OverflowMenu, {
215
+ title: title,
216
+ children: [
217
+ descriptionAction,
218
+ " ",
219
+ linksAction,
220
+ " ",
221
+ queryStateIndicator,
222
+ " ",
223
+ extraActions,
224
+ " ",
225
+ readActions,
226
+ " ",
227
+ editActions
228
+ ]
229
+ }),
230
+ moveAction
231
+ ]
232
+ })
233
+ ]
234
+ }),
235
+ /*#__PURE__*/ _jsxs(ConditionalBox, {
236
+ sx: (theme)=>({
237
+ [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).between(HEADER_SMALL_WIDTH, HEADER_MEDIUM_WIDTH)]: {
238
+ display: 'flex'
239
+ }
240
+ }),
241
+ children: [
242
+ /*#__PURE__*/ _jsxs(OnHover, {
243
+ children: [
244
+ descriptionAction,
245
+ " ",
246
+ linksAction
247
+ ]
248
+ }),
249
+ divider,
250
+ " ",
251
+ queryStateIndicator,
252
+ /*#__PURE__*/ _jsxs(OnHover, {
253
+ children: [
254
+ extraActions,
255
+ " ",
256
+ readActions,
257
+ /*#__PURE__*/ _jsx(OverflowMenu, {
258
+ title: title,
259
+ children: editActions
260
+ }),
261
+ moveAction
262
+ ]
263
+ })
264
+ ]
265
+ }),
266
+ /*#__PURE__*/ _jsxs(ConditionalBox, {
267
+ sx: (theme)=>({
268
+ // flip the logic here; if the browser (or jsdom) does not support container queries, always show all icons
269
+ display: 'flex',
270
+ [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).down(HEADER_MEDIUM_WIDTH)]: {
271
+ display: 'none'
272
+ }
273
+ }),
274
+ children: [
275
+ /*#__PURE__*/ _jsxs(OnHover, {
276
+ children: [
277
+ descriptionAction,
278
+ " ",
279
+ linksAction
280
+ ]
281
+ }),
282
+ divider,
283
+ " ",
284
+ queryStateIndicator,
285
+ /*#__PURE__*/ _jsxs(OnHover, {
286
+ children: [
287
+ extraActions,
288
+ " ",
289
+ readActions,
290
+ " ",
291
+ editActions,
292
+ " ",
293
+ moveAction
294
+ ]
295
+ })
296
+ ]
297
+ })
298
+ ]
299
+ });
300
+ };
301
+ const OverflowMenu = ({ children, title })=>{
302
+ const [anchorPosition, setAnchorPosition] = useState();
303
+ // do not show overflow menu if there is no content (for example, edit actions are hidden)
304
+ const hasContent = /*#__PURE__*/ isValidElement(children) || Array.isArray(children) && children.some(isValidElement);
305
+ if (!hasContent) {
306
+ return undefined;
307
+ }
308
+ const handleClick = (event)=>{
309
+ setAnchorPosition(event.currentTarget.getBoundingClientRect());
310
+ };
311
+ const handleClose = ()=>{
312
+ setAnchorPosition(undefined);
313
+ };
314
+ const open = Boolean(anchorPosition);
315
+ const id = open ? 'actions-menu' : undefined;
316
+ return /*#__PURE__*/ _jsxs(_Fragment, {
317
+ children: [
318
+ /*#__PURE__*/ _jsx(HeaderIconButton, {
319
+ className: "show-actions",
320
+ "aria-describedby": id,
321
+ onClick: handleClick,
322
+ "aria-label": ARIA_LABEL_TEXT.showPanelActions(title),
323
+ size: "small",
324
+ children: /*#__PURE__*/ _jsx(MenuIcon, {
325
+ fontSize: "inherit"
326
+ })
327
+ }),
328
+ /*#__PURE__*/ _jsx(Popover, {
329
+ id: id,
330
+ open: open,
331
+ anchorReference: "anchorPosition",
332
+ anchorPosition: anchorPosition,
333
+ onClose: handleClose,
334
+ anchorOrigin: {
335
+ vertical: 'bottom',
336
+ horizontal: 'left'
337
+ },
338
+ children: /*#__PURE__*/ _jsx(Stack, {
339
+ direction: "row",
340
+ alignItems: "center",
341
+ sx: {
342
+ padding: 1
343
+ },
344
+ onClick: handleClose,
345
+ children: children
346
+ })
347
+ })
348
+ ]
349
+ });
350
+ };
351
+
352
+ //# sourceMappingURL=PanelActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/Panel/PanelActions.tsx"],"sourcesContent":["// Copyright 2025 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 { Stack, Box, Popover, CircularProgress, styled, PopoverPosition } from '@mui/material';\nimport { isValidElement, PropsWithChildren, ReactNode, useMemo, useState } from 'react';\nimport { InfoTooltip } from '@perses-dev/components';\nimport ArrowCollapseIcon from 'mdi-material-ui/ArrowCollapse';\nimport ArrowExpandIcon from 'mdi-material-ui/ArrowExpand';\nimport PencilIcon from 'mdi-material-ui/PencilOutline';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport DragIcon from 'mdi-material-ui/DragVertical';\nimport ContentCopyIcon from 'mdi-material-ui/ContentCopy';\nimport MenuIcon from 'mdi-material-ui/Menu';\nimport { QueryData } from '@perses-dev/plugin-system';\nimport AlertIcon from 'mdi-material-ui/Alert';\nimport InformationOutlineIcon from 'mdi-material-ui/InformationOutline';\nimport { Link } from '@perses-dev/core';\nimport {\n ARIA_LABEL_TEXT,\n HEADER_ACTIONS_CONTAINER_NAME,\n HEADER_MEDIUM_WIDTH,\n HEADER_SMALL_WIDTH,\n TOOLTIP_TEXT,\n} from '../../constants';\nimport { HeaderIconButton } from './HeaderIconButton';\nimport { PanelLinks } from './PanelLinks';\n\nexport interface PanelActionsProps {\n title: string;\n description?: string;\n descriptionTooltipId: string;\n links?: Link[];\n extra?: React.ReactNode;\n editHandlers?: {\n onEditPanelClick: () => void;\n onDuplicatePanelClick: () => void;\n onDeletePanelClick: () => void;\n };\n readHandlers?: {\n isPanelViewed?: boolean;\n onViewPanelClick: () => void;\n };\n queryResults: QueryData[];\n}\n\nconst ConditionalBox = styled(Box)({\n display: 'none',\n alignItems: 'center',\n flexGrow: 1,\n justifyContent: 'flex-end',\n});\n\nexport const PanelActions: React.FC<PanelActionsProps> = ({\n editHandlers,\n readHandlers,\n extra,\n title,\n description,\n descriptionTooltipId,\n links,\n queryResults,\n}) => {\n const descriptionAction = useMemo(() => {\n if (description && description.trim().length > 0) {\n return (\n <InfoTooltip id={descriptionTooltipId} description={description} enterDelay={100}>\n <HeaderIconButton aria-label=\"panel description\" size=\"small\">\n <InformationOutlineIcon\n aria-describedby=\"info-tooltip\"\n aria-hidden={false}\n fontSize=\"inherit\"\n sx={{ color: (theme) => theme.palette.text.secondary }}\n />\n </HeaderIconButton>\n </InfoTooltip>\n );\n }\n return undefined;\n }, [descriptionTooltipId, description]);\n const linksAction = links && links.length > 0 && <PanelLinks links={links} />;\n const extraActions = editHandlers === undefined && extra;\n\n const queryStateIndicator = useMemo(() => {\n const hasData = queryResults.some((q) => q.data);\n const isFetching = queryResults.some((q) => q.isFetching);\n const queryErrors = queryResults.filter((q) => q.error);\n if (isFetching && hasData) {\n // If the panel has no data, the panel content will show the loading overlay.\n // Therefore, show the circular loading indicator only in case the panel doesn't display the loading overlay already.\n return <CircularProgress aria-label=\"loading\" size=\"1.125rem\" />;\n } else if (queryErrors.length > 0) {\n const errorTexts = queryErrors\n .map((q) => q.error)\n .map((e: any) => e?.message ?? e?.toString() ?? 'Unknown error') // eslint-disable-line @typescript-eslint/no-explicit-any\n .join('\\n');\n\n return (\n <InfoTooltip description={errorTexts}>\n <HeaderIconButton aria-label=\"panel errors\" size=\"small\">\n <AlertIcon fontSize=\"inherit\" />\n </HeaderIconButton>\n </InfoTooltip>\n );\n }\n }, [queryResults]);\n\n const readActions = useMemo(() => {\n if (readHandlers !== undefined) {\n return (\n <InfoTooltip description={TOOLTIP_TEXT.viewPanel}>\n <HeaderIconButton\n aria-label={ARIA_LABEL_TEXT.viewPanel(title)}\n size=\"small\"\n onClick={readHandlers.onViewPanelClick}\n >\n {readHandlers.isPanelViewed ? (\n <ArrowCollapseIcon fontSize=\"inherit\" />\n ) : (\n <ArrowExpandIcon fontSize=\"inherit\" />\n )}\n </HeaderIconButton>\n </InfoTooltip>\n );\n }\n return undefined;\n }, [readHandlers, title]);\n\n const editActions = useMemo(() => {\n if (editHandlers !== undefined) {\n // If there are edit handlers, always just show the edit buttons\n return (\n <>\n <InfoTooltip description={TOOLTIP_TEXT.editPanel}>\n <HeaderIconButton\n aria-label={ARIA_LABEL_TEXT.editPanel(title)}\n size=\"small\"\n onClick={editHandlers.onEditPanelClick}\n >\n <PencilIcon fontSize=\"inherit\" />\n </HeaderIconButton>\n </InfoTooltip>\n <InfoTooltip description={TOOLTIP_TEXT.duplicatePanel}>\n <HeaderIconButton\n aria-label={ARIA_LABEL_TEXT.duplicatePanel(title)}\n size=\"small\"\n onClick={editHandlers.onDuplicatePanelClick}\n >\n <ContentCopyIcon\n fontSize=\"inherit\"\n sx={{\n // Shrink this icon a little bit to look more consistent\n // with the other icons in the header.\n transform: 'scale(0.925)',\n }}\n />\n </HeaderIconButton>\n </InfoTooltip>\n <InfoTooltip description={TOOLTIP_TEXT.deletePanel}>\n <HeaderIconButton\n aria-label={ARIA_LABEL_TEXT.deletePanel(title)}\n size=\"small\"\n onClick={editHandlers.onDeletePanelClick}\n >\n <DeleteIcon fontSize=\"inherit\" />\n </HeaderIconButton>\n </InfoTooltip>\n </>\n );\n }\n return undefined;\n }, [editHandlers, title]);\n\n const moveAction = useMemo(() => {\n if (editActions && !readHandlers?.isPanelViewed) {\n return (\n <InfoTooltip description={TOOLTIP_TEXT.movePanel}>\n <HeaderIconButton aria-label={ARIA_LABEL_TEXT.movePanel(title)} size=\"small\">\n <DragIcon className=\"drag-handle\" sx={{ cursor: 'grab' }} fontSize=\"inherit\" />\n </HeaderIconButton>\n </InfoTooltip>\n );\n }\n return undefined;\n }, [editActions, readHandlers, title]);\n\n const divider = <Box sx={{ flexGrow: 1 }}></Box>;\n\n // if the panel is in non-editing, non-fullscreen mode, show certain icons only on hover\n const OnHover = ({ children }: PropsWithChildren): ReactNode =>\n editHandlers === undefined && !readHandlers?.isPanelViewed ? (\n <Box sx={{ display: 'var(--panel-hover, none)' }}>{children}</Box>\n ) : (\n <>{children}</>\n );\n\n return (\n <>\n {/* small panel width: move all icons except move/grab to overflow menu */}\n <ConditionalBox\n sx={(theme) => ({\n [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).between(0, HEADER_SMALL_WIDTH)]: { display: 'flex' },\n })}\n >\n {divider}\n <OnHover>\n <OverflowMenu title={title}>\n {descriptionAction} {linksAction} {queryStateIndicator} {extraActions} {readActions} {editActions}\n </OverflowMenu>\n {moveAction}\n </OnHover>\n </ConditionalBox>\n\n {/* medium panel width: move edit icons to overflow menu */}\n <ConditionalBox\n sx={(theme) => ({\n [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).between(HEADER_SMALL_WIDTH, HEADER_MEDIUM_WIDTH)]: {\n display: 'flex',\n },\n })}\n >\n <OnHover>\n {descriptionAction} {linksAction}\n </OnHover>\n {divider} {queryStateIndicator}\n <OnHover>\n {extraActions} {readActions}\n <OverflowMenu title={title}>{editActions}</OverflowMenu>\n {moveAction}\n </OnHover>\n </ConditionalBox>\n\n {/* large panel width: show all icons in panel header */}\n <ConditionalBox\n sx={(theme) => ({\n // flip the logic here; if the browser (or jsdom) does not support container queries, always show all icons\n display: 'flex',\n [theme.containerQueries(HEADER_ACTIONS_CONTAINER_NAME).down(HEADER_MEDIUM_WIDTH)]: { display: 'none' },\n })}\n >\n <OnHover>\n {descriptionAction} {linksAction}\n </OnHover>\n {divider} {queryStateIndicator}\n <OnHover>\n {extraActions} {readActions} {editActions} {moveAction}\n </OnHover>\n </ConditionalBox>\n </>\n );\n};\n\nconst OverflowMenu: React.FC<PropsWithChildren<{ title: string }>> = ({ children, title }) => {\n const [anchorPosition, setAnchorPosition] = useState<PopoverPosition>();\n\n // do not show overflow menu if there is no content (for example, edit actions are hidden)\n const hasContent = isValidElement(children) || (Array.isArray(children) && children.some(isValidElement));\n if (!hasContent) {\n return undefined;\n }\n\n const handleClick = (event: React.MouseEvent<HTMLElement>): undefined => {\n setAnchorPosition(event.currentTarget.getBoundingClientRect());\n };\n\n const handleClose = (): undefined => {\n setAnchorPosition(undefined);\n };\n\n const open = Boolean(anchorPosition);\n const id = open ? 'actions-menu' : undefined;\n\n return (\n <>\n <HeaderIconButton\n className=\"show-actions\"\n aria-describedby={id}\n onClick={handleClick}\n aria-label={ARIA_LABEL_TEXT.showPanelActions(title)}\n size=\"small\"\n >\n <MenuIcon fontSize=\"inherit\" />\n </HeaderIconButton>\n <Popover\n id={id}\n open={open}\n anchorReference=\"anchorPosition\"\n anchorPosition={anchorPosition}\n onClose={handleClose}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'left',\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\" sx={{ padding: 1 }} onClick={handleClose}>\n {children}\n </Stack>\n </Popover>\n </>\n );\n};\n"],"names":["Stack","Box","Popover","CircularProgress","styled","isValidElement","useMemo","useState","InfoTooltip","ArrowCollapseIcon","ArrowExpandIcon","PencilIcon","DeleteIcon","DragIcon","ContentCopyIcon","MenuIcon","AlertIcon","InformationOutlineIcon","ARIA_LABEL_TEXT","HEADER_ACTIONS_CONTAINER_NAME","HEADER_MEDIUM_WIDTH","HEADER_SMALL_WIDTH","TOOLTIP_TEXT","HeaderIconButton","PanelLinks","ConditionalBox","display","alignItems","flexGrow","justifyContent","PanelActions","editHandlers","readHandlers","extra","title","description","descriptionTooltipId","links","queryResults","descriptionAction","trim","length","id","enterDelay","aria-label","size","aria-describedby","aria-hidden","fontSize","sx","color","theme","palette","text","secondary","undefined","linksAction","extraActions","queryStateIndicator","hasData","some","q","data","isFetching","queryErrors","filter","error","errorTexts","map","e","message","toString","join","readActions","viewPanel","onClick","onViewPanelClick","isPanelViewed","editActions","editPanel","onEditPanelClick","duplicatePanel","onDuplicatePanelClick","transform","deletePanel","onDeletePanelClick","moveAction","movePanel","className","cursor","divider","OnHover","children","containerQueries","between","OverflowMenu","down","anchorPosition","setAnchorPosition","hasContent","Array","isArray","handleClick","event","currentTarget","getBoundingClientRect","handleClose","open","Boolean","showPanelActions","anchorReference","onClose","anchorOrigin","vertical","horizontal","direction","padding"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- import { PanelProps } from '@perses-dev/plugin-system';
1
+ import { PanelProps, QueryData } from '@perses-dev/plugin-system';
2
2
  import { UnknownSpec, PanelDefinition } from '@perses-dev/core';
3
3
  import { ReactElement } from 'react';
4
- export interface PanelContentProps extends PanelProps<UnknownSpec> {
4
+ export interface PanelContentProps extends Omit<PanelProps<UnknownSpec>, 'queryResults'> {
5
5
  panelPluginKind: string;
6
6
  definition?: PanelDefinition<UnknownSpec>;
7
+ queryResults: QueryData[];
7
8
  }
8
9
  /**
9
- * A small wrapper component that renders the appropriate PanelComponent from a Panel plugin based on the panel
10
- * definition's kind. Used so that an ErrorBoundary can be wrapped around this.
10
+ * Based on the status of the queries (loading, error or data available), this component renders a
11
+ * loading overlay, throws an error, or renders the panel content.
11
12
  */
12
13
  export declare function PanelContent(props: PanelContentProps): ReactElement;
13
14
  //# sourceMappingURL=PanelContent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelContent.d.ts","sourceRoot":"","sources":["../../../src/components/Panel/PanelContent.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAa,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,MAAM,WAAW,iBAAkB,SAAQ,UAAU,CAAC,WAAW,CAAC;IAChE,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAqBnE"}
1
+ {"version":3,"file":"PanelContent.d.ts","sourceRoot":"","sources":["../../../src/components/Panel/PanelContent.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAa,UAAU,EAAE,SAAS,EAAe,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,eAAe,EAAiB,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAKrC,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;IACtF,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IAC1C,YAAY,EAAE,SAAS,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAiDnE"}
@@ -12,32 +12,78 @@
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import { usePlugin } from '@perses-dev/plugin-system';
15
+ import { LoadingOverlay } from '@perses-dev/components';
15
16
  import { Skeleton } from '@mui/material';
17
+ import { PanelPluginLoader } from './PanelPluginLoader';
16
18
  /**
17
- * A small wrapper component that renders the appropriate PanelComponent from a Panel plugin based on the panel
18
- * definition's kind. Used so that an ErrorBoundary can be wrapped around this.
19
+ * Based on the status of the queries (loading, error or data available), this component renders a
20
+ * loading overlay, throws an error, or renders the panel content.
19
21
  */ export function PanelContent(props) {
20
- const { panelPluginKind, contentDimensions, definition, ...others } = props;
21
- const { data: plugin, isLoading } = usePlugin('Panel', panelPluginKind, {
22
- useErrorBoundary: true
22
+ const { panelPluginKind, definition, queryResults, spec, contentDimensions } = props;
23
+ const { data: plugin, isLoading: isPanelLoading } = usePlugin('Panel', panelPluginKind, {
24
+ throwOnError: true
23
25
  });
24
- const PanelComponent = plugin === null || plugin === void 0 ? void 0 : plugin.PanelComponent;
25
- if (isLoading) {
26
+ // Show fullsize skeleton if the panel plugin is loading.
27
+ if (isPanelLoading) {
26
28
  return /*#__PURE__*/ _jsx(Skeleton, {
27
29
  variant: "rectangular",
28
- width: contentDimensions === null || contentDimensions === void 0 ? void 0 : contentDimensions.width,
29
- height: contentDimensions === null || contentDimensions === void 0 ? void 0 : contentDimensions.height,
30
+ width: contentDimensions?.width,
31
+ height: contentDimensions?.height,
30
32
  "aria-label": "Loading..."
31
33
  });
32
34
  }
33
- if (PanelComponent === undefined) {
34
- throw new Error(`Missing PanelComponent from panel plugin for kind '${panelPluginKind}'`);
35
+ // Render the panel if any query has data, or the panel doesn't have a query attached (for example MarkdownPanel).
36
+ // Loading indicator or errors of other queries are shown in the panel header.
37
+ const queryResultsWithData = queryResults.flatMap((q)=>q.data ? [
38
+ {
39
+ data: q.data,
40
+ definition: q.definition
41
+ }
42
+ ] : []);
43
+ if (queryResultsWithData.length > 0 || queryResults.length === 0) {
44
+ return /*#__PURE__*/ _jsx(PanelPluginLoader, {
45
+ kind: panelPluginKind,
46
+ spec: spec,
47
+ contentDimensions: contentDimensions,
48
+ definition: definition,
49
+ queryResults: queryResultsWithData
50
+ });
51
+ }
52
+ // No query has data, show loading overlay if any query is fetching data.
53
+ if (queryResults.some((q)=>q.isFetching)) {
54
+ return /*#__PURE__*/ _jsx(PanelLoading, {
55
+ plugin: plugin,
56
+ spec: spec,
57
+ definition: definition,
58
+ contentDimensions: contentDimensions
59
+ });
60
+ }
61
+ // No query has data or is loading, show the error if any query has an error.
62
+ // The error will be catched in <ErrorBoundary> of <Panel>.
63
+ const queryError = queryResults.find((q)=>q.error);
64
+ if (queryError) {
65
+ throw queryError.error;
35
66
  }
36
- return /*#__PURE__*/ _jsx(PanelComponent, {
37
- ...others,
38
- contentDimensions: contentDimensions,
39
- definition: definition
67
+ // At this point, one or more queries are defined, but no query has data, is loading, or has an error.
68
+ // This can happen if all queries are disabled (e.g. dependent dashboard variables are loading, or they are not in the viewport of the browser).
69
+ // Most likely, some query will be enabled later. Render the panel loading skeleton.
70
+ return /*#__PURE__*/ _jsx(PanelLoading, {
71
+ plugin: plugin,
72
+ spec: spec,
73
+ definition: definition,
74
+ contentDimensions: contentDimensions
40
75
  });
41
76
  }
77
+ function PanelLoading({ plugin, spec, definition, contentDimensions }) {
78
+ if (plugin?.LoadingComponent) {
79
+ return /*#__PURE__*/ _jsx(plugin.LoadingComponent, {
80
+ spec: spec,
81
+ contentDimensions: contentDimensions,
82
+ definition: definition,
83
+ queryResults: []
84
+ });
85
+ }
86
+ return /*#__PURE__*/ _jsx(LoadingOverlay, {});
87
+ }
42
88
 
43
89
  //# sourceMappingURL=PanelContent.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Panel/PanelContent.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { usePlugin, PanelProps } from '@perses-dev/plugin-system';\nimport { Skeleton } from '@mui/material';\nimport { UnknownSpec, PanelDefinition } from '@perses-dev/core';\nimport { ReactElement } from 'react';\n\nexport interface PanelContentProps extends PanelProps<UnknownSpec> {\n panelPluginKind: string;\n definition?: PanelDefinition<UnknownSpec>;\n}\n\n/**\n * A small wrapper component that renders the appropriate PanelComponent from a Panel plugin based on the panel\n * definition's kind. Used so that an ErrorBoundary can be wrapped around this.\n */\nexport function PanelContent(props: PanelContentProps): ReactElement {\n const { panelPluginKind, contentDimensions, definition, ...others } = props;\n const { data: plugin, isLoading } = usePlugin('Panel', panelPluginKind, { useErrorBoundary: true });\n const PanelComponent = plugin?.PanelComponent;\n\n if (isLoading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width={contentDimensions?.width}\n height={contentDimensions?.height}\n aria-label=\"Loading...\"\n />\n );\n }\n\n if (PanelComponent === undefined) {\n throw new Error(`Missing PanelComponent from panel plugin for kind '${panelPluginKind}'`);\n }\n\n return <PanelComponent {...others} contentDimensions={contentDimensions} definition={definition} />;\n}\n"],"names":["usePlugin","Skeleton","PanelContent","props","panelPluginKind","contentDimensions","definition","others","data","plugin","isLoading","useErrorBoundary","PanelComponent","variant","width","height","aria-label","undefined","Error"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAASA,SAAS,QAAoB,4BAA4B;AAClE,SAASC,QAAQ,QAAQ,gBAAgB;AASzC;;;CAGC,GACD,OAAO,SAASC,aAAaC,KAAwB;IACnD,MAAM,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,UAAU,EAAE,GAAGC,QAAQ,GAAGJ;IACtE,MAAM,EAAEK,MAAMC,MAAM,EAAEC,SAAS,EAAE,GAAGV,UAAU,SAASI,iBAAiB;QAAEO,kBAAkB;IAAK;IACjG,MAAMC,iBAAiBH,mBAAAA,6BAAAA,OAAQG,cAAc;IAE7C,IAAIF,WAAW;QACb,qBACE,KAACT;YACCY,SAAQ;YACRC,KAAK,EAAET,8BAAAA,wCAAAA,kBAAmBS,KAAK;YAC/BC,MAAM,EAAEV,8BAAAA,wCAAAA,kBAAmBU,MAAM;YACjCC,cAAW;;IAGjB;IAEA,IAAIJ,mBAAmBK,WAAW;QAChC,MAAM,IAAIC,MAAM,CAAC,mDAAmD,EAAEd,gBAAgB,CAAC,CAAC;IAC1F;IAEA,qBAAO,KAACQ;QAAgB,GAAGL,MAAM;QAAEF,mBAAmBA;QAAmBC,YAAYA;;AACvF"}
1
+ {"version":3,"sources":["../../../src/components/Panel/PanelContent.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { usePlugin, PanelProps, QueryData, PanelPlugin } from '@perses-dev/plugin-system';\nimport { UnknownSpec, PanelDefinition, QueryDataType } from '@perses-dev/core';\nimport { ReactElement } from 'react';\nimport { LoadingOverlay } from '@perses-dev/components';\nimport { Skeleton } from '@mui/material';\nimport { PanelPluginLoader } from './PanelPluginLoader';\n\nexport interface PanelContentProps extends Omit<PanelProps<UnknownSpec>, 'queryResults'> {\n panelPluginKind: string;\n definition?: PanelDefinition<UnknownSpec>;\n queryResults: QueryData[];\n}\n\n/**\n * Based on the status of the queries (loading, error or data available), this component renders a\n * loading overlay, throws an error, or renders the panel content.\n */\nexport function PanelContent(props: PanelContentProps): ReactElement {\n const { panelPluginKind, definition, queryResults, spec, contentDimensions } = props;\n const { data: plugin, isLoading: isPanelLoading } = usePlugin('Panel', panelPluginKind, { throwOnError: true });\n\n // Show fullsize skeleton if the panel plugin is loading.\n if (isPanelLoading) {\n return (\n <Skeleton\n variant=\"rectangular\"\n width={contentDimensions?.width}\n height={contentDimensions?.height}\n aria-label=\"Loading...\"\n />\n );\n }\n\n // Render the panel if any query has data, or the panel doesn't have a query attached (for example MarkdownPanel).\n // Loading indicator or errors of other queries are shown in the panel header.\n const queryResultsWithData = queryResults.flatMap((q) =>\n q.data ? [{ data: q.data, definition: q.definition }] : []\n );\n if (queryResultsWithData.length > 0 || queryResults.length === 0) {\n return (\n <PanelPluginLoader\n kind={panelPluginKind}\n spec={spec}\n contentDimensions={contentDimensions}\n definition={definition}\n queryResults={queryResultsWithData}\n />\n );\n }\n\n // No query has data, show loading overlay if any query is fetching data.\n if (queryResults.some((q) => q.isFetching)) {\n return <PanelLoading plugin={plugin} spec={spec} definition={definition} contentDimensions={contentDimensions} />;\n }\n\n // No query has data or is loading, show the error if any query has an error.\n // The error will be catched in <ErrorBoundary> of <Panel>.\n const queryError = queryResults.find((q) => q.error);\n if (queryError) {\n throw queryError.error;\n }\n\n // At this point, one or more queries are defined, but no query has data, is loading, or has an error.\n // This can happen if all queries are disabled (e.g. dependent dashboard variables are loading, or they are not in the viewport of the browser).\n // Most likely, some query will be enabled later. Render the panel loading skeleton.\n return <PanelLoading plugin={plugin} spec={spec} definition={definition} contentDimensions={contentDimensions} />;\n}\n\ninterface PanelLoadingProps extends Pick<PanelContentProps, 'spec' | 'definition' | 'contentDimensions'> {\n plugin?: PanelPlugin<UnknownSpec, PanelProps<UnknownSpec, QueryDataType>>;\n}\n\nfunction PanelLoading({ plugin, spec, definition, contentDimensions }: PanelLoadingProps): ReactElement {\n if (plugin?.LoadingComponent) {\n return (\n <plugin.LoadingComponent\n spec={spec}\n contentDimensions={contentDimensions}\n definition={definition}\n queryResults={[]}\n />\n );\n }\n return <LoadingOverlay />;\n}\n"],"names":["usePlugin","LoadingOverlay","Skeleton","PanelPluginLoader","PanelContent","props","panelPluginKind","definition","queryResults","spec","contentDimensions","data","plugin","isLoading","isPanelLoading","throwOnError","variant","width","height","aria-label","queryResultsWithData","flatMap","q","length","kind","some","isFetching","PanelLoading","queryError","find","error","LoadingComponent"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAASA,SAAS,QAA4C,4BAA4B;AAG1F,SAASC,cAAc,QAAQ,yBAAyB;AACxD,SAASC,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,iBAAiB,QAAQ,sBAAsB;AAQxD;;;CAGC,GACD,OAAO,SAASC,aAAaC,KAAwB;IACnD,MAAM,EAAEC,eAAe,EAAEC,UAAU,EAAEC,YAAY,EAAEC,IAAI,EAAEC,iBAAiB,EAAE,GAAGL;IAC/E,MAAM,EAAEM,MAAMC,MAAM,EAAEC,WAAWC,cAAc,EAAE,GAAGd,UAAU,SAASM,iBAAiB;QAAES,cAAc;IAAK;IAE7G,yDAAyD;IACzD,IAAID,gBAAgB;QAClB,qBACE,KAACZ;YACCc,SAAQ;YACRC,OAAOP,mBAAmBO;YAC1BC,QAAQR,mBAAmBQ;YAC3BC,cAAW;;IAGjB;IAEA,kHAAkH;IAClH,8EAA8E;IAC9E,MAAMC,uBAAuBZ,aAAaa,OAAO,CAAC,CAACC,IACjDA,EAAEX,IAAI,GAAG;YAAC;gBAAEA,MAAMW,EAAEX,IAAI;gBAAEJ,YAAYe,EAAEf,UAAU;YAAC;SAAE,GAAG,EAAE;IAE5D,IAAIa,qBAAqBG,MAAM,GAAG,KAAKf,aAAae,MAAM,KAAK,GAAG;QAChE,qBACE,KAACpB;YACCqB,MAAMlB;YACNG,MAAMA;YACNC,mBAAmBA;YACnBH,YAAYA;YACZC,cAAcY;;IAGpB;IAEA,yEAAyE;IACzE,IAAIZ,aAAaiB,IAAI,CAAC,CAACH,IAAMA,EAAEI,UAAU,GAAG;QAC1C,qBAAO,KAACC;YAAaf,QAAQA;YAAQH,MAAMA;YAAMF,YAAYA;YAAYG,mBAAmBA;;IAC9F;IAEA,6EAA6E;IAC7E,2DAA2D;IAC3D,MAAMkB,aAAapB,aAAaqB,IAAI,CAAC,CAACP,IAAMA,EAAEQ,KAAK;IACnD,IAAIF,YAAY;QACd,MAAMA,WAAWE,KAAK;IACxB;IAEA,sGAAsG;IACtG,gJAAgJ;IAChJ,oFAAoF;IACpF,qBAAO,KAACH;QAAaf,QAAQA;QAAQH,MAAMA;QAAMF,YAAYA;QAAYG,mBAAmBA;;AAC9F;AAMA,SAASiB,aAAa,EAAEf,MAAM,EAAEH,IAAI,EAAEF,UAAU,EAAEG,iBAAiB,EAAqB;IACtF,IAAIE,QAAQmB,kBAAkB;QAC5B,qBACE,KAACnB,OAAOmB,gBAAgB;YACtBtB,MAAMA;YACNC,mBAAmBA;YACnBH,YAAYA;YACZC,cAAc,EAAE;;IAGtB;IACA,qBAAO,KAACP;AACV"}
@@ -1,6 +1,8 @@
1
1
  import { CardHeaderProps } from '@mui/material';
2
- import { ReactElement, ReactNode } from 'react';
3
2
  import { Link } from '@perses-dev/core';
3
+ import { QueryData } from '@perses-dev/plugin-system';
4
+ import { ReactElement, ReactNode } from 'react';
5
+ import { PanelActionsProps } from './PanelActions';
4
6
  type OmittedProps = 'children' | 'action' | 'title' | 'disableTypography';
5
7
  export interface PanelHeaderProps extends Omit<CardHeaderProps, OmittedProps> {
6
8
  id: string;
@@ -8,16 +10,10 @@ export interface PanelHeaderProps extends Omit<CardHeaderProps, OmittedProps> {
8
10
  description?: string;
9
11
  links?: Link[];
10
12
  extra?: ReactNode;
11
- readHandlers?: {
12
- isPanelViewed?: boolean;
13
- onViewPanelClick: () => void;
14
- };
15
- editHandlers?: {
16
- onEditPanelClick: () => void;
17
- onDuplicatePanelClick: () => void;
18
- onDeletePanelClick: () => void;
19
- };
13
+ queryResults: QueryData[];
14
+ readHandlers?: PanelActionsProps['readHandlers'];
15
+ editHandlers?: PanelActionsProps['editHandlers'];
20
16
  }
21
- export declare function PanelHeader({ id, title: rawTitle, description: rawDescription, links, readHandlers, editHandlers, sx, extra, ...rest }: PanelHeaderProps): ReactElement;
17
+ export declare function PanelHeader({ id, title: rawTitle, description: rawDescription, links, queryResults, readHandlers, editHandlers, sx, extra, ...rest }: PanelHeaderProps): ReactElement;
22
18
  export {};
23
19
  //# sourceMappingURL=PanelHeader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Panel/PanelHeader.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAiC,eAAe,EAAsB,MAAM,eAAe,CAAC;AAUnG,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,KAAK,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAE1E,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE;QACb,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,gBAAgB,EAAE,MAAM,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE;QACb,gBAAgB,EAAE,MAAM,IAAI,CAAC;QAC7B,qBAAqB,EAAE,MAAM,IAAI,CAAC;QAClC,kBAAkB,EAAE,MAAM,IAAI,CAAC;KAChC,CAAC;CACH;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,cAAc,EAC3B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,EAAE,EACF,KAAK,EACL,GAAG,IAAI,EACR,EAAE,gBAAgB,GAAG,YAAY,CA0IjC"}
1
+ {"version":3,"file":"PanelHeader.d.ts","sourceRoot":"","sources":["../../../src/components/Panel/PanelHeader.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAc,eAAe,EAAqB,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,SAAS,EAA+B,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,KAAK,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAE1E,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;CAClD;AAED,wBAAgB,WAAW,CAAC,EAC1B,EAAE,EACF,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,cAAc,EAC3B,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,EAAE,EACF,KAAK,EACL,GAAG,IAAI,EACR,EAAE,gBAAgB,GAAG,YAAY,CA0DjC"}