18559: Add adminOnly context menu item flag
authorStephen Smith <stephen@curii.com>
Tue, 29 Mar 2022 12:56:33 +0000 (08:56 -0400)
committerStephen Smith <stephen@curii.com>
Tue, 29 Mar 2022 12:56:33 +0000 (08:56 -0400)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

src/components/context-menu/context-menu.tsx
src/views-components/context-menu/action-sets/user-action-set.ts
src/views-components/context-menu/context-menu.tsx

index 36f0903df3784543401518f3f59c0b00eee02334..cb53edbc4eead8a244cd9f0fef843d290b4c9853 100644 (file)
@@ -10,6 +10,7 @@ export interface ContextMenuItem {
     name?: string | React.ComponentType;
     icon?: IconType;
     component?: React.ComponentType<any>;
+    adminOnly?: boolean;
 }
 
 export type ContextMenuItemGroup = ContextMenuItem[];
index 987eb1c878ca48a47d9f68a5975b33be6e6cd3bd..18426a0d16221e735b782e8a2d3584e5118fea72 100644 (file)
@@ -37,24 +37,28 @@ export const userActionSet: ContextMenuActionSet = [[{
     }
 }, {
     name: "Account Settings",
+    adminOnly: true,
     icon: UserPanelIcon,
     execute: (dispatch, { uuid }) => {
         dispatch<any>(navigateToUserProfile(uuid));
     }
 }, {
     name: "Setup User",
+    adminOnly: true,
     icon: AdminMenuIcon,
     execute: (dispatch, { uuid }) => {
         dispatch<any>(openSetupDialog(uuid));
     }
 }, {
     name: "Deactivate User",
+    adminOnly: true,
     icon: DeactivateUserIcon,
     execute: (dispatch, { uuid }) => {
         dispatch<any>(openDeactivateDialog(uuid));
     }
 }, {
     name: "Login As User",
+    adminOnly: true,
     icon: LoginAsIcon,
     execute: (dispatch, { uuid }) => {
         dispatch<any>(loginAs(uuid));
index f2c43ced1f9e0ded2aa6277f72799e45d974863d..09f6e19c12a3f447b751a9bb82b6a90f2dd72e23 100644 (file)
@@ -14,9 +14,10 @@ import { sortByProperty } from "common/array-utils";
 type DataProps = Pick<ContextMenuProps, "anchorEl" | "items" | "open"> & { resource?: ContextMenuResource };
 const mapStateToProps = (state: RootState): DataProps => {
     const { open, position, resource } = state.contextMenu;
+    const isAdmin = state.auth.user!.isAdmin;
     return {
         anchorEl: resource ? createAnchorAt(position) : undefined,
-        items: getMenuActionSet(resource),
+        items: getMenuActionSet(resource, isAdmin),
         open,
         resource
     };
@@ -59,8 +60,15 @@ export const addMenuActionSet = (name: string, itemSet: ContextMenuActionSet) =>
 };
 
 const emptyActionSet: ContextMenuActionSet = [];
-const getMenuActionSet = (resource?: ContextMenuResource): ContextMenuActionSet => {
-    return resource ? menuActionSets.get(resource.menuKind) || emptyActionSet : emptyActionSet;
+const getMenuActionSet = (resource?: ContextMenuResource, isAdmin?: boolean): ContextMenuActionSet => {
+    if (resource) {
+        return menuActionSets
+            .get(resource.menuKind)!
+            .map((group) => (group.filter((item) => (item.adminOnly ? isAdmin : true))))
+            || emptyActionSet
+    } else {
+        return emptyActionSet;
+    }
 };
 
 export enum ContextMenuKind {