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/multiselect-toolbar/MultiselectToolbar";
export const WORKBENCH_LOADING_SCREEN = "workbenchLoadingScreen";
}
};
-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, isSecondaryMove = false) =>
+ 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 (!isSecondaryMove && !uuidsToMove.length) uuidsToMove.push(data.uuid);
+
+ 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);
+ }
- async function moveSingleProject(uuid: string) {
- const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string };
- if (originalItem.kind === ResourceKind.PROJECT) {
+ //omly propagate if this call is the original
+ if (!isSecondaryMove) {
+ const kindsToMove: Set<string> = selectedToKindSet(checkedList);
+ kindsToMove.delete(ResourceKind.PROJECT);
+
+ kindsToMove.forEach(kind => {
+ secondaryMove[kind](data, true)(dispatch, getState, services);
+ });
+ }
+
+ 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<any>(projectMoveActions.moveProject(oldProject));
if (movedProject) {
kind: SnackbarKind.ERROR,
})
);
+ // }
}
}
- }
- if (sourceUuid) await dispatch<any>(loadSidePanelTreeProjects(sourceUuid));
- await dispatch<any>(loadSidePanelTreeProjects(destinationUuid));
-};
+ if (sourceUuid) await dispatch<any>(loadSidePanelTreeProjects(sourceUuid));
+ await dispatch<any>(loadSidePanelTreeProjects(destinationUuid));
+ };
export const updateProject = (data: projectUpdateActions.ProjectUpdateFormDialogData) => async (dispatch: Dispatch) => {
const updatedProject = await dispatch<any>(projectUpdateActions.updateProject(data));
}
};
-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, isSecondaryMove = false) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const checkedList = getState().multiselect.checkedList;
+ const uuidsToMove: string[] = selectedToArray(checkedList);
- for (const uuid of itemsToMove) {
- await moveSingleCollection(uuid);
- }
+ //if no items in checkedlist && no items passed in, default to normal context menu behavior
+ if (!isSecondaryMove && !uuidsToMove.length) uuidsToMove.push(data.uuid);
+
+ const collectionsToMove: MoveableResource[] = uuidsToMove
+ .map(uuid => getResource(uuid)(getState().resources) as MoveableResource)
+ .filter(resource => resource.kind === ResourceKind.COLLECTION);
+
+ for (const collection of collectionsToMove) {
+ await moveSingleCollection(collection);
+ }
+
+ //omly propagate if this call is the original
+ if (!isSecondaryMove) {
+ const kindsToMove: Set<string> = selectedToKindSet(checkedList);
+ kindsToMove.delete(ResourceKind.COLLECTION);
+
+ kindsToMove.forEach(kind => {
+ secondaryMove[kind](data, true)(dispatch, getState, services);
+ });
+ }
- async function moveSingleCollection(uuid: string) {
- const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string };
- if (originalItem.kind === ResourceKind.COLLECTION) {
+ async function moveSingleCollection(collection: MoveableResource) {
try {
- const oldCollection: MoveToFormDialogData = { name: originalItem.name, uuid: originalItem.uuid, ownerUuid: data.ownerUuid };
- const collection = await dispatch<any>(collectionMoveActions.moveCollection(oldCollection));
- dispatch<any>(updateResources([collection]));
- dispatch<any>(reloadProjectMatchingUuid([collection.ownerUuid]));
+ const oldCollection: MoveToFormDialogData = { name: collection.name, uuid: collection.uuid, ownerUuid: data.ownerUuid };
+ const movedCollection = await dispatch<any>(collectionMoveActions.moveCollection(oldCollection));
+ dispatch<any>(updateResources([movedCollection]));
+ dispatch<any>(reloadProjectMatchingUuid([movedCollection.ownerUuid]));
dispatch(
snackbarActions.OPEN_SNACKBAR({
message: "Collection has been moved.",
);
}
}
- }
-};
+ };
export const loadProcess = (uuid: string) =>
handleFirstTimeLoad(async (dispatch: Dispatch, getState: () => RootState) => {
}
};
-export const moveProcess = (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 moveProcess =
+ (data: MoveToFormDialogData, isSecondaryMove = false) =>
+ async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+ const checkedList = getState().multiselect.checkedList;
+ const uuidsToMove: string[] = selectedToArray(checkedList);
- for (const uuid of itemsToMove) {
- await moveSingleProcess(uuid);
- }
+ //if no items in checkedlist && no items passed in, default to normal context menu behavior
+ if (!isSecondaryMove && !uuidsToMove.length) uuidsToMove.push(data.uuid);
- async function moveSingleProcess(uuid: string) {
- const originalItem = getResource(uuid)(getState().resources) as Resource & { name: string };
- if (originalItem.kind === ResourceKind.PROCESS) {
+ const processesToMove: MoveableResource[] = uuidsToMove
+ .map(uuid => getResource(uuid)(getState().resources) as MoveableResource)
+ .filter(resource => resource.kind === ResourceKind.PROCESS);
+
+ for (const process of processesToMove) {
+ await moveSingleProcess(process);
+ }
+
+ //omly propagate if this call is the original
+ if (!isSecondaryMove) {
+ const kindsToMove: Set<string> = selectedToKindSet(checkedList);
+ kindsToMove.delete(ResourceKind.PROCESS);
+
+ kindsToMove.forEach(kind => {
+ secondaryMove[kind](data, true)(dispatch, getState, services);
+ });
+ }
+
+ async function moveSingleProcess(process: MoveableResource) {
try {
- const oldProcess: MoveToFormDialogData = { name: originalItem.name, uuid: originalItem.uuid, ownerUuid: data.ownerUuid };
- const process = await dispatch<any>(processMoveActions.moveProcess(oldProcess));
- dispatch<any>(updateResources([process]));
- dispatch<any>(reloadProjectMatchingUuid([process.ownerUuid]));
+ const oldProcess: MoveToFormDialogData = { name: process.name, uuid: process.uuid, ownerUuid: data.ownerUuid };
+ const movedProcess = await dispatch<any>(processMoveActions.moveProcess(oldProcess));
+ dispatch<any>(updateResources([movedProcess]));
+ dispatch<any>(reloadProjectMatchingUuid([movedProcess.ownerUuid]));
dispatch(
snackbarActions.OPEN_SNACKBAR({
message: "Process has been moved.",
);
}
}
- }
-};
+ };
export const copyProcess = (data: CopyFormDialogData) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
try {
const groupContentsHandlers = unionize(groupContentsHandlersRecord);
type GroupContentsHandler = UnionOf<typeof groupContentsHandlers>;
+
+type MoveableResource = Resource & { name: string };
+
+type MoveFunc = (
+ data: MoveToFormDialogData,
+ isSecondaryMove?: boolean
+) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => Promise<void>;
+
+const secondaryMove: Record<string, MoveFunc> = {
+ [ResourceKind.PROJECT]: moveProject,
+ [ResourceKind.PROCESS]: moveProcess,
+ [ResourceKind.COLLECTION]: moveCollection,
+};