From 3b5ffa7cf6d51c5842b3421b41804b925d6cde3f Mon Sep 17 00:00:00 2001 From: Lisa Knox Date: Thu, 31 Aug 2023 11:13:52 -0400 Subject: [PATCH] 15768: first stage of multimove propagation up Arvados-DCO-1.1-Signed-off-by: Lisa Knox --- .../multiselectToolbar/MultiselectToolbar.tsx | 2 +- src/store/workbench/workbench-actions.ts | 133 +++++++++++------- .../dialog-forms/move-project-dialog.ts | 17 ++- 3 files changed, 92 insertions(+), 60 deletions(-) diff --git a/src/components/multiselectToolbar/MultiselectToolbar.tsx b/src/components/multiselectToolbar/MultiselectToolbar.tsx index 47fd380e..85e6dd3a 100644 --- a/src/components/multiselectToolbar/MultiselectToolbar.tsx +++ b/src/components/multiselectToolbar/MultiselectToolbar.tsx @@ -104,7 +104,7 @@ export function selectedToArray(checkedList: TCheckedList): Array { return arrayifiedSelectedList; } -function selectedToKindSet(checkedList: TCheckedList): Set { +export function selectedToKindSet(checkedList: TCheckedList): Set { const setifiedList = new Set(); for (const [key, value] of Object.entries(checkedList)) { if (value === true) { diff --git a/src/store/workbench/workbench-actions.ts b/src/store/workbench/workbench-actions.ts index 4d717c48..1517f34c 100644 --- a/src/store/workbench/workbench-actions.ts +++ b/src/store/workbench/workbench-actions.ts @@ -100,7 +100,7 @@ import { loadAllProcessesPanel, allProcessesPanelActions } from "../all-processe import { allProcessesPanelColumns } from "views/all-processes-panel/all-processes-panel"; import { AdminMenuIcon } from "components/icon/icon"; import { userProfileGroupsColumns } from "views/user-profile-panel/user-profile-panel-root"; -import { selectedToArray } from "components/multiselectToolbar/MultiselectToolbar"; +import { selectedToArray, selectedToKindSet } from "components/multiselectToolbar/MultiselectToolbar"; export const WORKBENCH_LOADING_SCREEN = "workbenchLoadingScreen"; @@ -278,22 +278,39 @@ export const createProject = (data: projectCreateActions.ProjectCreateFormDialog } }; -export const moveProject = (data: MoveToFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const itemsToMove: string[] = selectedToArray(getState().multiselect.checkedList); - //if no items in checkedlist, default to normal context menu behavior - if (!itemsToMove.length) itemsToMove.push(data.uuid); - const sourceUuid = getResource(data.uuid)(getState().resources)?.ownerUuid; - const destinationUuid = data.ownerUuid; +export const moveProject = + (data: MoveToFormDialogData, secondaryMoveKind: string = "") => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const checkedList = getState().multiselect.checkedList; + const uuidsToMove: string[] = selectedToArray(checkedList); - for (const uuid of itemsToMove) { - await moveSingleProject(uuid); - } + //if no items in checkedlist && no items passed in, default to normal context menu behavior + if (!secondaryMoveKind.length && !uuidsToMove.length) uuidsToMove.push(data.uuid); - async function moveSingleProject(uuid: string) { - const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string }; - if (originalItem.kind === ResourceKind.PROJECT) { + const sourceUuid = getResource(data.uuid)(getState().resources)?.ownerUuid; + const destinationUuid = data.ownerUuid; + + const projectsToMove: MoveableResource[] = uuidsToMove + .map(uuid => getResource(uuid)(getState().resources) as MoveableResource) + .filter(resource => resource.kind === ResourceKind.PROJECT); + + for (const project of projectsToMove) { + await moveSingleProject(project); + } + + if (!secondaryMoveKind.length) { + const kindsToMove: Set = selectedToKindSet(checkedList); + kindsToMove.delete(ResourceKind.PROJECT); + + kindsToMove.forEach(kind => { + secondaryMove[kind](data, kind)(dispatch, getState, services); + console.log(secondaryMove[kind]); + }); + } + + async function moveSingleProject(project: MoveableResource) { try { - const oldProject: MoveToFormDialogData = { name: originalItem.name, uuid: originalItem.uuid, ownerUuid: data.ownerUuid }; + const oldProject: MoveToFormDialogData = { name: project.name, uuid: project.uuid, ownerUuid: data.ownerUuid }; const oldOwnerUuid = oldProject ? oldProject.ownerUuid : ""; const movedProject = await dispatch(projectMoveActions.moveProject(oldProject)); if (movedProject) { @@ -314,12 +331,12 @@ export const moveProject = (data: MoveToFormDialogData) => async (dispatch: Disp kind: SnackbarKind.ERROR, }) ); + // } } } - } - if (sourceUuid) await dispatch(loadSidePanelTreeProjects(sourceUuid)); - await dispatch(loadSidePanelTreeProjects(destinationUuid)); -}; + if (sourceUuid) await dispatch(loadSidePanelTreeProjects(sourceUuid)); + await dispatch(loadSidePanelTreeProjects(destinationUuid)); + }; export const updateProject = (data: projectUpdateActions.ProjectUpdateFormDialogData) => async (dispatch: Dispatch) => { const updatedProject = await dispatch(projectUpdateActions.updateProject(data)); @@ -434,42 +451,45 @@ export const copyCollection = (data: CopyFormDialogData) => async (dispatch: Dis } }; -export const moveCollection = (data: MoveToFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const itemsToMove: string[] = selectedToArray(getState().multiselect.checkedList); - //if no items in checkedlist, default to normal context menu behavior - if (!itemsToMove.length) itemsToMove.push(data.uuid); +export const moveCollection = + (data: MoveToFormDialogData, secondaryMoveKind: string = "") => + async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + console.log("MoveCollection?", data, secondaryMoveKind); + const itemsToMove: string[] = selectedToArray(getState().multiselect.checkedList); + //if no items in checkedlist, default to normal context menu behavior + if (!itemsToMove.length) itemsToMove.push(data.uuid); - for (const uuid of itemsToMove) { - await moveSingleCollection(uuid); - } + for (const uuid of itemsToMove) { + await moveSingleCollection(uuid); + } - async function moveSingleCollection(uuid: string) { - const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string }; - if (originalItem.kind === ResourceKind.COLLECTION) { - try { - const oldCollection: MoveToFormDialogData = { name: originalItem.name, uuid: originalItem.uuid, ownerUuid: data.ownerUuid }; - const collection = await dispatch(collectionMoveActions.moveCollection(oldCollection)); - dispatch(updateResources([collection])); - dispatch(reloadProjectMatchingUuid([collection.ownerUuid])); - dispatch( - snackbarActions.OPEN_SNACKBAR({ - message: "Collection has been moved.", - hideDuration: 2000, - kind: SnackbarKind.SUCCESS, - }) - ); - } catch (e) { - dispatch( - snackbarActions.OPEN_SNACKBAR({ - message: e.message, - hideDuration: 2000, - kind: SnackbarKind.ERROR, - }) - ); + async function moveSingleCollection(uuid: string) { + const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string }; + if (originalItem.kind === ResourceKind.COLLECTION) { + try { + const oldCollection: MoveToFormDialogData = { name: originalItem.name, uuid: originalItem.uuid, ownerUuid: data.ownerUuid }; + const collection = await dispatch(collectionMoveActions.moveCollection(oldCollection)); + dispatch(updateResources([collection])); + dispatch(reloadProjectMatchingUuid([collection.ownerUuid])); + dispatch( + snackbarActions.OPEN_SNACKBAR({ + message: "Collection has been moved.", + hideDuration: 2000, + kind: SnackbarKind.SUCCESS, + }) + ); + } catch (e) { + dispatch( + snackbarActions.OPEN_SNACKBAR({ + message: e.message, + hideDuration: 2000, + kind: SnackbarKind.ERROR, + }) + ); + } } } - } -}; + }; export const loadProcess = (uuid: string) => handleFirstTimeLoad(async (dispatch: Dispatch, getState: () => RootState) => { @@ -764,3 +784,16 @@ const groupContentsHandlersRecord = { const groupContentsHandlers = unionize(groupContentsHandlersRecord); type GroupContentsHandler = UnionOf; + +type MoveableResource = Resource & { name: string }; + +type MoveFunc = ( + data: MoveToFormDialogData, + secondaryMoveKind?: string +) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => Promise; + +const secondaryMove: Record = { + [ResourceKind.PROJECT]: moveProject, + [ResourceKind.PROCESS]: moveProcess, + [ResourceKind.COLLECTION]: moveCollection, +}; diff --git a/src/views-components/dialog-forms/move-project-dialog.ts b/src/views-components/dialog-forms/move-project-dialog.ts index 0729e29c..345040d5 100644 --- a/src/views-components/dialog-forms/move-project-dialog.ts +++ b/src/views-components/dialog-forms/move-project-dialog.ts @@ -4,12 +4,12 @@ import { compose } from "redux"; import { withDialog } from "store/dialog/with-dialog"; -import { reduxForm } from 'redux-form'; -import { PROJECT_MOVE_FORM_NAME } from 'store/projects/project-move-actions'; -import { MoveToFormDialogData } from 'store/move-to-dialog/move-to-dialog'; -import { DialogMoveTo } from 'views-components/dialog-move/dialog-move-to'; -import { moveProject } from 'store/workbench/workbench-actions'; -import { pickerId } from 'store/tree-picker/picker-id'; +import { reduxForm } from "redux-form"; +import { PROJECT_MOVE_FORM_NAME } from "store/projects/project-move-actions"; +import { MoveToFormDialogData } from "store/move-to-dialog/move-to-dialog"; +import { DialogMoveTo } from "views-components/dialog-move/dialog-move-to"; +import { moveProject } from "store/workbench/workbench-actions"; +import { pickerId } from "store/tree-picker/picker-id"; export const MoveProjectDialog = compose( withDialog(PROJECT_MOVE_FORM_NAME), @@ -17,8 +17,7 @@ export const MoveProjectDialog = compose( form: PROJECT_MOVE_FORM_NAME, onSubmit: (data, dispatch) => { dispatch(moveProject(data)); - } + }, }), - pickerId(PROJECT_MOVE_FORM_NAME), + pickerId(PROJECT_MOVE_FORM_NAME) )(DialogMoveTo); - -- 2.30.2