@perses-dev/dashboards 0.54.0-beta.1 → 0.54.0-beta.10

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 (212) hide show
  1. package/dist/cjs/components/Annotations/AnnotationsEditor.js +302 -0
  2. package/dist/cjs/components/Annotations/EditAnnotationsButton.js +83 -0
  3. package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +4 -2
  4. package/dist/cjs/components/GridLayout/GridItemContent.js +2 -9
  5. package/dist/cjs/components/Panel/Panel.js +4 -1
  6. package/dist/cjs/components/PanelDrawer/PanelQueriesSharedControls.js +3 -16
  7. package/dist/cjs/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +20 -3
  8. package/dist/cjs/components/Variables/VariableEditor.js +52 -18
  9. package/dist/cjs/constants/user-interface-text.js +1 -0
  10. package/dist/cjs/context/AnnotationProvider/AnnotationHydrationWrapper.js +50 -0
  11. package/dist/cjs/context/AnnotationProvider/AnnotationProvider.js +145 -0
  12. package/dist/{model/DashboardResource.js → cjs/context/AnnotationProvider/index.js} +18 -6
  13. package/dist/cjs/context/DashboardProvider/DashboardProvider.js +9 -2
  14. package/dist/cjs/context/DashboardProvider/panel-group-slice.js +14 -11
  15. package/dist/cjs/context/DashboardProvider/use-save-dashboard.js +12 -4
  16. package/dist/cjs/context/DatasourceStoreProvider.js +38 -5
  17. package/dist/cjs/context/VariableProvider/VariableProvider.js +11 -6
  18. package/dist/cjs/context/index.js +1 -0
  19. package/dist/cjs/context/useDashboard.js +11 -1
  20. package/dist/cjs/model/index.js +1 -1
  21. package/dist/cjs/views/ViewDashboard/DashboardApp.js +9 -1
  22. package/dist/cjs/views/ViewDashboard/ViewDashboard.js +30 -25
  23. package/dist/components/AddGroupButton/AddGroupButton.js +1 -1
  24. package/dist/components/AddGroupButton/AddGroupButton.js.map +1 -1
  25. package/dist/components/AddPanelButton/AddPanelButton.js +1 -1
  26. package/dist/components/AddPanelButton/AddPanelButton.js.map +1 -1
  27. package/dist/components/Annotations/AnnotationsEditor.d.ts +8 -0
  28. package/dist/components/Annotations/AnnotationsEditor.d.ts.map +1 -0
  29. package/dist/components/Annotations/AnnotationsEditor.js +289 -0
  30. package/dist/components/Annotations/AnnotationsEditor.js.map +1 -0
  31. package/dist/components/Annotations/EditAnnotationsButton.d.ts +18 -0
  32. package/dist/components/Annotations/EditAnnotationsButton.d.ts.map +1 -0
  33. package/dist/components/Annotations/EditAnnotationsButton.js +70 -0
  34. package/dist/components/Annotations/EditAnnotationsButton.js.map +1 -0
  35. package/dist/components/Dashboard/Dashboard.js +1 -1
  36. package/dist/components/Dashboard/Dashboard.js.map +1 -1
  37. package/dist/components/DashboardLinks/DashboardLinksEditor.js +1 -1
  38. package/dist/components/DashboardLinks/DashboardLinksEditor.js.map +1 -1
  39. package/dist/components/DashboardLinks/EditDashboardLinksButton.js +1 -1
  40. package/dist/components/DashboardLinks/EditDashboardLinksButton.js.map +1 -1
  41. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.js +1 -1
  42. package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.js.map +1 -1
  43. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts +2 -0
  44. package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
  45. package/dist/components/DashboardToolbar/DashboardToolbar.js +5 -3
  46. package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
  47. package/dist/components/Datasources/DatasourceEditor.d.ts.map +1 -1
  48. package/dist/components/Datasources/DatasourceEditor.js +1 -1
  49. package/dist/components/Datasources/DatasourceEditor.js.map +1 -1
  50. package/dist/components/Datasources/EditDatasourcesButton.js +1 -1
  51. package/dist/components/Datasources/EditDatasourcesButton.js.map +1 -1
  52. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js +1 -1
  53. package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js.map +1 -1
  54. package/dist/components/DownloadButton/DownloadButton.js +1 -1
  55. package/dist/components/DownloadButton/DownloadButton.js.map +1 -1
  56. package/dist/components/DownloadButton/serializeDashboard.d.ts +1 -1
  57. package/dist/components/DownloadButton/serializeDashboard.d.ts.map +1 -1
  58. package/dist/components/DownloadButton/serializeDashboard.js.map +1 -1
  59. package/dist/components/EditButton/EditButton.js +1 -1
  60. package/dist/components/EditButton/EditButton.js.map +1 -1
  61. package/dist/components/EditJsonButton/EditJsonButton.js +1 -1
  62. package/dist/components/EditJsonButton/EditJsonButton.js.map +1 -1
  63. package/dist/components/EditJsonDialog/EditJsonDialog.js +1 -1
  64. package/dist/components/EditJsonDialog/EditJsonDialog.js.map +1 -1
  65. package/dist/components/EmptyDashboard/EmptyDashboard.js +1 -1
  66. package/dist/components/EmptyDashboard/EmptyDashboard.js.map +1 -1
  67. package/dist/components/GridLayout/GridContainer.js +1 -1
  68. package/dist/components/GridLayout/GridContainer.js.map +1 -1
  69. package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
  70. package/dist/components/GridLayout/GridItemContent.js +3 -10
  71. package/dist/components/GridLayout/GridItemContent.js.map +1 -1
  72. package/dist/components/GridLayout/GridLayout.js +1 -1
  73. package/dist/components/GridLayout/GridLayout.js.map +1 -1
  74. package/dist/components/GridLayout/GridTitle.js +1 -1
  75. package/dist/components/GridLayout/GridTitle.js.map +1 -1
  76. package/dist/components/GridLayout/Row.js +1 -1
  77. package/dist/components/GridLayout/Row.js.map +1 -1
  78. package/dist/components/LeaveDialog/LeaveDialog.d.ts +1 -1
  79. package/dist/components/LeaveDialog/LeaveDialog.d.ts.map +1 -1
  80. package/dist/components/LeaveDialog/LeaveDialog.js +1 -1
  81. package/dist/components/LeaveDialog/LeaveDialog.js.map +1 -1
  82. package/dist/components/LinksDisplay/LinksDisplay.js +1 -1
  83. package/dist/components/LinksDisplay/LinksDisplay.js.map +1 -1
  84. package/dist/components/Panel/Panel.js +5 -2
  85. package/dist/components/Panel/Panel.js.map +1 -1
  86. package/dist/components/Panel/PanelActions.js +1 -1
  87. package/dist/components/Panel/PanelActions.js.map +1 -1
  88. package/dist/components/Panel/PanelContent.js +1 -1
  89. package/dist/components/Panel/PanelContent.js.map +1 -1
  90. package/dist/components/Panel/PanelHeader.js +1 -1
  91. package/dist/components/Panel/PanelHeader.js.map +1 -1
  92. package/dist/components/Panel/PanelPluginLoader.js +1 -1
  93. package/dist/components/Panel/PanelPluginLoader.js.map +1 -1
  94. package/dist/components/Panel/useSelectionItemActions.js +1 -1
  95. package/dist/components/Panel/useSelectionItemActions.js.map +1 -1
  96. package/dist/components/PanelDrawer/PanelDrawer.js +1 -1
  97. package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
  98. package/dist/components/PanelDrawer/PanelEditorForm.d.ts +1 -1
  99. package/dist/components/PanelDrawer/PanelEditorForm.d.ts.map +1 -1
  100. package/dist/components/PanelDrawer/PanelEditorForm.js +1 -1
  101. package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
  102. package/dist/components/PanelDrawer/PanelPreview.js +1 -1
  103. package/dist/components/PanelDrawer/PanelPreview.js.map +1 -1
  104. package/dist/components/PanelDrawer/PanelQueriesSharedControls.d.ts.map +1 -1
  105. package/dist/components/PanelDrawer/PanelQueriesSharedControls.js +5 -18
  106. package/dist/components/PanelDrawer/PanelQueriesSharedControls.js.map +1 -1
  107. package/dist/components/PanelGroupDialog/PanelGroupDialog.js +1 -1
  108. package/dist/components/PanelGroupDialog/PanelGroupDialog.js.map +1 -1
  109. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js +1 -1
  110. package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js.map +1 -1
  111. package/dist/components/QuerySummaryTable/QuerySummaryTable.js +1 -1
  112. package/dist/components/QuerySummaryTable/QuerySummaryTable.js.map +1 -1
  113. package/dist/components/QueryViewerDialog/QueryViewerDialog.js +1 -1
  114. package/dist/components/QueryViewerDialog/QueryViewerDialog.js.map +1 -1
  115. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.d.ts.map +1 -1
  116. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +22 -5
  117. package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js.map +1 -1
  118. package/dist/components/Variables/EditVariablesButton.js +1 -1
  119. package/dist/components/Variables/EditVariablesButton.js.map +1 -1
  120. package/dist/components/Variables/ListVariableListBox.js +1 -1
  121. package/dist/components/Variables/ListVariableListBox.js.map +1 -1
  122. package/dist/components/Variables/Variable.js +2 -2
  123. package/dist/components/Variables/Variable.js.map +1 -1
  124. package/dist/components/Variables/VariableEditor.d.ts.map +1 -1
  125. package/dist/components/Variables/VariableEditor.js +57 -23
  126. package/dist/components/Variables/VariableEditor.js.map +1 -1
  127. package/dist/components/Variables/VariableList.js +1 -1
  128. package/dist/components/Variables/VariableList.js.map +1 -1
  129. package/dist/constants/user-interface-text.d.ts +1 -0
  130. package/dist/constants/user-interface-text.d.ts.map +1 -1
  131. package/dist/constants/user-interface-text.js +1 -0
  132. package/dist/constants/user-interface-text.js.map +1 -1
  133. package/dist/context/AnnotationProvider/AnnotationHydrationWrapper.d.ts +7 -0
  134. package/dist/context/AnnotationProvider/AnnotationHydrationWrapper.d.ts.map +1 -0
  135. package/dist/context/AnnotationProvider/AnnotationHydrationWrapper.js +48 -0
  136. package/dist/context/AnnotationProvider/AnnotationHydrationWrapper.js.map +1 -0
  137. package/dist/context/AnnotationProvider/AnnotationProvider.d.ts +40 -0
  138. package/dist/context/AnnotationProvider/AnnotationProvider.d.ts.map +1 -0
  139. package/dist/context/AnnotationProvider/AnnotationProvider.js +114 -0
  140. package/dist/context/AnnotationProvider/AnnotationProvider.js.map +1 -0
  141. package/dist/context/AnnotationProvider/index.d.ts +2 -0
  142. package/dist/context/AnnotationProvider/index.d.ts.map +1 -0
  143. package/dist/{cjs/model/DashboardResource.js → context/AnnotationProvider/index.js} +3 -4
  144. package/dist/context/AnnotationProvider/index.js.map +1 -0
  145. package/dist/context/DashboardProvider/DashboardProvider.d.ts +4 -2
  146. package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
  147. package/dist/context/DashboardProvider/DashboardProvider.js +10 -3
  148. package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
  149. package/dist/context/DashboardProvider/common.d.ts +1 -1
  150. package/dist/context/DashboardProvider/common.d.ts.map +1 -1
  151. package/dist/context/DashboardProvider/common.js.map +1 -1
  152. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +2 -1
  153. package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
  154. package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
  155. package/dist/context/DashboardProvider/panel-editor-slice.d.ts +1 -1
  156. package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -1
  157. package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
  158. package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
  159. package/dist/context/DashboardProvider/panel-group-slice.js +14 -11
  160. package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
  161. package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts +8 -1
  162. package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts.map +1 -1
  163. package/dist/context/DashboardProvider/save-changes-dialog-slice.js.map +1 -1
  164. package/dist/context/DashboardProvider/use-save-dashboard.d.ts.map +1 -1
  165. package/dist/context/DashboardProvider/use-save-dashboard.js +13 -5
  166. package/dist/context/DashboardProvider/use-save-dashboard.js.map +1 -1
  167. package/dist/context/DatasourceStoreProvider.d.ts +1 -2
  168. package/dist/context/DatasourceStoreProvider.d.ts.map +1 -1
  169. package/dist/context/DatasourceStoreProvider.js +40 -7
  170. package/dist/context/DatasourceStoreProvider.js.map +1 -1
  171. package/dist/context/PanelEditorProvider/PanelEditorProvider.js +1 -1
  172. package/dist/context/PanelEditorProvider/PanelEditorProvider.js.map +1 -1
  173. package/dist/context/VariableProvider/VariableProvider.d.ts +2 -1
  174. package/dist/context/VariableProvider/VariableProvider.d.ts.map +1 -1
  175. package/dist/context/VariableProvider/VariableProvider.js +13 -8
  176. package/dist/context/VariableProvider/VariableProvider.js.map +1 -1
  177. package/dist/context/index.d.ts +1 -0
  178. package/dist/context/index.d.ts.map +1 -1
  179. package/dist/context/index.js +1 -0
  180. package/dist/context/index.js.map +1 -1
  181. package/dist/context/useDashboard.d.ts +1 -1
  182. package/dist/context/useDashboard.d.ts.map +1 -1
  183. package/dist/context/useDashboard.js +11 -1
  184. package/dist/context/useDashboard.js.map +1 -1
  185. package/dist/keyboard-shortcuts/PanelFocusProvider.js +1 -1
  186. package/dist/keyboard-shortcuts/PanelFocusProvider.js.map +1 -1
  187. package/dist/model/index.d.ts +1 -1
  188. package/dist/model/index.d.ts.map +1 -1
  189. package/dist/model/index.js +1 -1
  190. package/dist/model/index.js.map +1 -1
  191. package/dist/test/dashboard-provider.d.ts +1 -1
  192. package/dist/test/dashboard-provider.d.ts.map +1 -1
  193. package/dist/test/dashboard-provider.js.map +1 -1
  194. package/dist/test/datasource-provider.d.ts +1 -1
  195. package/dist/test/datasource-provider.d.ts.map +1 -1
  196. package/dist/test/datasource-provider.js.map +1 -1
  197. package/dist/test/render.js +1 -1
  198. package/dist/test/render.js.map +1 -1
  199. package/dist/test/testDashboard.d.ts +1 -1
  200. package/dist/test/testDashboard.d.ts.map +1 -1
  201. package/dist/test/testDashboard.js.map +1 -1
  202. package/dist/views/ViewDashboard/DashboardApp.d.ts +3 -1
  203. package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
  204. package/dist/views/ViewDashboard/DashboardApp.js +11 -3
  205. package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
  206. package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
  207. package/dist/views/ViewDashboard/ViewDashboard.js +32 -27
  208. package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
  209. package/package.json +9 -10
  210. package/dist/model/DashboardResource.d.ts +0 -15
  211. package/dist/model/DashboardResource.d.ts.map +0 -1
  212. package/dist/model/DashboardResource.js.map +0 -1
@@ -13,14 +13,16 @@
13
13
  import { createPanelRef } from '@perses-dev/spec';
14
14
  import { useDashboardStore } from './DashboardProvider';
15
15
  import { useVariableDefinitionActions, useVariableDefinitions } from './VariableProvider';
16
+ import { useAnnotationActions, useAnnotationSpecs } from './AnnotationProvider';
16
17
  export function useDashboard() {
17
- const { panels, panelGroups, panelGroupOrder, setDashboard: setDashboardResource, kind, metadata, display, duration, refreshInterval, datasources, links, ttl } = useDashboardStore(({ panels, panelGroups, panelGroupOrder, setDashboard, kind, metadata, display, duration, refreshInterval, datasources, links, ttl })=>({
18
+ const { panels, panelGroups, panelGroupOrder, setDashboard: setDashboardResource, kind, metadata, display, timezone, duration, refreshInterval, datasources, links, ttl } = useDashboardStore(({ panels, panelGroups, panelGroupOrder, setDashboard, kind, metadata, timezone, display, duration, refreshInterval, datasources, links, ttl })=>({
18
19
  panels,
19
20
  panelGroups,
20
21
  panelGroupOrder,
21
22
  setDashboard,
22
23
  kind,
23
24
  metadata,
25
+ timezone,
24
26
  display,
25
27
  duration,
26
28
  refreshInterval,
@@ -29,7 +31,9 @@ export function useDashboard() {
29
31
  ttl
30
32
  }));
31
33
  const { setVariableDefinitions } = useVariableDefinitionActions();
34
+ const { setAnnotationSpecs } = useAnnotationActions();
32
35
  const variables = useVariableDefinitions();
36
+ const annotations = useAnnotationSpecs();
33
37
  const layouts = convertPanelGroupsToLayouts(panelGroups, panelGroupOrder);
34
38
  const dashboard = kind === 'Dashboard' ? {
35
39
  kind,
@@ -39,7 +43,9 @@ export function useDashboard() {
39
43
  panels,
40
44
  layouts,
41
45
  variables,
46
+ annotations,
42
47
  duration,
48
+ timezone,
43
49
  refreshInterval,
44
50
  datasources,
45
51
  links
@@ -52,6 +58,7 @@ export function useDashboard() {
52
58
  panels,
53
59
  layouts,
54
60
  variables,
61
+ annotations,
55
62
  duration,
56
63
  refreshInterval,
57
64
  datasources,
@@ -61,6 +68,9 @@ export function useDashboard() {
61
68
  };
62
69
  const setDashboard = (dashboardResource)=>{
63
70
  setVariableDefinitions(dashboardResource.spec.variables);
71
+ if (dashboardResource.spec.annotations) {
72
+ setAnnotationSpecs(dashboardResource.spec.annotations);
73
+ }
64
74
  setDashboardResource(dashboardResource);
65
75
  };
66
76
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context/useDashboard.tsx"],"sourcesContent":["// Copyright 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 { createPanelRef, DashboardSpec, DurationString, GridDefinition, PanelGroupId } from '@perses-dev/spec';\nimport { DashboardResource, PanelGroupDefinition } from '../model';\n\nimport { useDashboardStore } from './DashboardProvider';\nimport { useVariableDefinitionActions, useVariableDefinitions } from './VariableProvider';\n\ntype DashboardType = Omit<DashboardResource, 'spec'> & { spec: DashboardSpec & { ttl?: DurationString } };\nexport function useDashboard(): {\n dashboard: DashboardType;\n setDashboard: (dashboardResource: DashboardResource) => void;\n} {\n const {\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard: setDashboardResource,\n kind,\n metadata,\n display,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n } = useDashboardStore(\n ({\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard,\n kind,\n metadata,\n display,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n }) => ({\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard,\n kind,\n metadata,\n display,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n })\n );\n const { setVariableDefinitions } = useVariableDefinitionActions();\n const variables = useVariableDefinitions();\n const layouts = convertPanelGroupsToLayouts(panelGroups, panelGroupOrder);\n\n const dashboard: DashboardType =\n kind === 'Dashboard'\n ? {\n kind,\n metadata,\n spec: {\n display,\n panels,\n layouts,\n variables,\n duration,\n refreshInterval,\n datasources,\n links,\n },\n }\n : {\n kind,\n metadata,\n spec: {\n display,\n panels,\n layouts,\n variables,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n },\n };\n\n const setDashboard = (dashboardResource: DashboardResource): void => {\n setVariableDefinitions(dashboardResource.spec.variables);\n setDashboardResource(dashboardResource);\n };\n\n return {\n dashboard,\n setDashboard,\n };\n}\n\nfunction convertPanelGroupsToLayouts(\n panelGroups: Record<number, PanelGroupDefinition>,\n panelGroupOrder: PanelGroupId[]\n): GridDefinition[] {\n const layouts: GridDefinition[] = [];\n panelGroupOrder.map((groupOrderId) => {\n const group = panelGroups[groupOrderId];\n if (group === undefined) {\n throw new Error('panel group not found');\n }\n const { title, isCollapsed, repeatVariable, itemLayouts, itemPanelKeys } = group;\n let display = undefined;\n if (title || isCollapsed !== undefined) {\n display = {\n title: title ?? '',\n collapse: {\n open: !isCollapsed,\n },\n };\n }\n const layout: GridDefinition = {\n kind: 'Grid',\n spec: {\n display,\n items: itemLayouts.map((layout) => {\n const panelKey = itemPanelKeys[layout.i];\n if (panelKey === undefined) {\n throw new Error(`Missing panel key of layout ${layout.i}`);\n }\n return {\n x: layout.x,\n y: layout.y,\n width: layout.w,\n height: layout.h,\n content: createPanelRef(panelKey),\n };\n }),\n repeatVariable: repeatVariable,\n },\n };\n layouts.push(layout);\n });\n\n return layouts;\n}\n"],"names":["createPanelRef","useDashboardStore","useVariableDefinitionActions","useVariableDefinitions","useDashboard","panels","panelGroups","panelGroupOrder","setDashboard","setDashboardResource","kind","metadata","display","duration","refreshInterval","datasources","links","ttl","setVariableDefinitions","variables","layouts","convertPanelGroupsToLayouts","dashboard","spec","dashboardResource","map","groupOrderId","group","undefined","Error","title","isCollapsed","repeatVariable","itemLayouts","itemPanelKeys","collapse","open","layout","items","panelKey","i","x","y","width","w","height","h","content","push"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,cAAc,QAAqE,mBAAmB;AAG/G,SAASC,iBAAiB,QAAQ,sBAAsB;AACxD,SAASC,4BAA4B,EAAEC,sBAAsB,QAAQ,qBAAqB;AAG1F,OAAO,SAASC;IAId,MAAM,EACJC,MAAM,EACNC,WAAW,EACXC,eAAe,EACfC,cAAcC,oBAAoB,EAClCC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,eAAe,EACfC,WAAW,EACXC,KAAK,EACLC,GAAG,EACJ,GAAGhB,kBACF,CAAC,EACCI,MAAM,EACNC,WAAW,EACXC,eAAe,EACfC,YAAY,EACZE,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,eAAe,EACfC,WAAW,EACXC,KAAK,EACLC,GAAG,EACJ,GAAM,CAAA;YACLZ;YACAC;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;QACF,CAAA;IAEF,MAAM,EAAEC,sBAAsB,EAAE,GAAGhB;IACnC,MAAMiB,YAAYhB;IAClB,MAAMiB,UAAUC,4BAA4Bf,aAAaC;IAEzD,MAAMe,YACJZ,SAAS,cACL;QACEA;QACAC;QACAY,MAAM;YACJX;YACAP;YACAe;YACAD;YACAN;YACAC;YACAC;YACAC;QACF;IACF,IACA;QACEN;QACAC;QACAY,MAAM;YACJX;YACAP;YACAe;YACAD;YACAN;YACAC;YACAC;YACAC;YACAC;QACF;IACF;IAEN,MAAMT,eAAe,CAACgB;QACpBN,uBAAuBM,kBAAkBD,IAAI,CAACJ,SAAS;QACvDV,qBAAqBe;IACvB;IAEA,OAAO;QACLF;QACAd;IACF;AACF;AAEA,SAASa,4BACPf,WAAiD,EACjDC,eAA+B;IAE/B,MAAMa,UAA4B,EAAE;IACpCb,gBAAgBkB,GAAG,CAAC,CAACC;QACnB,MAAMC,QAAQrB,WAAW,CAACoB,aAAa;QACvC,IAAIC,UAAUC,WAAW;YACvB,MAAM,IAAIC,MAAM;QAClB;QACA,MAAM,EAAEC,KAAK,EAAEC,WAAW,EAAEC,cAAc,EAAEC,WAAW,EAAEC,aAAa,EAAE,GAAGP;QAC3E,IAAIf,UAAUgB;QACd,IAAIE,SAASC,gBAAgBH,WAAW;YACtChB,UAAU;gBACRkB,OAAOA,SAAS;gBAChBK,UAAU;oBACRC,MAAM,CAACL;gBACT;YACF;QACF;QACA,MAAMM,SAAyB;YAC7B3B,MAAM;YACNa,MAAM;gBACJX;gBACA0B,OAAOL,YAAYR,GAAG,CAAC,CAACY;oBACtB,MAAME,WAAWL,aAAa,CAACG,OAAOG,CAAC,CAAC;oBACxC,IAAID,aAAaX,WAAW;wBAC1B,MAAM,IAAIC,MAAM,CAAC,4BAA4B,EAAEQ,OAAOG,CAAC,EAAE;oBAC3D;oBACA,OAAO;wBACLC,GAAGJ,OAAOI,CAAC;wBACXC,GAAGL,OAAOK,CAAC;wBACXC,OAAON,OAAOO,CAAC;wBACfC,QAAQR,OAAOS,CAAC;wBAChBC,SAAS/C,eAAeuC;oBAC1B;gBACF;gBACAP,gBAAgBA;YAClB;QACF;QACAZ,QAAQ4B,IAAI,CAACX;IACf;IAEA,OAAOjB;AACT"}
1
+ {"version":3,"sources":["../../src/context/useDashboard.tsx"],"sourcesContent":["// Copyright 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 { createPanelRef, DashboardSpec, DurationString, GridDefinition, PanelGroupId } from '@perses-dev/spec';\nimport { DashboardResource } from '@perses-dev/client';\nimport { PanelGroupDefinition } from '../model';\n\nimport { useDashboardStore } from './DashboardProvider';\nimport { useVariableDefinitionActions, useVariableDefinitions } from './VariableProvider';\nimport { useAnnotationActions, useAnnotationSpecs } from './AnnotationProvider';\n\ntype DashboardType = Omit<DashboardResource, 'spec'> & { spec: DashboardSpec & { ttl?: DurationString } };\nexport function useDashboard(): {\n dashboard: DashboardType;\n setDashboard: (dashboardResource: DashboardResource) => void;\n} {\n const {\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard: setDashboardResource,\n kind,\n metadata,\n display,\n timezone,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n } = useDashboardStore(\n ({\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard,\n kind,\n metadata,\n timezone,\n display,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n }) => ({\n panels,\n panelGroups,\n panelGroupOrder,\n setDashboard,\n kind,\n metadata,\n timezone,\n display,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n })\n );\n const { setVariableDefinitions } = useVariableDefinitionActions();\n const { setAnnotationSpecs } = useAnnotationActions();\n const variables = useVariableDefinitions();\n const annotations = useAnnotationSpecs();\n const layouts = convertPanelGroupsToLayouts(panelGroups, panelGroupOrder);\n\n const dashboard: DashboardType =\n kind === 'Dashboard'\n ? {\n kind,\n metadata,\n spec: {\n display,\n panels,\n layouts,\n variables,\n annotations,\n duration,\n timezone,\n refreshInterval,\n datasources,\n links,\n },\n }\n : {\n kind,\n metadata,\n spec: {\n display,\n panels,\n layouts,\n variables,\n annotations,\n duration,\n refreshInterval,\n datasources,\n links,\n ttl,\n },\n };\n\n const setDashboard = (dashboardResource: DashboardResource): void => {\n setVariableDefinitions(dashboardResource.spec.variables);\n if (dashboardResource.spec.annotations) {\n setAnnotationSpecs(dashboardResource.spec.annotations);\n }\n setDashboardResource(dashboardResource);\n };\n\n return {\n dashboard,\n setDashboard,\n };\n}\n\nfunction convertPanelGroupsToLayouts(\n panelGroups: Record<number, PanelGroupDefinition>,\n panelGroupOrder: PanelGroupId[]\n): GridDefinition[] {\n const layouts: GridDefinition[] = [];\n panelGroupOrder.map((groupOrderId) => {\n const group = panelGroups[groupOrderId];\n if (group === undefined) {\n throw new Error('panel group not found');\n }\n const { title, isCollapsed, repeatVariable, itemLayouts, itemPanelKeys } = group;\n let display = undefined;\n if (title || isCollapsed !== undefined) {\n display = {\n title: title ?? '',\n collapse: {\n open: !isCollapsed,\n },\n };\n }\n const layout: GridDefinition = {\n kind: 'Grid',\n spec: {\n display,\n items: itemLayouts.map((layout) => {\n const panelKey = itemPanelKeys[layout.i];\n if (panelKey === undefined) {\n throw new Error(`Missing panel key of layout ${layout.i}`);\n }\n return {\n x: layout.x,\n y: layout.y,\n width: layout.w,\n height: layout.h,\n content: createPanelRef(panelKey),\n };\n }),\n repeatVariable: repeatVariable,\n },\n };\n layouts.push(layout);\n });\n\n return layouts;\n}\n"],"names":["createPanelRef","useDashboardStore","useVariableDefinitionActions","useVariableDefinitions","useAnnotationActions","useAnnotationSpecs","useDashboard","panels","panelGroups","panelGroupOrder","setDashboard","setDashboardResource","kind","metadata","display","timezone","duration","refreshInterval","datasources","links","ttl","setVariableDefinitions","setAnnotationSpecs","variables","annotations","layouts","convertPanelGroupsToLayouts","dashboard","spec","dashboardResource","map","groupOrderId","group","undefined","Error","title","isCollapsed","repeatVariable","itemLayouts","itemPanelKeys","collapse","open","layout","items","panelKey","i","x","y","width","w","height","h","content","push"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
@@ -10,7 +11,6 @@
10
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
15
15
  const PanelFocusContext = /*#__PURE__*/ createContext(undefined);
16
16
  function usePanelFocusContext() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/keyboard-shortcuts/PanelFocusProvider.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ninterface PanelFocusContextValue {\n focusedPanelKey: string | null;\n setFocusedPanel: (panelKey: string) => void;\n clearFocusedPanel: () => void;\n}\n\nconst PanelFocusContext = createContext<PanelFocusContextValue | undefined>(undefined);\n\nfunction usePanelFocusContext(): PanelFocusContextValue {\n const ctx = useContext(PanelFocusContext);\n if (ctx === undefined) {\n throw new Error('Panel focus hooks must be used within a PanelFocusProvider');\n }\n return ctx;\n}\n\n/** Tracks which dashboard panel is currently focused (hovered) for panel-scoped shortcuts. */\nexport function PanelFocusProvider({ children }: { children: ReactNode }): ReactElement {\n const [focusedPanelKey, setFocusedPanelKeyState] = useState<string | null>(null);\n\n // This wrapper narrow the setter type (string-only / null-only) and provide\n // stable references for the useMemo context value below. React guarantees\n // setFocusedPanelKeyState is stable, but useCallback makes the stability\n // explicit and satisfies exhaustive-deps when used in useMemo.\n const setFocusedPanel = useCallback((panelKey: string) => {\n setFocusedPanelKeyState(panelKey);\n }, []);\n\n const clearFocusedPanel = useCallback(() => {\n setFocusedPanelKeyState(null);\n }, []);\n\n const value = useMemo(\n (): PanelFocusContextValue => ({\n focusedPanelKey,\n setFocusedPanel,\n clearFocusedPanel,\n }),\n [focusedPanelKey, setFocusedPanel, clearFocusedPanel]\n );\n\n return <PanelFocusContext.Provider value={value}>{children}</PanelFocusContext.Provider>;\n}\n\nexport function useFocusedPanel(): string | null {\n return usePanelFocusContext().focusedPanelKey;\n}\n\nconst PANEL_FOCUS_DEBOUNCE_MS = 50;\n\n/** Debounced mouse enter/leave handlers for panel focus. Add `tabIndex={-1}` to the panel element. */\nexport function usePanelFocusHandlers(panelKey: string): {\n onMouseEnter: (e: React.MouseEvent<HTMLElement>) => void;\n onMouseLeave: () => void;\n} {\n const { setFocusedPanel, clearFocusedPanel } = usePanelFocusContext();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onMouseEnter = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const element = e.currentTarget;\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n setFocusedPanel(panelKey);\n element.focus({ preventScroll: true });\n timerRef.current = null;\n }, PANEL_FOCUS_DEBOUNCE_MS);\n },\n [panelKey, setFocusedPanel]\n );\n\n const onMouseLeave = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n clearFocusedPanel();\n }, [clearFocusedPanel]);\n\n useEffect(() => {\n return (): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return useMemo(() => ({ onMouseEnter, onMouseLeave }), [onMouseEnter, onMouseLeave]);\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","PanelFocusContext","undefined","usePanelFocusContext","ctx","Error","PanelFocusProvider","children","focusedPanelKey","setFocusedPanelKeyState","setFocusedPanel","panelKey","clearFocusedPanel","value","Provider","useFocusedPanel","PANEL_FOCUS_DEBOUNCE_MS","usePanelFocusHandlers","timerRef","onMouseEnter","e","element","currentTarget","current","clearTimeout","setTimeout","focus","preventScroll","onMouseLeave"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,OAAOA,SACLC,aAAa,EAGbC,WAAW,EACXC,UAAU,EACVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,QAAQ;AAQf,MAAMC,kCAAoBP,cAAkDQ;AAE5E,SAASC;IACP,MAAMC,MAAMR,WAAWK;IACvB,IAAIG,QAAQF,WAAW;QACrB,MAAM,IAAIG,MAAM;IAClB;IACA,OAAOD;AACT;AAEA,4FAA4F,GAC5F,OAAO,SAASE,mBAAmB,EAAEC,QAAQ,EAA2B;IACtE,MAAM,CAACC,iBAAiBC,wBAAwB,GAAGT,SAAwB;IAE3E,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAMU,kBAAkBf,YAAY,CAACgB;QACnCF,wBAAwBE;IAC1B,GAAG,EAAE;IAEL,MAAMC,oBAAoBjB,YAAY;QACpCc,wBAAwB;IAC1B,GAAG,EAAE;IAEL,MAAMI,QAAQf,QACZ,IAA+B,CAAA;YAC7BU;YACAE;YACAE;QACF,CAAA,GACA;QAACJ;QAAiBE;QAAiBE;KAAkB;IAGvD,qBAAO,KAACX,kBAAkBa,QAAQ;QAACD,OAAOA;kBAAQN;;AACpD;AAEA,OAAO,SAASQ;IACd,OAAOZ,uBAAuBK,eAAe;AAC/C;AAEA,MAAMQ,0BAA0B;AAEhC,oGAAoG,GACpG,OAAO,SAASC,sBAAsBN,QAAgB;IAIpD,MAAM,EAAED,eAAe,EAAEE,iBAAiB,EAAE,GAAGT;IAC/C,MAAMe,WAAWnB,OAA6C;IAE9D,MAAMoB,eAAexB,YACnB,CAACyB;QACC,MAAMC,UAAUD,EAAEE,aAAa;QAC/B,IAAIJ,SAASK,OAAO,KAAK,MAAM;YAC7BC,aAAaN,SAASK,OAAO;QAC/B;QACAL,SAASK,OAAO,GAAGE,WAAW;YAC5Bf,gBAAgBC;YAChBU,QAAQK,KAAK,CAAC;gBAAEC,eAAe;YAAK;YACpCT,SAASK,OAAO,GAAG;QACrB,GAAGP;IACL,GACA;QAACL;QAAUD;KAAgB;IAG7B,MAAMkB,eAAejC,YAAY;QAC/B,IAAIuB,SAASK,OAAO,KAAK,MAAM;YAC7BC,aAAaN,SAASK,OAAO;YAC7BL,SAASK,OAAO,GAAG;QACrB;QACAX;IACF,GAAG;QAACA;KAAkB;IAEtBf,UAAU;QACR,OAAO;YACL,IAAIqB,SAASK,OAAO,KAAK,MAAM;gBAC7BC,aAAaN,SAASK,OAAO;YAC/B;QACF;IACF,GAAG,EAAE;IAEL,OAAOzB,QAAQ,IAAO,CAAA;YAAEqB;YAAcS;QAAa,CAAA,GAAI;QAACT;QAAcS;KAAa;AACrF"}
1
+ {"version":3,"sources":["../../src/keyboard-shortcuts/PanelFocusProvider.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React, {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ninterface PanelFocusContextValue {\n focusedPanelKey: string | null;\n setFocusedPanel: (panelKey: string) => void;\n clearFocusedPanel: () => void;\n}\n\nconst PanelFocusContext = createContext<PanelFocusContextValue | undefined>(undefined);\n\nfunction usePanelFocusContext(): PanelFocusContextValue {\n const ctx = useContext(PanelFocusContext);\n if (ctx === undefined) {\n throw new Error('Panel focus hooks must be used within a PanelFocusProvider');\n }\n return ctx;\n}\n\n/** Tracks which dashboard panel is currently focused (hovered) for panel-scoped shortcuts. */\nexport function PanelFocusProvider({ children }: { children: ReactNode }): ReactElement {\n const [focusedPanelKey, setFocusedPanelKeyState] = useState<string | null>(null);\n\n // This wrapper narrow the setter type (string-only / null-only) and provide\n // stable references for the useMemo context value below. React guarantees\n // setFocusedPanelKeyState is stable, but useCallback makes the stability\n // explicit and satisfies exhaustive-deps when used in useMemo.\n const setFocusedPanel = useCallback((panelKey: string) => {\n setFocusedPanelKeyState(panelKey);\n }, []);\n\n const clearFocusedPanel = useCallback(() => {\n setFocusedPanelKeyState(null);\n }, []);\n\n const value = useMemo(\n (): PanelFocusContextValue => ({\n focusedPanelKey,\n setFocusedPanel,\n clearFocusedPanel,\n }),\n [focusedPanelKey, setFocusedPanel, clearFocusedPanel]\n );\n\n return <PanelFocusContext.Provider value={value}>{children}</PanelFocusContext.Provider>;\n}\n\nexport function useFocusedPanel(): string | null {\n return usePanelFocusContext().focusedPanelKey;\n}\n\nconst PANEL_FOCUS_DEBOUNCE_MS = 50;\n\n/** Debounced mouse enter/leave handlers for panel focus. Add `tabIndex={-1}` to the panel element. */\nexport function usePanelFocusHandlers(panelKey: string): {\n onMouseEnter: (e: React.MouseEvent<HTMLElement>) => void;\n onMouseLeave: () => void;\n} {\n const { setFocusedPanel, clearFocusedPanel } = usePanelFocusContext();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onMouseEnter = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const element = e.currentTarget;\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n setFocusedPanel(panelKey);\n element.focus({ preventScroll: true });\n timerRef.current = null;\n }, PANEL_FOCUS_DEBOUNCE_MS);\n },\n [panelKey, setFocusedPanel]\n );\n\n const onMouseLeave = useCallback(() => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n clearFocusedPanel();\n }, [clearFocusedPanel]);\n\n useEffect(() => {\n return (): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return useMemo(() => ({ onMouseEnter, onMouseLeave }), [onMouseEnter, onMouseLeave]);\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","PanelFocusContext","undefined","usePanelFocusContext","ctx","Error","PanelFocusProvider","children","focusedPanelKey","setFocusedPanelKeyState","setFocusedPanel","panelKey","clearFocusedPanel","value","Provider","useFocusedPanel","PANEL_FOCUS_DEBOUNCE_MS","usePanelFocusHandlers","timerRef","onMouseEnter","e","element","currentTarget","current","clearTimeout","setTimeout","focus","preventScroll","onMouseLeave"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,OAAOA,SACLC,aAAa,EAGbC,WAAW,EACXC,UAAU,EACVC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,QAAQ;AAQf,MAAMC,kCAAoBP,cAAkDQ;AAE5E,SAASC;IACP,MAAMC,MAAMR,WAAWK;IACvB,IAAIG,QAAQF,WAAW;QACrB,MAAM,IAAIG,MAAM;IAClB;IACA,OAAOD;AACT;AAEA,4FAA4F,GAC5F,OAAO,SAASE,mBAAmB,EAAEC,QAAQ,EAA2B;IACtE,MAAM,CAACC,iBAAiBC,wBAAwB,GAAGT,SAAwB;IAE3E,4EAA4E;IAC5E,0EAA0E;IAC1E,yEAAyE;IACzE,+DAA+D;IAC/D,MAAMU,kBAAkBf,YAAY,CAACgB;QACnCF,wBAAwBE;IAC1B,GAAG,EAAE;IAEL,MAAMC,oBAAoBjB,YAAY;QACpCc,wBAAwB;IAC1B,GAAG,EAAE;IAEL,MAAMI,QAAQf,QACZ,IAA+B,CAAA;YAC7BU;YACAE;YACAE;QACF,CAAA,GACA;QAACJ;QAAiBE;QAAiBE;KAAkB;IAGvD,qBAAO,KAACX,kBAAkBa,QAAQ;QAACD,OAAOA;kBAAQN;;AACpD;AAEA,OAAO,SAASQ;IACd,OAAOZ,uBAAuBK,eAAe;AAC/C;AAEA,MAAMQ,0BAA0B;AAEhC,oGAAoG,GACpG,OAAO,SAASC,sBAAsBN,QAAgB;IAIpD,MAAM,EAAED,eAAe,EAAEE,iBAAiB,EAAE,GAAGT;IAC/C,MAAMe,WAAWnB,OAA6C;IAE9D,MAAMoB,eAAexB,YACnB,CAACyB;QACC,MAAMC,UAAUD,EAAEE,aAAa;QAC/B,IAAIJ,SAASK,OAAO,KAAK,MAAM;YAC7BC,aAAaN,SAASK,OAAO;QAC/B;QACAL,SAASK,OAAO,GAAGE,WAAW;YAC5Bf,gBAAgBC;YAChBU,QAAQK,KAAK,CAAC;gBAAEC,eAAe;YAAK;YACpCT,SAASK,OAAO,GAAG;QACrB,GAAGP;IACL,GACA;QAACL;QAAUD;KAAgB;IAG7B,MAAMkB,eAAejC,YAAY;QAC/B,IAAIuB,SAASK,OAAO,KAAK,MAAM;YAC7BC,aAAaN,SAASK,OAAO;YAC7BL,SAASK,OAAO,GAAG;QACrB;QACAX;IACF,GAAG;QAACA;KAAkB;IAEtBf,UAAU;QACR,OAAO;YACL,IAAIqB,SAASK,OAAO,KAAK,MAAM;gBAC7BC,aAAaN,SAASK,OAAO;YAC/B;QACF;IACF,GAAG,EAAE;IAEL,OAAOzB,QAAQ,IAAO,CAAA;YAAEqB;YAAcS;QAAa,CAAA,GAAI;QAACT;QAAcS;KAAa;AACrF"}
@@ -1,3 +1,3 @@
1
- export * from './DashboardResource';
2
1
  export * from './PanelGroupDefinition';
2
+ export * from './VariableDefinition';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAaA,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/model/index.ts"],"names":[],"mappings":"AAaA,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
@@ -10,7 +10,7 @@
10
10
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
- export * from './DashboardResource';
14
13
  export * from './PanelGroupDefinition';
14
+ export * from './VariableDefinition';
15
15
 
16
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/model/index.ts"],"sourcesContent":["// Copyright 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\nexport * from './DashboardResource';\nexport * from './PanelGroupDefinition';\n"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,sBAAsB;AACpC,cAAc,yBAAyB"}
1
+ {"version":3,"sources":["../../src/model/index.ts"],"sourcesContent":["// Copyright 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\nexport * from './PanelGroupDefinition';\nexport * from './VariableDefinition';\n"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,yBAAyB;AACvC,cAAc,uBAAuB"}
@@ -1,6 +1,6 @@
1
1
  import { StoreApi } from 'zustand';
2
+ import { DashboardResource } from '@perses-dev/client';
2
3
  import { DashboardStoreState } from '../context';
3
- import { DashboardResource } from '../model';
4
4
  /**
5
5
  * Helper to get a test dashboard resource.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-provider.d.ts","sourceRoot":"","sources":["../../src/test/dashboard-provider.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAoB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAGpD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI;IAC5C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;KAAE,CAAC;CAClD,CAcA"}
1
+ {"version":3,"file":"dashboard-provider.d.ts","sourceRoot":"","sources":["../../src/test/dashboard-provider.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAoB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAGnE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAGpD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI;IAC5C,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAA;KAAE,CAAC;CAClD,CAcA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/dashboard-provider.tsx"],"sourcesContent":["// Copyright 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 { useContext } from 'react';\nimport { StoreApi } from 'zustand';\nimport { DashboardContext, DashboardStoreState } from '../context';\nimport { DashboardResource } from '../model';\nimport testDashboard from './testDashboard';\n\n/**\n * Helper to get a test dashboard resource.\n */\nexport function getTestDashboard(): DashboardResource {\n // TODO: Should we be cloning this to create a new object each time?\n return testDashboard;\n}\n\n/**\n * Test helper to create a \"spy\" component that will capture the DashboardProvider's store, allowing you to inspect\n * its state in tests. Be sure to render the DashboardProviderSpy component that's returned in the component test\n * underneath the DashboardProvider.\n */\nexport function createDashboardProviderSpy(): {\n DashboardProviderSpy: () => null;\n store: { value?: StoreApi<DashboardStoreState> };\n} {\n const store: { value?: StoreApi<DashboardStoreState> } = {};\n\n // Spy component just captures the store value so it can be inspected in tests\n function DashboardProviderSpy(): null {\n const ctx = useContext(DashboardContext);\n store.value = ctx;\n return null;\n }\n\n return {\n DashboardProviderSpy,\n store,\n };\n}\n"],"names":["useContext","DashboardContext","testDashboard","getTestDashboard","createDashboardProviderSpy","store","DashboardProviderSpy","ctx","value"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,UAAU,QAAQ,QAAQ;AAEnC,SAASC,gBAAgB,QAA6B,aAAa;AAEnE,OAAOC,mBAAmB,kBAAkB;AAE5C;;CAEC,GACD,OAAO,SAASC;IACd,oEAAoE;IACpE,OAAOD;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASE;IAId,MAAMC,QAAmD,CAAC;IAE1D,8EAA8E;IAC9E,SAASC;QACP,MAAMC,MAAMP,WAAWC;QACvBI,MAAMG,KAAK,GAAGD;QACd,OAAO;IACT;IAEA,OAAO;QACLD;QACAD;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/test/dashboard-provider.tsx"],"sourcesContent":["// Copyright 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 { useContext } from 'react';\nimport { StoreApi } from 'zustand';\nimport { DashboardResource } from '@perses-dev/client';\nimport { DashboardContext, DashboardStoreState } from '../context';\nimport testDashboard from './testDashboard';\n\n/**\n * Helper to get a test dashboard resource.\n */\nexport function getTestDashboard(): DashboardResource {\n // TODO: Should we be cloning this to create a new object each time?\n return testDashboard;\n}\n\n/**\n * Test helper to create a \"spy\" component that will capture the DashboardProvider's store, allowing you to inspect\n * its state in tests. Be sure to render the DashboardProviderSpy component that's returned in the component test\n * underneath the DashboardProvider.\n */\nexport function createDashboardProviderSpy(): {\n DashboardProviderSpy: () => null;\n store: { value?: StoreApi<DashboardStoreState> };\n} {\n const store: { value?: StoreApi<DashboardStoreState> } = {};\n\n // Spy component just captures the store value so it can be inspected in tests\n function DashboardProviderSpy(): null {\n const ctx = useContext(DashboardContext);\n store.value = ctx;\n return null;\n }\n\n return {\n DashboardProviderSpy,\n store,\n };\n}\n"],"names":["useContext","DashboardContext","testDashboard","getTestDashboard","createDashboardProviderSpy","store","DashboardProviderSpy","ctx","value"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,UAAU,QAAQ,QAAQ;AAGnC,SAASC,gBAAgB,QAA6B,aAAa;AACnE,OAAOC,mBAAmB,kBAAkB;AAE5C;;CAEC,GACD,OAAO,SAASC;IACd,oEAAoE;IACpE,OAAOD;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASE;IAId,MAAMC,QAAmD,CAAC;IAE1D,8EAA8E;IAC9E,SAASC;QACP,MAAMC,MAAMP,WAAWC;QACvBI,MAAMG,KAAK,GAAGD;QACd,OAAO;IACT;IAEA,OAAO;QACLD;QACAD;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { GlobalDatasourceResource } from '@perses-dev/core';
1
+ import { GlobalDatasourceResource } from '@perses-dev/client';
2
2
  import { DatasourceStoreProviderProps } from '../context';
3
3
  export declare const prometheusDemoUrl = "https://prometheus.demo.prometheus.io";
4
4
  export declare const prometheusDemo: GlobalDatasourceResource;
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-provider.d.ts","sourceRoot":"","sources":["../../src/test/datasource-provider.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AACzE,eAAO,MAAM,cAAc,EAAE,wBAenB,CAAC;AAKX,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,4BAA4B,EAAE,eAAe,GAAG,mBAAmB,CAqB5G,CAAC"}
1
+ {"version":3,"file":"datasource-provider.d.ts","sourceRoot":"","sources":["../../src/test/datasource-provider.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AACzE,eAAO,MAAM,cAAc,EAAE,wBAenB,CAAC;AAKX,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,4BAA4B,EAAE,eAAe,GAAG,mBAAmB,CAqB5G,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/datasource-provider.tsx"],"sourcesContent":["// Copyright 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 { GlobalDatasourceResource } from '@perses-dev/core';\nimport { DatasourceStoreProviderProps } from '../context';\nimport { getTestDashboard } from './dashboard-provider';\n\nexport const prometheusDemoUrl = 'https://prometheus.demo.prometheus.io';\nexport const prometheusDemo: GlobalDatasourceResource = {\n kind: 'GlobalDatasource',\n metadata: {\n name: 'PrometheusDemo',\n createdAt: '0001-01-01T00:00:00Z',\n updatedAt: '0001-01-01T00:00:00Z',\n version: 0,\n },\n spec: {\n default: true,\n plugin: {\n kind: 'PrometheusDatasource',\n spec: { directUrl: prometheusDemoUrl },\n },\n },\n} as const;\n\n// This default currently defines the bare minimum to get a story working in\n// the `Dashboard` storybook with the Prometheus demo api. We'll likely want\n// to expand it to do more in the future.\nexport const defaultDatasourceProps: Pick<DatasourceStoreProviderProps, 'datasourceApi' | 'dashboardResource'> = {\n dashboardResource: getTestDashboard(),\n datasourceApi: {\n buildProxyUrl: () => '',\n getDatasource: () => {\n return Promise.resolve(undefined);\n },\n getGlobalDatasource: (selector) => {\n if (selector.kind === 'PrometheusDatasource') {\n return Promise.resolve(prometheusDemo);\n }\n\n return Promise.resolve(undefined);\n },\n listDatasources: () => {\n return Promise.resolve([]);\n },\n listGlobalDatasources: () => {\n return Promise.resolve([]);\n },\n },\n};\n"],"names":["getTestDashboard","prometheusDemoUrl","prometheusDemo","kind","metadata","name","createdAt","updatedAt","version","spec","default","plugin","directUrl","defaultDatasourceProps","dashboardResource","datasourceApi","buildProxyUrl","getDatasource","Promise","resolve","undefined","getGlobalDatasource","selector","listDatasources","listGlobalDatasources"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAIjC,SAASA,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,MAAMC,oBAAoB,wCAAwC;AACzE,OAAO,MAAMC,iBAA2C;IACtDC,MAAM;IACNC,UAAU;QACRC,MAAM;QACNC,WAAW;QACXC,WAAW;QACXC,SAAS;IACX;IACAC,MAAM;QACJC,SAAS;QACTC,QAAQ;YACNR,MAAM;YACNM,MAAM;gBAAEG,WAAWX;YAAkB;QACvC;IACF;AACF,EAAW;AAEX,4EAA4E;AAC5E,4EAA4E;AAC5E,yCAAyC;AACzC,OAAO,MAAMY,yBAAoG;IAC/GC,mBAAmBd;IACnBe,eAAe;QACbC,eAAe,IAAM;QACrBC,eAAe;YACb,OAAOC,QAAQC,OAAO,CAACC;QACzB;QACAC,qBAAqB,CAACC;YACpB,IAAIA,SAASnB,IAAI,KAAK,wBAAwB;gBAC5C,OAAOe,QAAQC,OAAO,CAACjB;YACzB;YAEA,OAAOgB,QAAQC,OAAO,CAACC;QACzB;QACAG,iBAAiB;YACf,OAAOL,QAAQC,OAAO,CAAC,EAAE;QAC3B;QACAK,uBAAuB;YACrB,OAAON,QAAQC,OAAO,CAAC,EAAE;QAC3B;IACF;AACF,EAAE"}
1
+ {"version":3,"sources":["../../src/test/datasource-provider.tsx"],"sourcesContent":["// Copyright 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 { GlobalDatasourceResource } from '@perses-dev/client';\nimport { DatasourceStoreProviderProps } from '../context';\nimport { getTestDashboard } from './dashboard-provider';\n\nexport const prometheusDemoUrl = 'https://prometheus.demo.prometheus.io';\nexport const prometheusDemo: GlobalDatasourceResource = {\n kind: 'GlobalDatasource',\n metadata: {\n name: 'PrometheusDemo',\n createdAt: '0001-01-01T00:00:00Z',\n updatedAt: '0001-01-01T00:00:00Z',\n version: 0,\n },\n spec: {\n default: true,\n plugin: {\n kind: 'PrometheusDatasource',\n spec: { directUrl: prometheusDemoUrl },\n },\n },\n} as const;\n\n// This default currently defines the bare minimum to get a story working in\n// the `Dashboard` storybook with the Prometheus demo api. We'll likely want\n// to expand it to do more in the future.\nexport const defaultDatasourceProps: Pick<DatasourceStoreProviderProps, 'datasourceApi' | 'dashboardResource'> = {\n dashboardResource: getTestDashboard(),\n datasourceApi: {\n buildProxyUrl: () => '',\n getDatasource: () => {\n return Promise.resolve(undefined);\n },\n getGlobalDatasource: (selector) => {\n if (selector.kind === 'PrometheusDatasource') {\n return Promise.resolve(prometheusDemo);\n }\n\n return Promise.resolve(undefined);\n },\n listDatasources: () => {\n return Promise.resolve([]);\n },\n listGlobalDatasources: () => {\n return Promise.resolve([]);\n },\n },\n};\n"],"names":["getTestDashboard","prometheusDemoUrl","prometheusDemo","kind","metadata","name","createdAt","updatedAt","version","spec","default","plugin","directUrl","defaultDatasourceProps","dashboardResource","datasourceApi","buildProxyUrl","getDatasource","Promise","resolve","undefined","getGlobalDatasource","selector","listDatasources","listGlobalDatasources"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAIjC,SAASA,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,MAAMC,oBAAoB,wCAAwC;AACzE,OAAO,MAAMC,iBAA2C;IACtDC,MAAM;IACNC,UAAU;QACRC,MAAM;QACNC,WAAW;QACXC,WAAW;QACXC,SAAS;IACX;IACAC,MAAM;QACJC,SAAS;QACTC,QAAQ;YACNR,MAAM;YACNM,MAAM;gBAAEG,WAAWX;YAAkB;QACvC;IACF;AACF,EAAW;AAEX,4EAA4E;AAC5E,4EAA4E;AAC5E,yCAAyC;AACzC,OAAO,MAAMY,yBAAoG;IAC/GC,mBAAmBd;IACnBe,eAAe;QACbC,eAAe,IAAM;QACrBC,eAAe;YACb,OAAOC,QAAQC,OAAO,CAACC;QACzB;QACAC,qBAAqB,CAACC;YACpB,IAAIA,SAASnB,IAAI,KAAK,wBAAwB;gBAC5C,OAAOe,QAAQC,OAAO,CAACjB;YACzB;YAEA,OAAOgB,QAAQC,OAAO,CAACC;QACzB;QACAG,iBAAiB;YACf,OAAOL,QAAQC,OAAO,CAAC,EAAE;QAC3B;QACAK,uBAAuB;YACrB,OAAON,QAAQC,OAAO,CAAC,EAAE;QAC3B;IACF;AACF,EAAE"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
@@ -10,7 +11,6 @@
10
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
- import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import { ChartsProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components';
15
15
  import { mockPluginRegistry, PluginRegistry } from '@perses-dev/plugin-system';
16
16
  import { HotkeysProvider } from '@tanstack/react-hotkeys';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/render.tsx"],"sourcesContent":["// Copyright 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 { ChartsProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components';\nimport { mockPluginRegistry, PluginRegistry } from '@perses-dev/plugin-system';\nimport { HotkeysProvider } from '@tanstack/react-hotkeys';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { render, RenderOptions, RenderResult } from '@testing-library/react';\nimport { createMemoryHistory, MemoryHistory } from 'history';\nimport { ReactElement, useLayoutEffect, useState } from 'react';\nimport { Router } from 'react-router-dom';\nimport { QueryParamProvider } from 'use-query-params';\nimport { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';\nimport { DatasourceStoreProvider } from '../context';\nimport { PanelFocusProvider } from '../keyboard-shortcuts';\nimport { defaultDatasourceProps } from '../test';\nimport { MOCK_PLUGINS } from './plugin-registry';\n\ninterface CustomRouterProps {\n history: MemoryHistory;\n children: React.ReactNode;\n}\n\n/*\n * Workaround for React router upgrade type errors.\n * More details: https://stackoverflow.com/a/69948457/17575201\n */\nconst CustomRouter: React.FC<CustomRouterProps> = ({ history, children }) => {\n const [state, setState] = useState({\n action: history.action,\n location: history.location,\n });\n\n useLayoutEffect(() => history.listen(setState), [history]);\n\n return (\n <Router location={state.location} navigationType={state.action} navigator={history}>\n {children}\n </Router>\n );\n};\n\n/**\n * Test helper to render a React component with some common app-level providers wrapped around it.\n */\nexport function renderWithContext(\n ui: React.ReactElement,\n options?: Omit<RenderOptions, 'queries'>,\n history?: MemoryHistory\n): RenderResult {\n // Create a new QueryClient for each test to avoid caching issues\n const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, retry: false } } });\n\n const customHistory = history ?? createMemoryHistory();\n\n const mockRegistry = mockPluginRegistry(...MOCK_PLUGINS);\n\n const BaseRender = (): ReactElement => (\n <CustomRouter history={customHistory}>\n <QueryClientProvider client={queryClient}>\n <QueryParamProvider adapter={ReactRouter6Adapter}>\n <SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}>\n <ChartsProvider chartsTheme={testChartsTheme}>\n <PluginRegistry\n pluginLoader={mockRegistry.pluginLoader}\n defaultPluginKinds={mockRegistry.defaultPluginKinds}\n >\n <HotkeysProvider\n defaultOptions={{\n hotkey: { preventDefault: true, stopPropagation: true },\n hotkeySequence: { timeout: 1000 },\n }}\n >\n <PanelFocusProvider>\n <DatasourceStoreProvider {...defaultDatasourceProps}>{ui}</DatasourceStoreProvider>\n </PanelFocusProvider>\n </HotkeysProvider>\n </PluginRegistry>\n </ChartsProvider>\n </SnackbarProvider>\n </QueryParamProvider>\n </QueryClientProvider>\n </CustomRouter>\n );\n\n return render(<BaseRender />, options);\n}\n"],"names":["ChartsProvider","SnackbarProvider","testChartsTheme","mockPluginRegistry","PluginRegistry","HotkeysProvider","QueryClient","QueryClientProvider","render","createMemoryHistory","useLayoutEffect","useState","Router","QueryParamProvider","ReactRouter6Adapter","DatasourceStoreProvider","PanelFocusProvider","defaultDatasourceProps","MOCK_PLUGINS","CustomRouter","history","children","state","setState","action","location","listen","navigationType","navigator","renderWithContext","ui","options","queryClient","defaultOptions","queries","refetchOnWindowFocus","retry","customHistory","mockRegistry","BaseRender","client","adapter","anchorOrigin","vertical","horizontal","chartsTheme","pluginLoader","defaultPluginKinds","hotkey","preventDefault","stopPropagation","hotkeySequence","timeout"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAEjC,SAASA,cAAc,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ,yBAAyB;AAC3F,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,4BAA4B;AAC/E,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,WAAW,EAAEC,mBAAmB,QAAQ,wBAAwB;AACzE,SAASC,MAAM,QAAqC,yBAAyB;AAC7E,SAASC,mBAAmB,QAAuB,UAAU;AAC7D,SAAuBC,eAAe,EAAEC,QAAQ,QAAQ,QAAQ;AAChE,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,kBAAkB,QAAQ,mBAAmB;AACtD,SAASC,mBAAmB,QAAQ,2CAA2C;AAC/E,SAASC,uBAAuB,QAAQ,aAAa;AACrD,SAASC,kBAAkB,QAAQ,wBAAwB;AAC3D,SAASC,sBAAsB,QAAQ,UAAU;AACjD,SAASC,YAAY,QAAQ,oBAAoB;AAOjD;;;CAGC,GACD,MAAMC,eAA4C,CAAC,EAAEC,OAAO,EAAEC,QAAQ,EAAE;IACtE,MAAM,CAACC,OAAOC,SAAS,GAAGZ,SAAS;QACjCa,QAAQJ,QAAQI,MAAM;QACtBC,UAAUL,QAAQK,QAAQ;IAC5B;IAEAf,gBAAgB,IAAMU,QAAQM,MAAM,CAACH,WAAW;QAACH;KAAQ;IAEzD,qBACE,KAACR;QAAOa,UAAUH,MAAMG,QAAQ;QAAEE,gBAAgBL,MAAME,MAAM;QAAEI,WAAWR;kBACxEC;;AAGP;AAEA;;CAEC,GACD,OAAO,SAASQ,kBACdC,EAAsB,EACtBC,OAAwC,EACxCX,OAAuB;IAEvB,iEAAiE;IACjE,MAAMY,cAAc,IAAI1B,YAAY;QAAE2B,gBAAgB;YAAEC,SAAS;gBAAEC,sBAAsB;gBAAOC,OAAO;YAAM;QAAE;IAAE;IAEjH,MAAMC,gBAAgBjB,WAAWX;IAEjC,MAAM6B,eAAenC,sBAAsBe;IAE3C,MAAMqB,aAAa,kBACjB,KAACpB;YAAaC,SAASiB;sBACrB,cAAA,KAAC9B;gBAAoBiC,QAAQR;0BAC3B,cAAA,KAACnB;oBAAmB4B,SAAS3B;8BAC3B,cAAA,KAACb;wBAAiByC,cAAc;4BAAEC,UAAU;4BAAUC,YAAY;wBAAQ;kCACxE,cAAA,KAAC5C;4BAAe6C,aAAa3C;sCAC3B,cAAA,KAACE;gCACC0C,cAAcR,aAAaQ,YAAY;gCACvCC,oBAAoBT,aAAaS,kBAAkB;0CAEnD,cAAA,KAAC1C;oCACC4B,gBAAgB;wCACde,QAAQ;4CAAEC,gBAAgB;4CAAMC,iBAAiB;wCAAK;wCACtDC,gBAAgB;4CAAEC,SAAS;wCAAK;oCAClC;8CAEA,cAAA,KAACpC;kDACC,cAAA,KAACD;4CAAyB,GAAGE,sBAAsB;sDAAGa;;;;;;;;;;IAWxE,OAAOtB,qBAAO,KAAC+B,iBAAeR;AAChC"}
1
+ {"version":3,"sources":["../../src/test/render.tsx"],"sourcesContent":["// Copyright 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 { ChartsProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components';\nimport { mockPluginRegistry, PluginRegistry } from '@perses-dev/plugin-system';\nimport { HotkeysProvider } from '@tanstack/react-hotkeys';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { render, RenderOptions, RenderResult } from '@testing-library/react';\nimport { createMemoryHistory, MemoryHistory } from 'history';\nimport { ReactElement, useLayoutEffect, useState } from 'react';\nimport { Router } from 'react-router-dom';\nimport { QueryParamProvider } from 'use-query-params';\nimport { ReactRouter6Adapter } from 'use-query-params/adapters/react-router-6';\nimport { DatasourceStoreProvider } from '../context';\nimport { PanelFocusProvider } from '../keyboard-shortcuts';\nimport { defaultDatasourceProps } from '../test';\nimport { MOCK_PLUGINS } from './plugin-registry';\n\ninterface CustomRouterProps {\n history: MemoryHistory;\n children: React.ReactNode;\n}\n\n/*\n * Workaround for React router upgrade type errors.\n * More details: https://stackoverflow.com/a/69948457/17575201\n */\nconst CustomRouter: React.FC<CustomRouterProps> = ({ history, children }) => {\n const [state, setState] = useState({\n action: history.action,\n location: history.location,\n });\n\n useLayoutEffect(() => history.listen(setState), [history]);\n\n return (\n <Router location={state.location} navigationType={state.action} navigator={history}>\n {children}\n </Router>\n );\n};\n\n/**\n * Test helper to render a React component with some common app-level providers wrapped around it.\n */\nexport function renderWithContext(\n ui: React.ReactElement,\n options?: Omit<RenderOptions, 'queries'>,\n history?: MemoryHistory\n): RenderResult {\n // Create a new QueryClient for each test to avoid caching issues\n const queryClient = new QueryClient({ defaultOptions: { queries: { refetchOnWindowFocus: false, retry: false } } });\n\n const customHistory = history ?? createMemoryHistory();\n\n const mockRegistry = mockPluginRegistry(...MOCK_PLUGINS);\n\n const BaseRender = (): ReactElement => (\n <CustomRouter history={customHistory}>\n <QueryClientProvider client={queryClient}>\n <QueryParamProvider adapter={ReactRouter6Adapter}>\n <SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}>\n <ChartsProvider chartsTheme={testChartsTheme}>\n <PluginRegistry\n pluginLoader={mockRegistry.pluginLoader}\n defaultPluginKinds={mockRegistry.defaultPluginKinds}\n >\n <HotkeysProvider\n defaultOptions={{\n hotkey: { preventDefault: true, stopPropagation: true },\n hotkeySequence: { timeout: 1000 },\n }}\n >\n <PanelFocusProvider>\n <DatasourceStoreProvider {...defaultDatasourceProps}>{ui}</DatasourceStoreProvider>\n </PanelFocusProvider>\n </HotkeysProvider>\n </PluginRegistry>\n </ChartsProvider>\n </SnackbarProvider>\n </QueryParamProvider>\n </QueryClientProvider>\n </CustomRouter>\n );\n\n return render(<BaseRender />, options);\n}\n"],"names":["ChartsProvider","SnackbarProvider","testChartsTheme","mockPluginRegistry","PluginRegistry","HotkeysProvider","QueryClient","QueryClientProvider","render","createMemoryHistory","useLayoutEffect","useState","Router","QueryParamProvider","ReactRouter6Adapter","DatasourceStoreProvider","PanelFocusProvider","defaultDatasourceProps","MOCK_PLUGINS","CustomRouter","history","children","state","setState","action","location","listen","navigationType","navigator","renderWithContext","ui","options","queryClient","defaultOptions","queries","refetchOnWindowFocus","retry","customHistory","mockRegistry","BaseRender","client","adapter","anchorOrigin","vertical","horizontal","chartsTheme","pluginLoader","defaultPluginKinds","hotkey","preventDefault","stopPropagation","hotkeySequence","timeout"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,cAAc,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ,yBAAyB;AAC3F,SAASC,kBAAkB,EAAEC,cAAc,QAAQ,4BAA4B;AAC/E,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,WAAW,EAAEC,mBAAmB,QAAQ,wBAAwB;AACzE,SAASC,MAAM,QAAqC,yBAAyB;AAC7E,SAASC,mBAAmB,QAAuB,UAAU;AAC7D,SAAuBC,eAAe,EAAEC,QAAQ,QAAQ,QAAQ;AAChE,SAASC,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,kBAAkB,QAAQ,mBAAmB;AACtD,SAASC,mBAAmB,QAAQ,2CAA2C;AAC/E,SAASC,uBAAuB,QAAQ,aAAa;AACrD,SAASC,kBAAkB,QAAQ,wBAAwB;AAC3D,SAASC,sBAAsB,QAAQ,UAAU;AACjD,SAASC,YAAY,QAAQ,oBAAoB;AAOjD;;;CAGC,GACD,MAAMC,eAA4C,CAAC,EAAEC,OAAO,EAAEC,QAAQ,EAAE;IACtE,MAAM,CAACC,OAAOC,SAAS,GAAGZ,SAAS;QACjCa,QAAQJ,QAAQI,MAAM;QACtBC,UAAUL,QAAQK,QAAQ;IAC5B;IAEAf,gBAAgB,IAAMU,QAAQM,MAAM,CAACH,WAAW;QAACH;KAAQ;IAEzD,qBACE,KAACR;QAAOa,UAAUH,MAAMG,QAAQ;QAAEE,gBAAgBL,MAAME,MAAM;QAAEI,WAAWR;kBACxEC;;AAGP;AAEA;;CAEC,GACD,OAAO,SAASQ,kBACdC,EAAsB,EACtBC,OAAwC,EACxCX,OAAuB;IAEvB,iEAAiE;IACjE,MAAMY,cAAc,IAAI1B,YAAY;QAAE2B,gBAAgB;YAAEC,SAAS;gBAAEC,sBAAsB;gBAAOC,OAAO;YAAM;QAAE;IAAE;IAEjH,MAAMC,gBAAgBjB,WAAWX;IAEjC,MAAM6B,eAAenC,sBAAsBe;IAE3C,MAAMqB,aAAa,kBACjB,KAACpB;YAAaC,SAASiB;sBACrB,cAAA,KAAC9B;gBAAoBiC,QAAQR;0BAC3B,cAAA,KAACnB;oBAAmB4B,SAAS3B;8BAC3B,cAAA,KAACb;wBAAiByC,cAAc;4BAAEC,UAAU;4BAAUC,YAAY;wBAAQ;kCACxE,cAAA,KAAC5C;4BAAe6C,aAAa3C;sCAC3B,cAAA,KAACE;gCACC0C,cAAcR,aAAaQ,YAAY;gCACvCC,oBAAoBT,aAAaS,kBAAkB;0CAEnD,cAAA,KAAC1C;oCACC4B,gBAAgB;wCACde,QAAQ;4CAAEC,gBAAgB;4CAAMC,iBAAiB;wCAAK;wCACtDC,gBAAgB;4CAAEC,SAAS;wCAAK;oCAClC;8CAEA,cAAA,KAACpC;kDACC,cAAA,KAACD;4CAAyB,GAAGE,sBAAsB;sDAAGa;;;;;;;;;;IAWxE,OAAOtB,qBAAO,KAAC+B,iBAAeR;AAChC"}
@@ -1,4 +1,4 @@
1
- import { DashboardResource } from '../model';
1
+ import { DashboardResource } from '@perses-dev/client';
2
2
  type DashboardResourceTest = Omit<DashboardResource, 'metadata'> & {
3
3
  metadata: {
4
4
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"testDashboard.d.ts","sourceRoot":"","sources":["../../src/test/testDashboard.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,KAAK,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,qBA0PpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"testDashboard.d.ts","sourceRoot":"","sources":["../../src/test/testDashboard.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,KAAK,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,qBA0PpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/test/testDashboard.ts"],"sourcesContent":["// Copyright 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 { DashboardResource } from '../model';\n\ntype DashboardResourceTest = Omit<DashboardResource, 'metadata'> & {\n metadata: {\n name: string;\n project: string;\n createdAt: string;\n updatedAt: string;\n version: number;\n };\n};\n\nconst testDashboard: DashboardResourceTest = {\n kind: 'Dashboard',\n metadata: {\n name: 'Node Stats',\n project: 'perses',\n createdAt: '2021-11-09',\n updatedAt: '2021-11-09',\n version: 0,\n },\n spec: {\n duration: '30m',\n refreshInterval: '0s',\n variables: [\n {\n kind: 'TextVariable',\n spec: {\n name: 'job',\n value: 'node',\n },\n },\n {\n kind: 'TextVariable',\n spec: {\n name: 'instance',\n value: 'demo.do.prometheus.io:9100',\n },\n },\n {\n kind: 'TextVariable',\n spec: {\n name: 'interval',\n value: '1m',\n },\n },\n ],\n panels: {\n cpu: {\n kind: 'Panel',\n spec: {\n display: { name: 'CPU' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: '%' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'avg without (cpu)(rate(node_cpu_seconds_total{job=\"node\",instance=\"$instance\",mode!=\"idle\"}[$interval]))',\n },\n },\n },\n },\n ],\n },\n },\n memory: {\n kind: 'Panel',\n spec: {\n display: { name: 'Memory' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'bytes' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'node_memory_MemTotal_bytes{job=\"node\",instance=\"$instance\"} - node_memory_MemFree_bytes{job=\"node\",instance=\"$instance\"} - node_memory_Buffers_bytes{job=\"node\",instance=\"$instance\"} - node_memory_Cached_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_Buffers_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_Cached_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_MemFree_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n ],\n },\n },\n // This panel is referenced in more than one layout below\n diskIO: {\n kind: 'Panel',\n spec: {\n display: { name: 'Disk I/O Utilization' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'percent' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'rate(node_disk_io_time_seconds_total{job=\"node\",instance=\"$instance\",device!~\"^(md\\\\\\\\d+$|dm-)\"}[$interval])',\n },\n },\n },\n },\n ],\n },\n },\n filesystemFullness: {\n kind: 'Panel',\n spec: {\n display: { name: 'Filesystem Fullness' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'percent' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n '1 - node_filesystem_free_bytes{job=\"node\",instance=\"$instance\",fstype!=\"rootfs\",mountpoint!~\"/(run|var).*\",mountpoint!=\"\"} / node_filesystem_size_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n ],\n },\n },\n },\n layouts: [\n // Regular Title, no collapse enabled\n {\n kind: 'Grid',\n spec: {\n display: {\n title: 'CPU Stats',\n collapse: {\n open: true,\n },\n },\n items: [\n // First Row\n {\n x: 0,\n y: 0,\n width: 12,\n height: 4,\n content: { $ref: '#/spec/panels/cpu' },\n },\n {\n x: 0,\n y: 5,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/diskIO' },\n },\n ],\n },\n },\n // No title,\n {\n kind: 'Grid',\n spec: {\n items: [\n {\n x: 0,\n y: 0,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/diskIO' },\n },\n {\n x: 8,\n y: 0,\n width: 8,\n height: 3,\n content: { $ref: '#/spec/panels/memory' },\n },\n ],\n },\n },\n // Collapsed\n {\n kind: 'Grid',\n spec: {\n display: {\n title: 'Disk Stats',\n collapse: {\n open: false,\n },\n },\n items: [\n {\n x: 18,\n y: 0,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/filesystemFullness' },\n },\n ],\n },\n },\n ],\n },\n};\n\nexport default testDashboard;\n"],"names":["testDashboard","kind","metadata","name","project","createdAt","updatedAt","version","spec","duration","refreshInterval","variables","value","panels","cpu","display","plugin","format","unit","queries","query","memory","diskIO","filesystemFullness","layouts","title","collapse","open","items","x","y","width","height","content","$ref"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/test/testDashboard.ts"],"sourcesContent":["// Copyright 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 { DashboardResource } from '@perses-dev/client';\n\ntype DashboardResourceTest = Omit<DashboardResource, 'metadata'> & {\n metadata: {\n name: string;\n project: string;\n createdAt: string;\n updatedAt: string;\n version: number;\n };\n};\n\nconst testDashboard: DashboardResourceTest = {\n kind: 'Dashboard',\n metadata: {\n name: 'Node Stats',\n project: 'perses',\n createdAt: '2021-11-09',\n updatedAt: '2021-11-09',\n version: 0,\n },\n spec: {\n duration: '30m',\n refreshInterval: '0s',\n variables: [\n {\n kind: 'TextVariable',\n spec: {\n name: 'job',\n value: 'node',\n },\n },\n {\n kind: 'TextVariable',\n spec: {\n name: 'instance',\n value: 'demo.do.prometheus.io:9100',\n },\n },\n {\n kind: 'TextVariable',\n spec: {\n name: 'interval',\n value: '1m',\n },\n },\n ],\n panels: {\n cpu: {\n kind: 'Panel',\n spec: {\n display: { name: 'CPU' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: '%' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'avg without (cpu)(rate(node_cpu_seconds_total{job=\"node\",instance=\"$instance\",mode!=\"idle\"}[$interval]))',\n },\n },\n },\n },\n ],\n },\n },\n memory: {\n kind: 'Panel',\n spec: {\n display: { name: 'Memory' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'bytes' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'node_memory_MemTotal_bytes{job=\"node\",instance=\"$instance\"} - node_memory_MemFree_bytes{job=\"node\",instance=\"$instance\"} - node_memory_Buffers_bytes{job=\"node\",instance=\"$instance\"} - node_memory_Cached_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_Buffers_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_Cached_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query: 'node_memory_MemFree_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n ],\n },\n },\n // This panel is referenced in more than one layout below\n diskIO: {\n kind: 'Panel',\n spec: {\n display: { name: 'Disk I/O Utilization' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'percent' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n 'rate(node_disk_io_time_seconds_total{job=\"node\",instance=\"$instance\",device!~\"^(md\\\\\\\\d+$|dm-)\"}[$interval])',\n },\n },\n },\n },\n ],\n },\n },\n filesystemFullness: {\n kind: 'Panel',\n spec: {\n display: { name: 'Filesystem Fullness' },\n plugin: {\n kind: 'TimeSeriesChart',\n spec: {\n format: { unit: 'percent' },\n },\n },\n queries: [\n {\n kind: 'TimeSeriesQuery',\n spec: {\n plugin: {\n kind: 'PrometheusTimeSeriesQuery',\n spec: {\n query:\n '1 - node_filesystem_free_bytes{job=\"node\",instance=\"$instance\",fstype!=\"rootfs\",mountpoint!~\"/(run|var).*\",mountpoint!=\"\"} / node_filesystem_size_bytes{job=\"node\",instance=\"$instance\"}',\n },\n },\n },\n },\n ],\n },\n },\n },\n layouts: [\n // Regular Title, no collapse enabled\n {\n kind: 'Grid',\n spec: {\n display: {\n title: 'CPU Stats',\n collapse: {\n open: true,\n },\n },\n items: [\n // First Row\n {\n x: 0,\n y: 0,\n width: 12,\n height: 4,\n content: { $ref: '#/spec/panels/cpu' },\n },\n {\n x: 0,\n y: 5,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/diskIO' },\n },\n ],\n },\n },\n // No title,\n {\n kind: 'Grid',\n spec: {\n items: [\n {\n x: 0,\n y: 0,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/diskIO' },\n },\n {\n x: 8,\n y: 0,\n width: 8,\n height: 3,\n content: { $ref: '#/spec/panels/memory' },\n },\n ],\n },\n },\n // Collapsed\n {\n kind: 'Grid',\n spec: {\n display: {\n title: 'Disk Stats',\n collapse: {\n open: false,\n },\n },\n items: [\n {\n x: 18,\n y: 0,\n width: 6,\n height: 2,\n content: { $ref: '#/spec/panels/filesystemFullness' },\n },\n ],\n },\n },\n ],\n },\n};\n\nexport default testDashboard;\n"],"names":["testDashboard","kind","metadata","name","project","createdAt","updatedAt","version","spec","duration","refreshInterval","variables","value","panels","cpu","display","plugin","format","unit","queries","query","memory","diskIO","filesystemFullness","layouts","title","collapse","open","items","x","y","width","height","content","$ref"],"mappings":"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"}
@@ -1,19 +1,21 @@
1
1
  import { ReactElement, ReactNode } from 'react';
2
2
  import { DashboardSpec } from '@perses-dev/spec';
3
+ import { DashboardResource } from '@perses-dev/client';
3
4
  import { EmptyDashboardProps } from '../../components';
4
5
  import { OnSaveDashboard } from '../../context';
5
- import { DashboardResource } from '../../model';
6
6
  export interface DashboardAppProps {
7
7
  dashboardResource: DashboardResource;
8
8
  emptyDashboardProps?: Partial<EmptyDashboardProps>;
9
9
  isReadonly: boolean;
10
10
  isVariableEnabled: boolean;
11
+ isAnnotationEnabled: boolean;
11
12
  isDatasourceEnabled: boolean;
12
13
  disableShortcuts?: boolean;
13
14
  isCreating?: boolean;
14
15
  isInitialVariableSticky?: boolean;
15
16
  isLeavingConfirmDialogEnabled?: boolean;
16
17
  dashboardTitleComponent?: ReactNode;
18
+ userPreferenceTimezone?: DashboardSpec['timezone'];
17
19
  onSave?: OnSaveDashboard;
18
20
  onDiscard?: (name: string, spec: DashboardSpec) => void;
19
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardApp.d.ts","sourceRoot":"","sources":["../../../src/views/ViewDashboard/DashboardApp.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAI1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EASL,mBAAmB,EAIpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAkE,MAAM,eAAe,CAAC;AAEhH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,uBAAuB,CAAC,EAAE,SAAS,CAAC;IACpC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,YAMvD,CAAC"}
1
+ {"version":3,"file":"DashboardApp.d.ts","sourceRoot":"","sources":["../../../src/views/ViewDashboard/DashboardApp.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAqB,MAAM,OAAO,CAAC;AAInE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EASL,mBAAmB,EAIpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAkE,MAAM,eAAe,CAAC;AAGhH,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnD,UAAU,EAAE,OAAO,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,uBAAuB,CAAC,EAAE,SAAS,CAAC;IACpC,sBAAsB,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;CACzD;AAED,eAAO,MAAM,YAAY,UAAW,iBAAiB,KAAG,YAMvD,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  // Copyright The Perses Authors
2
3
  // Licensed under the Apache License, Version 2.0 (the "License");
3
4
  // you may not use this file except in compliance with the License.
@@ -10,8 +11,7 @@
10
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
12
  // See the License for the specific language governing permissions and
12
13
  // limitations under the License.
13
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
- import { useState } from 'react';
14
+ import { useMemo, useState } from 'react';
15
15
  import { Box } from '@mui/material';
16
16
  import { ChartsProvider, ErrorAlert, ErrorBoundary, useChartsTheme } from '@perses-dev/components';
17
17
  import { useDatasourceStore } from '@perses-dev/plugin-system';
@@ -26,7 +26,7 @@ export const DashboardApp = (props)=>{
26
26
  });
27
27
  };
28
28
  const DashboardAppContent = (props)=>{
29
- const { dashboardResource, emptyDashboardProps, isReadonly, isVariableEnabled, isDatasourceEnabled, disableShortcuts, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, onSave, onDiscard } = props;
29
+ const { dashboardResource, emptyDashboardProps, isReadonly, isVariableEnabled, isAnnotationEnabled, isDatasourceEnabled, disableShortcuts, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, userPreferenceTimezone, onSave, onDiscard } = props;
30
30
  const chartsTheme = useChartsTheme();
31
31
  const { isEditMode, setEditMode } = useEditMode();
32
32
  const { dashboard, setDashboard } = useDashboard();
@@ -71,6 +71,12 @@ const DashboardAppContent = (props)=>{
71
71
  onCancelButtonClick,
72
72
  disabled: disableShortcuts
73
73
  });
74
+ const toolBarTimezone = useMemo(()=>{
75
+ return dashboardResource.spec.timezone || userPreferenceTimezone || 'local';
76
+ }, [
77
+ dashboardResource.spec,
78
+ userPreferenceTimezone
79
+ ]);
74
80
  return /*#__PURE__*/ _jsxs(Box, {
75
81
  sx: {
76
82
  flexGrow: 1,
@@ -82,11 +88,13 @@ const DashboardAppContent = (props)=>{
82
88
  children: [
83
89
  /*#__PURE__*/ _jsx(DashboardToolbar, {
84
90
  dashboardName: dashboardResource.metadata.name,
91
+ timezone: toolBarTimezone,
85
92
  dashboardTitleComponent: dashboardTitleComponent,
86
93
  initialVariableIsSticky: isInitialVariableSticky,
87
94
  onSave: onSave,
88
95
  isReadonly: isReadonly,
89
96
  isVariableEnabled: isVariableEnabled,
97
+ isAnnotationEnabled: isAnnotationEnabled,
90
98
  isDatasourceEnabled: isDatasourceEnabled,
91
99
  onEditButtonClick: onEditButtonClick,
92
100
  onCancelButtonClick: onCancelButtonClick
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/views/ViewDashboard/DashboardApp.tsx"],"sourcesContent":["// Copyright 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 { ReactElement, ReactNode, useState } from 'react';\nimport { Box } from '@mui/material';\nimport { ChartsProvider, ErrorAlert, ErrorBoundary, useChartsTheme } from '@perses-dev/components';\nimport { useDatasourceStore } from '@perses-dev/plugin-system';\nimport { DashboardSpec } from '@perses-dev/spec';\nimport {\n PanelDrawer,\n Dashboard,\n useDashboardShortcuts,\n PanelGroupDialog,\n DeletePanelGroupDialog,\n DashboardDiscardChangesConfirmationDialog,\n DashboardToolbar,\n DeletePanelDialog,\n EmptyDashboardProps,\n EditJsonDialog,\n SaveChangesConfirmationDialog,\n LeaveDialog,\n} from '../../components';\nimport { OnSaveDashboard, useDashboard, useDiscardChangesConfirmationDialog, useEditMode } from '../../context';\nimport { PanelFocusProvider } from '../../keyboard-shortcuts';\nimport { DashboardResource } from '../../model';\n\nexport interface DashboardAppProps {\n dashboardResource: DashboardResource;\n emptyDashboardProps?: Partial<EmptyDashboardProps>;\n isReadonly: boolean;\n isVariableEnabled: boolean;\n isDatasourceEnabled: boolean;\n disableShortcuts?: boolean;\n isCreating?: boolean;\n isInitialVariableSticky?: boolean;\n // If true, browser confirmation dialog will be shown when navigating away with unsaved changes (closing tab, ...).\n isLeavingConfirmDialogEnabled?: boolean;\n dashboardTitleComponent?: ReactNode;\n onSave?: OnSaveDashboard;\n onDiscard?: (name: string, spec: DashboardSpec) => void;\n}\n\nexport const DashboardApp = (props: DashboardAppProps): ReactElement => {\n return (\n <PanelFocusProvider>\n <DashboardAppContent {...props} />\n </PanelFocusProvider>\n );\n};\n\nconst DashboardAppContent = (props: DashboardAppProps): ReactElement => {\n const {\n dashboardResource,\n emptyDashboardProps,\n isReadonly,\n isVariableEnabled,\n isDatasourceEnabled,\n disableShortcuts,\n isCreating,\n isInitialVariableSticky,\n isLeavingConfirmDialogEnabled,\n dashboardTitleComponent,\n onSave,\n onDiscard,\n } = props;\n\n const chartsTheme = useChartsTheme();\n\n const { isEditMode, setEditMode } = useEditMode();\n\n const { dashboard, setDashboard } = useDashboard();\n const [originalDashboard, setOriginalDashboard] = useState<DashboardResource | undefined>(undefined);\n\n const { setSavedDatasources } = useDatasourceStore();\n\n const { openDiscardChangesConfirmationDialog, closeDiscardChangesConfirmationDialog } =\n useDiscardChangesConfirmationDialog();\n\n const handleDiscardChanges = (): void => {\n // Reset to the original spec and exit edit mode\n if (originalDashboard) {\n setDashboard(originalDashboard);\n }\n setEditMode(false);\n closeDiscardChangesConfirmationDialog();\n if (onDiscard) {\n onDiscard(dashboard.metadata.name, dashboard.spec);\n }\n };\n\n const onEditButtonClick = (): void => {\n setEditMode(true);\n setOriginalDashboard(dashboard);\n setSavedDatasources(dashboard.spec.datasources ?? {});\n };\n\n const onCancelButtonClick = (): void => {\n // check if dashboard has been modified\n if (JSON.stringify(dashboard) === JSON.stringify(originalDashboard)) {\n setEditMode(false);\n } else {\n openDiscardChangesConfirmationDialog({\n onDiscardChanges: () => {\n handleDiscardChanges();\n },\n onCancel: () => {\n closeDiscardChangesConfirmationDialog();\n },\n });\n }\n };\n\n useDashboardShortcuts({\n onSave,\n isReadonly,\n onEditButtonClick,\n onCancelButtonClick,\n disabled: disableShortcuts,\n });\n\n return (\n <Box\n sx={{\n flexGrow: 1,\n overflowX: 'hidden',\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <DashboardToolbar\n dashboardName={dashboardResource.metadata.name}\n dashboardTitleComponent={dashboardTitleComponent}\n initialVariableIsSticky={isInitialVariableSticky}\n onSave={onSave}\n isReadonly={isReadonly}\n isVariableEnabled={isVariableEnabled}\n isDatasourceEnabled={isDatasourceEnabled}\n onEditButtonClick={onEditButtonClick}\n onCancelButtonClick={onCancelButtonClick}\n />\n <Box sx={{ paddingTop: 2, paddingX: 2, height: '100%' }}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <Dashboard\n emptyDashboardProps={{\n onEditButtonClick,\n ...emptyDashboardProps,\n }}\n />\n </ErrorBoundary>\n <ChartsProvider chartsTheme={chartsTheme} enablePinning={false} enableSyncGrouping={false}>\n <PanelDrawer />\n </ChartsProvider>\n <PanelGroupDialog />\n <DeletePanelGroupDialog />\n <DeletePanelDialog />\n <DashboardDiscardChangesConfirmationDialog />\n <EditJsonDialog isReadonly={!isEditMode} disableMetadataEdition={!isCreating} />\n <SaveChangesConfirmationDialog />\n {isLeavingConfirmDialogEnabled && isEditMode && (\n <LeaveDialog original={originalDashboard} current={dashboard} />\n )}\n </Box>\n </Box>\n );\n};\n"],"names":["useState","Box","ChartsProvider","ErrorAlert","ErrorBoundary","useChartsTheme","useDatasourceStore","PanelDrawer","Dashboard","useDashboardShortcuts","PanelGroupDialog","DeletePanelGroupDialog","DashboardDiscardChangesConfirmationDialog","DashboardToolbar","DeletePanelDialog","EditJsonDialog","SaveChangesConfirmationDialog","LeaveDialog","useDashboard","useDiscardChangesConfirmationDialog","useEditMode","PanelFocusProvider","DashboardApp","props","DashboardAppContent","dashboardResource","emptyDashboardProps","isReadonly","isVariableEnabled","isDatasourceEnabled","disableShortcuts","isCreating","isInitialVariableSticky","isLeavingConfirmDialogEnabled","dashboardTitleComponent","onSave","onDiscard","chartsTheme","isEditMode","setEditMode","dashboard","setDashboard","originalDashboard","setOriginalDashboard","undefined","setSavedDatasources","openDiscardChangesConfirmationDialog","closeDiscardChangesConfirmationDialog","handleDiscardChanges","metadata","name","spec","onEditButtonClick","datasources","onCancelButtonClick","JSON","stringify","onDiscardChanges","onCancel","disabled","sx","flexGrow","overflowX","overflowY","display","flexDirection","dashboardName","initialVariableIsSticky","paddingTop","paddingX","height","FallbackComponent","enablePinning","enableSyncGrouping","disableMetadataEdition","original","current"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/views/ViewDashboard/DashboardApp.tsx"],"sourcesContent":["// Copyright 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 { ReactElement, ReactNode, useMemo, useState } from 'react';\nimport { Box } from '@mui/material';\nimport { ChartsProvider, ErrorAlert, ErrorBoundary, useChartsTheme } from '@perses-dev/components';\nimport { useDatasourceStore } from '@perses-dev/plugin-system';\nimport { DashboardSpec } from '@perses-dev/spec';\nimport { DashboardResource } from '@perses-dev/client';\nimport {\n PanelDrawer,\n Dashboard,\n useDashboardShortcuts,\n PanelGroupDialog,\n DeletePanelGroupDialog,\n DashboardDiscardChangesConfirmationDialog,\n DashboardToolbar,\n DeletePanelDialog,\n EmptyDashboardProps,\n EditJsonDialog,\n SaveChangesConfirmationDialog,\n LeaveDialog,\n} from '../../components';\nimport { OnSaveDashboard, useDashboard, useDiscardChangesConfirmationDialog, useEditMode } from '../../context';\nimport { PanelFocusProvider } from '../../keyboard-shortcuts';\n\nexport interface DashboardAppProps {\n dashboardResource: DashboardResource;\n emptyDashboardProps?: Partial<EmptyDashboardProps>;\n isReadonly: boolean;\n isVariableEnabled: boolean;\n isAnnotationEnabled: boolean;\n isDatasourceEnabled: boolean;\n disableShortcuts?: boolean;\n isCreating?: boolean;\n isInitialVariableSticky?: boolean;\n // If true, browser confirmation dialog will be shown when navigating away with unsaved changes (closing tab, ...).\n isLeavingConfirmDialogEnabled?: boolean;\n dashboardTitleComponent?: ReactNode;\n userPreferenceTimezone?: DashboardSpec['timezone'];\n onSave?: OnSaveDashboard;\n onDiscard?: (name: string, spec: DashboardSpec) => void;\n}\n\nexport const DashboardApp = (props: DashboardAppProps): ReactElement => {\n return (\n <PanelFocusProvider>\n <DashboardAppContent {...props} />\n </PanelFocusProvider>\n );\n};\n\nconst DashboardAppContent = (props: DashboardAppProps): ReactElement => {\n const {\n dashboardResource,\n emptyDashboardProps,\n isReadonly,\n isVariableEnabled,\n isAnnotationEnabled,\n isDatasourceEnabled,\n disableShortcuts,\n isCreating,\n isInitialVariableSticky,\n isLeavingConfirmDialogEnabled,\n dashboardTitleComponent,\n userPreferenceTimezone,\n onSave,\n onDiscard,\n } = props;\n\n const chartsTheme = useChartsTheme();\n\n const { isEditMode, setEditMode } = useEditMode();\n\n const { dashboard, setDashboard } = useDashboard();\n const [originalDashboard, setOriginalDashboard] = useState<DashboardResource | undefined>(undefined);\n\n const { setSavedDatasources } = useDatasourceStore();\n\n const { openDiscardChangesConfirmationDialog, closeDiscardChangesConfirmationDialog } =\n useDiscardChangesConfirmationDialog();\n\n const handleDiscardChanges = (): void => {\n // Reset to the original spec and exit edit mode\n if (originalDashboard) {\n setDashboard(originalDashboard);\n }\n setEditMode(false);\n closeDiscardChangesConfirmationDialog();\n if (onDiscard) {\n onDiscard(dashboard.metadata.name, dashboard.spec);\n }\n };\n\n const onEditButtonClick = (): void => {\n setEditMode(true);\n setOriginalDashboard(dashboard);\n setSavedDatasources(dashboard.spec.datasources ?? {});\n };\n\n const onCancelButtonClick = (): void => {\n // check if dashboard has been modified\n if (JSON.stringify(dashboard) === JSON.stringify(originalDashboard)) {\n setEditMode(false);\n } else {\n openDiscardChangesConfirmationDialog({\n onDiscardChanges: () => {\n handleDiscardChanges();\n },\n onCancel: () => {\n closeDiscardChangesConfirmationDialog();\n },\n });\n }\n };\n\n useDashboardShortcuts({\n onSave,\n isReadonly,\n onEditButtonClick,\n onCancelButtonClick,\n disabled: disableShortcuts,\n });\n\n const toolBarTimezone = useMemo((): string => {\n return dashboardResource.spec.timezone || userPreferenceTimezone || 'local';\n }, [dashboardResource.spec, userPreferenceTimezone]);\n\n return (\n <Box\n sx={{\n flexGrow: 1,\n overflowX: 'hidden',\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <DashboardToolbar\n dashboardName={dashboardResource.metadata.name}\n timezone={toolBarTimezone}\n dashboardTitleComponent={dashboardTitleComponent}\n initialVariableIsSticky={isInitialVariableSticky}\n onSave={onSave}\n isReadonly={isReadonly}\n isVariableEnabled={isVariableEnabled}\n isAnnotationEnabled={isAnnotationEnabled}\n isDatasourceEnabled={isDatasourceEnabled}\n onEditButtonClick={onEditButtonClick}\n onCancelButtonClick={onCancelButtonClick}\n />\n <Box sx={{ paddingTop: 2, paddingX: 2, height: '100%' }}>\n <ErrorBoundary FallbackComponent={ErrorAlert}>\n <Dashboard\n emptyDashboardProps={{\n onEditButtonClick,\n ...emptyDashboardProps,\n }}\n />\n </ErrorBoundary>\n <ChartsProvider chartsTheme={chartsTheme} enablePinning={false} enableSyncGrouping={false}>\n <PanelDrawer />\n </ChartsProvider>\n <PanelGroupDialog />\n <DeletePanelGroupDialog />\n <DeletePanelDialog />\n <DashboardDiscardChangesConfirmationDialog />\n <EditJsonDialog isReadonly={!isEditMode} disableMetadataEdition={!isCreating} />\n <SaveChangesConfirmationDialog />\n {isLeavingConfirmDialogEnabled && isEditMode && (\n <LeaveDialog original={originalDashboard} current={dashboard} />\n )}\n </Box>\n </Box>\n );\n};\n"],"names":["useMemo","useState","Box","ChartsProvider","ErrorAlert","ErrorBoundary","useChartsTheme","useDatasourceStore","PanelDrawer","Dashboard","useDashboardShortcuts","PanelGroupDialog","DeletePanelGroupDialog","DashboardDiscardChangesConfirmationDialog","DashboardToolbar","DeletePanelDialog","EditJsonDialog","SaveChangesConfirmationDialog","LeaveDialog","useDashboard","useDiscardChangesConfirmationDialog","useEditMode","PanelFocusProvider","DashboardApp","props","DashboardAppContent","dashboardResource","emptyDashboardProps","isReadonly","isVariableEnabled","isAnnotationEnabled","isDatasourceEnabled","disableShortcuts","isCreating","isInitialVariableSticky","isLeavingConfirmDialogEnabled","dashboardTitleComponent","userPreferenceTimezone","onSave","onDiscard","chartsTheme","isEditMode","setEditMode","dashboard","setDashboard","originalDashboard","setOriginalDashboard","undefined","setSavedDatasources","openDiscardChangesConfirmationDialog","closeDiscardChangesConfirmationDialog","handleDiscardChanges","metadata","name","spec","onEditButtonClick","datasources","onCancelButtonClick","JSON","stringify","onDiscardChanges","onCancel","disabled","toolBarTimezone","timezone","sx","flexGrow","overflowX","overflowY","display","flexDirection","dashboardName","initialVariableIsSticky","paddingTop","paddingX","height","FallbackComponent","enablePinning","enableSyncGrouping","disableMetadataEdition","original","current"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ViewDashboard.d.ts","sourceRoot":"","sources":["../../../src/views/ViewDashboard/ViewDashboard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAO,QAAQ,EAAE,MAAM,eAAe,CAAC;AAS9C,OAAO,EAAE,YAAY,EAAW,MAAM,OAAO,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAE5B,qBAAqB,EAEtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,iBAAiB;IACvF,aAAa,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAC7D,2BAA2B,CAAC,EAAE,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAkHrE"}
1
+ {"version":3,"file":"ViewDashboard.d.ts","sourceRoot":"","sources":["../../../src/views/ViewDashboard/ViewDashboard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAO,QAAQ,EAAE,MAAM,eAAe,CAAC;AAS9C,OAAO,EAAE,YAAY,EAAW,MAAM,OAAO,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAE5B,qBAAqB,EAGtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,iBAAiB;IACvF,aAAa,EAAE,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAC7D,2BAA2B,CAAC,EAAE,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;IACnF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAwHrE"}