21128: dynamic menu types created Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa...
authorLisa Knox <lisaknox83@gmail.com>
Tue, 14 Nov 2023 15:48:09 +0000 (10:48 -0500)
committerLisa Knox <lisaknox83@gmail.com>
Tue, 14 Nov 2023 15:48:09 +0000 (10:48 -0500)
src/components/multiselect-toolbar/MultiselectToolbar.tsx
src/components/multiselect-toolbar/ms-kind-action-differentiator.ts
src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
src/views-components/context-menu/context-menu-action-set.ts
src/views-components/multiselect-toolbar/ms-project-action-set.ts

index 3d8ae0c3d315435958f71cf683826dbec6a5c827..a8a3f7a8238d3d9ee70b0ea7b8455b260d0b3f6a 100644 (file)
@@ -13,7 +13,7 @@ import { ContextMenuResource } from "store/context-menu/context-menu-actions";
 import { Resource, extractUuidKind } from "models/resource";
 import { getResource } from "store/resources/resources";
 import { ResourcesState } from "store/resources/resources";
-import { ContextMenuAction, ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
+import { ContextMenuAction, ContextMenuActionSet, DynamicContextMenuAction } from "views-components/context-menu/context-menu-action-set";
 import { RestoreFromTrashIcon, TrashIcon } from "components/icon/icon";
 import { multiselectActionsFilters, TMultiselectActionsFilters, contextMenuActionConsts } from "./ms-toolbar-action-filters";
 import { kindToActionSet, findActionByName } from "./ms-kind-action-differentiator";
@@ -67,10 +67,10 @@ export const MultiselectToolbar = connect(
                 >
                     {buttons.length ? (
                         buttons.map((btn, i) =>
-                            btn.name === "ToggleTrashAction" ? (
+                            btn.defaultText ? (
                                 <Tooltip
                                     className={classes.button}
-                                    title={currentPathIsTrash ? "Restore selected" : "Move to trash"}
+                                    title={!currentPathIsTrash ? btn.defaultText: btn.altText}
                                     key={i}
                                     disableFocusListener
                                 >
@@ -85,9 +85,7 @@ export const MultiselectToolbar = connect(
                                     key={i}
                                     disableFocusListener
                                 >
-                                    <IconButton onClick={() => props.executeMulti(btn, checkedList, props.resources)}>
-                                        {btn.icon ? btn.icon({}) : <></>}
-                                    </IconButton>
+                                    <IconButton onClick={() => props.executeMulti(btn, checkedList, props.resources)}>{btn.icon ? btn.icon({}) : <></>}</IconButton>
                                 </Tooltip>
                             )
                         )
@@ -96,7 +94,7 @@ export const MultiselectToolbar = connect(
                     )}
                 </Toolbar>
             </React.Fragment>
-        );
+        )
     })
 );
 
@@ -135,9 +133,9 @@ function filterActions(actionArray: ContextMenuActionSet, filters: Set<string>):
 }
 
 function selectActionsByKind(currentResourceKinds: Array<string>, filterSet: TMultiselectActionsFilters) {
-    const rawResult: Set<ContextMenuAction> = new Set();
+    const rawResult: Set<DynamicContextMenuAction> = new Set();
     const resultNames = new Set();
-    const allFiltersArray: ContextMenuAction[][] = [];
+    const allFiltersArray: DynamicContextMenuAction[][] = []
     currentResourceKinds.forEach(kind => {
         if (filterSet[kind]) {
             const actions = filterActions(...filterSet[kind]);
index e2f643b6870e76d8f9e56b4e77ce49e679f29f80..48c3af3c2c7c0f4e09f77364f3b23f98dfdfec2b 100644 (file)
@@ -3,18 +3,18 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { ResourceKind } from "models/resource";
-import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
+import { DynamicContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
 import { msCollectionActionSet } from "views-components/multiselect-toolbar/ms-collection-action-set";
 import { msProjectActionSet } from "views-components/multiselect-toolbar/ms-project-action-set";
 import { msProcessActionSet } from "views-components/multiselect-toolbar/ms-process-action-set";
 
-export function findActionByName(name: string, actionSet: ContextMenuActionSet) {
+export function findActionByName(name: string, actionSet: DynamicContextMenuActionSet) {
     return actionSet[0].find(action => action.name === name);
 }
 
 const { COLLECTION, PROJECT, PROCESS } = ResourceKind;
 
-export const kindToActionSet: Record<string, ContextMenuActionSet> = {
+export const kindToActionSet: Record<string, DynamicContextMenuActionSet> = {
     [COLLECTION]: msCollectionActionSet,
     [PROJECT]: msProjectActionSet,
     [PROCESS]: msProcessActionSet,
index 18063da778f92771ed6f7805244f3d2377919d49..5ef29370c68ec7d783af379261d403cd95206b2f 100644 (file)
@@ -3,12 +3,12 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { ResourceKind } from "models/resource";
-import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
+import { DynamicContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
 import { msCollectionActionSet } from "views-components/multiselect-toolbar/ms-collection-action-set";
 import { msProjectActionSet } from "views-components/multiselect-toolbar/ms-project-action-set";
 import { msProcessActionSet } from "views-components/multiselect-toolbar/ms-process-action-set";
 
-export type TMultiselectActionsFilters = Record<string, [ContextMenuActionSet, Set<string>]>;
+export type TMultiselectActionsFilters = Record<string, [DynamicContextMenuActionSet, Set<string>]>;
 
 export const contextMenuActionConsts = {
     MAKE_A_COPY: "Make a copy",
index a953500b3ae7a49f9216bce9544b24b3771a9982..db59b5f0e1a477497fecdb5d08df57ddd10c56bd 100644 (file)
@@ -5,9 +5,18 @@
 import { Dispatch } from "redux";
 import { ContextMenuItem } from "components/context-menu/context-menu";
 import { ContextMenuResource } from "store/context-menu/context-menu-actions";
+import { IconType } from "components/icon/icon";
 
 export interface ContextMenuAction extends ContextMenuItem {
     execute(dispatch: Dispatch, resources: ContextMenuResource[], state?: any): void;
 }
 
+export interface DynamicContextMenuAction extends ContextMenuAction {
+    defaultText?: string
+    defaultIcon?: IconType
+    altText?: string
+    altIcon?: IconType
+}
+
 export type ContextMenuActionSet = Array<Array<ContextMenuAction>>;
+export type DynamicContextMenuActionSet = Array<Array<DynamicContextMenuAction>>;
index 2907686aff2adb89258956ae9c3edd6c617e88f1..8d58f4138bb9129f69d2d8ed50a87d9d0ea03df0 100644 (file)
@@ -2,7 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set";
+import { DynamicContextMenuActionSet, DynamicContextMenuAction } from "views-components/context-menu/context-menu-action-set";
 import { MoveToIcon, Link } from "components/icon/icon";
 import { openMoveProjectDialog } from "store/projects/project-move-actions";
 import { ToggleTrashAction } from "views-components/context-menu/actions/trash-action";
@@ -11,12 +11,19 @@ import { copyToClipboardAction } from "store/open-in-new-tab/open-in-new-tab.act
 import { ToggleFavoriteAction } from "views-components/context-menu/actions/favorite-action";
 import { toggleFavorite } from "store/favorites/favorites-actions";
 import { favoritePanelActions } from "store/favorite-panel/favorite-panel-action";
+import { AddFavoriteIcon, RemoveFavoriteIcon } from "components/icon/icon";
+import { RestoreFromTrashIcon, TrashIcon } from "components/icon/icon";
 
-export const msToggleFavoriteAction = {
-    component: ToggleFavoriteAction,
+
+export const msToggleFavoriteAction: DynamicContextMenuAction = {
     name: "ToggleFavoriteAction",
+    defaultText: 'Add to Favorites',
+    altText: 'Remove from Favorites',
+    defaultIcon: AddFavoriteIcon,
+    altIcon: RemoveFavoriteIcon,
+
     execute: (dispatch, resources) => {
-        dispatch(toggleFavorite(resources[0])).then(() => {
+        dispatch<any>(toggleFavorite(resources[0])).then(() => {
             dispatch(favoritePanelActions.REQUEST_ITEMS());
         });
     },
@@ -38,14 +45,17 @@ export const msMoveToAction = {
     },
 };
 
-export const msToggleTrashAction = {
-    component: ToggleTrashAction,
+export const msToggleTrashAction: DynamicContextMenuAction = {
     name: "ToggleTrashAction",
+    defaultText: 'Add to Trash',
+    altText: 'Restore from Trash',
+    defaultIcon: TrashIcon,
+    altIcon: RestoreFromTrashIcon,
     execute: (dispatch, resources) => {
         for (const resource of [...resources]) {
-            dispatch(toggleProjectTrashed(resource.uuid, resource.ownerUuid, resource.isTrashed!!, resources.length > 1));
+            dispatch<any>(toggleProjectTrashed(resource.uuid, resource.ownerUuid, resource.isTrashed!!, resources.length > 1));
         }
     },
 };
 
-export const msProjectActionSet: ContextMenuActionSet = [[msCopyToClipboardMenuAction, msMoveToAction, msToggleTrashAction, msToggleFavoriteAction]];
+export const msProjectActionSet: DynamicContextMenuAction[][] = [[msCopyToClipboardMenuAction, msMoveToAction, msToggleTrashAction, msToggleFavoriteAction]];