mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
fix(editor): Place duplicated WFs always to correct parent folders (#14713)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { successToast } from '../pages/notifications';
|
import { errorToast, successToast } from '../pages/notifications';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getters
|
* Getters
|
||||||
@@ -47,6 +47,14 @@ export function getWorkflowCardActionItem(workflowName: string, actionName: stri
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getDuplicateWorkflowModal() {
|
||||||
|
return cy.getByTestId('duplicate-modal');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getWorkflowMenu() {
|
||||||
|
return cy.getByTestId('workflow-menu');
|
||||||
|
}
|
||||||
|
|
||||||
export function getAddFolderButton() {
|
export function getAddFolderButton() {
|
||||||
return cy.getByTestId('add-folder-button');
|
return cy.getByTestId('add-folder-button');
|
||||||
}
|
}
|
||||||
@@ -304,6 +312,24 @@ export function renameFolderFromCardActions(folderName: string, newName: string)
|
|||||||
renameFolder(newName);
|
renameFolder(newName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function duplicateWorkflowFromCardActions(workflowName: string, duplicateName: string) {
|
||||||
|
getWorkflowCardActions(workflowName).click();
|
||||||
|
getWorkflowCardActionItem(workflowName, 'duplicate').click();
|
||||||
|
getDuplicateWorkflowModal().find('input').first().type('{selectall}');
|
||||||
|
getDuplicateWorkflowModal().find('input').first().type(duplicateName);
|
||||||
|
getDuplicateWorkflowModal().find('button').contains('Duplicate').click();
|
||||||
|
errorToast().should('not.exist');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function duplicateWorkflowFromWorkflowPage(duplicateName: string) {
|
||||||
|
getWorkflowMenu().click();
|
||||||
|
cy.getByTestId('workflow-menu-item-duplicate').click();
|
||||||
|
getDuplicateWorkflowModal().find('input').first().type('{selectall}');
|
||||||
|
getDuplicateWorkflowModal().find('input').first().type(duplicateName);
|
||||||
|
getDuplicateWorkflowModal().find('button').contains('Duplicate').click();
|
||||||
|
errorToast().should('not.exist');
|
||||||
|
}
|
||||||
|
|
||||||
export function deleteEmptyFolderFromCardDropdown(folderName: string) {
|
export function deleteEmptyFolderFromCardDropdown(folderName: string) {
|
||||||
cy.intercept('DELETE', '/rest/projects/**').as('deleteFolder');
|
cy.intercept('DELETE', '/rest/projects/**').as('deleteFolder');
|
||||||
getFolderCard(folderName).click();
|
getFolderCard(folderName).click();
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import {
|
|||||||
deleteFolderWithContentsFromListDropdown,
|
deleteFolderWithContentsFromListDropdown,
|
||||||
dragAndDropToFolder,
|
dragAndDropToFolder,
|
||||||
dragAndDropToProjectRoot,
|
dragAndDropToProjectRoot,
|
||||||
|
duplicateWorkflowFromCardActions,
|
||||||
|
duplicateWorkflowFromWorkflowPage,
|
||||||
getAddResourceDropdown,
|
getAddResourceDropdown,
|
||||||
getCurrentBreadcrumb,
|
getCurrentBreadcrumb,
|
||||||
getFolderCard,
|
getFolderCard,
|
||||||
@@ -538,6 +540,72 @@ describe('Folders', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Duplicate workflows', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
// Prevent the duplicated workflow from opening in a new tab
|
||||||
|
cy.window().then((win) => {
|
||||||
|
cy.stub(win, 'open').as('open');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should duplicate workflow within root folder from personal projects', () => {
|
||||||
|
goToPersonalProject();
|
||||||
|
createWorkflowFromProjectHeader(undefined, 'Duplicate Me From Root');
|
||||||
|
goToPersonalProject();
|
||||||
|
duplicateWorkflowFromCardActions('Duplicate Me From Root', 'Duplicate Me From Root (Copy)');
|
||||||
|
getWorkflowCard('Duplicate Me From Root (Copy)').should('exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should duplicate workflow within a folder from personal projects', () => {
|
||||||
|
goToPersonalProject();
|
||||||
|
createFolderFromProjectHeader('Parent folder for duplication');
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
createWorkflowFromProjectHeader(
|
||||||
|
'Parent folder for duplication',
|
||||||
|
'Duplicate Me From Personal',
|
||||||
|
);
|
||||||
|
goToPersonalProject();
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
duplicateWorkflowFromCardActions(
|
||||||
|
'Duplicate Me From Personal',
|
||||||
|
'Duplicate Me From Personal (Copy)',
|
||||||
|
);
|
||||||
|
getWorkflowCard('Duplicate Me From Personal (Copy)').should('exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should duplicate workflow within a folder from overview', () => {
|
||||||
|
goToPersonalProject();
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
createWorkflowFromProjectHeader(
|
||||||
|
'Parent folder for duplication',
|
||||||
|
'Duplicate Me From Overview',
|
||||||
|
);
|
||||||
|
getOverviewMenuItem().click();
|
||||||
|
duplicateWorkflowFromCardActions(
|
||||||
|
'Duplicate Me From Overview',
|
||||||
|
'Duplicate Me From Overview (Copy)',
|
||||||
|
);
|
||||||
|
getWorkflowCard('Duplicate Me From Overview (Copy)').should('exist');
|
||||||
|
goToPersonalProject();
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
getWorkflowCard('Duplicate Me From Overview (Copy)').should('exist');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should duplicate workflow within a folder from workflow', () => {
|
||||||
|
goToPersonalProject();
|
||||||
|
createFolderFromProjectHeader('Parent folder for duplication');
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
createWorkflowFromProjectHeader(
|
||||||
|
'Parent folder for duplication',
|
||||||
|
'Duplicate Me From Workflow',
|
||||||
|
);
|
||||||
|
duplicateWorkflowFromWorkflowPage('Duplicate Me From Workflow (Copy)');
|
||||||
|
goToPersonalProject();
|
||||||
|
getFolderCard('Parent folder for duplication').click();
|
||||||
|
getWorkflowCard('Duplicate Me From Workflow (Copy)').should('exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('Drag and drop', () => {
|
describe('Drag and drop', () => {
|
||||||
it('should drag and drop folders into folders', () => {
|
it('should drag and drop folders into folders', () => {
|
||||||
const PROJECT_NAME = 'Drag and Drop Test';
|
const PROJECT_NAME = 'Drag and Drop Test';
|
||||||
|
|||||||
@@ -17,7 +17,13 @@ import { useTelemetry } from '@/composables/useTelemetry';
|
|||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
modalName: string;
|
modalName: string;
|
||||||
isActive: boolean;
|
isActive: boolean;
|
||||||
data: { tags: string[]; id: string; name: string; externalEventBus?: EventBus };
|
data: {
|
||||||
|
tags: string[];
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
externalEventBus?: EventBus;
|
||||||
|
parentFolderId?: string;
|
||||||
|
};
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@@ -72,7 +78,7 @@ const save = async (): Promise<void> => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parentFolderId = router.currentRoute.value.params.folderId as string | undefined;
|
const parentFolderId = props.data.parentFolderId;
|
||||||
|
|
||||||
const currentWorkflowId = props.data.id;
|
const currentWorkflowId = props.data.id;
|
||||||
isSaving.value = true;
|
isSaving.value = true;
|
||||||
|
|||||||
@@ -408,6 +408,7 @@ async function onWorkflowMenuSelect(action: WORKFLOW_MENU_ACTIONS): Promise<void
|
|||||||
id: props.id,
|
id: props.id,
|
||||||
name: props.name,
|
name: props.name,
|
||||||
tags: props.tags,
|
tags: props.tags,
|
||||||
|
parentFolderId: currentFolder?.value?.id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ async function onAction(action: string) {
|
|||||||
typeof tag !== 'string' && 'id' in tag ? tag.id : tag,
|
typeof tag !== 'string' && 'id' in tag ? tag.id : tag,
|
||||||
),
|
),
|
||||||
externalEventBus: props.workflowListEventBus,
|
externalEventBus: props.workflowListEventBus,
|
||||||
|
parentFolderId: props.data.parentFolder?.id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user