From 1d5fd6f8997bb6f06c8ed62dc01905566cbe135e Mon Sep 17 00:00:00 2001 From: Lisa Knox Date: Tue, 14 Nov 2023 10:48:09 -0500 Subject: [PATCH] 21128: dynamic menu types created Arvados-DCO-1.1-Signed-off-by: Lisa Knox --- .../MultiselectToolbar.tsx | 16 +++++------- .../ms-kind-action-differentiator.ts | 6 ++--- .../ms-toolbar-action-filters.ts | 4 +-- .../context-menu/context-menu-action-set.ts | 9 +++++++ .../ms-project-action-set.ts | 26 +++++++++++++------ 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/components/multiselect-toolbar/MultiselectToolbar.tsx b/src/components/multiselect-toolbar/MultiselectToolbar.tsx index 3d8ae0c3d3..a8a3f7a823 100644 --- a/src/components/multiselect-toolbar/MultiselectToolbar.tsx +++ b/src/components/multiselect-toolbar/MultiselectToolbar.tsx @@ -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 ? ( @@ -85,9 +85,7 @@ export const MultiselectToolbar = connect( key={i} disableFocusListener > - props.executeMulti(btn, checkedList, props.resources)}> - {btn.icon ? btn.icon({}) : <>} - + props.executeMulti(btn, checkedList, props.resources)}>{btn.icon ? btn.icon({}) : <>} ) ) @@ -96,7 +94,7 @@ export const MultiselectToolbar = connect( )} - ); + ) }) ); @@ -135,9 +133,9 @@ function filterActions(actionArray: ContextMenuActionSet, filters: Set): } function selectActionsByKind(currentResourceKinds: Array, filterSet: TMultiselectActionsFilters) { - const rawResult: Set = new Set(); + const rawResult: Set = new Set(); const resultNames = new Set(); - const allFiltersArray: ContextMenuAction[][] = []; + const allFiltersArray: DynamicContextMenuAction[][] = [] currentResourceKinds.forEach(kind => { if (filterSet[kind]) { const actions = filterActions(...filterSet[kind]); diff --git a/src/components/multiselect-toolbar/ms-kind-action-differentiator.ts b/src/components/multiselect-toolbar/ms-kind-action-differentiator.ts index e2f643b687..48c3af3c2c 100644 --- a/src/components/multiselect-toolbar/ms-kind-action-differentiator.ts +++ b/src/components/multiselect-toolbar/ms-kind-action-differentiator.ts @@ -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 = { +export const kindToActionSet: Record = { [COLLECTION]: msCollectionActionSet, [PROJECT]: msProjectActionSet, [PROCESS]: msProcessActionSet, diff --git a/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts b/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts index 18063da778..5ef29370c6 100644 --- a/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts +++ b/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts @@ -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]>; +export type TMultiselectActionsFilters = Record]>; export const contextMenuActionConsts = { MAKE_A_COPY: "Make a copy", diff --git a/src/views-components/context-menu/context-menu-action-set.ts b/src/views-components/context-menu/context-menu-action-set.ts index a953500b3a..db59b5f0e1 100644 --- a/src/views-components/context-menu/context-menu-action-set.ts +++ b/src/views-components/context-menu/context-menu-action-set.ts @@ -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>; +export type DynamicContextMenuActionSet = Array>; diff --git a/src/views-components/multiselect-toolbar/ms-project-action-set.ts b/src/views-components/multiselect-toolbar/ms-project-action-set.ts index 2907686aff..8d58f4138b 100644 --- a/src/views-components/multiselect-toolbar/ms-project-action-set.ts +++ b/src/views-components/multiselect-toolbar/ms-project-action-set.ts @@ -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(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(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]]; -- 2.30.2