From f92ef0e126beacaafc968393d616a2c352f9de26 Mon Sep 17 00:00:00 2001 From: Laura Benz <48948963+L-M-K-B@users.noreply.github.com> Date: Thu, 3 Oct 2024 15:13:29 +0200 Subject: [PATCH] RestoreDashboards: Add link to dashboards browse view (#94000) * feat: add button * refactor: clean up * feat: add tracking * refactor: change button copy * refactor: add payload to tracking * refactor: add subURL * refactor: user permissions * refactor: group conditions Co-authored-by: Alex Khomenko --------- Co-authored-by: Alex Khomenko --- pkg/services/navtree/navtreeimpl/navtree.go | 2 +- .../BrowseDashboardsPage.tsx | 23 +++++++++++++++++-- public/locales/en-US/grafana.json | 3 +++ public/locales/pseudo-LOCALE/grafana.json | 3 +++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/pkg/services/navtree/navtreeimpl/navtree.go b/pkg/services/navtree/navtreeimpl/navtree.go index 47095e0c1ef..d89454d5ee0 100644 --- a/pkg/services/navtree/navtreeimpl/navtree.go +++ b/pkg/services/navtree/navtreeimpl/navtree.go @@ -387,7 +387,7 @@ func (s *ServiceImpl) buildDashboardNavLinks(c *contextmodel.ReqContext) []*navt }) } - if s.features.IsEnabled(c.Req.Context(), featuremgmt.FlagDashboardRestoreUI) && c.SignedInUser.GetOrgRole() == org.RoleAdmin { + if s.features.IsEnabled(c.Req.Context(), featuremgmt.FlagDashboardRestoreUI) && (c.SignedInUser.GetOrgRole() == org.RoleAdmin || c.IsGrafanaAdmin) { dashboardChildNavs = append(dashboardChildNavs, &navtree.NavLink{ Text: "Recently deleted", SubTitle: "Any items listed here for more than 30 days will be automatically deleted.", diff --git a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx index cce7bfdcdc3..6d8d2b14e26 100644 --- a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx +++ b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx @@ -4,11 +4,14 @@ import { useLocation, useParams } from 'react-router-dom-v5-compat'; import AutoSizer from 'react-virtualized-auto-sizer'; import { GrafanaTheme2 } from '@grafana/data'; -import { reportInteraction } from '@grafana/runtime'; -import { FilterInput, useStyles2 } from '@grafana/ui'; +import { config, reportInteraction } from '@grafana/runtime'; +import { LinkButton, FilterInput, useStyles2 } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; +import { getConfig } from 'app/core/config'; +import { Trans } from 'app/core/internationalization'; import { useDispatch } from 'app/types'; +import { contextSrv } from '../../core/services/context_srv'; import { buildNavModel, getDashboardsTabID } from '../folders/state/navModel'; import { useSearchStateManager } from '../search/state/SearchStateManager'; import { getSearchPlaceholder } from '../search/tempI18nPhrases'; @@ -81,6 +84,7 @@ const BrowseDashboardsPage = memo(() => { const { data: rootFolder } = useGetFolderQuery('general'); let folder = folderDTO ? folderDTO : rootFolder; const { canEditFolders, canEditDashboards, canCreateDashboards, canCreateFolders } = getFolderPermissions(folder); + const hasAdminRights = contextSrv.hasRole('Admin') || contextSrv.isGrafanaAdmin; const showEditTitle = canEditFolders && folderUID; const canSelect = canEditFolders || canEditDashboards; @@ -104,6 +108,12 @@ const BrowseDashboardsPage = memo(() => { } }; + const handleButtonClickToRecentlyDeleted = () => { + reportInteraction('grafana_browse_dashboards_page_button_to_recently_deleted', { + origin: window.location.pathname === getConfig().appSubUrl + '/dashboards' ? 'Dashboards' : 'Folder view', + }); + }; + return ( { onEditTitle={showEditTitle ? onEditTitle : undefined} actions={ <> + {config.featureToggles.dashboardRestore && config.featureToggles.dashboardRestoreUI && hasAdminRights && ( + + Recently deleted + + )} {folderDTO && } {(canCreateDashboards || canCreateFolders) && (