diff --git a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx index 6603bb3e01a..caba4bcb6a3 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx @@ -27,7 +27,7 @@ import { ObjectsReorderedOnCanvasEvent, } from '../../edit-pane/shared'; import { serializeDefaultGridLayout } from '../../serialization/layoutSerializers/DefaultGridLayoutSerializer'; -import { isClonedKey, joinCloneKeys } from '../../utils/clone'; +import { isClonedKey, joinCloneKeys, useHasClonedParents } from '../../utils/clone'; import { dashboardSceneGraph } from '../../utils/dashboardSceneGraph'; import { forceRenderChildren, @@ -533,8 +533,9 @@ function DefaultGridLayoutManagerRenderer({ model }: SceneComponentProps) { const { children, isHidden, isLazy } = model.useState(); + const hasClonedParents = useHasClonedParents(model); const styles = useStyles2(getStyles, model.state); const { layoutOrchestrator, isEditing } = useDashboardState(model); const layoutManager = sceneGraph.getAncestor(model, AutoGridLayoutManager); @@ -21,6 +23,8 @@ export function AutoGridLayoutRenderer({ model }: SceneComponentProps ) )} - {isEditing && } + {showCanvasActions && } ); } diff --git a/public/app/features/dashboard-scene/utils/clone.ts b/public/app/features/dashboard-scene/utils/clone.ts index f084b2e0182..89ee6867d81 100644 --- a/public/app/features/dashboard-scene/utils/clone.ts +++ b/public/app/features/dashboard-scene/utils/clone.ts @@ -1,5 +1,7 @@ import { SceneObject } from '@grafana/scenes'; +import { DashboardScene } from '../scene/DashboardScene'; + const CLONE_KEY = '-clone-'; const CLONE_SEPARATOR = '/'; @@ -82,3 +84,19 @@ export function useIsClone(scene: SceneObject): boolean { const { key } = scene.useState(); return isClonedKey(key!); } + +/** + * Useful hook for checking if a scene is in a clone chain + * @param scene + */ +export function useHasClonedParents(scene: SceneObject): boolean { + if (isClonedKey(scene.state.key!)) { + return true; + } + + if (!scene.parent || scene.parent instanceof DashboardScene) { + return false; + } + + return useHasClonedParents(scene.parent); +}