18559: Add context menu filter system for more complex context menus on user profile.
[arvados-workbench2.git] / src / views-components / context-menu / context-menu.tsx
index 0409ec3622ad7a0c601620f9ec2027277cdff64f..6f3a4389211363e9294bbfe3c53fdf530d32195a 100644 (file)
@@ -14,10 +14,19 @@ 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;
+
+    const filteredItems = getMenuActionSet(resource).map((group) => (group.filter((item) => {
+        if (resource && item.filters) {
+            // Execute all filters on this item, every returns true IFF all filters return true
+            return item.filters.every((filter) => filter(state, resource));
+        } else {
+            return true;
+        }
+    })));
+
     return {
         anchorEl: resource ? createAnchorAt(position) : undefined,
-        items: getMenuActionSet(resource, isAdmin),
+        items: filteredItems,
         open,
         resource
     };
@@ -60,16 +69,9 @@ export const addMenuActionSet = (name: string, itemSet: ContextMenuActionSet) =>
 };
 
 const emptyActionSet: ContextMenuActionSet = [];
-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;
-    }
-};
+const getMenuActionSet = (resource?: ContextMenuResource): ContextMenuActionSet => (
+   resource ? menuActionSets.get(resource.menuKind) || emptyActionSet : emptyActionSet
+);
 
 export enum ContextMenuKind {
     API_CLIENT_AUTHORIZATION = "ApiClientAuthorization",