From: Lisa Knox Date: Wed, 24 May 2023 20:14:00 +0000 (-0400) Subject: one process copies Arvados-DCO-1.1-Signed-off-by: Lisa Knox X-Git-Tag: 2.7.1~13^2~96 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/1bde07ef5884a55bbb47aaf30a90b122a4810617?hp=0486a1fe8e98fb613eceabfd745875ed2b0d4395 one process copies Arvados-DCO-1.1-Signed-off-by: Lisa Knox --- diff --git a/src/components/data-explorer/data-explorer.tsx b/src/components/data-explorer/data-explorer.tsx index 67c6e748..b1d4605f 100644 --- a/src/components/data-explorer/data-explorer.tsx +++ b/src/components/data-explorer/data-explorer.tsx @@ -186,7 +186,6 @@ export const DataExplorer = withStyles(styles)( panelName, panelMaximized, elementPath, - isMSToolbarVisible, toggleMSToolbar, setCheckedListOnStore, } = this.props; @@ -231,7 +230,6 @@ export const DataExplorer = withStyles(styles)( )} - {/* {isMSToolbarVisible && } */} )} diff --git a/src/components/multiselectToolbar/MultiselectToolbar.tsx b/src/components/multiselectToolbar/MultiselectToolbar.tsx index fc036b29..2d6b1889 100644 --- a/src/components/multiselectToolbar/MultiselectToolbar.tsx +++ b/src/components/multiselectToolbar/MultiselectToolbar.tsx @@ -13,10 +13,17 @@ import { TCheckedList } from 'components/data-table/data-table'; import { openRemoveProcessDialog, openRemoveManyProcessesDialog } from 'store/processes/processes-actions'; import { processResourceActionSet } from '../../views-components/context-menu/action-sets/process-resource-action-set'; import { ContextMenuResource } from 'store/context-menu/context-menu-actions'; -import { toggleTrashed } from 'store/trash/trash-actions'; import { ResourceKind, extractUuidKind } from 'models/resource'; +import { openMoveProcessDialog } from 'store/processes/process-move-actions'; +import { openCopyProcessDialog } from 'store/processes/process-copy-actions'; +import { getResource } from 'store/resources/resources'; +import { ResourceName } from 'views-components/data-explorer/renderers'; +import { ProcessResource } from 'models/process'; +import { ResourcesState } from 'store/resources/resources'; +import { Resource } from 'models/resource'; +import { getProcess } from 'store/processes/process'; -type CssRules = 'root' | 'expanded' | 'button'; +type CssRules = 'root' | 'button'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { @@ -26,8 +33,6 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ padding: 0, margin: '1rem auto auto 0.5rem', overflow: 'hidden', - }, - expanded: { transition: 'width 150ms', }, button: { @@ -42,30 +47,31 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ type MultiselectToolbarAction = { name: string; - action: string; + funcName: string; relevantKinds: Set; }; +//gleaned from src/views-components/context-menu/action-sets export const defaultActions: Array = [ { - name: 'copy', - action: 'copySelected', - relevantKinds: new Set([ResourceKind.COLLECTION]), + name: 'copy and re-run', + funcName: 'copySelected', + relevantKinds: new Set([ResourceKind.PROCESS]), }, { name: 'move', - action: 'moveSelected', - relevantKinds: new Set([ResourceKind.COLLECTION, ResourceKind.PROCESS]), + funcName: 'moveSelected', + relevantKinds: new Set([ResourceKind.PROCESS, ResourceKind.PROJECT]), }, { name: 'remove', - action: 'removeSelected', - relevantKinds: new Set([ResourceKind.COLLECTION, ResourceKind.PROCESS, ResourceKind.PROJECT]), + funcName: 'removeSelected', + relevantKinds: new Set([ResourceKind.PROCESS, ResourceKind.COLLECTION]), }, { - name: 'foo', - action: 'barSelected', - relevantKinds: new Set([ResourceKind.COLLECTION, ResourceKind.PROJECT]), + name: 'favorite', + funcName: 'favoriteSelected', + relevantKinds: new Set([ResourceKind.PROCESS, ResourceKind.PROJECT, ResourceKind.COLLECTION]), }, ]; @@ -73,10 +79,11 @@ export type MultiselectToolbarProps = { actions: Array; isVisible: boolean; checkedList: TCheckedList; - copySelected: () => void; - moveSelected: () => void; + resources: ResourcesState; + copySelected: (checkedList: TCheckedList, resources: ResourcesState) => void; + moveSelected: (resource) => void; barSelected: () => void; - removeSelected: (selectedList: TCheckedList) => void; + removeSelected: (checkedList: TCheckedList) => void; }; export const MultiselectToolbar = connect( @@ -85,16 +92,16 @@ export const MultiselectToolbar = connect( )( withStyles(styles)((props: MultiselectToolbarProps & WithStyles) => { // console.log(props); - const { classes, actions, isVisible, checkedList } = props; + const { classes, actions, isVisible, checkedList, resources } = props; const currentResourceKinds = Array.from(selectedToKindSet(checkedList)); const buttons = actions.filter((action) => currentResourceKinds.length && currentResourceKinds.every((kind) => action.relevantKinds.has(kind as ResourceKind))); return ( - + {buttons.length ? ( buttons.map((btn) => ( - )) @@ -127,23 +134,49 @@ function selectedToKindSet(checkedList: TCheckedList): Set { } function mapStateToProps(state: RootState) { + // console.log(state); + // console.log(getResource('tordo-dz642-0p7xefqdr4nw4pw')(state.resources)); const { isVisible, checkedList } = state.multiselect; return { isVisible: isVisible, checkedList: checkedList as TCheckedList, + resources: state.resources, }; } function mapDispatchToProps(dispatch: Dispatch) { return { - copySelected: () => {}, - moveSelected: () => {}, + copySelected: (checkedList: TCheckedList, resources: ResourcesState) => copyMoveMulti(dispatch, checkedList, resources), + moveSelected: (checkedList: TCheckedList) => {}, barSelected: () => {}, - removeSelected: (checkedList: TCheckedList) => removeMulti(dispatch, checkedList), + removeSelected: (checkedList: TCheckedList) => removeMultiProcesses(dispatch, checkedList), }; } -function removeMulti(dispatch: Dispatch, checkedList: TCheckedList): void { +function copyMoveMulti(dispatch: Dispatch, checkedList: TCheckedList, resources: ResourcesState) { + const selectedList: Array = selectedToArray(checkedList); + const single = getProcess(selectedList[0])(resources)?.containerRequest; + console.log(single); + const { name, uuid } = single as any; + console.log(name, uuid); + dispatch(openCopyProcessDialog({ name, uuid })); +} + +function moveMultiProcesses(dispatch: Dispatch, checkedList: TCheckedList): void { + const selectedList: Array = selectedToArray(checkedList); + // if (selectedList.length === 1) dispatch(openMoveProcessDialog(selectedList[0])); +} + +const RemoveFunctions = { + ONE_PROCESS: (uuid: string) => openRemoveProcessDialog(uuid), + MANY_PROCESSES: (list: Array) => openRemoveManyProcessesDialog(list), +}; + +function removeMultiProcesses(dispatch: Dispatch, checkedList: TCheckedList): void { const selectedList: Array = selectedToArray(checkedList); - dispatch(selectedList.length === 1 ? openRemoveProcessDialog(selectedList[0]) : openRemoveManyProcessesDialog(selectedList)); + dispatch(selectedList.length === 1 ? RemoveFunctions.ONE_PROCESS(selectedList[0]) : RemoveFunctions.MANY_PROCESSES(selectedList)); } + +//onRemove +//go through the array of selected and choose the appropriate removal function +//have a constant with [ResourceKind]: different removal methods diff --git a/src/store/processes/process-copy-actions.ts b/src/store/processes/process-copy-actions.ts index 3c55a9ad..d8e1eb09 100644 --- a/src/store/processes/process-copy-actions.ts +++ b/src/store/processes/process-copy-actions.ts @@ -2,85 +2,84 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { Dispatch } from "redux"; -import { dialogActions } from "store/dialog/dialog-actions"; +import { Dispatch } from 'redux'; +import { dialogActions } from 'store/dialog/dialog-actions'; import { initialize, startSubmit } from 'redux-form'; import { resetPickerProjectTree } from 'store/project-tree-picker/project-tree-picker-actions'; import { RootState } from 'store/store'; import { ServiceRepository } from 'services/services'; import { CopyFormDialogData } from 'store/copy-dialog/copy-dialog'; import { getProcess } from 'store/processes/process'; -import {snackbarActions, SnackbarKind} from 'store/snackbar/snackbar-actions'; +import { snackbarActions, SnackbarKind } from 'store/snackbar/snackbar-actions'; import { initProjectsTreePicker } from 'store/tree-picker/tree-picker-actions'; -import { ContainerRequestState } from "models/container-request"; +import { ContainerRequestState } from 'models/container-request'; export const PROCESS_COPY_FORM_NAME = 'processCopyFormName'; -export const openCopyProcessDialog = (resource: { name: string, uuid: string }) => - (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - const process = getProcess(resource.uuid)(getState().resources); - if (process) { - dispatch(resetPickerProjectTree()); - dispatch(initProjectsTreePicker(PROCESS_COPY_FORM_NAME)); - const initialData: CopyFormDialogData = { name: `Copy of: ${resource.name}`, uuid: resource.uuid, ownerUuid: '' }; - dispatch(initialize(PROCESS_COPY_FORM_NAME, initialData)); - dispatch(dialogActions.OPEN_DIALOG({ id: PROCESS_COPY_FORM_NAME, data: {} })); - } else { - dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Process not found', hideDuration: 2000, kind: SnackbarKind.ERROR })); - } - }; +export const openCopyProcessDialog = (resource: { name: string; uuid: string }) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + console.log(resource); + const process = getProcess(resource.uuid)(getState().resources); + if (process) { + dispatch(resetPickerProjectTree()); + dispatch(initProjectsTreePicker(PROCESS_COPY_FORM_NAME)); + const initialData: CopyFormDialogData = { name: `Copy of: ${resource.name}`, uuid: resource.uuid, ownerUuid: '' }; + dispatch(initialize(PROCESS_COPY_FORM_NAME, initialData)); + dispatch(dialogActions.OPEN_DIALOG({ id: PROCESS_COPY_FORM_NAME, data: {} })); + } else { + dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Process not found', hideDuration: 2000, kind: SnackbarKind.ERROR })); + } +}; -export const copyProcess = (resource: CopyFormDialogData) => - async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - dispatch(startSubmit(PROCESS_COPY_FORM_NAME)); - try { - const process = await services.containerRequestService.get(resource.uuid); - const { - command, - containerCountMax, - containerImage, - cwd, - description, - environment, - kind, - mounts, - outputName, - outputPath, - outputProperties, - outputStorageClasses, - outputTtl, - properties, - runtimeConstraints, - schedulingParameters, - useExisting, - } = process; - const newProcess = await services.containerRequestService.create({ - command, - containerCountMax, - containerImage, - cwd, - description, - environment, - kind, - mounts, - name: resource.name, - outputName, - outputPath, - outputProperties, - outputStorageClasses, - outputTtl, - ownerUuid: resource.ownerUuid, - priority: 500, - properties, - runtimeConstraints, - schedulingParameters, - state: ContainerRequestState.UNCOMMITTED, - useExisting, - }); - dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME })); - return newProcess; - } catch (e) { - dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME })); - throw new Error('Could not copy the process.'); - } - }; +export const copyProcess = (resource: CopyFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + dispatch(startSubmit(PROCESS_COPY_FORM_NAME)); + try { + const process = await services.containerRequestService.get(resource.uuid); + const { + command, + containerCountMax, + containerImage, + cwd, + description, + environment, + kind, + mounts, + outputName, + outputPath, + outputProperties, + outputStorageClasses, + outputTtl, + properties, + runtimeConstraints, + schedulingParameters, + useExisting, + } = process; + const newProcess = await services.containerRequestService.create({ + command, + containerCountMax, + containerImage, + cwd, + description, + environment, + kind, + mounts, + name: resource.name, + outputName, + outputPath, + outputProperties, + outputStorageClasses, + outputTtl, + ownerUuid: resource.ownerUuid, + priority: 500, + properties, + runtimeConstraints, + schedulingParameters, + state: ContainerRequestState.UNCOMMITTED, + useExisting, + }); + dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME })); + return newProcess; + } catch (e) { + dispatch(dialogActions.CLOSE_DIALOG({ id: PROCESS_COPY_FORM_NAME })); + throw new Error('Could not copy the process.'); + } +};