From 29938ec367007b4fc1b5d0eb9ccbb5c2fa33d355 Mon Sep 17 00:00:00 2001 From: Stephen Liu <750188453@qq.com> Date: Tue, 30 Aug 2022 10:34:28 +0800 Subject: [PATCH] fix(database-list): hidden upload file button if no permission (#21216) (cherry picked from commit 0c43190e04edc182f8787cc88d9a6fcf7f86a9f7) --- .../CRUD/data/database/DatabaseList.test.jsx | 28 ++++++++++++++++++- .../views/CRUD/data/database/DatabaseList.tsx | 11 +++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx b/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx index 5fe6ead7fdf08..1cc66ef9e3c97 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseList.test.jsx @@ -96,7 +96,7 @@ fetchMock.get( const useSelectorMock = jest.spyOn(reactRedux, 'useSelector'); const userSelectorMock = jest.spyOn(reactRedux, 'useSelector'); -describe('DatabaseList', () => { +describe('Admin DatabaseList', () => { useSelectorMock.mockReturnValue({ CSV_EXTENSIONS: ['csv'], EXCEL_EXTENSIONS: ['xls', 'xlsx'], @@ -212,4 +212,30 @@ describe('DatabaseList', () => { `"http://localhost/api/v1/database/?q=(filters:!((col:expose_in_sqllab,opr:eq,value:!t),(col:allow_run_async,opr:eq,value:!f),(col:database_name,opr:ct,value:fooo)),order_column:changed_on_delta_humanized,order_direction:desc,page:0,page_size:25)"`, ); }); + + it('should not render dropdown menu button if user is not admin', () => { + userSelectorMock.mockReturnValue({ + createdOn: '2021-05-27T18:12:38.952304', + email: 'alpha@gmail.com', + firstName: 'alpha', + isActive: true, + lastName: 'alpha', + permissions: {}, + roles: { + Alpha: [ + ['can_sqllab', 'Superset'], + ['can_write', 'Dashboard'], + ['can_write', 'Chart'], + ], + }, + userId: 2, + username: 'alpha', + }); + const newWrapper = mount( + + + , + ); + expect(newWrapper.find('.dropdown-menu-links')).not.toExist(); + }); }); diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx index b9c5b4a8465f6..dc9dc1a279145 100644 --- a/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx +++ b/superset-frontend/src/views/CRUD/data/database/DatabaseList.tsx @@ -37,6 +37,7 @@ import { commonMenuData } from 'src/views/CRUD/data/common'; import handleResourceExport from 'src/utils/export'; import { ExtentionConfigs } from 'src/views/components/types'; import { UserWithPermissionsAndRoles } from 'src/types/bootstrapTypes'; +import type { MenuObjectProps } from 'src/views/components/Menu'; import DatabaseModal from './DatabaseModal'; import { DatabaseObject } from './types'; @@ -230,11 +231,13 @@ function DatabaseList({ addDangerToast, addSuccessToast }: DatabaseListProps) { useEffect(() => hasFileUploadEnabled(), [databaseModalOpen]); - const filteredDropDown = uploadDropdownMenu.map(link => { + const filteredDropDown = uploadDropdownMenu.reduce((prev, cur) => { // eslint-disable-next-line no-param-reassign - link.childs = link.childs.filter(item => item.perm); - return link; - }); + cur.childs = cur.childs.filter(item => item.perm); + if (!cur.childs.length) return prev; + prev.push(cur); + return prev; + }, [] as MenuObjectProps[]); const menuData: SubMenuProps = { activeChild: 'Databases',