From 096a3b148f6137a77faed0f6b251d596854542c8 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Mon, 11 Dec 2023 09:26:32 +0100 Subject: [PATCH] DashboardScene: Support custom actions in the nav toolbar (#79139) * DashbaordScene: Support custom nav toolbar actions * Move custom actions to scenes feature dir * Review * betterrerererererer --- .../scene/NavToolbarActions.tsx | 25 +++++++++++++++ ...DashboardModelCompatibilityWrapper.test.ts | 11 ++++++- .../DashboardModelCompatibilityWrapper.ts | 1 + .../utils/registerDynamicDashNavAction.ts | 21 +++++++++++++ .../dashboard/components/DashNav/DashNav.tsx | 31 +++++++++---------- 5 files changed, 71 insertions(+), 18 deletions(-) create mode 100644 public/app/features/dashboard-scene/utils/registerDynamicDashNavAction.ts diff --git a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx index b0b3f05d018..70068fe5cff 100644 --- a/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx +++ b/public/app/features/dashboard-scene/scene/NavToolbarActions.tsx @@ -6,9 +6,11 @@ import { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate'; import { NavToolbarSeparator } from 'app/core/components/AppChrome/NavToolbar/NavToolbarSeparator'; import { t } from 'app/core/internationalization'; import { DashNavButton } from 'app/features/dashboard/components/DashNav/DashNavButton'; +import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv'; import { ShareModal } from '../sharing/ShareModal'; import { DashboardInteractions } from '../utils/interactions'; +import { dynamicDashNavActions } from '../utils/registerDynamicDashNavAction'; import { DashboardScene } from './DashboardScene'; @@ -19,6 +21,8 @@ interface Props { export const NavToolbarActions = React.memo(({ dashboard }) => { const { actions = [], isEditing, viewPanelScene, isDirty, uid, meta, editview } = dashboard.useState(); const toolbarActions = (actions ?? []).map((action) => ); + const rightToolbarActions: JSX.Element[] = []; + const _legacyDashboardModel = getDashboardSrv().getCurrent(); if (uid && !editview) { if (meta.canStar) { @@ -61,10 +65,31 @@ export const NavToolbarActions = React.memo(({ dashboard }) => { onClick={() => locationService.push(`/d/${uid}`)} /> ); + if (dynamicDashNavActions.left.length > 0) { + dynamicDashNavActions.left.map((action, index) => { + const Component = action.component; + const element = ; + typeof action.index === 'number' + ? toolbarActions.splice(action.index, 0, element) + : toolbarActions.push(element); + }); + } } toolbarActions.push(); + if (dynamicDashNavActions.right.length > 0) { + dynamicDashNavActions.right.map((action, index) => { + const Component = action.component; + const element = ; + typeof action.index === 'number' + ? rightToolbarActions.splice(action.index, 0, element) + : rightToolbarActions.push(element); + }); + + toolbarActions.push(...rightToolbarActions); + } + if (viewPanelScene) { toolbarActions.push(