@perses-dev/dashboards 0.38.0 → 0.40.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/AddGroupButton/AddGroupButton.js +9 -7
- package/dist/cjs/components/AddGroupButton/index.js +10 -8
- package/dist/cjs/components/AddPanelButton/AddPanelButton.js +9 -7
- package/dist/cjs/components/AddPanelButton/index.js +10 -8
- package/dist/cjs/components/Dashboard/Dashboard.js +14 -11
- package/dist/cjs/components/Dashboard/index.js +10 -8
- package/dist/cjs/components/DashboardStickyToolbar/DashboardStickyToolbar.js +18 -16
- package/dist/cjs/components/DashboardStickyToolbar/index.js +10 -8
- package/dist/cjs/components/DashboardToolbar/DashboardToolbar.js +43 -41
- package/dist/cjs/components/DashboardToolbar/index.js +10 -8
- package/dist/cjs/components/DeletePanelDialog/DeletePanelDialog.js +12 -10
- package/dist/cjs/components/DeletePanelDialog/index.js +10 -8
- package/dist/cjs/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +17 -15
- package/dist/cjs/components/DeletePanelGroupDialog/index.js +10 -8
- package/dist/cjs/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js +5 -3
- package/dist/cjs/components/DiscardChangesConfirmationDialog/index.js +10 -8
- package/dist/cjs/components/DownloadButton/DownloadButton.js +12 -10
- package/dist/cjs/components/DownloadButton/index.js +10 -8
- package/dist/cjs/components/EditButton/EditButton.js +8 -6
- package/dist/cjs/components/EditButton/index.js +10 -8
- package/dist/cjs/components/EditJsonButton/EditJsonButton.js +10 -8
- package/dist/cjs/components/EditJsonButton/index.js +10 -8
- package/dist/cjs/components/EditJsonDialog/EditJsonDialog.js +29 -23
- package/dist/cjs/components/EditJsonDialog/index.js +10 -8
- package/dist/cjs/components/EmptyDashboard/EmptyDashboard.js +18 -16
- package/dist/cjs/components/EmptyDashboard/index.js +10 -8
- package/dist/cjs/components/GridLayout/GridContainer.js +5 -3
- package/dist/cjs/components/GridLayout/GridItemContent.js +33 -12
- package/dist/cjs/components/GridLayout/GridLayout.js +19 -16
- package/dist/cjs/components/GridLayout/GridTitle.js +35 -33
- package/dist/cjs/components/GridLayout/index.js +13 -11
- package/dist/cjs/components/Panel/Panel.js +21 -21
- package/dist/cjs/components/Panel/PanelContent.js +8 -6
- package/dist/cjs/components/Panel/PanelHeader.js +39 -33
- package/dist/cjs/components/Panel/index.js +10 -8
- package/dist/cjs/components/PanelDrawer/PanelDrawer.js +25 -77
- package/dist/cjs/components/PanelDrawer/PanelEditorForm.js +269 -141
- package/dist/cjs/components/PanelDrawer/PanelPreview.js +11 -9
- package/dist/cjs/components/PanelDrawer/index.js +10 -8
- package/dist/cjs/components/PanelDrawer/usePanelEditor.js +3 -1
- package/dist/cjs/components/PanelGroupDialog/PanelGroupDialog.js +18 -16
- package/dist/cjs/components/PanelGroupDialog/PanelGroupEditorForm.js +15 -11
- package/dist/cjs/components/PanelGroupDialog/index.js +10 -8
- package/dist/cjs/components/QuerySummaryTable/QuerySummaryTable.js +46 -44
- package/dist/cjs/components/QuerySummaryTable/index.js +10 -8
- package/dist/cjs/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +23 -21
- package/dist/cjs/components/SaveChangesConfirmationDialog/index.js +10 -8
- package/dist/cjs/components/SaveDashboardButton/SaveDashboardButton.js +11 -9
- package/dist/cjs/components/SaveDashboardButton/index.js +10 -8
- package/dist/cjs/components/TimeRangeControls/TimeRangeControls.js +40 -16
- package/dist/cjs/components/TimeRangeControls/index.js +10 -8
- package/dist/cjs/components/ToolbarIconButton/ToolbarIconButton.js +5 -3
- package/dist/cjs/components/ToolbarIconButton/index.js +10 -8
- package/dist/cjs/components/Variables/BuiltinVariableAccordions.js +140 -0
- package/dist/cjs/components/Variables/EditVariablesButton.js +18 -11
- package/dist/cjs/components/Variables/TemplateVariable.js +127 -76
- package/dist/cjs/components/Variables/VariableEditor.js +356 -117
- package/dist/cjs/components/Variables/VariableList.js +45 -21
- package/dist/cjs/components/Variables/index.js +14 -11
- package/dist/cjs/components/index.js +31 -29
- package/dist/cjs/constants/grid-layout-config.js +6 -2
- package/dist/cjs/constants/index.js +11 -9
- package/dist/cjs/constants/user-interface-text.js +6 -2
- package/dist/cjs/context/DashboardProvider/DashboardProvider.js +40 -34
- package/dist/cjs/context/DashboardProvider/common.js +6 -2
- package/dist/cjs/context/DashboardProvider/dashboard-provider-api.js +70 -38
- package/dist/cjs/context/DashboardProvider/delete-panel-group-slice.js +3 -1
- package/dist/cjs/context/DashboardProvider/delete-panel-slice.js +5 -3
- package/dist/cjs/context/DashboardProvider/discard-changes-dialog-slice.js +3 -1
- package/dist/cjs/context/DashboardProvider/duplicate-panel-slice.js +3 -1
- package/dist/cjs/context/DashboardProvider/edit-json-dialog-slice.js +3 -1
- package/dist/cjs/context/DashboardProvider/index.js +12 -10
- package/dist/cjs/context/DashboardProvider/panel-editor-slice.js +13 -11
- package/dist/cjs/context/DashboardProvider/panel-group-editor-slice.js +8 -6
- package/dist/cjs/context/DashboardProvider/panel-group-slice.js +15 -7
- package/dist/cjs/context/DashboardProvider/panel-slice.js +3 -1
- package/dist/cjs/context/DashboardProvider/save-changes-dialog-slice.js +3 -1
- package/dist/cjs/context/DatasourceStoreProvider.js +114 -45
- package/dist/cjs/context/TemplateVariableProvider/TemplateVariableProvider.js +189 -51
- package/dist/cjs/context/TemplateVariableProvider/hydrationUtils.js +65 -13
- package/dist/cjs/context/TemplateVariableProvider/index.js +10 -8
- package/dist/cjs/context/TemplateVariableProvider/query-params.js +17 -7
- package/dist/cjs/context/TemplateVariableProvider/utils.js +49 -9
- package/dist/cjs/context/index.js +13 -11
- package/dist/cjs/context/useDashboard.js +8 -6
- package/dist/cjs/index.js +12 -10
- package/dist/cjs/stories/decorators/WithDashboard.js +6 -4
- package/dist/cjs/stories/decorators/WithDatasourceStore.js +6 -4
- package/dist/cjs/stories/decorators/WithTemplateVariables.js +6 -4
- package/dist/cjs/stories/decorators/constants.js +5 -3
- package/dist/cjs/stories/decorators/index.js +13 -11
- package/dist/cjs/test/dashboard-provider.js +8 -4
- package/dist/cjs/test/datasource-provider.js +16 -12
- package/dist/cjs/test/index.js +13 -11
- package/dist/cjs/test/plugin-registry.js +6 -4
- package/dist/cjs/test/render.js +27 -20
- package/dist/cjs/test/setup-tests.js +2 -2
- package/dist/cjs/test/testDashboard.js +13 -11
- package/dist/cjs/utils/index.js +11 -9
- package/dist/cjs/utils/panelUtils.js +9 -3
- package/dist/cjs/utils/time.js +5 -3
- package/dist/cjs/validation/index.js +30 -0
- package/dist/cjs/validation/panel.js +29 -0
- package/dist/cjs/views/ViewDashboard/DashboardApp.js +24 -15
- package/dist/cjs/views/ViewDashboard/ViewDashboard.js +64 -19
- package/dist/cjs/views/ViewDashboard/index.js +10 -8
- package/dist/cjs/views/index.js +10 -8
- package/dist/components/AddGroupButton/AddGroupButton.js.map +1 -1
- package/dist/components/AddGroupButton/index.js.map +1 -1
- package/dist/components/AddPanelButton/AddPanelButton.js.map +1 -1
- package/dist/components/AddPanelButton/index.js.map +1 -1
- package/dist/components/Dashboard/Dashboard.d.ts +3 -1
- package/dist/components/Dashboard/Dashboard.d.ts.map +1 -1
- package/dist/components/Dashboard/Dashboard.js +3 -2
- package/dist/components/Dashboard/Dashboard.js.map +1 -1
- package/dist/components/Dashboard/index.js.map +1 -1
- package/dist/components/DashboardStickyToolbar/DashboardStickyToolbar.js.map +1 -1
- package/dist/components/DashboardStickyToolbar/index.js.map +1 -1
- package/dist/components/DashboardToolbar/DashboardToolbar.js +1 -1
- package/dist/components/DashboardToolbar/DashboardToolbar.js.map +1 -1
- package/dist/components/DashboardToolbar/index.js.map +1 -1
- package/dist/components/DeletePanelDialog/DeletePanelDialog.js.map +1 -1
- package/dist/components/DeletePanelDialog/index.js.map +1 -1
- package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js +2 -2
- package/dist/components/DeletePanelGroupDialog/DeletePanelGroupDialog.js.map +1 -1
- package/dist/components/DeletePanelGroupDialog/index.js.map +1 -1
- package/dist/components/DiscardChangesConfirmationDialog/DiscardChangesConfirmationDialog.js.map +1 -1
- package/dist/components/DiscardChangesConfirmationDialog/index.js.map +1 -1
- package/dist/components/DownloadButton/DownloadButton.js.map +1 -1
- package/dist/components/DownloadButton/index.js.map +1 -1
- package/dist/components/EditButton/EditButton.js.map +1 -1
- package/dist/components/EditButton/index.js.map +1 -1
- package/dist/components/EditJsonButton/EditJsonButton.js.map +1 -1
- package/dist/components/EditJsonButton/index.js.map +1 -1
- package/dist/components/EditJsonDialog/EditJsonDialog.d.ts +4 -1
- package/dist/components/EditJsonDialog/EditJsonDialog.d.ts.map +1 -1
- package/dist/components/EditJsonDialog/EditJsonDialog.js +12 -8
- package/dist/components/EditJsonDialog/EditJsonDialog.js.map +1 -1
- package/dist/components/EditJsonDialog/index.js.map +1 -1
- package/dist/components/EmptyDashboard/EmptyDashboard.js.map +1 -1
- package/dist/components/EmptyDashboard/index.js.map +1 -1
- package/dist/components/GridLayout/GridContainer.js.map +1 -1
- package/dist/components/GridLayout/GridItemContent.d.ts +2 -0
- package/dist/components/GridLayout/GridItemContent.d.ts.map +1 -1
- package/dist/components/GridLayout/GridItemContent.js +27 -8
- package/dist/components/GridLayout/GridItemContent.js.map +1 -1
- package/dist/components/GridLayout/GridLayout.d.ts +2 -0
- package/dist/components/GridLayout/GridLayout.d.ts.map +1 -1
- package/dist/components/GridLayout/GridLayout.js +3 -2
- package/dist/components/GridLayout/GridLayout.js.map +1 -1
- package/dist/components/GridLayout/GridTitle.js.map +1 -1
- package/dist/components/GridLayout/index.js.map +1 -1
- package/dist/components/Panel/Panel.d.ts +20 -0
- package/dist/components/Panel/Panel.d.ts.map +1 -1
- package/dist/components/Panel/Panel.js +8 -10
- package/dist/components/Panel/Panel.js.map +1 -1
- package/dist/components/Panel/PanelContent.js.map +1 -1
- package/dist/components/Panel/PanelHeader.d.ts +2 -1
- package/dist/components/Panel/PanelHeader.d.ts.map +1 -1
- package/dist/components/Panel/PanelHeader.js +7 -3
- package/dist/components/Panel/PanelHeader.js.map +1 -1
- package/dist/components/Panel/index.js.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelDrawer.js +22 -76
- package/dist/components/PanelDrawer/PanelDrawer.js.map +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.d.ts +4 -1
- package/dist/components/PanelDrawer/PanelEditorForm.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelEditorForm.js +223 -138
- package/dist/components/PanelDrawer/PanelEditorForm.js.map +1 -1
- package/dist/components/PanelDrawer/PanelPreview.d.ts.map +1 -1
- package/dist/components/PanelDrawer/PanelPreview.js +2 -2
- package/dist/components/PanelDrawer/PanelPreview.js.map +1 -1
- package/dist/components/PanelDrawer/index.js.map +1 -1
- package/dist/components/PanelDrawer/usePanelEditor.js.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupDialog.js.map +1 -1
- package/dist/components/PanelGroupDialog/PanelGroupEditorForm.js.map +1 -1
- package/dist/components/PanelGroupDialog/index.js.map +1 -1
- package/dist/components/QuerySummaryTable/QuerySummaryTable.js +4 -4
- package/dist/components/QuerySummaryTable/QuerySummaryTable.js.map +1 -1
- package/dist/components/QuerySummaryTable/index.js.map +1 -1
- package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js +4 -4
- package/dist/components/SaveChangesConfirmationDialog/SaveChangesConfirmationDialog.js.map +1 -1
- package/dist/components/SaveChangesConfirmationDialog/index.js.map +1 -1
- package/dist/components/SaveDashboardButton/SaveDashboardButton.js +4 -4
- package/dist/components/SaveDashboardButton/SaveDashboardButton.js.map +1 -1
- package/dist/components/SaveDashboardButton/index.js.map +1 -1
- package/dist/components/TimeRangeControls/TimeRangeControls.d.ts.map +1 -1
- package/dist/components/TimeRangeControls/TimeRangeControls.js +19 -1
- package/dist/components/TimeRangeControls/TimeRangeControls.js.map +1 -1
- package/dist/components/TimeRangeControls/index.js.map +1 -1
- package/dist/components/ToolbarIconButton/ToolbarIconButton.js.map +1 -1
- package/dist/components/ToolbarIconButton/index.js.map +1 -1
- package/dist/components/Variables/BuiltinVariableAccordions.d.ts +8 -0
- package/dist/components/Variables/BuiltinVariableAccordions.d.ts.map +1 -0
- package/dist/components/Variables/BuiltinVariableAccordions.js +127 -0
- package/dist/components/Variables/BuiltinVariableAccordions.js.map +1 -0
- package/dist/components/Variables/EditVariablesButton.d.ts.map +1 -1
- package/dist/components/Variables/EditVariablesButton.js +6 -1
- package/dist/components/Variables/EditVariablesButton.js.map +1 -1
- package/dist/components/Variables/TemplateVariable.d.ts +12 -2
- package/dist/components/Variables/TemplateVariable.d.ts.map +1 -1
- package/dist/components/Variables/TemplateVariable.js +102 -61
- package/dist/components/Variables/TemplateVariable.js.map +1 -1
- package/dist/components/Variables/VariableEditor.d.ts +9 -1
- package/dist/components/Variables/VariableEditor.d.ts.map +1 -1
- package/dist/components/Variables/VariableEditor.js +326 -97
- package/dist/components/Variables/VariableEditor.js.map +1 -1
- package/dist/components/Variables/VariableList.d.ts +5 -0
- package/dist/components/Variables/VariableList.d.ts.map +1 -1
- package/dist/components/Variables/VariableList.js +32 -18
- package/dist/components/Variables/VariableList.js.map +1 -1
- package/dist/components/Variables/index.d.ts +1 -0
- package/dist/components/Variables/index.d.ts.map +1 -1
- package/dist/components/Variables/index.js +1 -0
- package/dist/components/Variables/index.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/constants/grid-layout-config.js.map +1 -1
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/user-interface-text.js.map +1 -1
- package/dist/context/DashboardProvider/DashboardProvider.js +5 -5
- package/dist/context/DashboardProvider/DashboardProvider.js.map +1 -1
- package/dist/context/DashboardProvider/common.js.map +1 -1
- package/dist/context/DashboardProvider/dashboard-provider-api.js +2 -2
- package/dist/context/DashboardProvider/dashboard-provider-api.js.map +1 -1
- package/dist/context/DashboardProvider/delete-panel-group-slice.js.map +1 -1
- package/dist/context/DashboardProvider/delete-panel-slice.js +2 -2
- package/dist/context/DashboardProvider/delete-panel-slice.js.map +1 -1
- package/dist/context/DashboardProvider/discard-changes-dialog-slice.js.map +1 -1
- package/dist/context/DashboardProvider/duplicate-panel-slice.js.map +1 -1
- package/dist/context/DashboardProvider/edit-json-dialog-slice.js.map +1 -1
- package/dist/context/DashboardProvider/index.js.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts +2 -1
- package/dist/context/DashboardProvider/panel-editor-slice.d.ts.map +1 -1
- package/dist/context/DashboardProvider/panel-editor-slice.js +7 -7
- package/dist/context/DashboardProvider/panel-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-editor-slice.js +2 -2
- package/dist/context/DashboardProvider/panel-group-editor-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-group-slice.js +3 -3
- package/dist/context/DashboardProvider/panel-group-slice.js.map +1 -1
- package/dist/context/DashboardProvider/panel-slice.js.map +1 -1
- package/dist/context/DashboardProvider/save-changes-dialog-slice.js.map +1 -1
- package/dist/context/DatasourceStoreProvider.d.ts +14 -10
- package/dist/context/DatasourceStoreProvider.d.ts.map +1 -1
- package/dist/context/DatasourceStoreProvider.js +107 -40
- package/dist/context/DatasourceStoreProvider.js.map +1 -1
- package/dist/context/TemplateVariableProvider/TemplateVariableProvider.d.ts +48 -13
- package/dist/context/TemplateVariableProvider/TemplateVariableProvider.d.ts.map +1 -1
- package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js +165 -41
- package/dist/context/TemplateVariableProvider/TemplateVariableProvider.js.map +1 -1
- package/dist/context/TemplateVariableProvider/hydrationUtils.d.ts +9 -2
- package/dist/context/TemplateVariableProvider/hydrationUtils.d.ts.map +1 -1
- package/dist/context/TemplateVariableProvider/hydrationUtils.js +67 -12
- package/dist/context/TemplateVariableProvider/hydrationUtils.js.map +1 -1
- package/dist/context/TemplateVariableProvider/index.js.map +1 -1
- package/dist/context/TemplateVariableProvider/query-params.js.map +1 -1
- package/dist/context/TemplateVariableProvider/utils.d.ts +27 -2
- package/dist/context/TemplateVariableProvider/utils.d.ts.map +1 -1
- package/dist/context/TemplateVariableProvider/utils.js +48 -6
- package/dist/context/TemplateVariableProvider/utils.js.map +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/useDashboard.js +1 -1
- package/dist/context/useDashboard.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/stories/decorators/WithDashboard.js.map +1 -1
- package/dist/stories/decorators/WithDatasourceStore.js.map +1 -1
- package/dist/stories/decorators/WithTemplateVariables.js.map +1 -1
- package/dist/stories/decorators/constants.js +2 -2
- package/dist/stories/decorators/constants.js.map +1 -1
- package/dist/stories/decorators/index.js.map +1 -1
- package/dist/test/dashboard-provider.js.map +1 -1
- package/dist/test/datasource-provider.d.ts.map +1 -1
- package/dist/test/datasource-provider.js +5 -7
- package/dist/test/datasource-provider.js.map +1 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/plugin-registry.js.map +1 -1
- package/dist/test/render.d.ts.map +1 -1
- package/dist/test/render.js +8 -3
- package/dist/test/render.js.map +1 -1
- package/dist/test/setup-tests.js.map +1 -1
- package/dist/test/testDashboard.js +10 -10
- package/dist/test/testDashboard.js.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/panelUtils.js.map +1 -1
- package/dist/utils/time.js.map +1 -1
- package/dist/validation/index.d.ts +2 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +15 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/panel.d.ts +19 -0
- package/dist/validation/panel.d.ts.map +1 -0
- package/dist/validation/panel.js +21 -0
- package/dist/validation/panel.js.map +1 -0
- 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 +11 -4
- package/dist/views/ViewDashboard/DashboardApp.js.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.d.ts +3 -1
- package/dist/views/ViewDashboard/ViewDashboard.d.ts.map +1 -1
- package/dist/views/ViewDashboard/ViewDashboard.js +51 -8
- package/dist/views/ViewDashboard/ViewDashboard.js.map +1 -1
- package/dist/views/ViewDashboard/index.js.map +1 -1
- package/dist/views/index.js.map +1 -1
- package/package.json +8 -7
|
@@ -16,13 +16,13 @@ import { createStore, useStore } from 'zustand';
|
|
|
16
16
|
import { immer } from 'zustand/middleware/immer';
|
|
17
17
|
import { devtools } from 'zustand/middleware';
|
|
18
18
|
import produce from 'immer';
|
|
19
|
-
import { TemplateVariableContext } from '@perses-dev/plugin-system';
|
|
20
|
-
import { DEFAULT_ALL_VALUE as ALL_VALUE } from '@perses-dev/core';
|
|
21
|
-
import { checkSavedDefaultVariableStatus } from './utils';
|
|
19
|
+
import { TemplateVariableContext, BuiltinVariableContext, useTimeRange } from '@perses-dev/plugin-system';
|
|
20
|
+
import { DEFAULT_ALL_VALUE as ALL_VALUE, formatDuration, intervalToPrometheusDuration } from '@perses-dev/core';
|
|
21
|
+
import { checkSavedDefaultVariableStatus, findVariableDefinitionByName, mergeVariableDefinitions } from './utils';
|
|
22
22
|
import { hydrateTemplateVariableStates } from './hydrationUtils';
|
|
23
|
-
import {
|
|
23
|
+
import { getInitalValuesFromQueryParameters, getURLQueryParamName, useVariableQueryParams } from './query-params';
|
|
24
24
|
const TemplateVariableStoreContext = /*#__PURE__*/ createContext(undefined);
|
|
25
|
-
function useTemplateVariableStoreCtx() {
|
|
25
|
+
export function useTemplateVariableStoreCtx() {
|
|
26
26
|
const context = useContext(TemplateVariableStoreContext);
|
|
27
27
|
if (!context) {
|
|
28
28
|
throw new Error('TemplateVariableStoreContext not initialized');
|
|
@@ -31,29 +31,55 @@ function useTemplateVariableStoreCtx() {
|
|
|
31
31
|
}
|
|
32
32
|
export function useTemplateVariableValues(variableNames) {
|
|
33
33
|
const store = useTemplateVariableStoreCtx();
|
|
34
|
-
|
|
35
|
-
const names = variableNames !== null && variableNames !== void 0 ? variableNames : Object.keys(s.variableState);
|
|
34
|
+
return useStore(store, (s)=>{
|
|
36
35
|
const vars = {};
|
|
36
|
+
// Collect values of local variables, from the variable state
|
|
37
|
+
const names = variableNames !== null && variableNames !== void 0 ? variableNames : s.variableDefinitions.map((value)=>value.spec.name);
|
|
37
38
|
names.forEach((name)=>{
|
|
38
|
-
const varState = s.variableState
|
|
39
|
-
|
|
39
|
+
const varState = s.variableState.get({
|
|
40
|
+
name
|
|
41
|
+
});
|
|
42
|
+
if (!varState || varState.overridden) {
|
|
40
43
|
return;
|
|
41
44
|
}
|
|
42
45
|
vars[name] = varState;
|
|
43
46
|
});
|
|
47
|
+
// Collect values of external variables, from the variable state
|
|
48
|
+
s.externalVariableDefinitions.forEach((d)=>{
|
|
49
|
+
const source = d.source;
|
|
50
|
+
d.definitions.forEach((value)=>{
|
|
51
|
+
const name = value.spec.name;
|
|
52
|
+
const varState = s.variableState.get({
|
|
53
|
+
name,
|
|
54
|
+
source
|
|
55
|
+
});
|
|
56
|
+
if (!varState || varState.overridden) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
vars[name] = varState;
|
|
60
|
+
});
|
|
61
|
+
});
|
|
44
62
|
return vars;
|
|
45
63
|
}, (left, right)=>{
|
|
46
64
|
return JSON.stringify(left) === JSON.stringify(right);
|
|
47
65
|
});
|
|
48
|
-
return state;
|
|
49
66
|
}
|
|
50
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Get the state and definition of a variable from the Template variables context.
|
|
69
|
+
* @param name name of the variable
|
|
70
|
+
* @param source if given, it searches in the external variables
|
|
71
|
+
*/ export function useTemplateVariable(name, source) {
|
|
51
72
|
const store = useTemplateVariableStoreCtx();
|
|
52
73
|
return useStore(store, (s)=>{
|
|
53
|
-
|
|
54
|
-
const
|
|
74
|
+
var _s_externalVariableDefinitions_find;
|
|
75
|
+
const state = s.variableState.get({
|
|
76
|
+
name,
|
|
77
|
+
source
|
|
78
|
+
});
|
|
79
|
+
const definitions = source ? (_s_externalVariableDefinitions_find = s.externalVariableDefinitions.find((v)=>v.source === source)) === null || _s_externalVariableDefinitions_find === void 0 ? void 0 : _s_externalVariableDefinitions_find.definitions : s.variableDefinitions;
|
|
80
|
+
const definition = (definitions || []).find((v)=>v.spec.name === name);
|
|
55
81
|
return {
|
|
56
|
-
state
|
|
82
|
+
state,
|
|
57
83
|
definition
|
|
58
84
|
};
|
|
59
85
|
});
|
|
@@ -75,13 +101,19 @@ export function useTemplateVariableDefinitions() {
|
|
|
75
101
|
const store = useTemplateVariableStoreCtx();
|
|
76
102
|
return useStore(store, (s)=>s.variableDefinitions);
|
|
77
103
|
}
|
|
104
|
+
export function useTemplateExternalVariableDefinitions() {
|
|
105
|
+
const store = useTemplateVariableStoreCtx();
|
|
106
|
+
return useStore(store, (s)=>s.externalVariableDefinitions);
|
|
107
|
+
}
|
|
78
108
|
export function useTemplateVariableStore() {
|
|
79
109
|
const store = useTemplateVariableStoreCtx();
|
|
80
110
|
return useStore(store);
|
|
81
111
|
}
|
|
82
|
-
function PluginProvider({ children }) {
|
|
112
|
+
function PluginProvider({ children , builtinVariables }) {
|
|
83
113
|
const originalValues = useTemplateVariableValues();
|
|
84
114
|
const definitions = useTemplateVariableDefinitions();
|
|
115
|
+
const externalDefinitions = useTemplateExternalVariableDefinitions();
|
|
116
|
+
const { absoluteTimeRange } = useTimeRange();
|
|
85
117
|
const values = useMemo(()=>{
|
|
86
118
|
const contextValues = {};
|
|
87
119
|
// This will loop through all the current variables values
|
|
@@ -92,14 +124,14 @@ function PluginProvider({ children }) {
|
|
|
92
124
|
...originalValues[name]
|
|
93
125
|
};
|
|
94
126
|
if (v.value === ALL_VALUE) {
|
|
95
|
-
const definition =
|
|
127
|
+
const definition = findVariableDefinitionByName(name, definitions, externalDefinitions);
|
|
96
128
|
// If the variable is a list variable and has a custom all value, then use that value instead
|
|
97
|
-
if ((definition === null || definition === void 0 ? void 0 : definition.kind) === 'ListVariable' && definition.spec.
|
|
98
|
-
v.value = definition.spec.
|
|
129
|
+
if ((definition === null || definition === void 0 ? void 0 : definition.kind) === 'ListVariable' && definition.spec.customAllValue) {
|
|
130
|
+
v.value = definition.spec.customAllValue;
|
|
99
131
|
} else {
|
|
100
|
-
var
|
|
101
|
-
var
|
|
102
|
-
v.value = (
|
|
132
|
+
var _v_options;
|
|
133
|
+
var _v_options_map;
|
|
134
|
+
v.value = (_v_options_map = (_v_options = v.options) === null || _v_options === void 0 ? void 0 : _v_options.map((o)=>o.value)) !== null && _v_options_map !== void 0 ? _v_options_map : null;
|
|
103
135
|
}
|
|
104
136
|
}
|
|
105
137
|
contextValues[name] = v;
|
|
@@ -107,49 +139,133 @@ function PluginProvider({ children }) {
|
|
|
107
139
|
return contextValues;
|
|
108
140
|
}, [
|
|
109
141
|
originalValues,
|
|
110
|
-
definitions
|
|
142
|
+
definitions,
|
|
143
|
+
externalDefinitions
|
|
111
144
|
]);
|
|
112
|
-
|
|
145
|
+
const allBuiltinVariables = [
|
|
146
|
+
{
|
|
147
|
+
kind: 'BuiltinVariable',
|
|
148
|
+
spec: {
|
|
149
|
+
name: '__from',
|
|
150
|
+
value: ()=>absoluteTimeRange.start.valueOf().toString(),
|
|
151
|
+
source: 'Dashboard',
|
|
152
|
+
display: {
|
|
153
|
+
name: '__from',
|
|
154
|
+
description: 'Start time of the current time range in unix millisecond epoch',
|
|
155
|
+
hidden: true
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
kind: 'BuiltinVariable',
|
|
161
|
+
spec: {
|
|
162
|
+
name: '__to',
|
|
163
|
+
value: ()=>absoluteTimeRange.end.valueOf().toString(),
|
|
164
|
+
source: 'Dashboard',
|
|
165
|
+
display: {
|
|
166
|
+
name: '__to',
|
|
167
|
+
description: 'End time of the current time range in unix millisecond epoch',
|
|
168
|
+
hidden: true
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
kind: 'BuiltinVariable',
|
|
174
|
+
spec: {
|
|
175
|
+
name: '__range',
|
|
176
|
+
value: ()=>formatDuration(intervalToPrometheusDuration(absoluteTimeRange)),
|
|
177
|
+
source: 'Dashboard',
|
|
178
|
+
display: {
|
|
179
|
+
name: '__range',
|
|
180
|
+
description: 'The range for the current dashboard in human readable format',
|
|
181
|
+
hidden: true
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
kind: 'BuiltinVariable',
|
|
187
|
+
spec: {
|
|
188
|
+
name: '__range_s',
|
|
189
|
+
value: ()=>((absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()) / 1000).toString(),
|
|
190
|
+
source: 'Dashboard',
|
|
191
|
+
display: {
|
|
192
|
+
name: '__range_s',
|
|
193
|
+
description: 'The range for the current dashboard in second',
|
|
194
|
+
hidden: true
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
kind: 'BuiltinVariable',
|
|
200
|
+
spec: {
|
|
201
|
+
name: '__range_ms',
|
|
202
|
+
value: ()=>(absoluteTimeRange.end.valueOf() - absoluteTimeRange.start.valueOf()).toString(),
|
|
203
|
+
source: 'Dashboard',
|
|
204
|
+
display: {
|
|
205
|
+
name: '__range_ms',
|
|
206
|
+
description: 'The range for the current dashboard in millisecond',
|
|
207
|
+
hidden: true
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
];
|
|
212
|
+
builtinVariables === null || builtinVariables === void 0 ? void 0 : builtinVariables.forEach((def)=>allBuiltinVariables.push(def));
|
|
213
|
+
return /*#__PURE__*/ _jsx(BuiltinVariableContext.Provider, {
|
|
113
214
|
value: {
|
|
114
|
-
|
|
215
|
+
variables: allBuiltinVariables
|
|
115
216
|
},
|
|
116
|
-
children:
|
|
217
|
+
children: /*#__PURE__*/ _jsx(TemplateVariableContext.Provider, {
|
|
218
|
+
value: {
|
|
219
|
+
state: values
|
|
220
|
+
},
|
|
221
|
+
children: children
|
|
222
|
+
})
|
|
117
223
|
});
|
|
118
224
|
}
|
|
119
|
-
function createTemplateVariableSrvStore({ initialVariableDefinitions =[] , queryParams }) {
|
|
225
|
+
function createTemplateVariableSrvStore({ initialVariableDefinitions =[] , externalVariableDefinitions =[] , queryParams }) {
|
|
120
226
|
const initialParams = getInitalValuesFromQueryParameters(queryParams ? queryParams[0] : {});
|
|
121
227
|
const store = createStore()(devtools(immer((set, get)=>{
|
|
122
228
|
return {
|
|
123
|
-
variableState: hydrateTemplateVariableStates(initialVariableDefinitions, initialParams),
|
|
229
|
+
variableState: hydrateTemplateVariableStates(initialVariableDefinitions, initialParams, externalVariableDefinitions),
|
|
124
230
|
variableDefinitions: initialVariableDefinitions,
|
|
231
|
+
externalVariableDefinitions: externalVariableDefinitions,
|
|
125
232
|
setVariableDefinitions (definitions) {
|
|
126
233
|
set((state)=>{
|
|
127
234
|
state.variableDefinitions = definitions;
|
|
128
|
-
state.variableState = hydrateTemplateVariableStates(definitions, initialParams);
|
|
235
|
+
state.variableState = hydrateTemplateVariableStates(definitions, initialParams, externalVariableDefinitions);
|
|
129
236
|
}, false, '[Variables] setVariableDefinitions' // Used for action name in Redux devtools
|
|
130
237
|
);
|
|
131
238
|
},
|
|
132
|
-
setVariableOptions (name, options) {
|
|
239
|
+
setVariableOptions (name, options, source) {
|
|
133
240
|
set((state)=>{
|
|
134
|
-
const varState = state.variableState
|
|
241
|
+
const varState = state.variableState.get({
|
|
242
|
+
name,
|
|
243
|
+
source
|
|
244
|
+
});
|
|
135
245
|
if (!varState) {
|
|
136
246
|
return;
|
|
137
247
|
}
|
|
138
248
|
varState.options = options;
|
|
139
249
|
}, false, '[Variables] setVariableOptions');
|
|
140
250
|
},
|
|
141
|
-
setVariableLoading (name, loading) {
|
|
251
|
+
setVariableLoading (name, loading, source) {
|
|
142
252
|
set((state)=>{
|
|
143
|
-
const varState = state.variableState
|
|
253
|
+
const varState = state.variableState.get({
|
|
254
|
+
name,
|
|
255
|
+
source
|
|
256
|
+
});
|
|
144
257
|
if (!varState) {
|
|
145
258
|
return;
|
|
146
259
|
}
|
|
147
260
|
varState.loading = loading;
|
|
148
261
|
}, false, '[Variables] setVariableLoading');
|
|
149
262
|
},
|
|
150
|
-
setVariableValue: (name, value)=>set((state)=>{
|
|
263
|
+
setVariableValue: (name, value, source)=>set((state)=>{
|
|
151
264
|
let val = value;
|
|
152
|
-
const varState = state.variableState
|
|
265
|
+
const varState = state.variableState.get({
|
|
266
|
+
name,
|
|
267
|
+
source
|
|
268
|
+
});
|
|
153
269
|
if (!varState) {
|
|
154
270
|
return;
|
|
155
271
|
}
|
|
@@ -174,20 +290,25 @@ function createTemplateVariableSrvStore({ initialVariableDefinitions =[] , query
|
|
|
174
290
|
const variableState = get().variableState;
|
|
175
291
|
const updatedVariables = produce(variableDefinitions, (draft)=>{
|
|
176
292
|
draft.forEach((variable, index)=>{
|
|
293
|
+
const name = variable.spec.name;
|
|
177
294
|
if (variable.kind === 'ListVariable') {
|
|
178
|
-
const currentVariable = variableState
|
|
295
|
+
const currentVariable = variableState.get({
|
|
296
|
+
name
|
|
297
|
+
});
|
|
179
298
|
if ((currentVariable === null || currentVariable === void 0 ? void 0 : currentVariable.value) !== undefined) {
|
|
180
299
|
draft[index] = {
|
|
181
300
|
kind: 'ListVariable',
|
|
182
301
|
spec: produce(variable.spec, (specDraft)=>{
|
|
183
|
-
specDraft.
|
|
302
|
+
specDraft.defaultValue = currentVariable.value;
|
|
184
303
|
})
|
|
185
304
|
};
|
|
186
305
|
}
|
|
187
306
|
} else if (variable.kind === 'TextVariable') {
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
307
|
+
const currentVariable = variableState.get({
|
|
308
|
+
name
|
|
309
|
+
});
|
|
310
|
+
const currentVariableValue = typeof (currentVariable === null || currentVariable === void 0 ? void 0 : currentVariable.value) === 'string' ? currentVariable.value : '';
|
|
311
|
+
if ((currentVariable === null || currentVariable === void 0 ? void 0 : currentVariable.value) !== undefined) {
|
|
191
312
|
draft[index] = {
|
|
192
313
|
kind: 'TextVariable',
|
|
193
314
|
spec: produce(variable.spec, (specDraft)=>{
|
|
@@ -210,15 +331,18 @@ function createTemplateVariableSrvStore({ initialVariableDefinitions =[] , query
|
|
|
210
331
|
})));
|
|
211
332
|
return store;
|
|
212
333
|
}
|
|
213
|
-
export function TemplateVariableProvider({ children , initialVariableDefinitions =[] }) {
|
|
214
|
-
const
|
|
334
|
+
export function TemplateVariableProvider({ children , initialVariableDefinitions =[] , externalVariableDefinitions =[] , builtinVariables =[] }) {
|
|
335
|
+
const allVariableDefs = mergeVariableDefinitions(initialVariableDefinitions, externalVariableDefinitions);
|
|
336
|
+
const queryParams = useVariableQueryParams(allVariableDefs);
|
|
215
337
|
const [store] = useState(createTemplateVariableSrvStore({
|
|
216
338
|
initialVariableDefinitions,
|
|
339
|
+
externalVariableDefinitions,
|
|
217
340
|
queryParams
|
|
218
341
|
}));
|
|
219
342
|
return /*#__PURE__*/ _jsx(TemplateVariableStoreContext.Provider, {
|
|
220
343
|
value: store,
|
|
221
344
|
children: /*#__PURE__*/ _jsx(PluginProvider, {
|
|
345
|
+
builtinVariables: builtinVariables,
|
|
222
346
|
children: children
|
|
223
347
|
})
|
|
224
348
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/TemplateVariableProvider.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createContext, useContext, useMemo, useState } from 'react';\nimport { createStore, useStore } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { devtools } from 'zustand/middleware';\nimport produce from 'immer';\nimport { TemplateVariableContext, VariableStateMap, VariableState, VariableOption } from '@perses-dev/plugin-system';\nimport { DEFAULT_ALL_VALUE as ALL_VALUE, VariableName, VariableValue, VariableDefinition } from '@perses-dev/core';\nimport { checkSavedDefaultVariableStatus } from './utils';\nimport { hydrateTemplateVariableStates } from './hydrationUtils';\nimport { useVariableQueryParams, getInitalValuesFromQueryParameters, getURLQueryParamName } from './query-params';\n\ntype TemplateVariableStore = {\n variableDefinitions: VariableDefinition[];\n variableState: VariableStateMap;\n setVariableValue: (variableName: VariableName, value: VariableValue) => void;\n setVariableOptions: (name: VariableName, options: VariableOption[]) => void;\n setVariableLoading: (name: VariableName, loading: boolean) => void;\n setVariableDefinitions: (definitions: VariableDefinition[]) => void;\n setVariableDefaultValues: () => VariableDefinition[];\n getSavedVariablesStatus: () => { isSavedVariableModified: boolean; modifiedVariableNames: string[] };\n};\n\nconst TemplateVariableStoreContext = createContext<ReturnType<typeof createTemplateVariableSrvStore> | undefined>(\n undefined\n);\nfunction useTemplateVariableStoreCtx() {\n const context = useContext(TemplateVariableStoreContext);\n if (!context) {\n throw new Error('TemplateVariableStoreContext not initialized');\n }\n return context;\n}\n\nexport function useTemplateVariableValues(variableNames?: string[]) {\n const store = useTemplateVariableStoreCtx();\n const state = useStore(\n store,\n (s) => {\n const names = variableNames ?? Object.keys(s.variableState);\n const vars: VariableStateMap = {};\n names.forEach((name) => {\n const varState = s.variableState[name];\n if (!varState) {\n return;\n }\n vars[name] = varState;\n });\n return vars;\n },\n (left, right) => {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n );\n return state;\n}\n\nexport function useTemplateVariable(name: string) {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (s) => {\n const variableState = s.variableState[name];\n const definition = s.variableDefinitions.find((v) => v.spec.name === name);\n return {\n state: variableState,\n definition,\n };\n });\n}\n\nexport function useTemplateVariableActions() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (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}\n\nexport function useTemplateVariableDefinitions() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (s) => s.variableDefinitions);\n}\n\nexport function useTemplateVariableStore() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store);\n}\n\nfunction PluginProvider({ children }: { children: React.ReactNode }) {\n const originalValues = useTemplateVariableValues();\n const definitions = useTemplateVariableDefinitions();\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 = definitions.find((d) => d.spec.name === name);\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.custom_all_value) {\n v.value = definition.spec.custom_all_value;\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]);\n\n return <TemplateVariableContext.Provider value={{ state: values }}>{children}</TemplateVariableContext.Provider>;\n}\n\ninterface TemplateVariableSrvArgs {\n initialVariableDefinitions?: VariableDefinition[];\n queryParams?: ReturnType<typeof useVariableQueryParams>;\n}\n\nfunction createTemplateVariableSrvStore({ initialVariableDefinitions = [], queryParams }: TemplateVariableSrvArgs) {\n const initialParams = getInitalValuesFromQueryParameters(queryParams ? queryParams[0] : {});\n const store = createStore<TemplateVariableStore>()(\n devtools(\n immer((set, get) => ({\n variableState: hydrateTemplateVariableStates(initialVariableDefinitions, initialParams),\n variableDefinitions: initialVariableDefinitions,\n setVariableDefinitions(definitions: VariableDefinition[]) {\n set(\n (state) => {\n state.variableDefinitions = definitions;\n state.variableState = hydrateTemplateVariableStates(definitions, initialParams);\n },\n false,\n '[Variables] setVariableDefinitions' // Used for action name in Redux devtools\n );\n },\n setVariableOptions(name, options) {\n set(\n (state) => {\n const varState = state.variableState[name];\n if (!varState) {\n return;\n }\n varState.options = options;\n },\n false,\n '[Variables] setVariableOptions'\n );\n },\n setVariableLoading(name, loading) {\n set(\n (state) => {\n const varState = state.variableState[name];\n if (!varState) {\n return;\n }\n varState.loading = loading;\n },\n false,\n '[Variables] setVariableLoading'\n );\n },\n setVariableValue: (name, value) =>\n set(\n (state) => {\n let val = value;\n const varState = state.variableState[name];\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: () => {\n const variableDefinitions = get().variableDefinitions;\n const variableState = get().variableState;\n const updatedVariables = produce(variableDefinitions, (draft) => {\n draft.forEach((variable, index) => {\n if (variable.kind === 'ListVariable') {\n const currentVariable = variableState[variable.spec.name];\n if (currentVariable?.value !== undefined) {\n draft[index] = {\n kind: 'ListVariable',\n spec: produce(variable.spec, (specDraft) => {\n specDraft.default_value = currentVariable.value;\n }),\n };\n }\n } else if (variable.kind === 'TextVariable') {\n const currentVariable = variableState[variable.spec.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 return checkSavedDefaultVariableStatus(get().variableDefinitions, get().variableState);\n },\n }))\n )\n );\n\n return store;\n}\n\nexport interface TemplateVariableProviderProps {\n children: React.ReactNode;\n initialVariableDefinitions?: VariableDefinition[];\n}\n\nexport function TemplateVariableProvider({ children, initialVariableDefinitions = [] }: TemplateVariableProviderProps) {\n const queryParams = useVariableQueryParams(initialVariableDefinitions);\n const [store] = useState(createTemplateVariableSrvStore({ initialVariableDefinitions, queryParams }));\n\n return (\n <TemplateVariableStoreContext.Provider value={store}>\n <PluginProvider>{children}</PluginProvider>\n </TemplateVariableStoreContext.Provider>\n );\n}\n"],"names":["createContext","useContext","useMemo","useState","createStore","useStore","immer","devtools","produce","TemplateVariableContext","DEFAULT_ALL_VALUE","ALL_VALUE","checkSavedDefaultVariableStatus","hydrateTemplateVariableStates","useVariableQueryParams","getInitalValuesFromQueryParameters","getURLQueryParamName","TemplateVariableStoreContext","undefined","useTemplateVariableStoreCtx","context","Error","useTemplateVariableValues","variableNames","store","state","s","names","Object","keys","variableState","vars","forEach","name","varState","left","right","JSON","stringify","useTemplateVariable","definition","variableDefinitions","find","v","spec","useTemplateVariableActions","setVariableValue","setVariableLoading","setVariableOptions","setVariableDefinitions","setVariableDefaultValues","getSavedVariablesStatus","useTemplateVariableDefinitions","useTemplateVariableStore","PluginProvider","children","originalValues","definitions","values","contextValues","value","d","kind","custom_all_value","options","map","o","Provider","createTemplateVariableSrvStore","initialVariableDefinitions","queryParams","initialParams","set","get","loading","val","Array","isArray","includes","at","filter","setQueryParams","updatedVariables","draft","variable","index","currentVariable","specDraft","default_value","currentVariableValue","TemplateVariableProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/TemplateVariableProvider.tsx"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createContext, ReactNode, useContext, useMemo, useState } from 'react';\nimport { createStore, useStore } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { devtools } from 'zustand/middleware';\nimport produce from 'immer';\nimport {\n TemplateVariableContext,\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 intervalToPrometheusDuration,\n BuiltinVariableDefinition,\n} from '@perses-dev/core';\nimport { checkSavedDefaultVariableStatus, findVariableDefinitionByName, mergeVariableDefinitions } from './utils';\nimport { hydrateTemplateVariableStates } from './hydrationUtils';\nimport { getInitalValuesFromQueryParameters, getURLQueryParamName, useVariableQueryParams } from './query-params';\n\ntype TemplateVariableStore = {\n variableDefinitions: VariableDefinition[];\n externalVariableDefinitions: ExternalVariableDefinition[];\n variableState: VariableStoreStateMap;\n setVariableValue: (variableName: VariableName, value: VariableValue, source?: string) => void;\n setVariableOptions: (name: VariableName, options: VariableOption[], source?: string) => void;\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\nconst TemplateVariableStoreContext = createContext<ReturnType<typeof createTemplateVariableSrvStore> | undefined>(\n undefined\n);\nexport function useTemplateVariableStoreCtx() {\n const context = useContext(TemplateVariableStoreContext);\n if (!context) {\n throw new Error('TemplateVariableStoreContext not initialized');\n }\n return context;\n}\n\nexport function useTemplateVariableValues(variableNames?: string[]) {\n const store = useTemplateVariableStoreCtx();\n return useStore(\n store,\n (s) => {\n const vars: 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 vars[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 vars[name] = varState;\n });\n });\n\n return vars;\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 Template variables context.\n * @param name name of the variable\n * @param source if given, it searches in the external variables\n */\nexport function useTemplateVariable(name: string, source?: string) {\n const store = useTemplateVariableStoreCtx();\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 useTemplateVariableActions() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (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}\n\nexport function useTemplateVariableDefinitions() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (s) => s.variableDefinitions);\n}\n\nexport function useTemplateExternalVariableDefinitions() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store, (s) => s.externalVariableDefinitions);\n}\n\nexport function useTemplateVariableStore() {\n const store = useTemplateVariableStoreCtx();\n return useStore(store);\n}\n\ninterface PluginProviderProps {\n children: ReactNode;\n builtinVariables?: BuiltinVariableDefinition[];\n}\n\nfunction PluginProvider({ children, builtinVariables }: PluginProviderProps) {\n const originalValues = useTemplateVariableValues();\n const definitions = useTemplateVariableDefinitions();\n const externalDefinitions = useTemplateExternalVariableDefinitions();\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[] = [\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(intervalToPrometheusDuration(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) => allBuiltinVariables.push(def));\n\n return (\n <BuiltinVariableContext.Provider value={{ variables: allBuiltinVariables }}>\n <TemplateVariableContext.Provider value={{ state: values }}>{children}</TemplateVariableContext.Provider>\n </BuiltinVariableContext.Provider>\n );\n}\n\ninterface TemplateVariableSrvArgs {\n initialVariableDefinitions?: VariableDefinition[];\n externalVariableDefinitions?: ExternalVariableDefinition[];\n queryParams?: ReturnType<typeof useVariableQueryParams>;\n}\n\nfunction createTemplateVariableSrvStore({\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n queryParams,\n}: TemplateVariableSrvArgs) {\n const initialParams = getInitalValuesFromQueryParameters(queryParams ? queryParams[0] : {});\n const store = createStore<TemplateVariableStore>()(\n devtools(\n immer((set, get) => ({\n variableState: hydrateTemplateVariableStates(\n initialVariableDefinitions,\n initialParams,\n externalVariableDefinitions\n ),\n variableDefinitions: initialVariableDefinitions,\n externalVariableDefinitions: externalVariableDefinitions,\n setVariableDefinitions(definitions: VariableDefinition[]) {\n set(\n (state) => {\n state.variableDefinitions = definitions;\n state.variableState = hydrateTemplateVariableStates(\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) {\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) {\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) =>\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: () => {\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 return checkSavedDefaultVariableStatus(get().variableDefinitions, get().variableState);\n },\n }))\n )\n );\n\n return store;\n}\n\nexport type ExternalVariableDefinition = {\n source: string;\n tooltip?: {\n title?: string;\n description?: string;\n };\n editLink?: string;\n definitions: VariableDefinition[];\n};\n\nexport interface TemplateVariableProviderProps {\n children: ReactNode;\n initialVariableDefinitions?: VariableDefinition[];\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 externalVariableDefinitions?: ExternalVariableDefinition[];\n builtinVariables?: BuiltinVariableDefinition[];\n}\n\nexport function TemplateVariableProvider({\n children,\n initialVariableDefinitions = [],\n externalVariableDefinitions = [],\n builtinVariables = [],\n}: TemplateVariableProviderProps) {\n const allVariableDefs = mergeVariableDefinitions(initialVariableDefinitions, externalVariableDefinitions);\n const queryParams = useVariableQueryParams(allVariableDefs);\n const [store] = useState(\n createTemplateVariableSrvStore({ initialVariableDefinitions, externalVariableDefinitions, queryParams })\n );\n\n return (\n <TemplateVariableStoreContext.Provider value={store}>\n <PluginProvider builtinVariables={builtinVariables}>{children}</PluginProvider>\n </TemplateVariableStoreContext.Provider>\n );\n}\n"],"names":["createContext","useContext","useMemo","useState","createStore","useStore","immer","devtools","produce","TemplateVariableContext","BuiltinVariableContext","useTimeRange","DEFAULT_ALL_VALUE","ALL_VALUE","formatDuration","intervalToPrometheusDuration","checkSavedDefaultVariableStatus","findVariableDefinitionByName","mergeVariableDefinitions","hydrateTemplateVariableStates","getInitalValuesFromQueryParameters","getURLQueryParamName","useVariableQueryParams","TemplateVariableStoreContext","undefined","useTemplateVariableStoreCtx","context","Error","useTemplateVariableValues","variableNames","store","s","vars","names","variableDefinitions","map","value","spec","name","forEach","varState","variableState","get","overridden","externalVariableDefinitions","d","source","definitions","left","right","JSON","stringify","useTemplateVariable","state","find","v","definition","useTemplateVariableActions","setVariableValue","setVariableLoading","setVariableOptions","setVariableDefinitions","setVariableDefaultValues","getSavedVariablesStatus","useTemplateVariableDefinitions","useTemplateExternalVariableDefinitions","useTemplateVariableStore","PluginProvider","children","builtinVariables","originalValues","externalDefinitions","absoluteTimeRange","values","contextValues","Object","keys","kind","customAllValue","options","o","allBuiltinVariables","start","valueOf","toString","display","description","hidden","end","def","push","Provider","variables","createTemplateVariableSrvStore","initialVariableDefinitions","queryParams","initialParams","set","loading","val","Array","isArray","includes","at","filter","setQueryParams","updatedVariables","draft","variable","index","currentVariable","specDraft","defaultValue","currentVariableValue","TemplateVariableProvider","allVariableDefs"],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { VariableValue, VariableDefinition } from '@perses-dev/core';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { VariableStoreStateMap } from '@perses-dev/plugin-system';
|
|
3
|
+
import { ExternalVariableDefinition } from '@perses-dev/dashboards';
|
|
4
|
+
/**
|
|
5
|
+
* Build the local variable states according to the given definitions
|
|
6
|
+
* @param localDefinitions local variable definitions. Dynamic part.
|
|
7
|
+
* @param externalDefinitions external variables definitions. Static part.
|
|
8
|
+
* @param initialValues values coming from query parameters
|
|
9
|
+
*/
|
|
10
|
+
export declare function hydrateTemplateVariableStates(localDefinitions: VariableDefinition[], initialValues: Record<string, VariableValue>, externalDefinitions?: ExternalVariableDefinition[]): VariableStoreStateMap;
|
|
4
11
|
//# sourceMappingURL=hydrationUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydrationUtils.d.ts","sourceRoot":"","sources":["../../../src/context/TemplateVariableProvider/hydrationUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAqB,aAAa,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hydrationUtils.d.ts","sourceRoot":"","sources":["../../../src/context/TemplateVariableProvider/hydrationUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAqB,aAAa,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAiB,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAyCpE;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,gBAAgB,EAAE,kBAAkB,EAAE,EACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC5C,mBAAmB,GAAE,0BAA0B,EAAO,GACrD,qBAAqB,CA8DvB"}
|
|
@@ -11,11 +11,14 @@
|
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
import { DEFAULT_ALL_VALUE } from '@perses-dev/core';
|
|
14
|
+
import { VariableStoreStateMap } from '@perses-dev/plugin-system';
|
|
14
15
|
// TODO: move to TemplateVariableProvider/utils.ts
|
|
15
16
|
function hydrateTemplateVariableState(variable, initialValue) {
|
|
16
17
|
const varState = {
|
|
17
18
|
value: null,
|
|
18
|
-
loading: false
|
|
19
|
+
loading: false,
|
|
20
|
+
overriding: false,
|
|
21
|
+
overridden: false
|
|
19
22
|
};
|
|
20
23
|
switch(variable.kind){
|
|
21
24
|
case 'TextVariable':
|
|
@@ -23,15 +26,15 @@ function hydrateTemplateVariableState(variable, initialValue) {
|
|
|
23
26
|
break;
|
|
24
27
|
case 'ListVariable':
|
|
25
28
|
varState.options = [];
|
|
26
|
-
var
|
|
27
|
-
varState.value = (
|
|
28
|
-
// TODO: smarter fallbacks for
|
|
29
|
+
var _ref;
|
|
30
|
+
varState.value = (_ref = initialValue !== null && initialValue !== void 0 ? initialValue : variable.spec.defaultValue) !== null && _ref !== void 0 ? _ref : null;
|
|
31
|
+
// TODO: smarter fallbacks for defaultValue when allowAllValue is true
|
|
29
32
|
if (varState.options.length > 0 && !varState.value) {
|
|
30
|
-
var
|
|
31
|
-
var
|
|
32
|
-
const firstOptionValue = (
|
|
33
|
+
var _varState_options_;
|
|
34
|
+
var _varState_options__value;
|
|
35
|
+
const firstOptionValue = (_varState_options__value = (_varState_options_ = varState.options[0]) === null || _varState_options_ === void 0 ? void 0 : _varState_options_.value) !== null && _varState_options__value !== void 0 ? _varState_options__value : null;
|
|
33
36
|
if (firstOptionValue !== null) {
|
|
34
|
-
varState.value = variable.spec.
|
|
37
|
+
varState.value = variable.spec.allowMultiple ? [
|
|
35
38
|
firstOptionValue
|
|
36
39
|
] : firstOptionValue;
|
|
37
40
|
}
|
|
@@ -50,13 +53,65 @@ function hydrateTemplateVariableState(variable, initialValue) {
|
|
|
50
53
|
}
|
|
51
54
|
return varState;
|
|
52
55
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Build the local variable states according to the given definitions
|
|
58
|
+
* @param localDefinitions local variable definitions. Dynamic part.
|
|
59
|
+
* @param externalDefinitions external variables definitions. Static part.
|
|
60
|
+
* @param initialValues values coming from query parameters
|
|
61
|
+
*/ export function hydrateTemplateVariableStates(localDefinitions, initialValues, externalDefinitions = []) {
|
|
62
|
+
const state = new VariableStoreStateMap();
|
|
63
|
+
// Collect the names used by local definitions
|
|
64
|
+
let overridingNames = {};
|
|
65
|
+
localDefinitions.forEach((v)=>{
|
|
66
|
+
overridingNames[v.spec.name] = true;
|
|
67
|
+
}, {});
|
|
68
|
+
// Then populate the external variables state,
|
|
69
|
+
// taking care of well flagging each name as used, so the overridden state can be filled accordingly.
|
|
70
|
+
const overriddenNames = {};
|
|
71
|
+
externalDefinitions.forEach((externalDef)=>{
|
|
72
|
+
const source = externalDef.source;
|
|
73
|
+
externalDef.definitions.forEach((v)=>{
|
|
74
|
+
const name = v.spec.name;
|
|
75
|
+
const param = initialValues[name];
|
|
76
|
+
const initialValue = param ? param : null;
|
|
77
|
+
state.set({
|
|
78
|
+
source,
|
|
79
|
+
name
|
|
80
|
+
}, {
|
|
81
|
+
...hydrateTemplateVariableState(v, initialValue),
|
|
82
|
+
overridden: !!overridingNames[name]
|
|
83
|
+
});
|
|
84
|
+
overridingNames[name] = true;
|
|
85
|
+
overriddenNames[v.spec.name] = true;
|
|
86
|
+
});
|
|
87
|
+
}, {});
|
|
88
|
+
// Then populate the local variables state,
|
|
89
|
+
// taking care the overriding state is filled according to the names used in external variables.
|
|
90
|
+
localDefinitions.forEach((v)=>{
|
|
56
91
|
const name = v.spec.name;
|
|
57
92
|
const param = initialValues[name];
|
|
58
93
|
const initialValue = param ? param : null;
|
|
59
|
-
state
|
|
94
|
+
state.set({
|
|
95
|
+
name
|
|
96
|
+
}, {
|
|
97
|
+
...hydrateTemplateVariableState(v, initialValue),
|
|
98
|
+
overriding: !!overriddenNames[name]
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
overridingNames = {};
|
|
102
|
+
externalDefinitions.slice().reverse().forEach((externalDef)=>{
|
|
103
|
+
const source = externalDef.source;
|
|
104
|
+
externalDef.definitions.forEach((v)=>{
|
|
105
|
+
const name = v.spec.name;
|
|
106
|
+
const value = state.get({
|
|
107
|
+
source,
|
|
108
|
+
name
|
|
109
|
+
});
|
|
110
|
+
if (value) {
|
|
111
|
+
value.overriding = !!overridingNames[name];
|
|
112
|
+
}
|
|
113
|
+
overridingNames[name] = true;
|
|
114
|
+
});
|
|
60
115
|
});
|
|
61
116
|
return state;
|
|
62
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/hydrationUtils.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { DEFAULT_ALL_VALUE, VariableValue, VariableDefinition } from '@perses-dev/core';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/hydrationUtils.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { DEFAULT_ALL_VALUE, VariableValue, VariableDefinition } from '@perses-dev/core';\nimport { VariableStoreStateMap, VariableState } from '@perses-dev/plugin-system';\nimport { ExternalVariableDefinition } from '@perses-dev/dashboards';\n\n// TODO: move to TemplateVariableProvider/utils.ts\nfunction hydrateTemplateVariableState(variable: VariableDefinition, initialValue?: VariableValue): VariableState {\n const varState: VariableState = {\n value: null,\n loading: false,\n overriding: false,\n overridden: false,\n };\n switch (variable.kind) {\n case 'TextVariable':\n varState.value = initialValue ?? variable.spec.value;\n break;\n case 'ListVariable':\n varState.options = [];\n varState.value = initialValue ?? variable.spec.defaultValue ?? null;\n // TODO: smarter fallbacks for defaultValue when allowAllValue is true\n if (varState.options.length > 0 && !varState.value) {\n const firstOptionValue = varState.options[0]?.value ?? null;\n if (firstOptionValue !== null) {\n varState.value = variable.spec.allowMultiple ? [firstOptionValue] : firstOptionValue;\n }\n }\n\n // \"all\" variable handling assumes the value is not in an array. This is\n // handled properly during internal variable interactions, but it is possible\n // to end up in a buggy state if the variables are initialized with an \"all\"\n // value inside an array. When hydrating variables, normalize this to minimize\n // bugs.\n if (Array.isArray(varState.value) && varState.value.length === 1 && varState.value[0] === DEFAULT_ALL_VALUE) {\n varState.value = DEFAULT_ALL_VALUE;\n }\n\n break;\n default:\n break;\n }\n return varState;\n}\n\n/**\n * Build the local variable states according to the given definitions\n * @param localDefinitions local variable definitions. Dynamic part.\n * @param externalDefinitions external variables definitions. Static part.\n * @param initialValues values coming from query parameters\n */\nexport function hydrateTemplateVariableStates(\n localDefinitions: VariableDefinition[],\n initialValues: Record<string, VariableValue>,\n externalDefinitions: ExternalVariableDefinition[] = []\n): VariableStoreStateMap {\n const state: VariableStoreStateMap = new VariableStoreStateMap();\n\n // Collect the names used by local definitions\n let overridingNames: Record<string, boolean> = {};\n localDefinitions.forEach((v) => {\n overridingNames[v.spec.name] = true;\n }, {} as Record<string, boolean>);\n\n // Then populate the external variables state,\n // taking care of well flagging each name as used, so the overridden state can be filled accordingly.\n const overriddenNames: Record<string, boolean> = {};\n externalDefinitions.forEach((externalDef) => {\n const source = externalDef.source;\n externalDef.definitions.forEach((v) => {\n const name = v.spec.name;\n const param = initialValues[name];\n const initialValue = param ? param : null;\n state.set(\n { source, name },\n {\n ...hydrateTemplateVariableState(v, initialValue),\n overridden: !!overridingNames[name],\n }\n );\n\n overridingNames[name] = true;\n overriddenNames[v.spec.name] = true;\n });\n }, {} as Record<string, boolean>);\n\n // Then populate the local variables state,\n // taking care the overriding state is filled according to the names used in external variables.\n localDefinitions.forEach((v) => {\n const name = v.spec.name;\n const param = initialValues[name];\n const initialValue = param ? param : null;\n state.set(\n { name },\n {\n ...hydrateTemplateVariableState(v, initialValue),\n overriding: !!overriddenNames[name],\n }\n );\n });\n\n overridingNames = {};\n externalDefinitions\n .slice()\n .reverse()\n .forEach((externalDef) => {\n const source = externalDef.source;\n externalDef.definitions.forEach((v) => {\n const name = v.spec.name;\n const value = state.get({ source, name });\n if (value) {\n value.overriding = !!overridingNames[name];\n }\n overridingNames[name] = true;\n });\n });\n return state;\n}\n"],"names":["DEFAULT_ALL_VALUE","VariableStoreStateMap","hydrateTemplateVariableState","variable","initialValue","varState","value","loading","overriding","overridden","kind","spec","options","defaultValue","length","firstOptionValue","allowMultiple","Array","isArray","hydrateTemplateVariableStates","localDefinitions","initialValues","externalDefinitions","state","overridingNames","forEach","v","name","overriddenNames","externalDef","source","definitions","param","set","slice","reverse","get"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/index.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './TemplateVariableProvider';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,
|
|
1
|
+
{"version":3,"sources":["../../../src/context/TemplateVariableProvider/index.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport * from './TemplateVariableProvider';\n"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,cAAc,6BAA6B"}
|