From f9b4fc71e50450fb27b7b2831991c37e6ed092ab Mon Sep 17 00:00:00 2001 From: Alex Spencer <52186778+alexjonspencer1@users.noreply.github.com> Date: Tue, 25 Nov 2025 12:08:09 -0800 Subject: [PATCH] chore: PoC --- .../PanelDataTransformationsTab.tsx | 42 ++++++++++----- .../usePersistedTransformationState.ts | 51 +++++++++++++++++++ .../TransformationOperationRow.tsx | 7 +++ .../TransformationOperationRows.tsx | 6 +++ 4 files changed, 94 insertions(+), 12 deletions(-) create mode 100644 public/app/features/dashboard-scene/panel-edit/PanelDataPane/usePersistedTransformationState.ts diff --git a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataTransformationsTab.tsx b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataTransformationsTab.tsx index af68e86adc4..8d220c860dd 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataTransformationsTab.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataTransformationsTab.tsx @@ -18,13 +18,14 @@ import { Button, ButtonGroup, ConfirmModal, Tab, useStyles2 } from '@grafana/ui' import { TransformationOperationRows } from 'app/features/dashboard/components/TransformationsEditor/TransformationOperationRows'; import { ExpressionQueryType } from 'app/features/expressions/types'; -import { getQueryRunnerFor } from '../../utils/utils'; +import { getDashboardSceneFor, getQueryRunnerFor } from '../../utils/utils'; import { EmptyTransformationsMessage } from './EmptyTransformationsMessage'; import { PanelDataPane } from './PanelDataPane'; import { PanelDataQueriesTab } from './PanelDataQueriesTab'; import { TransformationsDrawer } from './TransformationsDrawer'; import { PanelDataPaneTab, TabId, PanelDataTabHeaderProps } from './types'; +import { usePersistedTransformationState } from './usePersistedTransformationState'; import { findSqlExpression, scrollToQueryRow } from './utils'; const SET_TIMEOUT = 750; @@ -73,6 +74,11 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro const sourceData = model.getQueryRunner().useState(); const { data, transformations: transformsWrongType } = model.getDataTransformer().useState(); + // Get dashboard and panel IDs for scoping session storage + const dashboard = getDashboardSceneFor(model); + const panel = model.state.panelRef.resolve(); + const storageKey = `${dashboard.state.uid}-${panel.state.key || 'unknown'}`; + // Type guard to ensure transformations are DataTransformerConfig[] const transformations = useMemo(() => { return Array.isArray(transformsWrongType) @@ -83,11 +89,13 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro : []; }, [transformsWrongType]); - const [drawerOpen, setDrawerOpen] = useState(false); - const [confirmModalOpen, setConfirmModalOpen] = useState(false); + const { isOpen: getRowCollapseState, setIsOpen: setRowCollapseState } = usePersistedTransformationState(storageKey); - const openDrawer = () => setDrawerOpen(true); - const closeDrawer = () => setDrawerOpen(false); + const [confirmModalOpen, setConfirmModalOpen] = useState(false); + const [pickerDrawerOpen, setPickerDrawerOpen] = useState(false); + + const openPickerDrawer = () => setPickerDrawerOpen(true); + const closePickerDrawer = () => setPickerDrawerOpen(false); const onGoToQueries = useCallback(() => { const parent = model.parent; @@ -134,15 +142,15 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro const transformationsDrawer = ( { if (selected.value === undefined) { return; } model.onChangeTransformations([...transformations, { id: selected.value, options: {} }]); - closeDrawer(); + closePickerDrawer(); }} - isOpen={drawerOpen} + isOpen={pickerDrawerOpen} series={data.series} /> ); @@ -151,7 +159,7 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro return ( <> @@ -162,12 +170,18 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro return ( <> - +