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 (
<>