From a96f80312ffed5290f23a438fe04479d7d353a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 3 Apr 2025 10:13:43 +0200 Subject: [PATCH] DashboardOutline: Sync row collapse state with outline node collapse state (#103283) DashboardOutline: Sync row expanded state with outline --- .../edit-pane/DashboardOutline.tsx | 41 +++++++++++++++---- .../scene/layout-rows/RowItem.tsx | 8 ++++ .../scene/types/EditableDashboardElement.ts | 10 +++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/public/app/features/dashboard-scene/edit-pane/DashboardOutline.tsx b/public/app/features/dashboard-scene/edit-pane/DashboardOutline.tsx index 55841138a99..1a7e61a1e5f 100644 --- a/public/app/features/dashboard-scene/edit-pane/DashboardOutline.tsx +++ b/public/app/features/dashboard-scene/edit-pane/DashboardOutline.tsx @@ -1,5 +1,5 @@ import { css, cx } from '@emotion/css'; -import { useMemo, useState } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { SceneObject, VizPanel } from '@grafana/scenes'; @@ -22,12 +22,20 @@ export function DashboardOutline({ editPane }: Props) { return ( - + ); } -function DashboardOutlineNode({ sceneObject, expandable }: { sceneObject: SceneObject; expandable: boolean }) { +function DashboardOutlineNode({ + sceneObject, + expandable, + editPane, +}: { + sceneObject: SceneObject; + expandable: boolean; + editPane: DashboardEditPane; +}) { const [isExpanded, setIsExpanded] = useState(true); const { key } = sceneObject.useState(); const styles = useStyles2(getStyles); @@ -38,17 +46,33 @@ function DashboardOutlineNode({ sceneObject, expandable }: { sceneObject: SceneO const children = collectEditableElementChildren(sceneObject); const elementInfo = editableElement.getEditableElementInfo(); const instanceName = elementInfo.instanceName === '' ? '' : elementInfo.instanceName; + const elementExpanded = !editableElement.getCollapsedState?.(); + + const onPointerDown = (evt: React.PointerEvent) => { + onSelect?.(evt); + setIsExpanded(!isExpanded); + editableElement.scrollIntoView?.(); + + // Sync expanded state with canvas element + if (editableElement.getCollapsedState) { + editableElement.setCollapsedState?.(isExpanded); + } + }; + + // Sync canvas element expanded state with outline element + useEffect(() => { + if (elementExpanded !== isExpanded) { + console.log('elementExpanded', elementExpanded); + setIsExpanded(elementExpanded); + } + }, [isExpanded, elementExpanded]); return ( <>