@perses-dev/dashboards 0.54.0-beta.8 → 0.54.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +2 -2
- package/dist/cjs/components/GridLayout/GridItemContent.js +2 -9
- package/dist/cjs/components/PanelDrawer/PanelEditorForm.js +1 -1
- package/dist/cjs/components/PanelDrawer/PanelQueriesSharedControls.js +3 -16
- package/dist/cjs/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +20 -3
- package/dist/cjs/context/DashboardProvider/DashboardProvider.js +9 -2
- package/dist/cjs/context/DashboardProvider/use-save-dashboard.js +12 -4
- package/dist/cjs/context/VariableProvider/VariableProvider.js +1 -0
- package/dist/cjs/context/useDashboard.js +3 -1
- package/dist/cjs/views/ViewDashboard/DashboardApp.js +8 -1
- package/dist/cjs/views/ViewDashboard/ViewDashboard.js +3 -2
- package/dist/components/DashboardToolbar/DashboardToolbar.d.ts +1 -0
- package/dist/components/DashboardToolbar/DashboardToolbar.d.ts.map +1 -1
- package/dist/components/DashboardToolbar/DashboardToolbar.js +2 -2
- package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
- package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
- package/dist/components/GridLayout/GridItemContent.js +2 -9
- package/dist/components/GridLayout/GridItemContent.js.map +1 -1
- package/dist/components/GridLayout/GridLayout.d.ts +1 -1
- package/dist/components/GridLayout/GridLayout.d.ts.map +1 -1
- package/dist/components/GridLayout/GridLayout.js.map +1 -1
- package/dist/components/GridLayout/GridTitle.d.ts +1 -1
- package/dist/components/GridLayout/GridTitle.d.ts.map +1 -1
- package/dist/components/GridLayout/GridTitle.js.map +1 -1
- package/dist/components/GridLayout/Row.d.ts +1 -1
- package/dist/components/GridLayout/Row.d.ts.map +1 -1
- package/dist/components/GridLayout/Row.js.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.js +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.d.ts +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.js +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
- package/dist/components/PanelDrawer/PanelPreview.d.ts +1 -1
- package/dist/components/PanelDrawer/PanelPreview.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelPreview.js.map +1 -1
- package/dist/components/PanelDrawer/PanelQueriesSharedControls.d.ts +2 -1
- package/dist/components/PanelDrawer/PanelQueriesSharedControls.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelQueriesSharedControls.js +4 -17
- package/dist/components/PanelDrawer/PanelQueriesSharedControls.js.map +1 -1
- package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.d.ts.map +1 -1
- package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +21 -4
- package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js.map +1 -1
- package/dist/context/DashboardProvider/DashboardProvider.d.ts +2 -0
- package/dist/context/DashboardProvider/DashboardProvider.d.ts.map +1 -1
- package/dist/context/DashboardProvider/DashboardProvider.js +9 -2
- package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
- package/dist/context/DashboardProvider/dashboard-provider-api.d.ts +2 -1
- package/dist/context/DashboardProvider/dashboard-provider-api.d.ts.map +1 -1
- package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
- package/dist/context/DashboardProvider/delete-panel-group-slice.d.ts +1 -1
- package/dist/context/DashboardProvider/delete-panel-group-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/delete-panel-group-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-slice.d.ts +2 -1
- package/dist/context/DashboardProvider/panel-group-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
- package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts +8 -1
- package/dist/context/DashboardProvider/save-changes-dialog-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/save-changes-dialog-slice.js.map +1 -1
- package/dist/context/DashboardProvider/use-save-dashboard.d.ts.map +1 -1
- package/dist/context/DashboardProvider/use-save-dashboard.js +13 -5
- package/dist/context/DashboardProvider/use-save-dashboard.js.map +1 -1
- package/dist/context/DashboardProvider/view-panel-slice.js.map +1 -1
- package/dist/context/VariableProvider/VariableProvider.d.ts.map +1 -1
- package/dist/context/VariableProvider/VariableProvider.js +1 -0
- package/dist/context/VariableProvider/VariableProvider.js.map +1 -1
- package/dist/context/useDashboard.d.ts.map +1 -1
- package/dist/context/useDashboard.js +3 -1
- package/dist/context/useDashboard.js.map +1 -1
- package/dist/model/PanelGroupDefinition.d.ts +1 -1
- package/dist/model/PanelGroupDefinition.d.ts.map +1 -1
- package/dist/model/PanelGroupDefinition.js.map +1 -1
- package/dist/views/ViewDashboard/DashboardApp.d.ts +1 -0
- package/dist/views/ViewDashboard/DashboardApp.d.ts.map +1 -1
- package/dist/views/ViewDashboard/DashboardApp.js +9 -2
- package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.js +3 -2
- package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
- package/package.json +5 -5
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
import { useCallback, useState } from 'react';
|
|
14
14
|
import { isRelativeTimeRange } from '@perses-dev/spec';
|
|
15
|
-
import { useTimeRange } from '@perses-dev/plugin-system';
|
|
15
|
+
import { useTimeRange, useTimeZoneParams } from '@perses-dev/plugin-system';
|
|
16
16
|
import { useVariableDefinitionActions } from '../VariableProvider/VariableProvider';
|
|
17
17
|
import { useDashboard } from '../useDashboard';
|
|
18
18
|
import { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provider-api';
|
|
@@ -30,6 +30,7 @@ import { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provi
|
|
|
30
30
|
const { dashboard, setDashboard } = useDashboard();
|
|
31
31
|
const { setEditMode } = useEditMode();
|
|
32
32
|
const { timeRange, refreshInterval } = useTimeRange();
|
|
33
|
+
const { timeZone } = useTimeZoneParams();
|
|
33
34
|
const { getSavedVariablesStatus, setVariableDefaultValues } = useVariableDefinitionActions();
|
|
34
35
|
const { openSaveChangesConfirmationDialog, closeSaveChangesConfirmationDialog } = useSaveChangesConfirmationDialog();
|
|
35
36
|
const performSave = useCallback(async ()=>{
|
|
@@ -58,12 +59,17 @@ import { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provi
|
|
|
58
59
|
const { isSavedVariableModified } = getSavedVariablesStatus();
|
|
59
60
|
const isSavedDurationModified = isRelativeTimeRange(timeRange) && dashboard.spec.duration !== timeRange.pastDuration;
|
|
60
61
|
const isSavedRefreshIntervalModified = dashboard.spec.refreshInterval !== refreshInterval;
|
|
61
|
-
|
|
62
|
+
const isTimeZoneModified = timeZone === 'local' && !dashboard.spec.timezone ? false : dashboard.spec.timezone !== timeZone;
|
|
63
|
+
if (isSavedDurationModified || isSavedVariableModified || isSavedRefreshIntervalModified || isTimeZoneModified) {
|
|
62
64
|
openSaveChangesConfirmationDialog({
|
|
63
|
-
onSaveChanges: (
|
|
65
|
+
onSaveChanges: (options)=>{
|
|
66
|
+
const { saveDefaultRefreshInterval, saveDefaultTimeRange, saveDefaultTimeZone, saveDefaultVariables } = options;
|
|
64
67
|
if (isRelativeTimeRange(timeRange) && saveDefaultTimeRange) {
|
|
65
68
|
dashboard.spec.duration = timeRange.pastDuration;
|
|
66
69
|
}
|
|
70
|
+
if (saveDefaultTimeZone) {
|
|
71
|
+
dashboard.spec.timezone = timeZone;
|
|
72
|
+
}
|
|
67
73
|
if (saveDefaultVariables) {
|
|
68
74
|
const variables = setVariableDefaultValues();
|
|
69
75
|
dashboard.spec.variables = variables;
|
|
@@ -79,17 +85,19 @@ import { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provi
|
|
|
79
85
|
},
|
|
80
86
|
isSavedDurationModified,
|
|
81
87
|
isSavedVariableModified,
|
|
82
|
-
isSavedRefreshIntervalModified
|
|
88
|
+
isSavedRefreshIntervalModified,
|
|
89
|
+
isTimeZoneModified
|
|
83
90
|
});
|
|
84
91
|
} else {
|
|
85
92
|
performSave();
|
|
86
93
|
}
|
|
87
94
|
}, [
|
|
88
95
|
isSaving,
|
|
89
|
-
getSavedVariablesStatus,
|
|
90
96
|
timeRange,
|
|
91
97
|
dashboard,
|
|
92
98
|
refreshInterval,
|
|
99
|
+
timeZone,
|
|
100
|
+
getSavedVariablesStatus,
|
|
93
101
|
openSaveChangesConfirmationDialog,
|
|
94
102
|
setVariableDefaultValues,
|
|
95
103
|
setDashboard,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/DashboardProvider/use-save-dashboard.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 { useCallback, useState } from 'react';\nimport { isRelativeTimeRange } from '@perses-dev/spec';\nimport { useTimeRange } from '@perses-dev/plugin-system';\nimport { useVariableDefinitionActions } from '../VariableProvider/VariableProvider';\nimport { useDashboard } from '../useDashboard';\nimport { OnSaveDashboard } from './common';\nimport { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provider-api';\n\nexport interface SaveDashboardResult {\n /**\n * Triggers the save flow. If time range, refresh interval, or variable defaults have been\n * modified, opens the SaveChangesConfirmationDialog before saving. Otherwise saves directly.\n * Includes a concurrent-save guard to prevent duplicate saves.\n */\n saveDashboard: () => void;\n\n /**\n * Whether a save operation is currently in progress.\n */\n isSaving: boolean;\n}\n\n/**\n * Hook that encapsulates the full save-dashboard flow, including:\n * - Checking for modified defaults (time range, refresh interval, variables)\n * - Opening the SaveChangesConfirmationDialog when defaults have changed\n * - Saving directly when no confirmation is needed\n * - Preventing concurrent saves via an `isSaving` guard\n * - Exiting edit mode after a successful save\n *\n * Used by both SaveDashboardButton and DashboardShortcuts to ensure consistent save behavior.\n */\nexport function useSaveDashboard(onSave?: OnSaveDashboard): SaveDashboardResult {\n const [isSaving, setSaving] = useState(false);\n const { dashboard, setDashboard } = useDashboard();\n const { setEditMode } = useEditMode();\n const { timeRange, refreshInterval } = useTimeRange();\n const { getSavedVariablesStatus, setVariableDefaultValues } = useVariableDefinitionActions();\n const { openSaveChangesConfirmationDialog, closeSaveChangesConfirmationDialog } = useSaveChangesConfirmationDialog();\n
|
|
1
|
+
{"version":3,"sources":["../../../src/context/DashboardProvider/use-save-dashboard.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 { useCallback, useState } from 'react';\nimport { isRelativeTimeRange } from '@perses-dev/spec';\nimport { useTimeRange, useTimeZoneParams } from '@perses-dev/plugin-system';\nimport { useVariableDefinitionActions } from '../VariableProvider/VariableProvider';\nimport { useDashboard } from '../useDashboard';\nimport { OnSaveDashboard } from './common';\nimport { useEditMode, useSaveChangesConfirmationDialog } from './dashboard-provider-api';\nimport { SaveChangesConfirmationDialogOptions } from './save-changes-dialog-slice';\n\nexport interface SaveDashboardResult {\n /**\n * Triggers the save flow. If time range, refresh interval, or variable defaults have been\n * modified, opens the SaveChangesConfirmationDialog before saving. Otherwise saves directly.\n * Includes a concurrent-save guard to prevent duplicate saves.\n */\n saveDashboard: () => void;\n\n /**\n * Whether a save operation is currently in progress.\n */\n isSaving: boolean;\n}\n\n/**\n * Hook that encapsulates the full save-dashboard flow, including:\n * - Checking for modified defaults (time range, refresh interval, variables)\n * - Opening the SaveChangesConfirmationDialog when defaults have changed\n * - Saving directly when no confirmation is needed\n * - Preventing concurrent saves via an `isSaving` guard\n * - Exiting edit mode after a successful save\n *\n * Used by both SaveDashboardButton and DashboardShortcuts to ensure consistent save behavior.\n */\nexport function useSaveDashboard(onSave?: OnSaveDashboard): SaveDashboardResult {\n const [isSaving, setSaving] = useState(false);\n const { dashboard, setDashboard } = useDashboard();\n const { setEditMode } = useEditMode();\n const { timeRange, refreshInterval } = useTimeRange();\n const { timeZone } = useTimeZoneParams();\n const { getSavedVariablesStatus, setVariableDefaultValues } = useVariableDefinitionActions();\n const { openSaveChangesConfirmationDialog, closeSaveChangesConfirmationDialog } = useSaveChangesConfirmationDialog();\n const performSave = useCallback(async (): Promise<void> => {\n if (!onSave) {\n setEditMode(false);\n return;\n }\n\n try {\n setSaving(true);\n await onSave(dashboard);\n closeSaveChangesConfirmationDialog();\n setEditMode(false);\n } finally {\n setSaving(false);\n }\n }, [closeSaveChangesConfirmationDialog, dashboard, onSave, setEditMode]);\n\n const saveDashboard = useCallback((): void => {\n if (isSaving) {\n return;\n }\n\n const { isSavedVariableModified } = getSavedVariablesStatus();\n const isSavedDurationModified =\n isRelativeTimeRange(timeRange) && dashboard.spec.duration !== timeRange.pastDuration;\n const isSavedRefreshIntervalModified = dashboard.spec.refreshInterval !== refreshInterval;\n const isTimeZoneModified =\n timeZone === 'local' && !dashboard.spec.timezone ? false : dashboard.spec.timezone !== timeZone;\n\n if (isSavedDurationModified || isSavedVariableModified || isSavedRefreshIntervalModified || isTimeZoneModified) {\n openSaveChangesConfirmationDialog({\n onSaveChanges: (options: SaveChangesConfirmationDialogOptions) => {\n const { saveDefaultRefreshInterval, saveDefaultTimeRange, saveDefaultTimeZone, saveDefaultVariables } =\n options;\n if (isRelativeTimeRange(timeRange) && saveDefaultTimeRange) {\n dashboard.spec.duration = timeRange.pastDuration;\n }\n if (saveDefaultTimeZone) {\n dashboard.spec.timezone = timeZone;\n }\n if (saveDefaultVariables) {\n const variables = setVariableDefaultValues();\n dashboard.spec.variables = variables;\n }\n if (saveDefaultRefreshInterval && isSavedRefreshIntervalModified) {\n dashboard.spec.refreshInterval = refreshInterval;\n }\n setDashboard(dashboard);\n performSave();\n },\n onCancel: () => {\n closeSaveChangesConfirmationDialog();\n },\n isSavedDurationModified,\n isSavedVariableModified,\n isSavedRefreshIntervalModified,\n isTimeZoneModified,\n });\n } else {\n performSave();\n }\n }, [\n isSaving,\n timeRange,\n dashboard,\n refreshInterval,\n timeZone,\n getSavedVariablesStatus,\n openSaveChangesConfirmationDialog,\n setVariableDefaultValues,\n setDashboard,\n performSave,\n closeSaveChangesConfirmationDialog,\n ]);\n\n return { saveDashboard, isSaving };\n}\n"],"names":["useCallback","useState","isRelativeTimeRange","useTimeRange","useTimeZoneParams","useVariableDefinitionActions","useDashboard","useEditMode","useSaveChangesConfirmationDialog","useSaveDashboard","onSave","isSaving","setSaving","dashboard","setDashboard","setEditMode","timeRange","refreshInterval","timeZone","getSavedVariablesStatus","setVariableDefaultValues","openSaveChangesConfirmationDialog","closeSaveChangesConfirmationDialog","performSave","saveDashboard","isSavedVariableModified","isSavedDurationModified","spec","duration","pastDuration","isSavedRefreshIntervalModified","isTimeZoneModified","timezone","onSaveChanges","options","saveDefaultRefreshInterval","saveDefaultTimeRange","saveDefaultTimeZone","saveDefaultVariables","variables","onCancel"],"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,WAAW,EAAEC,QAAQ,QAAQ,QAAQ;AAC9C,SAASC,mBAAmB,QAAQ,mBAAmB;AACvD,SAASC,YAAY,EAAEC,iBAAiB,QAAQ,4BAA4B;AAC5E,SAASC,4BAA4B,QAAQ,uCAAuC;AACpF,SAASC,YAAY,QAAQ,kBAAkB;AAE/C,SAASC,WAAW,EAAEC,gCAAgC,QAAQ,2BAA2B;AAiBzF;;;;;;;;;CASC,GACD,OAAO,SAASC,iBAAiBC,MAAwB;IACvD,MAAM,CAACC,UAAUC,UAAU,GAAGX,SAAS;IACvC,MAAM,EAAEY,SAAS,EAAEC,YAAY,EAAE,GAAGR;IACpC,MAAM,EAAES,WAAW,EAAE,GAAGR;IACxB,MAAM,EAAES,SAAS,EAAEC,eAAe,EAAE,GAAGd;IACvC,MAAM,EAAEe,QAAQ,EAAE,GAAGd;IACrB,MAAM,EAAEe,uBAAuB,EAAEC,wBAAwB,EAAE,GAAGf;IAC9D,MAAM,EAAEgB,iCAAiC,EAAEC,kCAAkC,EAAE,GAAGd;IAClF,MAAMe,cAAcvB,YAAY;QAC9B,IAAI,CAACU,QAAQ;YACXK,YAAY;YACZ;QACF;QAEA,IAAI;YACFH,UAAU;YACV,MAAMF,OAAOG;YACbS;YACAP,YAAY;QACd,SAAU;YACRH,UAAU;QACZ;IACF,GAAG;QAACU;QAAoCT;QAAWH;QAAQK;KAAY;IAEvE,MAAMS,gBAAgBxB,YAAY;QAChC,IAAIW,UAAU;YACZ;QACF;QAEA,MAAM,EAAEc,uBAAuB,EAAE,GAAGN;QACpC,MAAMO,0BACJxB,oBAAoBc,cAAcH,UAAUc,IAAI,CAACC,QAAQ,KAAKZ,UAAUa,YAAY;QACtF,MAAMC,iCAAiCjB,UAAUc,IAAI,CAACV,eAAe,KAAKA;QAC1E,MAAMc,qBACJb,aAAa,WAAW,CAACL,UAAUc,IAAI,CAACK,QAAQ,GAAG,QAAQnB,UAAUc,IAAI,CAACK,QAAQ,KAAKd;QAEzF,IAAIQ,2BAA2BD,2BAA2BK,kCAAkCC,oBAAoB;YAC9GV,kCAAkC;gBAChCY,eAAe,CAACC;oBACd,MAAM,EAAEC,0BAA0B,EAAEC,oBAAoB,EAAEC,mBAAmB,EAAEC,oBAAoB,EAAE,GACnGJ;oBACF,IAAIhC,oBAAoBc,cAAcoB,sBAAsB;wBAC1DvB,UAAUc,IAAI,CAACC,QAAQ,GAAGZ,UAAUa,YAAY;oBAClD;oBACA,IAAIQ,qBAAqB;wBACvBxB,UAAUc,IAAI,CAACK,QAAQ,GAAGd;oBAC5B;oBACA,IAAIoB,sBAAsB;wBACxB,MAAMC,YAAYnB;wBAClBP,UAAUc,IAAI,CAACY,SAAS,GAAGA;oBAC7B;oBACA,IAAIJ,8BAA8BL,gCAAgC;wBAChEjB,UAAUc,IAAI,CAACV,eAAe,GAAGA;oBACnC;oBACAH,aAAaD;oBACbU;gBACF;gBACAiB,UAAU;oBACRlB;gBACF;gBACAI;gBACAD;gBACAK;gBACAC;YACF;QACF,OAAO;YACLR;QACF;IACF,GAAG;QACDZ;QACAK;QACAH;QACAI;QACAC;QACAC;QACAE;QACAD;QACAN;QACAS;QACAD;KACD;IAED,OAAO;QAAEE;QAAeb;IAAS;AACnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/DashboardProvider/view-panel-slice.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 { StateCreator } from 'zustand';\nimport { PanelGroupId } from '@perses-dev/
|
|
1
|
+
{"version":3,"sources":["../../../src/context/DashboardProvider/view-panel-slice.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 { StateCreator } from 'zustand';\nimport { PanelGroupId } from '@perses-dev/plugin-system';\nimport { PanelGroupDefinition, PanelGroupItemId } from '../../model';\nimport { Middleware } from './common';\nimport { PanelGroupSlice } from './panel-group-slice';\n\n/*\n * A reference to a Panel that can be repeated in a PanelGroup.\n */\nexport interface VirtualPanelRef {\n ref: string;\n repeatVariable?: [string, string];\n}\n\n/**\n * Slice that handles viewing Panels in max size (\"full screen\").\n */\nexport interface ViewPanelSlice {\n viewPanel: ViewPanelState;\n getViewPanel: () => PanelGroupItemId | undefined;\n setViewPanel: (panelGroupItemId?: PanelGroupItemId) => void;\n}\n\nexport interface ViewPanelState {\n // Do not use directly, use `getViewPanel()` instead for getting the current viewed PanelGroupItemId!\n panelGroupItemId?: PanelGroupItemId;\n panelRef?: VirtualPanelRef;\n}\n\n/**\n * Curried function for viewing panel in max size (\"full screen\").\n */\nexport function createViewPanelSlice(\n viewPanelRef?: VirtualPanelRef,\n setViewPanelRef?: (ref: VirtualPanelRef | undefined) => void\n): StateCreator<ViewPanelSlice & PanelGroupSlice, Middleware, [], ViewPanelSlice> {\n return (set, get) => ({\n viewPanel: {\n panelGroupItemId: undefined,\n panelRef: viewPanelRef,\n },\n\n getViewPanel(): PanelGroupItemId | undefined {\n return getViewPanelGroupId(get().panelGroups, get().viewPanel.panelGroupItemId, get().viewPanel.panelRef);\n },\n\n setViewPanel(panelGroupItemId?: PanelGroupItemId): void {\n set((state) => {\n state.viewPanel = {\n panelRef: undefined,\n panelGroupItemId: panelGroupItemId,\n };\n const panelRef = findPanelRefOfPanelGroupItemId(get().panelGroups, panelGroupItemId);\n if (setViewPanelRef) {\n setViewPanelRef(panelRef);\n }\n });\n },\n });\n}\n\nfunction getViewPanelGroupId(\n panelGroups: Record<PanelGroupId, PanelGroupDefinition>,\n panelGroupItemId?: PanelGroupItemId,\n panelRef?: VirtualPanelRef\n): PanelGroupItemId | undefined {\n if (panelGroupItemId) {\n return panelGroupItemId;\n }\n\n if (panelRef) {\n return findPanelGroupItemIdOfPanelRef(panelGroups, panelRef);\n }\n\n return undefined;\n}\n\n// Find the PanelGroupItemId of a Panel from a PanelRef\nfunction findPanelGroupItemIdOfPanelRef(\n panelGroups: Record<PanelGroupId, PanelGroupDefinition>,\n panelRef: VirtualPanelRef\n): PanelGroupItemId | undefined {\n for (const panelGroup of Object.values(panelGroups)) {\n const itemPanel = Object.entries(panelGroup.itemPanelKeys ?? []).find(([_, value]) => value === panelRef.ref);\n if (itemPanel) {\n const [key] = itemPanel;\n return {\n panelGroupId: panelGroup.id,\n panelGroupItemLayoutId: key,\n repeatVariable: panelRef.repeatVariable,\n };\n }\n }\n return undefined;\n}\n\n// Find the PanelRef from a PanelGroupItemId\nfunction findPanelRefOfPanelGroupItemId(\n panelGroups: Record<PanelGroupId, PanelGroupDefinition>,\n panelGroupItemId?: PanelGroupItemId\n): VirtualPanelRef | undefined {\n if (!panelGroupItemId) {\n return undefined;\n }\n const panelGroup = panelGroups[panelGroupItemId.panelGroupId];\n if (panelGroup) {\n const panelRef = panelGroup.itemPanelKeys[panelGroupItemId.panelGroupItemLayoutId];\n if (panelRef) {\n return { ref: panelRef, repeatVariable: panelGroupItemId.repeatVariable };\n }\n }\n return undefined;\n}\n"],"names":["createViewPanelSlice","viewPanelRef","setViewPanelRef","set","get","viewPanel","panelGroupItemId","undefined","panelRef","getViewPanel","getViewPanelGroupId","panelGroups","setViewPanel","state","findPanelRefOfPanelGroupItemId","findPanelGroupItemIdOfPanelRef","panelGroup","Object","values","itemPanel","entries","itemPanelKeys","find","_","value","ref","key","panelGroupId","id","panelGroupItemLayoutId","repeatVariable"],"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;AA+BjC;;CAEC,GACD,OAAO,SAASA,qBACdC,YAA8B,EAC9BC,eAA4D;IAE5D,OAAO,CAACC,KAAKC,MAAS,CAAA;YACpBC,WAAW;gBACTC,kBAAkBC;gBAClBC,UAAUP;YACZ;YAEAQ;gBACE,OAAOC,oBAAoBN,MAAMO,WAAW,EAAEP,MAAMC,SAAS,CAACC,gBAAgB,EAAEF,MAAMC,SAAS,CAACG,QAAQ;YAC1G;YAEAI,cAAaN,gBAAmC;gBAC9CH,IAAI,CAACU;oBACHA,MAAMR,SAAS,GAAG;wBAChBG,UAAUD;wBACVD,kBAAkBA;oBACpB;oBACA,MAAME,WAAWM,+BAA+BV,MAAMO,WAAW,EAAEL;oBACnE,IAAIJ,iBAAiB;wBACnBA,gBAAgBM;oBAClB;gBACF;YACF;QACF,CAAA;AACF;AAEA,SAASE,oBACPC,WAAuD,EACvDL,gBAAmC,EACnCE,QAA0B;IAE1B,IAAIF,kBAAkB;QACpB,OAAOA;IACT;IAEA,IAAIE,UAAU;QACZ,OAAOO,+BAA+BJ,aAAaH;IACrD;IAEA,OAAOD;AACT;AAEA,uDAAuD;AACvD,SAASQ,+BACPJ,WAAuD,EACvDH,QAAyB;IAEzB,KAAK,MAAMQ,cAAcC,OAAOC,MAAM,CAACP,aAAc;QACnD,MAAMQ,YAAYF,OAAOG,OAAO,CAACJ,WAAWK,aAAa,IAAI,EAAE,EAAEC,IAAI,CAAC,CAAC,CAACC,GAAGC,MAAM,GAAKA,UAAUhB,SAASiB,GAAG;QAC5G,IAAIN,WAAW;YACb,MAAM,CAACO,IAAI,GAAGP;YACd,OAAO;gBACLQ,cAAcX,WAAWY,EAAE;gBAC3BC,wBAAwBH;gBACxBI,gBAAgBtB,SAASsB,cAAc;YACzC;QACF;IACF;IACA,OAAOvB;AACT;AAEA,4CAA4C;AAC5C,SAASO,+BACPH,WAAuD,EACvDL,gBAAmC;IAEnC,IAAI,CAACA,kBAAkB;QACrB,OAAOC;IACT;IACA,MAAMS,aAAaL,WAAW,CAACL,iBAAiBqB,YAAY,CAAC;IAC7D,IAAIX,YAAY;QACd,MAAMR,WAAWQ,WAAWK,aAAa,CAACf,iBAAiBuB,sBAAsB,CAAC;QAClF,IAAIrB,UAAU;YACZ,OAAO;gBAAEiB,KAAKjB;gBAAUsB,gBAAgBxB,iBAAiBwB,cAAc;YAAC;QAC1E;IACF;IACA,OAAOvB;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableProvider.d.ts","sourceRoot":"","sources":["../../../src/context/VariableProvider/VariableProvider.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAiC,MAAM,OAAO,CAAC;AAC9F,OAAO,EAAe,QAAQ,EAAY,MAAM,SAAS,CAAC;AAM1D,OAAO,EAEL,gBAAgB,EAChB,aAAa,EACb,qBAAqB,EACrB,cAAc,EAGf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,YAAY,EACZ,aAAa,EACb,kBAAkB,EAElB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAK5E;;;;;;GAMG;AACH,KAAK,uBAAuB,GAAG;IAC7B;;;;;;;;OAQG;IACH,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C;;;;;;;;;;OAUG;IACH,2BAA2B,EAAE,0BAA0B,EAAE,CAAC;IAC1D;;;;OAIG;IACH,aAAa,EAAE,qBAAqB,CAAC;IACrC;;;;;OAKG;IACH,gBAAgB,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9F;;;;;OAKG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7F;;;;;OAKG;IACH,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,sBAAsB,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACpE,wBAAwB,EAAE,MAAM,kBAAkB,EAAE,CAAC;IACrD,uBAAuB,EAAE,MAAM;QAAE,uBAAuB,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACtG,CAAC;AAMF,wBAAgB,6BAA6B,IAAI,QAAQ,CAAC,uBAAuB,CAAC,CAMjF;AAED,wBAAgB,2BAA2B,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAoCtF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd;IACD,UAAU,EAAE,sBAAsB,GAAG,sBAAsB,GAAG,SAAS,CAAC;IACxE,KAAK,EAAE,aAAa,GAAG,SAAS,CAAC;CAClC,CAWA;AAED,wBAAgB,4BAA4B,IAAI;IAC9C,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,uBAAuB,EAAE,MAAM;QAAE,uBAAuB,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACrG,wBAAwB,EAAE,MAAM,kBAAkB,EAAE,CAAC;IACrD,gBAAgB,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9F,kBAAkB,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7F,sBAAsB,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;CACrE,CAgBA;AAED,wBAAgB,sBAAsB,IAAI,kBAAkB,EAAE,CAG7D;AAED,wBAAgB,8BAA8B,IAAI,0BAA0B,EAAE,CAG7E;
|
|
1
|
+
{"version":3,"file":"VariableProvider.d.ts","sourceRoot":"","sources":["../../../src/context/VariableProvider/VariableProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -127,6 +127,7 @@ function PluginProvider({ children, builtinVariables }) {
|
|
|
127
127
|
// If the variable is a list variable and has a custom all value, then use that value instead
|
|
128
128
|
if (definition?.kind === 'ListVariable' && definition.spec.customAllValue) {
|
|
129
129
|
v.value = definition.spec.customAllValue;
|
|
130
|
+
v.customAllValue = definition.spec.customAllValue;
|
|
130
131
|
} else {
|
|
131
132
|
v.value = v.options?.map((o)=>o.value) ?? null;
|
|
132
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/VariableProvider/VariableProvider.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 { createContext, ReactElement, ReactNode, useContext, useMemo, useState } from 'react';\nimport { createStore, StoreApi, useStore } from 'zustand';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\nimport { immer } from 'zustand/middleware/immer';\nimport { devtools } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\nimport { produce } from 'immer';\nimport {\n VariableContext,\n VariableStateMap,\n VariableState,\n VariableStoreStateMap,\n VariableOption,\n BuiltinVariableContext,\n useTimeRange,\n} from '@perses-dev/plugin-system';\nimport {\n DEFAULT_ALL_VALUE as ALL_VALUE,\n VariableName,\n VariableValue,\n VariableDefinition,\n formatDuration,\n BuiltinVariableDefinition,\n TextVariableDefinition,\n ListVariableDefinition,\n intervalToDuration,\n} from '@perses-dev/spec';\nimport { ExternalVariableDefinition } from '../../model/VariableDefinition';\nimport { checkSavedDefaultVariableStatus, findVariableDefinitionByName, mergeVariableDefinitions } from './utils';\nimport { hydrateVariableDefinitionStates as hydrateVariableDefinitionStates } from './hydrationUtils';\nimport { getInitalValuesFromQueryParameters, getURLQueryParamName, useVariableQueryParams } from './query-params';\n\n/**\n * This store is used to manipulate and read the definition of the variables and their state.\n * - being local or external variables.\n * - being text or list variables.\n * - being of any state (value, options, loading, error, ...) check {@VariableState}\n * Go and read each property documentation for more details.\n */\ntype VariableDefinitionStore = {\n /**\n * List of local variables definitions.\n * This is typically the variable definition that can be modified through the setVariableDefinition setter.\n *\n * In Perses App ecosystem, this is typically the dashboard scope variables, that's why we call them local.\n * Note that depending on the form, we can reuse this store to modify higher scope variables. For example,\n * when we modify the variable of a project, we'll set this field with project scope variables. To be able to modify\n * them.\n */\n variableDefinitions: VariableDefinition[];\n /**\n * List of external variable definitions.\n * This is static variable definitions that won´t be modified under this context.\n * You'll have to set one list of external variable definition by scope. See {@link ExternalVariableDefinition} for\n * more details.\n *\n * In Perses App ecosystem, this is typically the project or global scope variables.\n * Note that depending on the form, we can reuse this store to modify higher scope variables. For example,\n * when we modify the variable of a project, we'll set this field with global scope variables. Which means we\n * won't be able to modify them from this form.\n */\n externalVariableDefinitions: ExternalVariableDefinition[];\n /**\n * Additionally to definitions, we need to associate to each variable a state. That's what this map is meant for.\n * This can be heavily modified under this context, using the different setters available.\n * Note that the state of local AND external variables can be modified.\n */\n variableState: VariableStoreStateMap;\n /**\n * Allow to modify the `value` property of a variable in the state map.\n * @param variableName identify the variable\n * @param value new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableValue: (variableName: VariableName, value: VariableValue, source?: string) => void;\n /**\n * Allow to modify the `options` property of a variable in the state map.\n * @param variableName identify the variable\n * @param options new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableOptions: (name: VariableName, options: VariableOption[], source?: string) => void;\n /**\n * Allow to modify the `loading` property of a variable in the state map.\n * @param variableName identify the variable\n * @param laoding new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableLoading: (name: VariableName, loading: boolean, source?: string) => void;\n setVariableDefinitions: (definitions: VariableDefinition[]) => void;\n setVariableDefaultValues: () => VariableDefinition[];\n getSavedVariablesStatus: () => { isSavedVariableModified: boolean; modifiedVariableNames: string[] };\n};\n\n/**\n * Context object for {@link VariableDefinitionStore}.\n */\nconst VariableDefinitionStoreContext = createContext<StoreApi<VariableDefinitionStore> | undefined>(undefined);\nexport function useVariableDefinitionStoreCtx(): StoreApi<VariableDefinitionStore> {\n const context = useContext(VariableDefinitionStoreContext);\n if (!context) {\n throw new Error('VariableStoreContext not initialized');\n }\n return context;\n}\n\nexport function useVariableDefinitionStates(variableNames?: string[]): VariableStateMap {\n const store = useVariableDefinitionStoreCtx();\n return useStoreWithEqualityFn(\n store,\n (s) => {\n const varStates: VariableStateMap = {};\n\n // Collect values of local variables, from the variable state\n const names = variableNames ?? s.variableDefinitions.map((value) => value.spec.name);\n names.forEach((name) => {\n const varState = s.variableState.get({ name });\n if (!varState || varState.overridden) {\n return;\n }\n varStates[name] = varState;\n });\n\n // Collect values of external variables, from the variable state\n s.externalVariableDefinitions.forEach((d) => {\n const source = d.source;\n d.definitions.forEach((value) => {\n const name = value.spec.name;\n const varState = s.variableState.get({ name, source });\n if (!varState || varState.overridden) {\n return;\n }\n varStates[name] = varState;\n });\n });\n\n return varStates;\n },\n (left, right) => {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n );\n}\n\n/**\n * Get the state and definition of a variable from the variables context.\n * @param name name of the variable\n * @param source if given, it searches in the external variables\n */\nexport function useVariableDefinitionAndState(\n name: string,\n source?: string\n): {\n definition: TextVariableDefinition | ListVariableDefinition | undefined;\n state: VariableState | undefined;\n} {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => {\n const state = s.variableState.get({ name, source });\n const definitions = source\n ? s.externalVariableDefinitions.find((v) => v.source === source)?.definitions\n : s.variableDefinitions;\n const definition = (definitions || []).find((v) => v.spec.name === name);\n\n return { state, definition };\n });\n}\n\nexport function useVariableDefinitionActions(): {\n setVariableLoading: (name: VariableName, loading: boolean, source?: string) => void;\n getSavedVariablesStatus: () => { isSavedVariableModified: boolean; modifiedVariableNames: string[] };\n setVariableDefaultValues: () => VariableDefinition[];\n setVariableValue: (variableName: VariableName, value: VariableValue, source?: string) => void;\n setVariableOptions: (name: VariableName, options: VariableOption[], source?: string) => void;\n setVariableDefinitions: (definitions: VariableDefinition[]) => void;\n} {\n const store = useVariableDefinitionStoreCtx();\n return useStoreWithEqualityFn(\n store,\n (s) => {\n return {\n setVariableValue: s.setVariableValue,\n setVariableLoading: s.setVariableLoading,\n setVariableOptions: s.setVariableOptions,\n setVariableDefinitions: s.setVariableDefinitions,\n setVariableDefaultValues: s.setVariableDefaultValues,\n getSavedVariablesStatus: s.getSavedVariablesStatus,\n };\n },\n shallow\n );\n}\n\nexport function useVariableDefinitions(): VariableDefinition[] {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => s.variableDefinitions);\n}\n\nexport function useExternalVariableDefinitions(): ExternalVariableDefinition[] {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => s.externalVariableDefinitions);\n}\n\ninterface PluginProviderProps {\n children: ReactNode;\n builtinVariables?: BuiltinVariableDefinition[];\n}\n\nfunction PluginProvider({ children, builtinVariables }: PluginProviderProps): ReactElement {\n const originalValues = useVariableDefinitionStates();\n const definitions = useVariableDefinitions();\n const externalDefinitions = useExternalVariableDefinitions();\n const { absoluteTimeRange } = useTimeRange();\n\n const values = useMemo(() => {\n const contextValues: VariableStateMap = {};\n\n // This will loop through all the current variables values\n // and update any variables that have ALL_VALUE as their current value\n // to include all options.\n Object.keys(originalValues).forEach((name) => {\n const v = { ...originalValues[name] } as VariableState;\n\n if (v.value === ALL_VALUE) {\n const definition = findVariableDefinitionByName(name, definitions, externalDefinitions);\n // If the variable is a list variable and has a custom all value, then use that value instead\n if (definition?.kind === 'ListVariable' && definition.spec.customAllValue) {\n v.value = definition.spec.customAllValue;\n } else {\n v.value = v.options?.map((o: { value: string }) => o.value) ?? null;\n }\n }\n contextValues[name] = v;\n });\n return contextValues;\n }, [originalValues, definitions, externalDefinitions]);\n\n const allBuiltinVariables: BuiltinVariableDefinition[] = useMemo(() => {\n const result: BuiltinVariableDefinition[] = [\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__from',\n value: () => absoluteTimeRange.start.valueOf().toString(),\n source: 'Dashboard',\n display: {\n name: '__from',\n description: 'Start time of the current time range in unix millisecond epoch',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__to',\n value: () => absoluteTimeRange.end.valueOf().toString(),\n source: 'Dashboard',\n display: {\n name: '__to',\n description: 'End time of the current time range in unix millisecond epoch',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range',\n value: () => formatDuration(intervalToDuration(absoluteTimeRange)),\n source: 'Dashboard',\n display: {\n name: '__range',\n description: 'The range for the current dashboard in human readable format',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range_s',\n value: () => ((absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()) / 1000).toString(),\n source: 'Dashboard',\n display: {\n name: '__range_s',\n description: 'The range for the current dashboard in second',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range_ms',\n value: () => (absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()).toString(),\n source: 'Dashboard',\n display: {\n name: '__range_ms',\n description: 'The range for the current dashboard in millisecond',\n hidden: true,\n },\n },\n },\n ];\n builtinVariables?.forEach((def) => result.push(def));\n return result;\n }, [absoluteTimeRange, builtinVariables]);\n\n return (\n <BuiltinVariableContext.Provider value={{ variables: allBuiltinVariables }}>\n <VariableContext.Provider value={{ state: values }}>{children}</VariableContext.Provider>\n </BuiltinVariableContext.Provider>\n );\n}\n\ninterface VariableDefinitionStoreArgs {\n initialVariableDefinitions?: VariableDefinition[];\n externalVariableDefinitions?: ExternalVariableDefinition[];\n queryParams?: ReturnType<typeof useVariableQueryParams>;\n initialVariableValues?: Record<string, VariableValue>;\n}\n\nfunction createVariableDefinitionStore({\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n queryParams,\n initialVariableValues,\n}: VariableDefinitionStoreArgs): StoreApi<VariableDefinitionStore> {\n const queryParamValues = getInitalValuesFromQueryParameters(queryParams ? queryParams[0] : {});\n const initialParams = { ...queryParamValues, ...initialVariableValues };\n const store = createStore<VariableDefinitionStore>()(\n devtools(\n immer((set, get) => ({\n variableState: hydrateVariableDefinitionStates(\n initialVariableDefinitions,\n initialParams,\n externalVariableDefinitions\n ),\n variableDefinitions: initialVariableDefinitions,\n externalVariableDefinitions: externalVariableDefinitions,\n setVariableDefinitions(definitions: VariableDefinition[]): void {\n set(\n (state) => {\n state.variableDefinitions = definitions;\n state.variableState = hydrateVariableDefinitionStates(\n definitions,\n initialParams,\n externalVariableDefinitions\n );\n },\n false,\n '[Variables] setVariableDefinitions' // Used for action name in Redux devtools\n );\n },\n setVariableOptions(name, options, source?: string): void {\n set(\n (state) => {\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n varState.options = options;\n },\n false,\n '[Variables] setVariableOptions'\n );\n },\n setVariableLoading(name, loading, source?: string): void {\n set(\n (state) => {\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n varState.loading = loading;\n },\n false,\n '[Variables] setVariableLoading'\n );\n },\n setVariableValue: (name, value, source?: string): void =>\n set(\n (state) => {\n let val = value;\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n\n // Make sure there is only one all value\n if (Array.isArray(val) && val.includes(ALL_VALUE)) {\n if (val.at(-1) === ALL_VALUE) {\n val = ALL_VALUE;\n } else {\n val = val.filter((v) => v !== ALL_VALUE);\n }\n }\n if (queryParams) {\n const setQueryParams = queryParams[1];\n setQueryParams({ [getURLQueryParamName(name)]: val });\n }\n varState.value = val;\n },\n false,\n '[Variables] setVariableValue'\n ),\n setVariableDefaultValues: (): VariableDefinition[] => {\n const variableDefinitions = get().variableDefinitions;\n const variableState = get().variableState;\n const updatedVariables = produce(variableDefinitions, (draft) => {\n draft.forEach((variable, index) => {\n const name = variable.spec.name;\n if (variable.kind === 'ListVariable') {\n const currentVariable = variableState.get({ name });\n if (currentVariable?.value !== undefined) {\n draft[index] = {\n kind: 'ListVariable',\n spec: produce(variable.spec, (specDraft) => {\n specDraft.defaultValue = currentVariable.value;\n }),\n };\n }\n } else if (variable.kind === 'TextVariable') {\n const currentVariable = variableState.get({ name });\n const currentVariableValue = typeof currentVariable?.value === 'string' ? currentVariable.value : '';\n if (currentVariable?.value !== undefined) {\n draft[index] = {\n kind: 'TextVariable',\n spec: produce(variable.spec, (specDraft) => {\n specDraft.value = currentVariableValue;\n }),\n };\n }\n }\n });\n });\n set(\n (state) => {\n state.variableDefinitions = updatedVariables;\n },\n false,\n '[Variables] setVariableDefaultValues'\n );\n return updatedVariables;\n },\n getSavedVariablesStatus: (): {\n modifiedVariableNames: string[];\n isSavedVariableModified: boolean;\n } => {\n return checkSavedDefaultVariableStatus(get().variableDefinitions, get().variableState);\n },\n }))\n )\n );\n\n return store as StoreApi<VariableDefinitionStore>;\n}\n\n/**\n * The external variables allow you to give to the provider some additional variables, not defined in the dashboard and static.\n * It means that you won´t be able to update them from the dashboard itself, but you will see them appear and will be able\n * to modify their runtime value as any other variable.\n * If one of the external variable has the same name as a local one, it will be marked as overridden.\n * You can define one list of variable definition by source and as many source as you want.\n * The order of the sources is important as first one will take precedence on the following ones, in case they have same names.\n */\n\nexport interface VariableProviderProps {\n children: ReactNode;\n initialVariableDefinitions?: VariableDefinition[];\n externalVariableDefinitions?: ExternalVariableDefinition[];\n builtinVariableDefinitions?: BuiltinVariableDefinition[];\n initialVariableValues?: Record<string, VariableValue>;\n}\n\n// TODO: merge the different providers related to Variables under a single one (and keep \"VariableProvider\" as a name)\nexport function VariableProvider({\n children,\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n builtinVariableDefinitions = [],\n initialVariableValues,\n}: VariableProviderProps): ReactElement {\n const [store] = useState(() =>\n createVariableDefinitionStore({ initialVariableDefinitions, externalVariableDefinitions, initialVariableValues })\n );\n\n return (\n <VariableDefinitionStoreContext.Provider value={store}>\n <PluginProvider builtinVariables={builtinVariableDefinitions}>{children}</PluginProvider>\n </VariableDefinitionStoreContext.Provider>\n );\n}\n\nexport function VariableProviderWithQueryParams({\n children,\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n builtinVariableDefinitions: builtinVariables = [],\n}: VariableProviderProps): ReactElement {\n const allVariableDefs = mergeVariableDefinitions(initialVariableDefinitions, externalVariableDefinitions);\n const queryParams = useVariableQueryParams(allVariableDefs);\n const [store] = useState(() =>\n createVariableDefinitionStore({ initialVariableDefinitions, externalVariableDefinitions, queryParams })\n );\n\n return (\n <VariableDefinitionStoreContext.Provider value={store}>\n <PluginProvider builtinVariables={builtinVariables}>{children}</PluginProvider>\n </VariableDefinitionStoreContext.Provider>\n );\n}\n"],"names":["createContext","useContext","useMemo","useState","createStore","useStore","useStoreWithEqualityFn","immer","devtools","shallow","produce","VariableContext","BuiltinVariableContext","useTimeRange","DEFAULT_ALL_VALUE","ALL_VALUE","formatDuration","intervalToDuration","checkSavedDefaultVariableStatus","findVariableDefinitionByName","mergeVariableDefinitions","hydrateVariableDefinitionStates","getInitalValuesFromQueryParameters","getURLQueryParamName","useVariableQueryParams","VariableDefinitionStoreContext","undefined","useVariableDefinitionStoreCtx","context","Error","useVariableDefinitionStates","variableNames","store","s","varStates","names","variableDefinitions","map","value","spec","name","forEach","varState","variableState","get","overridden","externalVariableDefinitions","d","source","definitions","left","right","JSON","stringify","useVariableDefinitionAndState","state","find","v","definition","useVariableDefinitionActions","setVariableValue","setVariableLoading","setVariableOptions","setVariableDefinitions","setVariableDefaultValues","getSavedVariablesStatus","useVariableDefinitions","useExternalVariableDefinitions","PluginProvider","children","builtinVariables","originalValues","externalDefinitions","absoluteTimeRange","values","contextValues","Object","keys","kind","customAllValue","options","o","allBuiltinVariables","result","start","valueOf","toString","display","description","hidden","end","def","push","Provider","variables","createVariableDefinitionStore","initialVariableDefinitions","queryParams","initialVariableValues","queryParamValues","initialParams","set","loading","val","Array","isArray","includes","at","filter","setQueryParams","updatedVariables","draft","variable","index","currentVariable","specDraft","defaultValue","currentVariableValue","VariableProvider","builtinVariableDefinitions","VariableProviderWithQueryParams","allVariableDefs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/context/VariableProvider/VariableProvider.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 { createContext, ReactElement, ReactNode, useContext, useMemo, useState } from 'react';\nimport { createStore, StoreApi, useStore } from 'zustand';\nimport { useStoreWithEqualityFn } from 'zustand/traditional';\nimport { immer } from 'zustand/middleware/immer';\nimport { devtools } from 'zustand/middleware';\nimport { shallow } from 'zustand/shallow';\nimport { produce } from 'immer';\nimport {\n VariableContext,\n VariableStateMap,\n VariableState,\n VariableStoreStateMap,\n VariableOption,\n BuiltinVariableContext,\n useTimeRange,\n} from '@perses-dev/plugin-system';\nimport {\n DEFAULT_ALL_VALUE as ALL_VALUE,\n VariableName,\n VariableValue,\n VariableDefinition,\n formatDuration,\n BuiltinVariableDefinition,\n TextVariableDefinition,\n ListVariableDefinition,\n intervalToDuration,\n} from '@perses-dev/spec';\nimport { ExternalVariableDefinition } from '../../model/VariableDefinition';\nimport { checkSavedDefaultVariableStatus, findVariableDefinitionByName, mergeVariableDefinitions } from './utils';\nimport { hydrateVariableDefinitionStates as hydrateVariableDefinitionStates } from './hydrationUtils';\nimport { getInitalValuesFromQueryParameters, getURLQueryParamName, useVariableQueryParams } from './query-params';\n\n/**\n * This store is used to manipulate and read the definition of the variables and their state.\n * - being local or external variables.\n * - being text or list variables.\n * - being of any state (value, options, loading, error, ...) check {@VariableState}\n * Go and read each property documentation for more details.\n */\ntype VariableDefinitionStore = {\n /**\n * List of local variables definitions.\n * This is typically the variable definition that can be modified through the setVariableDefinition setter.\n *\n * In Perses App ecosystem, this is typically the dashboard scope variables, that's why we call them local.\n * Note that depending on the form, we can reuse this store to modify higher scope variables. For example,\n * when we modify the variable of a project, we'll set this field with project scope variables. To be able to modify\n * them.\n */\n variableDefinitions: VariableDefinition[];\n /**\n * List of external variable definitions.\n * This is static variable definitions that won´t be modified under this context.\n * You'll have to set one list of external variable definition by scope. See {@link ExternalVariableDefinition} for\n * more details.\n *\n * In Perses App ecosystem, this is typically the project or global scope variables.\n * Note that depending on the form, we can reuse this store to modify higher scope variables. For example,\n * when we modify the variable of a project, we'll set this field with global scope variables. Which means we\n * won't be able to modify them from this form.\n */\n externalVariableDefinitions: ExternalVariableDefinition[];\n /**\n * Additionally to definitions, we need to associate to each variable a state. That's what this map is meant for.\n * This can be heavily modified under this context, using the different setters available.\n * Note that the state of local AND external variables can be modified.\n */\n variableState: VariableStoreStateMap;\n /**\n * Allow to modify the `value` property of a variable in the state map.\n * @param variableName identify the variable\n * @param value new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableValue: (variableName: VariableName, value: VariableValue, source?: string) => void;\n /**\n * Allow to modify the `options` property of a variable in the state map.\n * @param variableName identify the variable\n * @param options new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableOptions: (name: VariableName, options: VariableOption[], source?: string) => void;\n /**\n * Allow to modify the `loading` property of a variable in the state map.\n * @param variableName identify the variable\n * @param laoding new value\n * @param source identify the variable source if this is an external variable. See {@link ExternalVariableDefinition}\n */\n setVariableLoading: (name: VariableName, loading: boolean, source?: string) => void;\n setVariableDefinitions: (definitions: VariableDefinition[]) => void;\n setVariableDefaultValues: () => VariableDefinition[];\n getSavedVariablesStatus: () => { isSavedVariableModified: boolean; modifiedVariableNames: string[] };\n};\n\n/**\n * Context object for {@link VariableDefinitionStore}.\n */\nconst VariableDefinitionStoreContext = createContext<StoreApi<VariableDefinitionStore> | undefined>(undefined);\nexport function useVariableDefinitionStoreCtx(): StoreApi<VariableDefinitionStore> {\n const context = useContext(VariableDefinitionStoreContext);\n if (!context) {\n throw new Error('VariableStoreContext not initialized');\n }\n return context;\n}\n\nexport function useVariableDefinitionStates(variableNames?: string[]): VariableStateMap {\n const store = useVariableDefinitionStoreCtx();\n return useStoreWithEqualityFn(\n store,\n (s) => {\n const varStates: VariableStateMap = {};\n\n // Collect values of local variables, from the variable state\n const names = variableNames ?? s.variableDefinitions.map((value) => value.spec.name);\n names.forEach((name) => {\n const varState = s.variableState.get({ name });\n if (!varState || varState.overridden) {\n return;\n }\n varStates[name] = varState;\n });\n\n // Collect values of external variables, from the variable state\n s.externalVariableDefinitions.forEach((d) => {\n const source = d.source;\n d.definitions.forEach((value) => {\n const name = value.spec.name;\n const varState = s.variableState.get({ name, source });\n if (!varState || varState.overridden) {\n return;\n }\n varStates[name] = varState;\n });\n });\n\n return varStates;\n },\n (left, right) => {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n );\n}\n\n/**\n * Get the state and definition of a variable from the variables context.\n * @param name name of the variable\n * @param source if given, it searches in the external variables\n */\nexport function useVariableDefinitionAndState(\n name: string,\n source?: string\n): {\n definition: TextVariableDefinition | ListVariableDefinition | undefined;\n state: VariableState | undefined;\n} {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => {\n const state = s.variableState.get({ name, source });\n const definitions = source\n ? s.externalVariableDefinitions.find((v) => v.source === source)?.definitions\n : s.variableDefinitions;\n const definition = (definitions || []).find((v) => v.spec.name === name);\n\n return { state, definition };\n });\n}\n\nexport function useVariableDefinitionActions(): {\n setVariableLoading: (name: VariableName, loading: boolean, source?: string) => void;\n getSavedVariablesStatus: () => { isSavedVariableModified: boolean; modifiedVariableNames: string[] };\n setVariableDefaultValues: () => VariableDefinition[];\n setVariableValue: (variableName: VariableName, value: VariableValue, source?: string) => void;\n setVariableOptions: (name: VariableName, options: VariableOption[], source?: string) => void;\n setVariableDefinitions: (definitions: VariableDefinition[]) => void;\n} {\n const store = useVariableDefinitionStoreCtx();\n return useStoreWithEqualityFn(\n store,\n (s) => {\n return {\n setVariableValue: s.setVariableValue,\n setVariableLoading: s.setVariableLoading,\n setVariableOptions: s.setVariableOptions,\n setVariableDefinitions: s.setVariableDefinitions,\n setVariableDefaultValues: s.setVariableDefaultValues,\n getSavedVariablesStatus: s.getSavedVariablesStatus,\n };\n },\n shallow\n );\n}\n\nexport function useVariableDefinitions(): VariableDefinition[] {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => s.variableDefinitions);\n}\n\nexport function useExternalVariableDefinitions(): ExternalVariableDefinition[] {\n const store = useVariableDefinitionStoreCtx();\n return useStore(store, (s) => s.externalVariableDefinitions);\n}\n\ninterface PluginProviderProps {\n children: ReactNode;\n builtinVariables?: BuiltinVariableDefinition[];\n}\n\nfunction PluginProvider({ children, builtinVariables }: PluginProviderProps): ReactElement {\n const originalValues = useVariableDefinitionStates();\n const definitions = useVariableDefinitions();\n const externalDefinitions = useExternalVariableDefinitions();\n const { absoluteTimeRange } = useTimeRange();\n\n const values = useMemo(() => {\n const contextValues: VariableStateMap = {};\n\n // This will loop through all the current variables values\n // and update any variables that have ALL_VALUE as their current value\n // to include all options.\n Object.keys(originalValues).forEach((name) => {\n const v = { ...originalValues[name] } as VariableState;\n\n if (v.value === ALL_VALUE) {\n const definition = findVariableDefinitionByName(name, definitions, externalDefinitions);\n // If the variable is a list variable and has a custom all value, then use that value instead\n if (definition?.kind === 'ListVariable' && definition.spec.customAllValue) {\n v.value = definition.spec.customAllValue;\n v.customAllValue = definition.spec.customAllValue;\n } else {\n v.value = v.options?.map((o: { value: string }) => o.value) ?? null;\n }\n }\n contextValues[name] = v;\n });\n return contextValues;\n }, [originalValues, definitions, externalDefinitions]);\n\n const allBuiltinVariables: BuiltinVariableDefinition[] = useMemo(() => {\n const result: BuiltinVariableDefinition[] = [\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__from',\n value: () => absoluteTimeRange.start.valueOf().toString(),\n source: 'Dashboard',\n display: {\n name: '__from',\n description: 'Start time of the current time range in unix millisecond epoch',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__to',\n value: () => absoluteTimeRange.end.valueOf().toString(),\n source: 'Dashboard',\n display: {\n name: '__to',\n description: 'End time of the current time range in unix millisecond epoch',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range',\n value: () => formatDuration(intervalToDuration(absoluteTimeRange)),\n source: 'Dashboard',\n display: {\n name: '__range',\n description: 'The range for the current dashboard in human readable format',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range_s',\n value: () => ((absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()) / 1000).toString(),\n source: 'Dashboard',\n display: {\n name: '__range_s',\n description: 'The range for the current dashboard in second',\n hidden: true,\n },\n },\n },\n {\n kind: 'BuiltinVariable',\n spec: {\n name: '__range_ms',\n value: () => (absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()).toString(),\n source: 'Dashboard',\n display: {\n name: '__range_ms',\n description: 'The range for the current dashboard in millisecond',\n hidden: true,\n },\n },\n },\n ];\n builtinVariables?.forEach((def) => result.push(def));\n return result;\n }, [absoluteTimeRange, builtinVariables]);\n\n return (\n <BuiltinVariableContext.Provider value={{ variables: allBuiltinVariables }}>\n <VariableContext.Provider value={{ state: values }}>{children}</VariableContext.Provider>\n </BuiltinVariableContext.Provider>\n );\n}\n\ninterface VariableDefinitionStoreArgs {\n initialVariableDefinitions?: VariableDefinition[];\n externalVariableDefinitions?: ExternalVariableDefinition[];\n queryParams?: ReturnType<typeof useVariableQueryParams>;\n initialVariableValues?: Record<string, VariableValue>;\n}\n\nfunction createVariableDefinitionStore({\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n queryParams,\n initialVariableValues,\n}: VariableDefinitionStoreArgs): StoreApi<VariableDefinitionStore> {\n const queryParamValues = getInitalValuesFromQueryParameters(queryParams ? queryParams[0] : {});\n const initialParams = { ...queryParamValues, ...initialVariableValues };\n const store = createStore<VariableDefinitionStore>()(\n devtools(\n immer((set, get) => ({\n variableState: hydrateVariableDefinitionStates(\n initialVariableDefinitions,\n initialParams,\n externalVariableDefinitions\n ),\n variableDefinitions: initialVariableDefinitions,\n externalVariableDefinitions: externalVariableDefinitions,\n setVariableDefinitions(definitions: VariableDefinition[]): void {\n set(\n (state) => {\n state.variableDefinitions = definitions;\n state.variableState = hydrateVariableDefinitionStates(\n definitions,\n initialParams,\n externalVariableDefinitions\n );\n },\n false,\n '[Variables] setVariableDefinitions' // Used for action name in Redux devtools\n );\n },\n setVariableOptions(name, options, source?: string): void {\n set(\n (state) => {\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n varState.options = options;\n },\n false,\n '[Variables] setVariableOptions'\n );\n },\n setVariableLoading(name, loading, source?: string): void {\n set(\n (state) => {\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n varState.loading = loading;\n },\n false,\n '[Variables] setVariableLoading'\n );\n },\n setVariableValue: (name, value, source?: string): void =>\n set(\n (state) => {\n let val = value;\n const varState = state.variableState.get({ name, source });\n if (!varState) {\n return;\n }\n\n // Make sure there is only one all value\n if (Array.isArray(val) && val.includes(ALL_VALUE)) {\n if (val.at(-1) === ALL_VALUE) {\n val = ALL_VALUE;\n } else {\n val = val.filter((v) => v !== ALL_VALUE);\n }\n }\n if (queryParams) {\n const setQueryParams = queryParams[1];\n setQueryParams({ [getURLQueryParamName(name)]: val });\n }\n varState.value = val;\n },\n false,\n '[Variables] setVariableValue'\n ),\n setVariableDefaultValues: (): VariableDefinition[] => {\n const variableDefinitions = get().variableDefinitions;\n const variableState = get().variableState;\n const updatedVariables = produce(variableDefinitions, (draft) => {\n draft.forEach((variable, index) => {\n const name = variable.spec.name;\n if (variable.kind === 'ListVariable') {\n const currentVariable = variableState.get({ name });\n if (currentVariable?.value !== undefined) {\n draft[index] = {\n kind: 'ListVariable',\n spec: produce(variable.spec, (specDraft) => {\n specDraft.defaultValue = currentVariable.value;\n }),\n };\n }\n } else if (variable.kind === 'TextVariable') {\n const currentVariable = variableState.get({ name });\n const currentVariableValue = typeof currentVariable?.value === 'string' ? currentVariable.value : '';\n if (currentVariable?.value !== undefined) {\n draft[index] = {\n kind: 'TextVariable',\n spec: produce(variable.spec, (specDraft) => {\n specDraft.value = currentVariableValue;\n }),\n };\n }\n }\n });\n });\n set(\n (state) => {\n state.variableDefinitions = updatedVariables;\n },\n false,\n '[Variables] setVariableDefaultValues'\n );\n return updatedVariables;\n },\n getSavedVariablesStatus: (): {\n modifiedVariableNames: string[];\n isSavedVariableModified: boolean;\n } => {\n return checkSavedDefaultVariableStatus(get().variableDefinitions, get().variableState);\n },\n }))\n )\n );\n\n return store as StoreApi<VariableDefinitionStore>;\n}\n\n/**\n * The external variables allow you to give to the provider some additional variables, not defined in the dashboard and static.\n * It means that you won´t be able to update them from the dashboard itself, but you will see them appear and will be able\n * to modify their runtime value as any other variable.\n * If one of the external variable has the same name as a local one, it will be marked as overridden.\n * You can define one list of variable definition by source and as many source as you want.\n * The order of the sources is important as first one will take precedence on the following ones, in case they have same names.\n */\n\nexport interface VariableProviderProps {\n children: ReactNode;\n initialVariableDefinitions?: VariableDefinition[];\n externalVariableDefinitions?: ExternalVariableDefinition[];\n builtinVariableDefinitions?: BuiltinVariableDefinition[];\n initialVariableValues?: Record<string, VariableValue>;\n}\n\n// TODO: merge the different providers related to Variables under a single one (and keep \"VariableProvider\" as a name)\nexport function VariableProvider({\n children,\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n builtinVariableDefinitions = [],\n initialVariableValues,\n}: VariableProviderProps): ReactElement {\n const [store] = useState(() =>\n createVariableDefinitionStore({ initialVariableDefinitions, externalVariableDefinitions, initialVariableValues })\n );\n\n return (\n <VariableDefinitionStoreContext.Provider value={store}>\n <PluginProvider builtinVariables={builtinVariableDefinitions}>{children}</PluginProvider>\n </VariableDefinitionStoreContext.Provider>\n );\n}\n\nexport function VariableProviderWithQueryParams({\n children,\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n builtinVariableDefinitions: builtinVariables = [],\n}: VariableProviderProps): ReactElement {\n const allVariableDefs = mergeVariableDefinitions(initialVariableDefinitions, externalVariableDefinitions);\n const queryParams = useVariableQueryParams(allVariableDefs);\n const [store] = useState(() =>\n createVariableDefinitionStore({ initialVariableDefinitions, externalVariableDefinitions, queryParams })\n );\n\n return (\n <VariableDefinitionStoreContext.Provider value={store}>\n <PluginProvider builtinVariables={builtinVariables}>{children}</PluginProvider>\n </VariableDefinitionStoreContext.Provider>\n );\n}\n"],"names":["createContext","useContext","useMemo","useState","createStore","useStore","useStoreWithEqualityFn","immer","devtools","shallow","produce","VariableContext","BuiltinVariableContext","useTimeRange","DEFAULT_ALL_VALUE","ALL_VALUE","formatDuration","intervalToDuration","checkSavedDefaultVariableStatus","findVariableDefinitionByName","mergeVariableDefinitions","hydrateVariableDefinitionStates","getInitalValuesFromQueryParameters","getURLQueryParamName","useVariableQueryParams","VariableDefinitionStoreContext","undefined","useVariableDefinitionStoreCtx","context","Error","useVariableDefinitionStates","variableNames","store","s","varStates","names","variableDefinitions","map","value","spec","name","forEach","varState","variableState","get","overridden","externalVariableDefinitions","d","source","definitions","left","right","JSON","stringify","useVariableDefinitionAndState","state","find","v","definition","useVariableDefinitionActions","setVariableValue","setVariableLoading","setVariableOptions","setVariableDefinitions","setVariableDefaultValues","getSavedVariablesStatus","useVariableDefinitions","useExternalVariableDefinitions","PluginProvider","children","builtinVariables","originalValues","externalDefinitions","absoluteTimeRange","values","contextValues","Object","keys","kind","customAllValue","options","o","allBuiltinVariables","result","start","valueOf","toString","display","description","hidden","end","def","push","Provider","variables","createVariableDefinitionStore","initialVariableDefinitions","queryParams","initialVariableValues","queryParamValues","initialParams","set","loading","val","Array","isArray","includes","at","filter","setQueryParams","updatedVariables","draft","variable","index","currentVariable","specDraft","defaultValue","currentVariableValue","VariableProvider","builtinVariableDefinitions","VariableProviderWithQueryParams","allVariableDefs"],"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,aAAa,EAA2BC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAQ;AAC9F,SAASC,WAAW,EAAYC,QAAQ,QAAQ,UAAU;AAC1D,SAASC,sBAAsB,QAAQ,sBAAsB;AAC7D,SAASC,KAAK,QAAQ,2BAA2B;AACjD,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,SAASC,OAAO,QAAQ,QAAQ;AAChC,SACEC,eAAe,EAKfC,sBAAsB,EACtBC,YAAY,QACP,4BAA4B;AACnC,SACEC,qBAAqBC,SAAS,EAI9BC,cAAc,EAIdC,kBAAkB,QACb,mBAAmB;AAE1B,SAASC,+BAA+B,EAAEC,4BAA4B,EAAEC,wBAAwB,QAAQ,UAAU;AAClH,SAASC,mCAAmCA,+BAA+B,QAAQ,mBAAmB;AACtG,SAASC,kCAAkC,EAAEC,oBAAoB,EAAEC,sBAAsB,QAAQ,iBAAiB;AAgElH;;CAEC,GACD,MAAMC,+CAAiCzB,cAA6D0B;AACpG,OAAO,SAASC;IACd,MAAMC,UAAU3B,WAAWwB;IAC3B,IAAI,CAACG,SAAS;QACZ,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOD;AACT;AAEA,OAAO,SAASE,4BAA4BC,aAAwB;IAClE,MAAMC,QAAQL;IACd,OAAOrB,uBACL0B,OACA,CAACC;QACC,MAAMC,YAA8B,CAAC;QAErC,6DAA6D;QAC7D,MAAMC,QAAQJ,iBAAiBE,EAAEG,mBAAmB,CAACC,GAAG,CAAC,CAACC,QAAUA,MAAMC,IAAI,CAACC,IAAI;QACnFL,MAAMM,OAAO,CAAC,CAACD;YACb,MAAME,WAAWT,EAAEU,aAAa,CAACC,GAAG,CAAC;gBAAEJ;YAAK;YAC5C,IAAI,CAACE,YAAYA,SAASG,UAAU,EAAE;gBACpC;YACF;YACAX,SAAS,CAACM,KAAK,GAAGE;QACpB;QAEA,gEAAgE;QAChET,EAAEa,2BAA2B,CAACL,OAAO,CAAC,CAACM;YACrC,MAAMC,SAASD,EAAEC,MAAM;YACvBD,EAAEE,WAAW,CAACR,OAAO,CAAC,CAACH;gBACrB,MAAME,OAAOF,MAAMC,IAAI,CAACC,IAAI;gBAC5B,MAAME,WAAWT,EAAEU,aAAa,CAACC,GAAG,CAAC;oBAAEJ;oBAAMQ;gBAAO;gBACpD,IAAI,CAACN,YAAYA,SAASG,UAAU,EAAE;oBACpC;gBACF;gBACAX,SAAS,CAACM,KAAK,GAAGE;YACpB;QACF;QAEA,OAAOR;IACT,GACA,CAACgB,MAAMC;QACL,OAAOC,KAAKC,SAAS,CAACH,UAAUE,KAAKC,SAAS,CAACF;IACjD;AAEJ;AAEA;;;;CAIC,GACD,OAAO,SAASG,8BACdd,IAAY,EACZQ,MAAe;IAKf,MAAMhB,QAAQL;IACd,OAAOtB,SAAS2B,OAAO,CAACC;QACtB,MAAMsB,QAAQtB,EAAEU,aAAa,CAACC,GAAG,CAAC;YAAEJ;YAAMQ;QAAO;QACjD,MAAMC,cAAcD,SAChBf,EAAEa,2BAA2B,CAACU,IAAI,CAAC,CAACC,IAAMA,EAAET,MAAM,KAAKA,SAASC,cAChEhB,EAAEG,mBAAmB;QACzB,MAAMsB,aAAa,AAACT,CAAAA,eAAe,EAAE,AAAD,EAAGO,IAAI,CAAC,CAACC,IAAMA,EAAElB,IAAI,CAACC,IAAI,KAAKA;QAEnE,OAAO;YAAEe;YAAOG;QAAW;IAC7B;AACF;AAEA,OAAO,SAASC;IAQd,MAAM3B,QAAQL;IACd,OAAOrB,uBACL0B,OACA,CAACC;QACC,OAAO;YACL2B,kBAAkB3B,EAAE2B,gBAAgB;YACpCC,oBAAoB5B,EAAE4B,kBAAkB;YACxCC,oBAAoB7B,EAAE6B,kBAAkB;YACxCC,wBAAwB9B,EAAE8B,sBAAsB;YAChDC,0BAA0B/B,EAAE+B,wBAAwB;YACpDC,yBAAyBhC,EAAEgC,uBAAuB;QACpD;IACF,GACAxD;AAEJ;AAEA,OAAO,SAASyD;IACd,MAAMlC,QAAQL;IACd,OAAOtB,SAAS2B,OAAO,CAACC,IAAMA,EAAEG,mBAAmB;AACrD;AAEA,OAAO,SAAS+B;IACd,MAAMnC,QAAQL;IACd,OAAOtB,SAAS2B,OAAO,CAACC,IAAMA,EAAEa,2BAA2B;AAC7D;AAOA,SAASsB,eAAe,EAAEC,QAAQ,EAAEC,gBAAgB,EAAuB;IACzE,MAAMC,iBAAiBzC;IACvB,MAAMmB,cAAciB;IACpB,MAAMM,sBAAsBL;IAC5B,MAAM,EAAEM,iBAAiB,EAAE,GAAG5D;IAE9B,MAAM6D,SAASxE,QAAQ;QACrB,MAAMyE,gBAAkC,CAAC;QAEzC,0DAA0D;QAC1D,sEAAsE;QACtE,0BAA0B;QAC1BC,OAAOC,IAAI,CAACN,gBAAgB9B,OAAO,CAAC,CAACD;YACnC,MAAMiB,IAAI;gBAAE,GAAGc,cAAc,CAAC/B,KAAK;YAAC;YAEpC,IAAIiB,EAAEnB,KAAK,KAAKvB,WAAW;gBACzB,MAAM2C,aAAavC,6BAA6BqB,MAAMS,aAAauB;gBACnE,6FAA6F;gBAC7F,IAAId,YAAYoB,SAAS,kBAAkBpB,WAAWnB,IAAI,CAACwC,cAAc,EAAE;oBACzEtB,EAAEnB,KAAK,GAAGoB,WAAWnB,IAAI,CAACwC,cAAc;oBACxCtB,EAAEsB,cAAc,GAAGrB,WAAWnB,IAAI,CAACwC,cAAc;gBACnD,OAAO;oBACLtB,EAAEnB,KAAK,GAAGmB,EAAEuB,OAAO,EAAE3C,IAAI,CAAC4C,IAAyBA,EAAE3C,KAAK,KAAK;gBACjE;YACF;YACAqC,aAAa,CAACnC,KAAK,GAAGiB;QACxB;QACA,OAAOkB;IACT,GAAG;QAACJ;QAAgBtB;QAAauB;KAAoB;IAErD,MAAMU,sBAAmDhF,QAAQ;QAC/D,MAAMiF,SAAsC;YAC1C;gBACEL,MAAM;gBACNvC,MAAM;oBACJC,MAAM;oBACNF,OAAO,IAAMmC,kBAAkBW,KAAK,CAACC,OAAO,GAAGC,QAAQ;oBACvDtC,QAAQ;oBACRuC,SAAS;wBACP/C,MAAM;wBACNgD,aAAa;wBACbC,QAAQ;oBACV;gBACF;YACF;YACA;gBACEX,MAAM;gBACNvC,MAAM;oBACJC,MAAM;oBACNF,OAAO,IAAMmC,kBAAkBiB,GAAG,CAACL,OAAO,GAAGC,QAAQ;oBACrDtC,QAAQ;oBACRuC,SAAS;wBACP/C,MAAM;wBACNgD,aAAa;wBACbC,QAAQ;oBACV;gBACF;YACF;YACA;gBACEX,MAAM;gBACNvC,MAAM;oBACJC,MAAM;oBACNF,OAAO,IAAMtB,eAAeC,mBAAmBwD;oBAC/CzB,QAAQ;oBACRuC,SAAS;wBACP/C,MAAM;wBACNgD,aAAa;wBACbC,QAAQ;oBACV;gBACF;YACF;YACA;gBACEX,MAAM;gBACNvC,MAAM;oBACJC,MAAM;oBACNF,OAAO,IAAM,AAAC,CAAA,AAACmC,CAAAA,kBAAkBiB,GAAG,CAACL,OAAO,KAAKZ,kBAAkBW,KAAK,CAACC,OAAO,EAAC,IAAK,IAAG,EAAGC,QAAQ;oBACpGtC,QAAQ;oBACRuC,SAAS;wBACP/C,MAAM;wBACNgD,aAAa;wBACbC,QAAQ;oBACV;gBACF;YACF;YACA;gBACEX,MAAM;gBACNvC,MAAM;oBACJC,MAAM;oBACNF,OAAO,IAAM,AAACmC,CAAAA,kBAAkBiB,GAAG,CAACL,OAAO,KAAKZ,kBAAkBW,KAAK,CAACC,OAAO,EAAC,EAAGC,QAAQ;oBAC3FtC,QAAQ;oBACRuC,SAAS;wBACP/C,MAAM;wBACNgD,aAAa;wBACbC,QAAQ;oBACV;gBACF;YACF;SACD;QACDnB,kBAAkB7B,QAAQ,CAACkD,MAAQR,OAAOS,IAAI,CAACD;QAC/C,OAAOR;IACT,GAAG;QAACV;QAAmBH;KAAiB;IAExC,qBACE,KAAC1D,uBAAuBiF,QAAQ;QAACvD,OAAO;YAAEwD,WAAWZ;QAAoB;kBACvE,cAAA,KAACvE,gBAAgBkF,QAAQ;YAACvD,OAAO;gBAAEiB,OAAOmB;YAAO;sBAAIL;;;AAG3D;AASA,SAAS0B,8BAA8B,EACrCC,6BAA6B,EAAE,EAC/BlD,8BAA8B,EAAE,EAChCmD,WAAW,EACXC,qBAAqB,EACO;IAC5B,MAAMC,mBAAmB7E,mCAAmC2E,cAAcA,WAAW,CAAC,EAAE,GAAG,CAAC;IAC5F,MAAMG,gBAAgB;QAAE,GAAGD,gBAAgB;QAAE,GAAGD,qBAAqB;IAAC;IACtE,MAAMlE,QAAQ5B,cACZI,SACED,MAAM,CAAC8F,KAAKzD,MAAS,CAAA;YACnBD,eAAetB,gCACb2E,4BACAI,eACAtD;YAEFV,qBAAqB4D;YACrBlD,6BAA6BA;YAC7BiB,wBAAuBd,WAAiC;gBACtDoD,IACE,CAAC9C;oBACCA,MAAMnB,mBAAmB,GAAGa;oBAC5BM,MAAMZ,aAAa,GAAGtB,gCACpB4B,aACAmD,eACAtD;gBAEJ,GACA,OACA,qCAAqC,yCAAyC;;YAElF;YACAgB,oBAAmBtB,IAAI,EAAEwC,OAAO,EAAEhC,MAAe;gBAC/CqD,IACE,CAAC9C;oBACC,MAAMb,WAAWa,MAAMZ,aAAa,CAACC,GAAG,CAAC;wBAAEJ;wBAAMQ;oBAAO;oBACxD,IAAI,CAACN,UAAU;wBACb;oBACF;oBACAA,SAASsC,OAAO,GAAGA;gBACrB,GACA,OACA;YAEJ;YACAnB,oBAAmBrB,IAAI,EAAE8D,OAAO,EAAEtD,MAAe;gBAC/CqD,IACE,CAAC9C;oBACC,MAAMb,WAAWa,MAAMZ,aAAa,CAACC,GAAG,CAAC;wBAAEJ;wBAAMQ;oBAAO;oBACxD,IAAI,CAACN,UAAU;wBACb;oBACF;oBACAA,SAAS4D,OAAO,GAAGA;gBACrB,GACA,OACA;YAEJ;YACA1C,kBAAkB,CAACpB,MAAMF,OAAOU,SAC9BqD,IACE,CAAC9C;oBACC,IAAIgD,MAAMjE;oBACV,MAAMI,WAAWa,MAAMZ,aAAa,CAACC,GAAG,CAAC;wBAAEJ;wBAAMQ;oBAAO;oBACxD,IAAI,CAACN,UAAU;wBACb;oBACF;oBAEA,wCAAwC;oBACxC,IAAI8D,MAAMC,OAAO,CAACF,QAAQA,IAAIG,QAAQ,CAAC3F,YAAY;wBACjD,IAAIwF,IAAII,EAAE,CAAC,CAAC,OAAO5F,WAAW;4BAC5BwF,MAAMxF;wBACR,OAAO;4BACLwF,MAAMA,IAAIK,MAAM,CAAC,CAACnD,IAAMA,MAAM1C;wBAChC;oBACF;oBACA,IAAIkF,aAAa;wBACf,MAAMY,iBAAiBZ,WAAW,CAAC,EAAE;wBACrCY,eAAe;4BAAE,CAACtF,qBAAqBiB,MAAM,EAAE+D;wBAAI;oBACrD;oBACA7D,SAASJ,KAAK,GAAGiE;gBACnB,GACA,OACA;YAEJvC,0BAA0B;gBACxB,MAAM5B,sBAAsBQ,MAAMR,mBAAmB;gBACrD,MAAMO,gBAAgBC,MAAMD,aAAa;gBACzC,MAAMmE,mBAAmBpG,QAAQ0B,qBAAqB,CAAC2E;oBACrDA,MAAMtE,OAAO,CAAC,CAACuE,UAAUC;wBACvB,MAAMzE,OAAOwE,SAASzE,IAAI,CAACC,IAAI;wBAC/B,IAAIwE,SAASlC,IAAI,KAAK,gBAAgB;4BACpC,MAAMoC,kBAAkBvE,cAAcC,GAAG,CAAC;gCAAEJ;4BAAK;4BACjD,IAAI0E,iBAAiB5E,UAAUZ,WAAW;gCACxCqF,KAAK,CAACE,MAAM,GAAG;oCACbnC,MAAM;oCACNvC,MAAM7B,QAAQsG,SAASzE,IAAI,EAAE,CAAC4E;wCAC5BA,UAAUC,YAAY,GAAGF,gBAAgB5E,KAAK;oCAChD;gCACF;4BACF;wBACF,OAAO,IAAI0E,SAASlC,IAAI,KAAK,gBAAgB;4BAC3C,MAAMoC,kBAAkBvE,cAAcC,GAAG,CAAC;gCAAEJ;4BAAK;4BACjD,MAAM6E,uBAAuB,OAAOH,iBAAiB5E,UAAU,WAAW4E,gBAAgB5E,KAAK,GAAG;4BAClG,IAAI4E,iBAAiB5E,UAAUZ,WAAW;gCACxCqF,KAAK,CAACE,MAAM,GAAG;oCACbnC,MAAM;oCACNvC,MAAM7B,QAAQsG,SAASzE,IAAI,EAAE,CAAC4E;wCAC5BA,UAAU7E,KAAK,GAAG+E;oCACpB;gCACF;4BACF;wBACF;oBACF;gBACF;gBACAhB,IACE,CAAC9C;oBACCA,MAAMnB,mBAAmB,GAAG0E;gBAC9B,GACA,OACA;gBAEF,OAAOA;YACT;YACA7C,yBAAyB;gBAIvB,OAAO/C,gCAAgC0B,MAAMR,mBAAmB,EAAEQ,MAAMD,aAAa;YACvF;QACF,CAAA;IAIJ,OAAOX;AACT;AAmBA,sHAAsH;AACtH,OAAO,SAASsF,iBAAiB,EAC/BjD,QAAQ,EACR2B,6BAA6B,EAAE,EAC/BlD,8BAA8B,EAAE,EAChCyE,6BAA6B,EAAE,EAC/BrB,qBAAqB,EACC;IACtB,MAAM,CAAClE,MAAM,GAAG7B,SAAS,IACvB4F,8BAA8B;YAAEC;YAA4BlD;YAA6BoD;QAAsB;IAGjH,qBACE,KAACzE,+BAA+BoE,QAAQ;QAACvD,OAAON;kBAC9C,cAAA,KAACoC;YAAeE,kBAAkBiD;sBAA6BlD;;;AAGrE;AAEA,OAAO,SAASmD,gCAAgC,EAC9CnD,QAAQ,EACR2B,6BAA6B,EAAE,EAC/BlD,8BAA8B,EAAE,EAChCyE,4BAA4BjD,mBAAmB,EAAE,EAC3B;IACtB,MAAMmD,kBAAkBrG,yBAAyB4E,4BAA4BlD;IAC7E,MAAMmD,cAAczE,uBAAuBiG;IAC3C,MAAM,CAACzF,MAAM,GAAG7B,SAAS,IACvB4F,8BAA8B;YAAEC;YAA4BlD;YAA6BmD;QAAY;IAGvG,qBACE,KAACxE,+BAA+BoE,QAAQ;QAACvD,OAAON;kBAC9C,cAAA,KAACoC;YAAeE,kBAAkBA;sBAAmBD;;;AAG3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../src/context/useDashboard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAkB,aAAa,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../src/context/useDashboard.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAkB,aAAa,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAQvD,KAAK,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,EAAE,aAAa,GAAG;QAAE,GAAG,CAAC,EAAE,cAAc,CAAA;KAAE,CAAA;CAAE,CAAC;AAC1G,wBAAgB,YAAY,IAAI;IAC9B,SAAS,EAAE,aAAa,CAAC;IACzB,YAAY,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC9D,CAmGA"}
|
|
@@ -15,13 +15,14 @@ import { useDashboardStore } from './DashboardProvider';
|
|
|
15
15
|
import { useVariableDefinitionActions, useVariableDefinitions } from './VariableProvider';
|
|
16
16
|
import { useAnnotationActions, useAnnotationSpecs } from './AnnotationProvider';
|
|
17
17
|
export function useDashboard() {
|
|
18
|
-
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 })=>({
|
|
19
19
|
panels,
|
|
20
20
|
panelGroups,
|
|
21
21
|
panelGroupOrder,
|
|
22
22
|
setDashboard,
|
|
23
23
|
kind,
|
|
24
24
|
metadata,
|
|
25
|
+
timezone,
|
|
25
26
|
display,
|
|
26
27
|
duration,
|
|
27
28
|
refreshInterval,
|
|
@@ -44,6 +45,7 @@ export function useDashboard() {
|
|
|
44
45
|
variables,
|
|
45
46
|
annotations,
|
|
46
47
|
duration,
|
|
48
|
+
timezone,
|
|
47
49
|
refreshInterval,
|
|
48
50
|
datasources,
|
|
49
51
|
links
|
|
@@ -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
|
|
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 } from '@perses-dev/spec';\nimport { DashboardResource } from '@perses-dev/client';\nimport { PanelGroupId } from '@perses-dev/plugin-system';\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":"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,QAAuD,mBAAmB;AAKjG,SAASC,iBAAiB,QAAQ,sBAAsB;AACxD,SAASC,4BAA4B,EAAEC,sBAAsB,QAAQ,qBAAqB;AAC1F,SAASC,oBAAoB,EAAEC,kBAAkB,QAAQ,uBAAuB;AAGhF,OAAO,SAASC;IAId,MAAM,EACJC,MAAM,EACNC,WAAW,EACXC,eAAe,EACfC,cAAcC,oBAAoB,EAClCC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,QAAQ,EACRC,eAAe,EACfC,WAAW,EACXC,KAAK,EACLC,GAAG,EACJ,GAAGnB,kBACF,CAAC,EACCM,MAAM,EACNC,WAAW,EACXC,eAAe,EACfC,YAAY,EACZE,IAAI,EACJC,QAAQ,EACRE,QAAQ,EACRD,OAAO,EACPE,QAAQ,EACRC,eAAe,EACfC,WAAW,EACXC,KAAK,EACLC,GAAG,EACJ,GAAM,CAAA;YACLb;YACAC;YACAC;YACAC;YACAE;YACAC;YACAE;YACAD;YACAE;YACAC;YACAC;YACAC;YACAC;QACF,CAAA;IAEF,MAAM,EAAEC,sBAAsB,EAAE,GAAGnB;IACnC,MAAM,EAAEoB,kBAAkB,EAAE,GAAGlB;IAC/B,MAAMmB,YAAYpB;IAClB,MAAMqB,cAAcnB;IACpB,MAAMoB,UAAUC,4BAA4BlB,aAAaC;IAEzD,MAAMkB,YACJf,SAAS,cACL;QACEA;QACAC;QACAe,MAAM;YACJd;YACAP;YACAkB;YACAF;YACAC;YACAR;YACAD;YACAE;YACAC;YACAC;QACF;IACF,IACA;QACEP;QACAC;QACAe,MAAM;YACJd;YACAP;YACAkB;YACAF;YACAC;YACAR;YACAC;YACAC;YACAC;YACAC;QACF;IACF;IAEN,MAAMV,eAAe,CAACmB;QACpBR,uBAAuBQ,kBAAkBD,IAAI,CAACL,SAAS;QACvD,IAAIM,kBAAkBD,IAAI,CAACJ,WAAW,EAAE;YACtCF,mBAAmBO,kBAAkBD,IAAI,CAACJ,WAAW;QACvD;QACAb,qBAAqBkB;IACvB;IAEA,OAAO;QACLF;QACAjB;IACF;AACF;AAEA,SAASgB,4BACPlB,WAAiD,EACjDC,eAA+B;IAE/B,MAAMgB,UAA4B,EAAE;IACpChB,gBAAgBqB,GAAG,CAAC,CAACC;QACnB,MAAMC,QAAQxB,WAAW,CAACuB,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,IAAIlB,UAAUmB;QACd,IAAIE,SAASC,gBAAgBH,WAAW;YACtCnB,UAAU;gBACRqB,OAAOA,SAAS;gBAChBK,UAAU;oBACRC,MAAM,CAACL;gBACT;YACF;QACF;QACA,MAAMM,SAAyB;YAC7B9B,MAAM;YACNgB,MAAM;gBACJd;gBACA6B,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,SAASpD,eAAe4C;oBAC1B;gBACF;gBACAP,gBAAgBA;YAClB;QACF;QACAZ,QAAQ4B,IAAI,CAACX;IACf;IAEA,OAAOjB;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelGroupDefinition.d.ts","sourceRoot":"","sources":["../../src/model/PanelGroupDefinition.ts"],"names":[],"mappings":"AAaA,
|
|
1
|
+
{"version":3,"file":"PanelGroupDefinition.d.ts","sourceRoot":"","sources":["../../src/model/PanelGroupDefinition.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAC;IACV;;OAEG;IACH,CAAC,EAAE,MAAM,CAAC;IACV;;OAEG;IACH,CAAC,EAAE,MAAM,CAAC;IACV;;OAEG;IACH,CAAC,EAAE,MAAM,CAAC;IACV;;OAEG;IACH,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,CAAC,EAAE,sBAAsB,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAE3F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/model/PanelGroupDefinition.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\
|
|
1
|
+
{"version":3,"sources":["../../src/model/PanelGroupDefinition.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 { PanelGroupId } from '@perses-dev/plugin-system';\n/**\n * Panel Group Item Layout ID type. String identifier for items within a panel group.\n */\nexport type PanelGroupItemLayoutId = string;\n\n/**\n * Uniquely identifies an item in a PanelGroup.\n */\nexport interface PanelGroupItemId {\n panelGroupId: PanelGroupId;\n panelGroupItemLayoutId: PanelGroupItemLayoutId;\n repeatVariable?: [string, string]; // Optional, used for repeated panel groups. Variable name and value.\n}\n\n/**\n * Base layout properties for positioning and sizing items in a grid.\n * This is a framework-agnostic representation that can be used with various grid systems.\n */\nexport interface BaseLayout {\n /**\n * Item identifier\n */\n i: string;\n /**\n * X position in grid units\n */\n x: number;\n /**\n * Y position in grid units\n */\n y: number;\n /**\n * Width in grid units\n */\n w: number;\n /**\n * Height in grid units\n */\n h: number;\n}\n\nexport interface PanelGroupItemLayout extends BaseLayout {\n i: PanelGroupItemLayoutId;\n}\n\n/**\n * Definition of a panel group, containing layout and panel information.\n */\nexport interface PanelGroupDefinition {\n id: PanelGroupId;\n isCollapsed: boolean;\n title?: string;\n repeatedOriginId?: PanelGroupId; // ID of the original panel group from which this repeated group is derived\n repeatVariable?: string; // Optional, used for repeated panel groups\n itemLayouts: PanelGroupItemLayout[];\n itemPanelKeys: Record<PanelGroupItemLayoutId, string>;\n}\n\n/**\n * Check if two PanelGroupItemId are equal\n */\nexport function isPanelGroupItemIdEqual(a?: PanelGroupItemId, b?: PanelGroupItemId): boolean {\n return a?.panelGroupId === b?.panelGroupId && a?.panelGroupItemLayoutId === b?.panelGroupItemLayoutId;\n}\n"],"names":["isPanelGroupItemIdEqual","a","b","panelGroupId","panelGroupItemLayoutId"],"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;AA6DjC;;CAEC,GACD,OAAO,SAASA,wBAAwBC,CAAoB,EAAEC,CAAoB;IAChF,OAAOD,GAAGE,iBAAiBD,GAAGC,gBAAgBF,GAAGG,2BAA2BF,GAAGE;AACjF"}
|
|
@@ -15,6 +15,7 @@ export interface DashboardAppProps {
|
|
|
15
15
|
isInitialVariableSticky?: boolean;
|
|
16
16
|
isLeavingConfirmDialogEnabled?: boolean;
|
|
17
17
|
dashboardTitleComponent?: ReactNode;
|
|
18
|
+
userPreferenceTimezone?: DashboardSpec['timezone'];
|
|
18
19
|
onSave?: OnSaveDashboard;
|
|
19
20
|
onDiscard?: (name: string, spec: DashboardSpec) => void;
|
|
20
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,
|
|
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"}
|
|
@@ -11,7 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
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, isAnnotationEnabled, 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,6 +88,7 @@ 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,
|
|
@@ -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 { 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 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 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 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":["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","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,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,
|
|
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"}
|
|
@@ -22,7 +22,7 @@ import { DashboardApp } from './DashboardApp';
|
|
|
22
22
|
/**
|
|
23
23
|
* The View for displaying a Dashboard, along with the UI for selecting variable values.
|
|
24
24
|
*/ export function ViewDashboard(props) {
|
|
25
|
-
const { dashboardResource, datasourceApi, externalVariableDefinitions, emptyDashboardProps, isReadonly, isVariableEnabled, isAnnotationEnabled, isDatasourceEnabled, disableShortcuts, isEditing, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, onSave, onDiscard, sx, ...others } = props;
|
|
25
|
+
const { dashboardResource, datasourceApi, externalVariableDefinitions, emptyDashboardProps, isReadonly, isVariableEnabled, isAnnotationEnabled, isDatasourceEnabled, disableShortcuts, isEditing, isCreating, isInitialVariableSticky, isLeavingConfirmDialogEnabled, dashboardTitleComponent, onSave, onDiscard, sx, userPreferenceTimezone, ...others } = props;
|
|
26
26
|
const { spec } = dashboardResource;
|
|
27
27
|
const dashboardDuration = spec.duration ?? DEFAULT_DASHBOARD_DURATION;
|
|
28
28
|
const dashboardRefreshInterval = spec.refreshInterval ?? DEFAULT_REFRESH_INTERVAL;
|
|
@@ -108,7 +108,8 @@ import { DashboardApp } from './DashboardApp';
|
|
|
108
108
|
isLeavingConfirmDialogEnabled: isLeavingConfirmDialogEnabled,
|
|
109
109
|
dashboardTitleComponent: dashboardTitleComponent,
|
|
110
110
|
onSave: onSave,
|
|
111
|
-
onDiscard: onDiscard
|
|
111
|
+
onDiscard: onDiscard,
|
|
112
|
+
userPreferenceTimezone: userPreferenceTimezone
|
|
112
113
|
})
|
|
113
114
|
})
|
|
114
115
|
})
|