You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by el...@apache.org on 2022/09/20 20:50:25 UTC

[superset] 15/29: fix(database-list): hidden upload file button if no permission (#21216)

This is an automated email from the ASF dual-hosted git repository.

elizabeth pushed a commit to branch 2.0-test
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 32736680dac054f6b464ff51e9e29b5a974eb41d
Author: Stephen Liu <75...@qq.com>
AuthorDate: Tue Aug 30 10:34:28 2022 +0800

    fix(database-list): hidden upload file button if no permission (#21216)
    
    (cherry picked from commit 0c43190e04edc182f8787cc88d9a6fcf7f86a9f7)
---
 .../views/CRUD/data/database/DatabaseList.test.jsx | 28 +++++++++++++++++++++-
 .../src/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 5fe6ead7fd..1cc66ef9e3 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(
+      <Provider store={store}>
+        <DatabaseList />
+      </Provider>,
+    );
+    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 b9c5b4a846..dc9dc1a279 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',