From 859bae14d31fe063ed1204be7300083b3216de60 Mon Sep 17 00:00:00 2001 From: Lisa Knox Date: Tue, 18 Jul 2023 18:06:56 -0400 Subject: [PATCH] 15768: changed all context menu actions to take an array of resources Arvados-DCO-1.1-Signed-off-by: Lisa Knox --- .../multiselectToolbar/MultiselectToolbar.tsx | 46 +++- .../api-client-authorization-action-set.ts | 50 ++-- .../action-sets/collection-action-set.ts | 52 ++-- .../collection-files-item-action-set.ts | 99 ++++---- .../action-sets/favorite-action-set.ts | 30 ++- .../action-sets/group-action-set.ts | 65 ++--- .../action-sets/group-member-action-set.ts | 50 ++-- .../action-sets/keep-service-action-set.ts | 48 ++-- .../action-sets/link-action-set.ts | 48 ++-- .../action-sets/permission-edit-action-set.ts | 50 ++-- .../process-resource-action-set.ts | 231 ++++++++++-------- .../action-sets/repository-action-set.ts | 67 ++--- .../action-sets/resource-action-set.ts | 22 +- .../action-sets/root-project-action-set.ts | 38 +-- .../action-sets/search-results-action-set.ts | 38 +-- .../action-sets/ssh-key-action-set.ts | 48 ++-- .../action-sets/trash-action-set.ts | 24 +- .../trashed-collection-action-set.ts | 68 +++--- .../action-sets/user-action-set.ts | 148 +++++------ .../action-sets/virtual-machine-action-set.ts | 50 ++-- .../action-sets/workflow-action-set.ts | 92 ++++--- .../context-menu/context-menu-action-set.ts | 10 +- .../context-menu/context-menu.tsx | 114 ++++----- .../process-remove-many-dialog.tsx | 2 + 24 files changed, 817 insertions(+), 673 deletions(-) diff --git a/src/components/multiselectToolbar/MultiselectToolbar.tsx b/src/components/multiselectToolbar/MultiselectToolbar.tsx index 557a7f11..1092cf98 100644 --- a/src/components/multiselectToolbar/MultiselectToolbar.tsx +++ b/src/components/multiselectToolbar/MultiselectToolbar.tsx @@ -22,11 +22,7 @@ import { CopyProcessDialog, CopyManyProcessesDialog } from 'views-components/dia import { collectionActionSet } from 'views-components/context-menu/action-sets/collection-action-set'; import { ContextMenuAction, ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; import { TrashIcon } from 'components/icon/icon'; -import { - multiselectActionsFilters, - TMultiselectActionsFilters, - contextMenuActionConsts, -} from './ms-toolbar-action-filters'; +import { multiselectActionsFilters, TMultiselectActionsFilters, contextMenuActionConsts } from './ms-toolbar-action-filters'; import { kindToActionSet, findActionByName } from './ms-kind-action-differentiator'; type CssRules = 'root' | 'button'; @@ -171,17 +167,47 @@ function mapStateToProps(state: RootState) { function mapDispatchToProps(dispatch: Dispatch) { return { - executeMulti: (action: ContextMenuAction, checkedList: TCheckedList, resources: ResourcesState) => { - selectedToArray(checkedList).forEach((uuid) => { - const resource = getResource(uuid)(resources); - executeSpecific(dispatch, action.name, resource); - }); + // executeMulti: (action: ContextMenuAction, checkedList: TCheckedList, resources: ResourcesState) => { + // selectedToArray(checkedList).forEach((uuid) => { + // const resource = getResource(uuid)(resources); + // executeSpecific(dispatch, action.name, resource); + // }); + // }, + executeMulti: (selectedAction: ContextMenuAction, checkedList: TCheckedList, resources: ResourcesState) => { + console.log(groupByKind(checkedList, resources)); + // selectedToArray(checkedList).forEach((uuid) => { + // const resource = getResource(uuid)(resources); + // executeSpecific(dispatch, action.name, resource); + // }); + const kindGroups = groupByKind(checkedList, resources); + for (const kind in kindGroups) { + const actionSet = kindToActionSet[kind]; + const action = findActionByName(selectedAction.name as string, actionSet); + // if (action) action.execute(dispatch, kindGroups[kind]); + // if (action && action.name === 'ToggleTrashAction') action.execute(dispatch, kindGroups[kind]); + } }, }; } +// function executeSpecific(dispatch: Dispatch, actionName, resource) { +// const actionSet = kindToActionSet[resource.kind]; +// const action = findActionByName(actionName, actionSet); +// if (action) action.execute(dispatch, resource); +// } + function executeSpecific(dispatch: Dispatch, actionName, resource) { const actionSet = kindToActionSet[resource.kind]; const action = findActionByName(actionName, actionSet); if (action) action.execute(dispatch, resource); } + +function groupByKind(checkedList: TCheckedList, resources: ResourcesState): Record> { + const result = {}; + selectedToArray(checkedList).forEach((uuid) => { + const resource = getResource(uuid)(resources) as Resource; + if (!result[resource.kind]) result[resource.kind] = []; + result[resource.kind].push(resource); + }); + return result; +} diff --git a/src/views-components/context-menu/action-sets/api-client-authorization-action-set.ts b/src/views-components/context-menu/action-sets/api-client-authorization-action-set.ts index aeaa6a22..001bae4f 100644 --- a/src/views-components/context-menu/action-sets/api-client-authorization-action-set.ts +++ b/src/views-components/context-menu/action-sets/api-client-authorization-action-set.ts @@ -4,28 +4,34 @@ import { openApiClientAuthorizationAttributesDialog, - openApiClientAuthorizationRemoveDialog + openApiClientAuthorizationRemoveDialog, } from 'store/api-client-authorizations/api-client-authorizations-actions'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; -export const apiClientAuthorizationActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openApiClientAuthorizationAttributesDialog(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openApiClientAuthorizationRemoveDialog(uuid)); - } -}]]; +export const apiClientAuthorizationActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openApiClientAuthorizationAttributesDialog(uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openAdvancedTabDialog(uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openApiClientAuthorizationRemoveDialog(uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/collection-action-set.ts b/src/views-components/context-menu/action-sets/collection-action-set.ts index 5b170f67..fec40794 100644 --- a/src/views-components/context-menu/action-sets/collection-action-set.ts +++ b/src/views-components/context-menu/action-sets/collection-action-set.ts @@ -32,14 +32,17 @@ import { openRestoreCollectionVersionDialog } from 'store/collections/collection import { TogglePublicFavoriteAction } from '../actions/public-favorite-action'; import { togglePublicFavorite } from 'store/public-favorites/public-favorites-actions'; import { publicFavoritePanelActions } from 'store/public-favorites-panel/public-favorites-action'; +import { ContextMenuResource } from 'store/context-menu/context-menu-actions'; const toggleFavoriteAction: ContextMenuAction = { component: ToggleFavoriteAction, name: 'ToggleFavoriteAction', - execute: (dispatch, resource) => { - dispatch(toggleFavorite(resource)).then(() => { - dispatch(favoritePanelActions.REQUEST_ITEMS()); - }); + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch(toggleFavorite(resource)).then(() => { + dispatch(favoritePanelActions.REQUEST_ITEMS()); + }) + ); }, }; @@ -62,8 +65,8 @@ const commonActionSet: ContextMenuActionSet = [ { icon: CopyIcon, name: 'Make a copy', - execute: (dispatch, resource) => { - dispatch(openCollectionCopyDialog(resource)); + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openCollectionCopyDialog(resource))); }, }, { @@ -76,8 +79,8 @@ const commonActionSet: ContextMenuActionSet = [ { icon: AdvancedIcon, name: 'API Details', - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); }, }, ], @@ -90,8 +93,8 @@ export const readOnlyCollectionActionSet: ContextMenuActionSet = [ { icon: FolderSharedIcon, name: 'Open with 3rd party client', - execute: (dispatch, resource) => { - dispatch(openWebDavS3InfoDialog(resource.uuid)); + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openWebDavS3InfoDialog(resource.uuid))); }, }, ], @@ -103,27 +106,28 @@ export const collectionActionSet: ContextMenuActionSet = [ { icon: RenameIcon, name: 'Edit collection', - execute: (dispatch, resource) => { - dispatch(openCollectionUpdateDialog(resource)); + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openCollectionUpdateDialog(resource))); }, }, { icon: ShareIcon, name: 'Share', - execute: (dispatch, { uuid }) => { - dispatch(openSharingDialog(uuid)); + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openSharingDialog(uuid))); }, }, { icon: MoveToIcon, name: 'Move to', - execute: (dispatch, resource) => dispatch(openMoveCollectionDialog(resource)), + execute: (dispatch, resources) => resources.forEach((resource) => dispatch(openMoveCollectionDialog(resource))), }, { component: ToggleTrashAction, name: 'ToggleTrashAction', - execute: (dispatch, resource) => { - dispatch(toggleCollectionTrashed(resource.uuid, resource.isTrashed!!)); + // execute: (dispatch, resource) => { + execute: (dispatch, resources: ContextMenuResource[]) => { + resources.forEach((resource) => dispatch(toggleCollectionTrashed(resource.uuid, resource.isTrashed!!))); }, }, ], @@ -135,10 +139,12 @@ export const collectionAdminActionSet: ContextMenuActionSet = [ { component: TogglePublicFavoriteAction, name: 'TogglePublicFavoriteAction', - execute: (dispatch, resource) => { - dispatch(togglePublicFavorite(resource)).then(() => { - dispatch(publicFavoritePanelActions.REQUEST_ITEMS()); - }); + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch(togglePublicFavorite(resource)).then(() => { + dispatch(publicFavoritePanelActions.REQUEST_ITEMS()); + }) + ); }, }, ], @@ -150,8 +156,8 @@ export const oldCollectionVersionActionSet: ContextMenuActionSet = [ { icon: RestoreVersionIcon, name: 'Restore version', - execute: (dispatch, { uuid }) => { - dispatch(openRestoreCollectionVersionDialog(uuid)); + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openRestoreCollectionVersionDialog(uuid))); }, }, ], diff --git a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts index 4cb9ebda..03674665 100644 --- a/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts +++ b/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts @@ -2,52 +2,69 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; -import { RemoveIcon, RenameIcon } from "components/icon/icon"; -import { DownloadCollectionFileAction } from "../actions/download-collection-file-action"; +import { ContextMenuActionSet } from '../context-menu-action-set'; +import { RemoveIcon, RenameIcon } from 'components/icon/icon'; +import { DownloadCollectionFileAction } from '../actions/download-collection-file-action'; import { openFileRemoveDialog, openRenameFileDialog } from 'store/collection-panel/collection-panel-files/collection-panel-files-actions'; import { CollectionFileViewerAction } from 'views-components/context-menu/actions/collection-file-viewer-action'; -import { CollectionCopyToClipboardAction } from "../actions/collection-copy-to-clipboard-action"; +import { CollectionCopyToClipboardAction } from '../actions/collection-copy-to-clipboard-action'; -export const readOnlyCollectionDirectoryItemActionSet: ContextMenuActionSet = [[ - { - component: CollectionFileViewerAction, - execute: () => { return; }, - }, - { - component: CollectionCopyToClipboardAction, - execute: () => { return; }, - } -]]; +export const readOnlyCollectionDirectoryItemActionSet: ContextMenuActionSet = [ + [ + { + component: CollectionFileViewerAction, + execute: () => { + return; + }, + }, + { + component: CollectionCopyToClipboardAction, + execute: () => { + return; + }, + }, + ], +]; -export const readOnlyCollectionFileItemActionSet: ContextMenuActionSet = [[ - { - component: DownloadCollectionFileAction, - execute: () => { return; } - }, - ...readOnlyCollectionDirectoryItemActionSet.reduce((prev, next) => prev.concat(next), []), -]]; +export const readOnlyCollectionFileItemActionSet: ContextMenuActionSet = [ + [ + { + component: DownloadCollectionFileAction, + execute: () => { + return; + }, + }, + ...readOnlyCollectionDirectoryItemActionSet.reduce((prev, next) => prev.concat(next), []), + ], +]; -const writableActionSet: ContextMenuActionSet = [[ - { - name: "Rename", - icon: RenameIcon, - execute: (dispatch, resource) => { - dispatch(openRenameFileDialog({ - name: resource.name, - id: resource.uuid, - path: resource.uuid.split('/').slice(1).join('/') })); - } - }, - { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, resource) => { - dispatch(openFileRemoveDialog(resource.uuid)); - } - } -]]; +const writableActionSet: ContextMenuActionSet = [ + [ + { + name: 'Rename', + icon: RenameIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch( + openRenameFileDialog({ + name: resource.name, + id: resource.uuid, + path: resource.uuid.split('/').slice(1).join('/'), + }) + ) + ); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openFileRemoveDialog(resource.uuid))); + }, + }, + ], +]; export const collectionDirectoryItemActionSet: ContextMenuActionSet = readOnlyCollectionDirectoryItemActionSet.concat(writableActionSet); -export const collectionFileItemActionSet: ContextMenuActionSet = readOnlyCollectionFileItemActionSet.concat(writableActionSet); \ No newline at end of file +export const collectionFileItemActionSet: ContextMenuActionSet = readOnlyCollectionFileItemActionSet.concat(writableActionSet); diff --git a/src/views-components/context-menu/action-sets/favorite-action-set.ts b/src/views-components/context-menu/action-sets/favorite-action-set.ts index ee012fb1..bdc4b07a 100644 --- a/src/views-components/context-menu/action-sets/favorite-action-set.ts +++ b/src/views-components/context-menu/action-sets/favorite-action-set.ts @@ -2,16 +2,22 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; -import { ToggleFavoriteAction } from "../actions/favorite-action"; -import { toggleFavorite } from "store/favorites/favorites-actions"; -import { favoritePanelActions } from "store/favorite-panel/favorite-panel-action"; +import { ContextMenuActionSet } from '../context-menu-action-set'; +import { ToggleFavoriteAction } from '../actions/favorite-action'; +import { toggleFavorite } from 'store/favorites/favorites-actions'; +import { favoritePanelActions } from 'store/favorite-panel/favorite-panel-action'; -export const favoriteActionSet: ContextMenuActionSet = [[{ - component: ToggleFavoriteAction, - execute: (dispatch, resource) => { - dispatch(toggleFavorite(resource)).then(() => { - dispatch(favoritePanelActions.REQUEST_ITEMS()); - }); - } -}]]; +export const favoriteActionSet: ContextMenuActionSet = [ + [ + { + component: ToggleFavoriteAction, + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch(toggleFavorite(resource)).then(() => { + dispatch(favoritePanelActions.REQUEST_ITEMS()); + }) + ); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/group-action-set.ts b/src/views-components/context-menu/action-sets/group-action-set.ts index f573af69..23d88264 100644 --- a/src/views-components/context-menu/action-sets/group-action-set.ts +++ b/src/views-components/context-menu/action-sets/group-action-set.ts @@ -2,33 +2,40 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { RenameIcon, AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; -import { openGroupAttributes, openRemoveGroupDialog, openGroupUpdateDialog } from "store/groups-panel/groups-panel-actions"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { RenameIcon, AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; +import { openGroupAttributes, openRemoveGroupDialog, openGroupUpdateDialog } from 'store/groups-panel/groups-panel-actions'; -export const groupActionSet: ContextMenuActionSet = [[{ - name: "Rename", - icon: RenameIcon, - execute: (dispatch, resource) => { - dispatch(openGroupUpdateDialog(resource)); - } -}, { - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openGroupAttributes(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openRemoveGroupDialog(uuid)); - } -}]]; +export const groupActionSet: ContextMenuActionSet = [ + [ + { + name: 'Rename', + icon: RenameIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openGroupUpdateDialog(resource))); + }, + }, + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openGroupAttributes(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRemoveGroupDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/group-member-action-set.ts b/src/views-components/context-menu/action-sets/group-member-action-set.ts index 37aa35c0..17b3d74c 100644 --- a/src/views-components/context-menu/action-sets/group-member-action-set.ts +++ b/src/views-components/context-menu/action-sets/group-member-action-set.ts @@ -2,27 +2,33 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; import { openGroupMemberAttributes, openRemoveGroupMemberDialog } from 'store/group-details-panel/group-details-panel-actions'; -export const groupMemberActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openGroupMemberAttributes(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openRemoveGroupMemberDialog(uuid)); - } -}]]; +export const groupMemberActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openGroupMemberAttributes(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRemoveGroupMemberDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/keep-service-action-set.ts b/src/views-components/context-menu/action-sets/keep-service-action-set.ts index 820d1978..0d2cbd07 100644 --- a/src/views-components/context-menu/action-sets/keep-service-action-set.ts +++ b/src/views-components/context-menu/action-sets/keep-service-action-set.ts @@ -4,25 +4,31 @@ import { openKeepServiceAttributesDialog, openKeepServiceRemoveDialog } from 'store/keep-services/keep-services-actions'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; -export const keepServiceActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openKeepServiceAttributesDialog(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openKeepServiceRemoveDialog(uuid)); - } -}]]; +export const keepServiceActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openKeepServiceAttributesDialog(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openKeepServiceRemoveDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/link-action-set.ts b/src/views-components/context-menu/action-sets/link-action-set.ts index 929a65a9..4f0b330e 100644 --- a/src/views-components/context-menu/action-sets/link-action-set.ts +++ b/src/views-components/context-menu/action-sets/link-action-set.ts @@ -4,25 +4,31 @@ import { openLinkAttributesDialog, openLinkRemoveDialog } from 'store/link-panel/link-panel-actions'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; -export const linkActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openLinkAttributesDialog(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openLinkRemoveDialog(uuid)); - } -}]]; +export const linkActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openLinkAttributesDialog(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openLinkRemoveDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/permission-edit-action-set.ts b/src/views-components/context-menu/action-sets/permission-edit-action-set.ts index 8663d3c7..4b6950ee 100644 --- a/src/views-components/context-menu/action-sets/permission-edit-action-set.ts +++ b/src/views-components/context-menu/action-sets/permission-edit-action-set.ts @@ -2,27 +2,33 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { CanReadIcon, CanManageIcon, CanWriteIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { CanReadIcon, CanManageIcon, CanWriteIcon } from 'components/icon/icon'; import { editPermissionLevel } from 'store/group-details-panel/group-details-panel-actions'; -import { PermissionLevel } from "models/permission"; +import { PermissionLevel } from 'models/permission'; -export const permissionEditActionSet: ContextMenuActionSet = [[{ - name: "Read", - icon: CanReadIcon, - execute: (dispatch, { uuid }) => { - dispatch(editPermissionLevel(uuid, PermissionLevel.CAN_READ)); - } -}, { - name: "Write", - icon: CanWriteIcon, - execute: (dispatch, { uuid }) => { - dispatch(editPermissionLevel(uuid, PermissionLevel.CAN_WRITE)); - } -}, { - name: "Manage", - icon: CanManageIcon, - execute: (dispatch, { uuid }) => { - dispatch(editPermissionLevel(uuid, PermissionLevel.CAN_MANAGE)); - } -}]]; +export const permissionEditActionSet: ContextMenuActionSet = [ + [ + { + name: 'Read', + icon: CanReadIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(editPermissionLevel(resource.uuid, PermissionLevel.CAN_READ))); + }, + }, + { + name: 'Write', + icon: CanWriteIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(editPermissionLevel(resource.uuid, PermissionLevel.CAN_WRITE))); + }, + }, + { + name: 'Manage', + icon: CanManageIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(editPermissionLevel(resource.uuid, PermissionLevel.CAN_MANAGE))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/process-resource-action-set.ts b/src/views-components/context-menu/action-sets/process-resource-action-set.ts index 7d593ee4..9ea1dc62 100644 --- a/src/views-components/context-menu/action-sets/process-resource-action-set.ts +++ b/src/views-components/context-menu/action-sets/process-resource-action-set.ts @@ -2,118 +2,135 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; -import { ToggleFavoriteAction } from "../actions/favorite-action"; -import { toggleFavorite } from "store/favorites/favorites-actions"; +import { ContextMenuActionSet } from '../context-menu-action-set'; +import { ToggleFavoriteAction } from '../actions/favorite-action'; +import { toggleFavorite } from 'store/favorites/favorites-actions'; import { - RenameIcon, ShareIcon, MoveToIcon, DetailsIcon, - RemoveIcon, ReRunProcessIcon, OutputIcon, + RenameIcon, + ShareIcon, + MoveToIcon, + DetailsIcon, + RemoveIcon, + ReRunProcessIcon, + OutputIcon, AdvancedIcon, - OpenIcon -} from "components/icon/icon"; -import { favoritePanelActions } from "store/favorite-panel/favorite-panel-action"; + OpenIcon, +} from 'components/icon/icon'; +import { favoritePanelActions } from 'store/favorite-panel/favorite-panel-action'; import { openMoveProcessDialog } from 'store/processes/process-move-actions'; -import { openProcessUpdateDialog } from "store/processes/process-update-actions"; +import { openProcessUpdateDialog } from 'store/processes/process-update-actions'; import { openCopyProcessDialog } from 'store/processes/process-copy-actions'; -import { openSharingDialog } from "store/sharing-dialog/sharing-dialog-actions"; -import { openRemoveProcessDialog } from "store/processes/processes-actions"; +import { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions'; +import { openRemoveProcessDialog } from 'store/processes/processes-actions'; import { toggleDetailsPanel } from 'store/details-panel/details-panel-action'; -import { navigateToOutput } from "store/process-panel/process-panel-actions"; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; -import { TogglePublicFavoriteAction } from "../actions/public-favorite-action"; -import { togglePublicFavorite } from "store/public-favorites/public-favorites-actions"; -import { publicFavoritePanelActions } from "store/public-favorites-panel/public-favorites-action"; -import { openInNewTabAction } from "store/open-in-new-tab/open-in-new-tab.actions"; +import { navigateToOutput } from 'store/process-panel/process-panel-actions'; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; +import { TogglePublicFavoriteAction } from '../actions/public-favorite-action'; +import { togglePublicFavorite } from 'store/public-favorites/public-favorites-actions'; +import { publicFavoritePanelActions } from 'store/public-favorites-panel/public-favorites-action'; +import { openInNewTabAction } from 'store/open-in-new-tab/open-in-new-tab.actions'; -export const readOnlyProcessResourceActionSet: ContextMenuActionSet = [[ - { - component: ToggleFavoriteAction, - execute: (dispatch, resource) => { - dispatch(toggleFavorite(resource)).then(() => { - dispatch(favoritePanelActions.REQUEST_ITEMS()); - }); - } - }, - { - icon: OpenIcon, - name: "Open in new tab", - execute: (dispatch, resource) => { - dispatch(openInNewTabAction(resource)); - } - }, - { - icon: ReRunProcessIcon, - name: "Copy and re-run process", - execute: (dispatch, resource) => { - dispatch(openCopyProcessDialog(resource)); - } - }, - { - icon: OutputIcon, - name: "Outputs", - execute: (dispatch, resource) => { - if(resource.outputUuid){ - dispatch(navigateToOutput(resource.outputUuid)); - } - } - }, - { - icon: DetailsIcon, - name: "View details", - execute: dispatch => { - dispatch(toggleDetailsPanel()); - } - }, - { - icon: AdvancedIcon, - name: "API Details", - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } - }, -]]; +export const readOnlyProcessResourceActionSet: ContextMenuActionSet = [ + [ + { + component: ToggleFavoriteAction, + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch(toggleFavorite(resource)).then(() => { + dispatch(favoritePanelActions.REQUEST_ITEMS()); + }) + ); + }, + }, + { + icon: OpenIcon, + name: 'Open in new tab', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openInNewTabAction(resource))); + }, + }, + { + icon: ReRunProcessIcon, + name: 'Copy and re-run process', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openCopyProcessDialog(resource))); + }, + }, + { + icon: OutputIcon, + name: 'Outputs', + execute: (dispatch, resources) => { + resources.forEach((resource) => { + if (resource.outputUuid) { + dispatch(navigateToOutput(resource.outputUuid)); + } + }); + }, + }, + { + icon: DetailsIcon, + name: 'View details', + execute: (dispatch) => { + dispatch(toggleDetailsPanel()); + }, + }, + { + icon: AdvancedIcon, + name: 'API Details', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + ], +]; -export const processResourceActionSet: ContextMenuActionSet = [[ - ...readOnlyProcessResourceActionSet.reduce((prev, next) => prev.concat(next), []), - { - icon: RenameIcon, - name: "Edit process", - execute: (dispatch, resource) => { - dispatch(openProcessUpdateDialog(resource)); - } - }, - { - icon: ShareIcon, - name: "Share", - execute: (dispatch, { uuid }) => { - dispatch(openSharingDialog(uuid)); - } - }, - { - icon: MoveToIcon, - name: "Move to", - execute: (dispatch, resource) => { - dispatch(openMoveProcessDialog(resource)); - } - }, - { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, resource) => { - dispatch(openRemoveProcessDialog(resource.uuid)); - } - } -]]; +export const processResourceActionSet: ContextMenuActionSet = [ + [ + ...readOnlyProcessResourceActionSet.reduce((prev, next) => prev.concat(next), []), + { + icon: RenameIcon, + name: 'Edit process', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openProcessUpdateDialog(resource))); + }, + }, + { + icon: ShareIcon, + name: 'Share', + execute: (dispatch, resources) => { + resources.forEach(({ uuid }) => dispatch(openSharingDialog(uuid))); + }, + }, + { + icon: MoveToIcon, + name: 'Move to', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openMoveProcessDialog(resource))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRemoveProcessDialog(resource.uuid))); + }, + }, + ], +]; -export const processResourceAdminActionSet: ContextMenuActionSet = [[ - ...processResourceActionSet.reduce((prev, next) => prev.concat(next), []), - { - component: TogglePublicFavoriteAction, - name: "Add to public favorites", - execute: (dispatch, resource) => { - dispatch(togglePublicFavorite(resource)).then(() => { - dispatch(publicFavoritePanelActions.REQUEST_ITEMS()); - }); - } - }, -]]; +export const processResourceAdminActionSet: ContextMenuActionSet = [ + [ + ...processResourceActionSet.reduce((prev, next) => prev.concat(next), []), + { + component: TogglePublicFavoriteAction, + name: 'Add to public favorites', + execute: (dispatch, resources) => { + resources.forEach((resource) => + dispatch(togglePublicFavorite(resource)).then(() => { + dispatch(publicFavoritePanelActions.REQUEST_ITEMS()); + }) + ); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/repository-action-set.ts b/src/views-components/context-menu/action-sets/repository-action-set.ts index 12fec7c4..e893a7fa 100644 --- a/src/views-components/context-menu/action-sets/repository-action-set.ts +++ b/src/views-components/context-menu/action-sets/repository-action-set.ts @@ -2,34 +2,41 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, ShareIcon, AttributesIcon } from "components/icon/icon"; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; -import { openRepositoryAttributes, openRemoveRepositoryDialog } from "store/repositories/repositories-actions"; -import { openSharingDialog } from "store/sharing-dialog/sharing-dialog-actions"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, ShareIcon, AttributesIcon } from 'components/icon/icon'; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; +import { openRepositoryAttributes, openRemoveRepositoryDialog } from 'store/repositories/repositories-actions'; +import { openSharingDialog } from 'store/sharing-dialog/sharing-dialog-actions'; -export const repositoryActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openRepositoryAttributes(uuid)); - } -}, { - name: "Share", - icon: ShareIcon, - execute: (dispatch, { uuid }) => { - dispatch(openSharingDialog(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openRemoveRepositoryDialog(uuid)); - } -}]]; +export const repositoryActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRepositoryAttributes(resource.uuid))); + }, + }, + { + name: 'Share', + icon: ShareIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openSharingDialog(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRemoveRepositoryDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/resource-action-set.ts b/src/views-components/context-menu/action-sets/resource-action-set.ts index ea8c53c5..401e9634 100644 --- a/src/views-components/context-menu/action-sets/resource-action-set.ts +++ b/src/views-components/context-menu/action-sets/resource-action-set.ts @@ -2,13 +2,17 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; -import { ToggleFavoriteAction } from "../actions/favorite-action"; -import { toggleFavorite } from "store/favorites/favorites-actions"; +import { ContextMenuActionSet } from '../context-menu-action-set'; +import { ToggleFavoriteAction } from '../actions/favorite-action'; +import { toggleFavorite } from 'store/favorites/favorites-actions'; -export const resourceActionSet: ContextMenuActionSet = [[{ - component: ToggleFavoriteAction, - execute: (dispatch, resource) => { - dispatch(toggleFavorite(resource)); - } -}]]; +export const resourceActionSet: ContextMenuActionSet = [ + [ + { + component: ToggleFavoriteAction, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(toggleFavorite(resource))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/root-project-action-set.ts b/src/views-components/context-menu/action-sets/root-project-action-set.ts index 9cf5bf03..afd7a477 100644 --- a/src/views-components/context-menu/action-sets/root-project-action-set.ts +++ b/src/views-components/context-menu/action-sets/root-project-action-set.ts @@ -2,24 +2,26 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; +import { ContextMenuActionSet } from '../context-menu-action-set'; import { openCollectionCreateDialog } from 'store/collections/collection-create-actions'; -import { NewProjectIcon, CollectionIcon } from "components/icon/icon"; +import { NewProjectIcon, CollectionIcon } from 'components/icon/icon'; import { openProjectCreateDialog } from 'store/projects/project-create-actions'; -export const rootProjectActionSet: ContextMenuActionSet = [[ - { - icon: NewProjectIcon, - name: "New project", - execute: (dispatch, resource) => { - dispatch(openProjectCreateDialog(resource.uuid)); - } - }, - { - icon: CollectionIcon, - name: "New Collection", - execute: (dispatch, resource) => { - dispatch(openCollectionCreateDialog(resource.uuid)); - } - } -]]; +export const rootProjectActionSet: ContextMenuActionSet = [ + [ + { + icon: NewProjectIcon, + name: 'New project', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openProjectCreateDialog(resource.uuid))); + }, + }, + { + icon: CollectionIcon, + name: 'New Collection', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openCollectionCreateDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/search-results-action-set.ts b/src/views-components/context-menu/action-sets/search-results-action-set.ts index aeb6d155..943be4c7 100644 --- a/src/views-components/context-menu/action-sets/search-results-action-set.ts +++ b/src/views-components/context-menu/action-sets/search-results-action-set.ts @@ -2,41 +2,41 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; +import { ContextMenuActionSet } from '../context-menu-action-set'; import { DetailsIcon, AdvancedIcon, OpenIcon, Link } from 'components/icon/icon'; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; import { toggleDetailsPanel } from 'store/details-panel/details-panel-action'; -import { copyToClipboardAction, openInNewTabAction } from "store/open-in-new-tab/open-in-new-tab.actions"; +import { copyToClipboardAction, openInNewTabAction } from 'store/open-in-new-tab/open-in-new-tab.actions'; export const searchResultsActionSet: ContextMenuActionSet = [ [ { icon: OpenIcon, - name: "Open in new tab", - execute: (dispatch, resource) => { - dispatch(openInNewTabAction(resource)); - } + name: 'Open in new tab', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openInNewTabAction(resource))); + }, }, { icon: Link, - name: "Copy to clipboard", - execute: (dispatch, resource) => { - dispatch(copyToClipboardAction(resource)); - } + name: 'Copy to clipboard', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(copyToClipboardAction(resource))); + }, }, { icon: DetailsIcon, - name: "View details", - execute: dispatch => { + name: 'View details', + execute: (dispatch) => { dispatch(toggleDetailsPanel()); - } + }, }, { icon: AdvancedIcon, - name: "API Details", - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } + name: 'API Details', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, }, - ] + ], ]; diff --git a/src/views-components/context-menu/action-sets/ssh-key-action-set.ts b/src/views-components/context-menu/action-sets/ssh-key-action-set.ts index d1a94cd3..f0620ede 100644 --- a/src/views-components/context-menu/action-sets/ssh-key-action-set.ts +++ b/src/views-components/context-menu/action-sets/ssh-key-action-set.ts @@ -2,27 +2,33 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; import { openSshKeyRemoveDialog, openSshKeyAttributesDialog } from 'store/auth/auth-action-ssh'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -export const sshKeyActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openSshKeyAttributesDialog(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openSshKeyRemoveDialog(uuid)); - } -}]]; +export const sshKeyActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openSshKeyAttributesDialog(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openSshKeyRemoveDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/trash-action-set.ts b/src/views-components/context-menu/action-sets/trash-action-set.ts index c0afd36a..82e00df6 100644 --- a/src/views-components/context-menu/action-sets/trash-action-set.ts +++ b/src/views-components/context-menu/action-sets/trash-action-set.ts @@ -2,15 +2,17 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; -import { ToggleTrashAction } from "views-components/context-menu/actions/trash-action"; -import { toggleTrashed } from "store/trash/trash-actions"; +import { ContextMenuActionSet } from '../context-menu-action-set'; +import { ToggleTrashAction } from 'views-components/context-menu/actions/trash-action'; +import { toggleTrashed } from 'store/trash/trash-actions'; -export const trashActionSet: ContextMenuActionSet = [[ - { - component: ToggleTrashAction, - execute: (dispatch, resource) => { - dispatch(toggleTrashed(resource.kind, resource.uuid, resource.ownerUuid, resource.isTrashed!!)); - } - }, -]]; +export const trashActionSet: ContextMenuActionSet = [ + [ + { + component: ToggleTrashAction, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(toggleTrashed(resource.kind, resource.uuid, resource.ownerUuid, resource.isTrashed!!))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/trashed-collection-action-set.ts b/src/views-components/context-menu/action-sets/trashed-collection-action-set.ts index 020ff5c7..8b8b7c6e 100644 --- a/src/views-components/context-menu/action-sets/trashed-collection-action-set.ts +++ b/src/views-components/context-menu/action-sets/trashed-collection-action-set.ts @@ -2,39 +2,41 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "../context-menu-action-set"; +import { ContextMenuActionSet } from '../context-menu-action-set'; import { DetailsIcon, ProvenanceGraphIcon, AdvancedIcon, RestoreFromTrashIcon } from 'components/icon/icon'; -import { toggleCollectionTrashed } from "store/trash/trash-actions"; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; +import { toggleCollectionTrashed } from 'store/trash/trash-actions'; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; import { toggleDetailsPanel } from 'store/details-panel/details-panel-action'; -export const trashedCollectionActionSet: ContextMenuActionSet = [[ - { - icon: DetailsIcon, - name: "View details", - execute: dispatch => { - dispatch(toggleDetailsPanel()); - } - }, - { - icon: ProvenanceGraphIcon, - name: "Provenance graph", - execute: (dispatch, resource) => { - // add code - } - }, - { - icon: AdvancedIcon, - name: "API Details", - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } - }, - { - icon: RestoreFromTrashIcon, - name: "Restore", - execute: (dispatch, resource) => { - dispatch(toggleCollectionTrashed(resource.uuid, true)); - } - }, -]]; +export const trashedCollectionActionSet: ContextMenuActionSet = [ + [ + { + icon: DetailsIcon, + name: 'View details', + execute: (dispatch) => { + dispatch(toggleDetailsPanel()); + }, + }, + { + icon: ProvenanceGraphIcon, + name: 'Provenance graph', + execute: (dispatch, resource) => { + // add code + }, + }, + { + icon: AdvancedIcon, + name: 'API Details', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + icon: RestoreFromTrashIcon, + name: 'Restore', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(toggleCollectionTrashed(resource.uuid, true))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/user-action-set.ts b/src/views-components/context-menu/action-sets/user-action-set.ts index c00b7f1f..104402a7 100644 --- a/src/views-components/context-menu/action-sets/user-action-set.ts +++ b/src/views-components/context-menu/action-sets/user-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 { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; import { AdvancedIcon, ProjectIcon, @@ -12,76 +12,84 @@ import { LoginAsIcon, AdminMenuIcon, ActiveIcon, -} from "components/icon/icon"; +} from 'components/icon/icon'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -import { loginAs, openUserAttributes, openUserProjects } from "store/users/users-actions"; -import { openSetupDialog, openDeactivateDialog, openActivateDialog } from "store/user-profile/user-profile-actions"; -import { navigateToUserProfile } from "store/navigation/navigation-action"; -import { canActivateUser, canDeactivateUser, canSetupUser, isAdmin, needsUserProfileLink, isOtherUser } from "store/context-menu/context-menu-filters"; +import { loginAs, openUserAttributes, openUserProjects } from 'store/users/users-actions'; +import { openSetupDialog, openDeactivateDialog, openActivateDialog } from 'store/user-profile/user-profile-actions'; +import { navigateToUserProfile } from 'store/navigation/navigation-action'; +import { + canActivateUser, + canDeactivateUser, + canSetupUser, + isAdmin, + needsUserProfileLink, + isOtherUser, +} from 'store/context-menu/context-menu-filters'; -export const userActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openUserAttributes(uuid)); - } -}, { - name: "Project", - icon: ProjectIcon, - execute: (dispatch, { uuid }) => { - dispatch(openUserProjects(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Account Settings", - icon: UserPanelIcon, - execute: (dispatch, { uuid }) => { - dispatch(navigateToUserProfile(uuid)); - }, - filters: [needsUserProfileLink] -}],[{ - name: "Activate User", - icon: ActiveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openActivateDialog(uuid)); - }, - filters: [ - isAdmin, - canActivateUser, - ], -}, { - name: "Setup User", - icon: AdminMenuIcon, - execute: (dispatch, { uuid }) => { - dispatch(openSetupDialog(uuid)); - }, - filters: [ - isAdmin, - canSetupUser, - ], -}, { - name: "Deactivate User", - icon: DeactivateUserIcon, - execute: (dispatch, { uuid }) => { - dispatch(openDeactivateDialog(uuid)); - }, - filters: [ - isAdmin, - canDeactivateUser, +export const userActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openUserAttributes(resource.uuid))); + }, + }, + { + name: 'Project', + icon: ProjectIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openUserProjects(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Account Settings', + icon: UserPanelIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(navigateToUserProfile(resource.uuid))); + }, + filters: [needsUserProfileLink], + }, ], -}, { - name: "Login As User", - icon: LoginAsIcon, - execute: (dispatch, { uuid }) => { - dispatch(loginAs(uuid)); - }, - filters: [ - isAdmin, - isOtherUser, + [ + { + name: 'Activate User', + icon: ActiveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openActivateDialog(resource.uuid))); + }, + filters: [isAdmin, canActivateUser], + }, + { + name: 'Setup User', + icon: AdminMenuIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openSetupDialog(resource.uuid))); + }, + filters: [isAdmin, canSetupUser], + }, + { + name: 'Deactivate User', + icon: DeactivateUserIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openDeactivateDialog(resource.uuid))); + }, + filters: [isAdmin, canDeactivateUser], + }, + { + name: 'Login As User', + icon: LoginAsIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(loginAs(resource.uuid))); + }, + filters: [isAdmin, isOtherUser], + }, ], -}]]; +]; diff --git a/src/views-components/context-menu/action-sets/virtual-machine-action-set.ts b/src/views-components/context-menu/action-sets/virtual-machine-action-set.ts index be9567cd..7cb13bd2 100644 --- a/src/views-components/context-menu/action-sets/virtual-machine-action-set.ts +++ b/src/views-components/context-menu/action-sets/virtual-machine-action-set.ts @@ -2,27 +2,33 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { AdvancedIcon, RemoveIcon, AttributesIcon } from "components/icon/icon"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { AdvancedIcon, RemoveIcon, AttributesIcon } from 'components/icon/icon'; import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -import { openVirtualMachineAttributes, openRemoveVirtualMachineDialog } from "store/virtual-machines/virtual-machines-actions"; +import { openVirtualMachineAttributes, openRemoveVirtualMachineDialog } from 'store/virtual-machines/virtual-machines-actions'; -export const virtualMachineActionSet: ContextMenuActionSet = [[{ - name: "Attributes", - icon: AttributesIcon, - execute: (dispatch, { uuid }) => { - dispatch(openVirtualMachineAttributes(uuid)); - } -}, { - name: "API Details", - icon: AdvancedIcon, - execute: (dispatch, { uuid }) => { - dispatch(openAdvancedTabDialog(uuid)); - } -}, { - name: "Remove", - icon: RemoveIcon, - execute: (dispatch, { uuid }) => { - dispatch(openRemoveVirtualMachineDialog(uuid)); - } -}]]; +export const virtualMachineActionSet: ContextMenuActionSet = [ + [ + { + name: 'Attributes', + icon: AttributesIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openVirtualMachineAttributes(resource.uuid))); + }, + }, + { + name: 'API Details', + icon: AdvancedIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + name: 'Remove', + icon: RemoveIcon, + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRemoveVirtualMachineDialog(resource.uuid))); + }, + }, + ], +]; diff --git a/src/views-components/context-menu/action-sets/workflow-action-set.ts b/src/views-components/context-menu/action-sets/workflow-action-set.ts index a5223d1d..7902e1c0 100644 --- a/src/views-components/context-menu/action-sets/workflow-action-set.ts +++ b/src/views-components/context-menu/action-sets/workflow-action-set.ts @@ -2,53 +2,49 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { ContextMenuActionSet } from "views-components/context-menu/context-menu-action-set"; -import { openRunProcess } from "store/workflow-panel/workflow-panel-actions"; -import { - DetailsIcon, - AdvancedIcon, - OpenIcon, - Link, - StartIcon -} from "components/icon/icon"; -import { copyToClipboardAction, openInNewTabAction } from "store/open-in-new-tab/open-in-new-tab.actions"; +import { ContextMenuActionSet } from 'views-components/context-menu/context-menu-action-set'; +import { openRunProcess } from 'store/workflow-panel/workflow-panel-actions'; +import { DetailsIcon, AdvancedIcon, OpenIcon, Link, StartIcon } from 'components/icon/icon'; +import { copyToClipboardAction, openInNewTabAction } from 'store/open-in-new-tab/open-in-new-tab.actions'; import { toggleDetailsPanel } from 'store/details-panel/details-panel-action'; -import { openAdvancedTabDialog } from "store/advanced-tab/advanced-tab"; +import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab'; -export const workflowActionSet: ContextMenuActionSet = [[ - { - icon: OpenIcon, - name: "Open in new tab", - execute: (dispatch, resource) => { - dispatch(openInNewTabAction(resource)); - } - }, - { - icon: Link, - name: "Copy to clipboard", - execute: (dispatch, resource) => { - dispatch(copyToClipboardAction(resource)); - } - }, - { - icon: DetailsIcon, - name: "View details", - execute: dispatch => { - dispatch(toggleDetailsPanel()); - } - }, - { - icon: AdvancedIcon, - name: "API Details", - execute: (dispatch, resource) => { - dispatch(openAdvancedTabDialog(resource.uuid)); - } - }, - { - icon: StartIcon, - name: "Run Workflow", - execute: (dispatch, resource) => { - dispatch(openRunProcess(resource.uuid, resource.ownerUuid, resource.name)); - } - }, -]]; +export const workflowActionSet: ContextMenuActionSet = [ + [ + { + icon: OpenIcon, + name: 'Open in new tab', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openInNewTabAction(resource))); + }, + }, + { + icon: Link, + name: 'Copy to clipboard', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(copyToClipboardAction(resource))); + }, + }, + { + icon: DetailsIcon, + name: 'View details', + execute: (dispatch) => { + dispatch(toggleDetailsPanel()); + }, + }, + { + icon: AdvancedIcon, + name: 'API Details', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openAdvancedTabDialog(resource.uuid))); + }, + }, + { + icon: StartIcon, + name: 'Run Workflow', + execute: (dispatch, resources) => { + resources.forEach((resource) => dispatch(openRunProcess(resource.uuid, resource.ownerUuid, resource.name))); + }, + }, + ], +]; 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 abef7ec0..9ee4106e 100644 --- a/src/views-components/context-menu/context-menu-action-set.ts +++ b/src/views-components/context-menu/context-menu-action-set.ts @@ -2,13 +2,13 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { Dispatch } from "redux"; -import { ContextMenuItem } from "components/context-menu/context-menu"; -import { ContextMenuResource } from "store/context-menu/context-menu-actions"; -import { RootState } from "store/store"; +import { Dispatch } from 'redux'; +import { ContextMenuItem } from 'components/context-menu/context-menu'; +import { ContextMenuResource } from 'store/context-menu/context-menu-actions'; +import { RootState } from 'store/store'; export interface ContextMenuAction extends ContextMenuItem { - execute(dispatch: Dispatch, resource: ContextMenuResource, state?: any): void; + execute(dispatch: Dispatch, resources: ContextMenuResource[], state?: any): void; } export type ContextMenuActionSet = Array>; diff --git a/src/views-components/context-menu/context-menu.tsx b/src/views-components/context-menu/context-menu.tsx index c659b7c5..76832ccf 100644 --- a/src/views-components/context-menu/context-menu.tsx +++ b/src/views-components/context-menu/context-menu.tsx @@ -2,37 +2,39 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { connect } from "react-redux"; -import { RootState } from "store/store"; -import { contextMenuActions, ContextMenuResource } from "store/context-menu/context-menu-actions"; -import { ContextMenu as ContextMenuComponent, ContextMenuProps, ContextMenuItem } from "components/context-menu/context-menu"; -import { createAnchorAt } from "components/popover/helpers"; -import { ContextMenuActionSet, ContextMenuAction } from "./context-menu-action-set"; -import { Dispatch } from "redux"; +import { connect } from 'react-redux'; +import { RootState } from 'store/store'; +import { contextMenuActions, ContextMenuResource } from 'store/context-menu/context-menu-actions'; +import { ContextMenu as ContextMenuComponent, ContextMenuProps, ContextMenuItem } from 'components/context-menu/context-menu'; +import { createAnchorAt } from 'components/popover/helpers'; +import { ContextMenuActionSet, ContextMenuAction } from './context-menu-action-set'; +import { Dispatch } from 'redux'; import { memoize } from 'lodash'; -import { sortByProperty } from "common/array-utils"; -type DataProps = Pick & { resource?: ContextMenuResource }; +import { sortByProperty } from 'common/array-utils'; +type DataProps = Pick & { resource?: ContextMenuResource }; const mapStateToProps = (state: RootState): DataProps => { const { open, position, resource } = state.contextMenu; - 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; - } - }))); + 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: filteredItems, open, - resource + resource, }; }; -type ActionProps = Pick & { onItemClick: (item: ContextMenuItem, resource?: ContextMenuResource) => void }; +type ActionProps = Pick & { onItemClick: (item: ContextMenuItem, resource?: ContextMenuResource) => void }; const mapDispatchToProps = (dispatch: Dispatch): ActionProps => ({ onClose: () => { dispatch(contextMenuActions.CLOSE_CONTEXT_MENU()); @@ -40,14 +42,14 @@ const mapDispatchToProps = (dispatch: Dispatch): ActionProps => ({ onItemClick: (action: ContextMenuAction, resource?: ContextMenuResource) => { dispatch(contextMenuActions.CLOSE_CONTEXT_MENU()); if (resource) { - action.execute(dispatch, resource); + action.execute(dispatch, [resource]); } - } + }, }); const handleItemClick = memoize( (resource: DataProps['resource'], onItemClick: ActionProps['onItemClick']): ContextMenuProps['onItemClick'] => - item => { + (item) => { onItemClick(item, resource); } ); @@ -55,63 +57,61 @@ const handleItemClick = memoize( const mergeProps = ({ resource, ...dataProps }: DataProps, actionProps: ActionProps): ContextMenuProps => ({ ...dataProps, ...actionProps, - onItemClick: handleItemClick(resource, actionProps.onItemClick) + onItemClick: handleItemClick(resource, actionProps.onItemClick), }); - export const ContextMenu = connect(mapStateToProps, mapDispatchToProps, mergeProps)(ContextMenuComponent); const menuActionSets = new Map(); export const addMenuActionSet = (name: string, itemSet: ContextMenuActionSet) => { - const sorted = itemSet.map(items => items.sort(sortByProperty('name'))); + const sorted = itemSet.map((items) => items.sort(sortByProperty('name'))); menuActionSets.set(name, sorted); }; const emptyActionSet: ContextMenuActionSet = []; -const getMenuActionSet = (resource?: ContextMenuResource): ContextMenuActionSet => ( - resource ? menuActionSets.get(resource.menuKind) || emptyActionSet : emptyActionSet -); +const getMenuActionSet = (resource?: ContextMenuResource): ContextMenuActionSet => + resource ? menuActionSets.get(resource.menuKind) || emptyActionSet : emptyActionSet; export enum ContextMenuKind { - API_CLIENT_AUTHORIZATION = "ApiClientAuthorization", - ROOT_PROJECT = "RootProject", - PROJECT = "Project", - FILTER_GROUP = "FilterGroup", + API_CLIENT_AUTHORIZATION = 'ApiClientAuthorization', + ROOT_PROJECT = 'RootProject', + PROJECT = 'Project', + FILTER_GROUP = 'FilterGroup', READONLY_PROJECT = 'ReadOnlyProject', FROZEN_PROJECT = 'FrozenProject', FROZEN_PROJECT_ADMIN = 'FrozenProjectAdmin', - PROJECT_ADMIN = "ProjectAdmin", - FILTER_GROUP_ADMIN = "FilterGroupAdmin", - RESOURCE = "Resource", - FAVORITE = "Favorite", - TRASH = "Trash", - COLLECTION_FILES = "CollectionFiles", - READONLY_COLLECTION_FILES = "ReadOnlyCollectionFiles", - COLLECTION_FILE_ITEM = "CollectionFileItem", - COLLECTION_DIRECTORY_ITEM = "CollectionDirectoryItem", - READONLY_COLLECTION_FILE_ITEM = "ReadOnlyCollectionFileItem", - READONLY_COLLECTION_DIRECTORY_ITEM = "ReadOnlyCollectionDirectoryItem", - COLLECTION_FILES_NOT_SELECTED = "CollectionFilesNotSelected", + PROJECT_ADMIN = 'ProjectAdmin', + FILTER_GROUP_ADMIN = 'FilterGroupAdmin', + RESOURCE = 'Resource', + FAVORITE = 'Favorite', + TRASH = 'Trash', + COLLECTION_FILES = 'CollectionFiles', + READONLY_COLLECTION_FILES = 'ReadOnlyCollectionFiles', + COLLECTION_FILE_ITEM = 'CollectionFileItem', + COLLECTION_DIRECTORY_ITEM = 'CollectionDirectoryItem', + READONLY_COLLECTION_FILE_ITEM = 'ReadOnlyCollectionFileItem', + READONLY_COLLECTION_DIRECTORY_ITEM = 'ReadOnlyCollectionDirectoryItem', + COLLECTION_FILES_NOT_SELECTED = 'CollectionFilesNotSelected', COLLECTION = 'Collection', COLLECTION_ADMIN = 'CollectionAdmin', READONLY_COLLECTION = 'ReadOnlyCollection', OLD_VERSION_COLLECTION = 'OldVersionCollection', TRASHED_COLLECTION = 'TrashedCollection', - PROCESS = "Process", + PROCESS = 'Process', PROCESS_ADMIN = 'ProcessAdmin', PROCESS_RESOURCE = 'ProcessResource', READONLY_PROCESS_RESOURCE = 'ReadOnlyProcessResource', - PROCESS_LOGS = "ProcessLogs", - REPOSITORY = "Repository", - SSH_KEY = "SshKey", - VIRTUAL_MACHINE = "VirtualMachine", - KEEP_SERVICE = "KeepService", - USER = "User", - GROUPS = "Group", - GROUP_MEMBER = "GroupMember", - PERMISSION_EDIT = "PermissionEdit", - LINK = "Link", - WORKFLOW = "Workflow", - SEARCH_RESULTS = "SearchResults" + PROCESS_LOGS = 'ProcessLogs', + REPOSITORY = 'Repository', + SSH_KEY = 'SshKey', + VIRTUAL_MACHINE = 'VirtualMachine', + KEEP_SERVICE = 'KeepService', + USER = 'User', + GROUPS = 'Group', + GROUP_MEMBER = 'GroupMember', + PERMISSION_EDIT = 'PermissionEdit', + LINK = 'Link', + WORKFLOW = 'Workflow', + SEARCH_RESULTS = 'SearchResults', } diff --git a/src/views-components/process-remove-many-dialog/process-remove-many-dialog.tsx b/src/views-components/process-remove-many-dialog/process-remove-many-dialog.tsx index d0d979af..4889418c 100644 --- a/src/views-components/process-remove-many-dialog/process-remove-many-dialog.tsx +++ b/src/views-components/process-remove-many-dialog/process-remove-many-dialog.tsx @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: AGPL-3.0 +//this file can probably be removed - lk + import { Dispatch, compose } from 'redux'; import { connect } from 'react-redux'; import { ConfirmationDialog } from 'components/confirmation-dialog/confirmation-dialog'; -- 2.30.2