From cc251db3c1dcdea99b4ad53faf5750af8d898318 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Tue, 19 Sep 2023 10:51:59 +0100 Subject: [PATCH] Browse Dashboards: Better logic for showing selection checkboxes (#74988) show selection checkboxes if can edit either folders or dashboards --- .../BrowseDashboardsPage.test.tsx | 17 +++++++------- .../BrowseDashboardsPage.tsx | 13 ++++++----- .../BrowseFolderAlertingPage.test.tsx | 11 +++++---- .../BrowseFolderLibraryPanelsPage.test.tsx | 11 +++++---- .../components/FolderActionsButton.test.tsx | 23 ++++++++++--------- .../components/FolderActionsButton.tsx | 8 +++---- .../features/browse-dashboards/permissions.ts | 18 ++++++++------- 7 files changed, 54 insertions(+), 47 deletions(-) diff --git a/public/app/features/browse-dashboards/BrowseDashboardsPage.test.tsx b/public/app/features/browse-dashboards/BrowseDashboardsPage.test.tsx index f7c1897fcfd..1d3598c1e9c 100644 --- a/public/app/features/browse-dashboards/BrowseDashboardsPage.test.tsx +++ b/public/app/features/browse-dashboards/BrowseDashboardsPage.test.tsx @@ -101,9 +101,10 @@ describe('browse-dashboards BrowseDashboardsPage', () => { let server: SetupServer; const mockPermissions = { canCreateDashboards: true, - canCreateFolder: true, - canDeleteFolder: true, - canEditFolder: true, + canEditDashboards: true, + canCreateFolders: true, + canDeleteFolders: true, + canEditFolders: true, canViewPermissions: true, canSetPermissions: true, }; @@ -173,7 +174,7 @@ describe('browse-dashboards BrowseDashboardsPage', () => { return { ...mockPermissions, canCreateDashboards: false, - canCreateFolder: false, + canCreateFolders: false, }; }); render(); @@ -277,7 +278,7 @@ describe('browse-dashboards BrowseDashboardsPage', () => { return { ...mockPermissions, canCreateDashboards: false, - canCreateFolder: false, + canCreateFolders: false, }; }); render(); @@ -294,8 +295,8 @@ describe('browse-dashboards BrowseDashboardsPage', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, - canEditFolder: false, + canDeleteFolders: false, + canEditFolders: false, canSetPermissions: false, canViewPermissions: false, }; @@ -314,7 +315,7 @@ describe('browse-dashboards BrowseDashboardsPage', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canEditFolder: false, + canEditFolders: false, }; }); render(); diff --git a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx index 251bb7a99e7..4b35b39ed76 100644 --- a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx +++ b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx @@ -78,9 +78,10 @@ const BrowseDashboardsPage = memo(({ match }: Props) => { const hasSelection = useHasSelection(); - const { canEditFolder, canCreateDashboards, canCreateFolder } = getFolderPermissions(folderDTO); + const { canEditFolders, canEditDashboards, canCreateDashboards, canCreateFolders } = getFolderPermissions(folderDTO); - const showEditTitle = canEditFolder && folderUID; + const showEditTitle = canEditFolders && folderUID; + const canSelect = canEditFolders || canEditDashboards; const onEditTitle = async (newValue: string) => { if (folderDTO) { const result = await saveFolder({ @@ -101,11 +102,11 @@ const BrowseDashboardsPage = memo(({ match }: Props) => { actions={ <> {folderDTO && } - {(canCreateDashboards || canCreateFolder) && ( + {(canCreateDashboards || canCreateFolders) && ( )} @@ -125,9 +126,9 @@ const BrowseDashboardsPage = memo(({ match }: Props) => { {({ width, height }) => isSearching ? ( - + ) : ( - + ) } diff --git a/public/app/features/browse-dashboards/BrowseFolderAlertingPage.test.tsx b/public/app/features/browse-dashboards/BrowseFolderAlertingPage.test.tsx index 14f057725d1..e7f01c2a7e1 100644 --- a/public/app/features/browse-dashboards/BrowseFolderAlertingPage.test.tsx +++ b/public/app/features/browse-dashboards/BrowseFolderAlertingPage.test.tsx @@ -37,9 +37,10 @@ describe('browse-dashboards BrowseFolderAlertingPage', () => { let server: SetupServer; const mockPermissions = { canCreateDashboards: true, - canCreateFolder: true, - canDeleteFolder: true, - canEditFolder: true, + canEditDashboards: true, + canCreateFolders: true, + canDeleteFolders: true, + canEditFolders: true, canViewPermissions: true, canSetPermissions: true, }; @@ -105,8 +106,8 @@ describe('browse-dashboards BrowseFolderAlertingPage', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, - canEditFolder: false, + canDeleteFolders: false, + canEditFolders: false, canViewPermissions: false, canSetPermissions: false, }; diff --git a/public/app/features/browse-dashboards/BrowseFolderLibraryPanelsPage.test.tsx b/public/app/features/browse-dashboards/BrowseFolderLibraryPanelsPage.test.tsx index 27424333759..b188fd20a93 100644 --- a/public/app/features/browse-dashboards/BrowseFolderLibraryPanelsPage.test.tsx +++ b/public/app/features/browse-dashboards/BrowseFolderLibraryPanelsPage.test.tsx @@ -37,9 +37,10 @@ describe('browse-dashboards BrowseFolderLibraryPanelsPage', () => { let server: SetupServer; const mockPermissions = { canCreateDashboards: true, - canCreateFolder: true, - canDeleteFolder: true, - canEditFolder: true, + canEditDashboards: true, + canCreateFolders: true, + canDeleteFolders: true, + canEditFolders: true, canViewPermissions: true, canSetPermissions: true, }; @@ -110,8 +111,8 @@ describe('browse-dashboards BrowseFolderLibraryPanelsPage', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, - canEditFolder: false, + canDeleteFolders: false, + canEditFolders: false, canViewPermissions: false, canSetPermissions: false, }; diff --git a/public/app/features/browse-dashboards/components/FolderActionsButton.test.tsx b/public/app/features/browse-dashboards/components/FolderActionsButton.test.tsx index 0c50ae35ec0..d6a4a134ad5 100644 --- a/public/app/features/browse-dashboards/components/FolderActionsButton.test.tsx +++ b/public/app/features/browse-dashboards/components/FolderActionsButton.test.tsx @@ -27,9 +27,10 @@ describe('browse-dashboards FolderActionsButton', () => { const mockFolder = mockFolderDTO(); const mockPermissions = { canCreateDashboards: true, - canCreateFolder: true, - canDeleteFolder: true, - canEditFolder: true, + canEditDashboards: true, + canCreateFolders: true, + canDeleteFolders: true, + canEditFolders: true, canViewPermissions: true, canSetPermissions: true, }; @@ -55,8 +56,8 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, - canEditFolder: false, + canDeleteFolders: false, + canEditFolders: false, canViewPermissions: false, canSetPermissions: false, }; @@ -98,7 +99,7 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canEditFolder: false, + canEditFolders: false, }; }); render(); @@ -113,7 +114,7 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, + canDeleteFolders: false, }; }); render(); @@ -168,8 +169,8 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, - canEditFolder: false, + canDeleteFolders: false, + canEditFolders: false, canViewPermissions: false, canSetPermissions: false, }; @@ -216,7 +217,7 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canEditFolder: false, + canEditFolders: false, }; }); render(); @@ -230,7 +231,7 @@ describe('browse-dashboards FolderActionsButton', () => { jest.spyOn(permissions, 'getFolderPermissions').mockImplementation(() => { return { ...mockPermissions, - canDeleteFolder: false, + canDeleteFolders: false, }; }); render(); diff --git a/public/app/features/browse-dashboards/components/FolderActionsButton.tsx b/public/app/features/browse-dashboards/components/FolderActionsButton.tsx index 0f2ed031cdc..149de26aefd 100644 --- a/public/app/features/browse-dashboards/components/FolderActionsButton.tsx +++ b/public/app/features/browse-dashboards/components/FolderActionsButton.tsx @@ -23,9 +23,9 @@ export function FolderActionsButton({ folder }: Props) { const [showPermissionsDrawer, setShowPermissionsDrawer] = useState(false); const [moveFolder] = useMoveFolderMutation(); const [deleteFolder] = useDeleteFolderMutation(); - const { canEditFolder, canDeleteFolder, canViewPermissions, canSetPermissions } = getFolderPermissions(folder); + const { canEditFolders, canDeleteFolders, canViewPermissions, canSetPermissions } = getFolderPermissions(folder); // Can only move folders when nestedFolders is enabled - const canMoveFolder = config.featureToggles.nestedFolders && canEditFolder; + const canMoveFolder = config.featureToggles.nestedFolders && canEditFolders; const onMove = async (destinationUID: string) => { await moveFolder({ folder, destinationUID }); @@ -94,11 +94,11 @@ export function FolderActionsButton({ folder }: Props) { {canViewPermissions && setShowPermissionsDrawer(true)} label={managePermissionsLabel} />} {canMoveFolder && } - {canDeleteFolder && } + {canDeleteFolders && } ); - if (!canViewPermissions && !canMoveFolder && !canDeleteFolder) { + if (!canViewPermissions && !canMoveFolder && !canDeleteFolders) { return null; } diff --git a/public/app/features/browse-dashboards/permissions.ts b/public/app/features/browse-dashboards/permissions.ts index 4236cdeb750..f93beba255e 100644 --- a/public/app/features/browse-dashboards/permissions.ts +++ b/public/app/features/browse-dashboards/permissions.ts @@ -7,21 +7,23 @@ function checkFolderPermission(action: AccessControlAction, folderDTO?: FolderDT } export function getFolderPermissions(folderDTO?: FolderDTO) { - const canEditFolder = checkFolderPermission(AccessControlAction.FoldersWrite, folderDTO); // Can only create a folder if we have permissions and either we're at root or nestedFolders is enabled - const canCreateFolder = Boolean( + const canCreateDashboards = checkFolderPermission(AccessControlAction.DashboardsCreate, folderDTO); + const canCreateFolders = Boolean( (!folderDTO || config.featureToggles.nestedFolders) && checkFolderPermission(AccessControlAction.FoldersCreate) ); - const canCreateDashboards = checkFolderPermission(AccessControlAction.DashboardsCreate, folderDTO); - const canDeleteFolder = checkFolderPermission(AccessControlAction.FoldersDelete, folderDTO); - const canViewPermissions = checkFolderPermission(AccessControlAction.FoldersPermissionsRead, folderDTO); + const canDeleteFolders = checkFolderPermission(AccessControlAction.FoldersDelete, folderDTO); + const canEditDashboards = checkFolderPermission(AccessControlAction.DashboardsWrite, folderDTO); + const canEditFolders = checkFolderPermission(AccessControlAction.FoldersWrite, folderDTO); const canSetPermissions = checkFolderPermission(AccessControlAction.FoldersPermissionsWrite, folderDTO); + const canViewPermissions = checkFolderPermission(AccessControlAction.FoldersPermissionsRead, folderDTO); return { canCreateDashboards, - canCreateFolder, - canDeleteFolder, - canEditFolder, + canCreateFolders, + canDeleteFolders, + canEditDashboards, + canEditFolders, canSetPermissions, canViewPermissions, };