From 896d684065bad1fb21fc39afb9f101bf76dd1a37 Mon Sep 17 00:00:00 2001
From: Leo <108552997+lpskdl@users.noreply.github.com>
Date: Fri, 16 Sep 2022 09:19:19 +0200
Subject: [PATCH] Browse: Hide dashboard actions if user does not have enough
permission (#55218)
* hide dashboard actions if user does not have enough permission
* improve test description
---
.../components/ManageDashboards.test.tsx | 63 +++++++++++++++++++
.../search/components/ManageDashboardsNew.tsx | 24 +++----
2 files changed, 76 insertions(+), 11 deletions(-)
create mode 100644 public/app/features/search/components/ManageDashboards.test.tsx
diff --git a/public/app/features/search/components/ManageDashboards.test.tsx b/public/app/features/search/components/ManageDashboards.test.tsx
new file mode 100644
index 00000000000..b8aa0e25abf
--- /dev/null
+++ b/public/app/features/search/components/ManageDashboards.test.tsx
@@ -0,0 +1,63 @@
+import { render, screen, waitFor } from '@testing-library/react';
+import React from 'react';
+import { Provider } from 'react-redux';
+
+import { contextSrv } from 'app/core/services/context_srv';
+import { configureStore } from 'app/store/configureStore';
+import { FolderDTO } from 'app/types';
+
+import ManageDashboardsNew from './ManageDashboardsNew';
+
+jest.mock('app/core/services/context_srv', () => {
+ const originMock = jest.requireActual('app/core/services/context_srv');
+
+ return {
+ ...originMock,
+ contextSrv: {
+ ...originMock.context_srv,
+ user: {},
+ hasAccess: jest.fn(() => false),
+ },
+ };
+});
+
+const setup = async (options?: { folder?: FolderDTO }) => {
+ const { folder = {} as FolderDTO } = options || {};
+ const store = configureStore();
+
+ const { rerender } = await waitFor(() =>
+ render(
+
+
+
+ )
+ );
+
+ return { rerender, store };
+};
+
+jest.spyOn(console, 'error').mockImplementation();
+
+describe('ManageDashboards', () => {
+ beforeEach(() => {
+ (contextSrv.hasAccess as jest.Mock).mockClear();
+ });
+ it("should hide and show dashboard actions based on user's permissions", async () => {
+ (contextSrv.hasAccess as jest.Mock).mockReturnValue(false);
+
+ const { rerender, store } = await setup();
+
+ expect(screen.queryByRole('button', { name: /new/i })).not.toBeInTheDocument();
+
+ (contextSrv.hasAccess as jest.Mock).mockReturnValue(true);
+ await waitFor(() =>
+ rerender(
+
+
+
+ )
+ );
+
+ expect(screen.getByRole('button', { name: /new/i })).toBeInTheDocument();
+ });
+});
diff --git a/public/app/features/search/components/ManageDashboardsNew.tsx b/public/app/features/search/components/ManageDashboardsNew.tsx
index 3c3d507345e..381a8492c3a 100644
--- a/public/app/features/search/components/ManageDashboardsNew.tsx
+++ b/public/app/features/search/components/ManageDashboardsNew.tsx
@@ -29,15 +29,18 @@ export const ManageDashboardsNew = React.memo(({ folder }: Props) => {
const folderId = folder?.id;
// const folderUid = folder?.uid;
const canSave = folder?.canSave;
+ const { isEditor } = contextSrv;
const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders;
-
+ const canCreateFolders = contextSrv.hasAccess(AccessControlAction.FoldersCreate, isEditor);
+ const canCreateDashboards = contextSrv.hasAccess(
+ AccessControlAction.DashboardsCreate,
+ hasEditPermissionInFolders || !!canSave
+ );
let [includePanels, setIncludePanels] = useLocalStorage(SEARCH_PANELS_LOCAL_STORAGE_KEY, true);
if (!config.featureToggles.panelTitleSearch) {
includePanels = false;
}
- const { isEditor } = contextSrv;
-
const onSearchQueryChange = (e: React.ChangeEvent) => {
onQueryChange(e.currentTarget.value);
};
@@ -57,14 +60,13 @@ export const ManageDashboardsNew = React.memo(({ folder }: Props) => {
suffix={false ? : null}
/>
-
+ {canCreateFolders && canCreateDashboards && (
+
+ )}