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
|
||||
@@ -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() {
|
||||
return cy.getByTestId('add-folder-button');
|
||||
}
|
||||
@@ -304,6 +312,24 @@ export function renameFolderFromCardActions(folderName: string, newName: string)
|
||||
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) {
|
||||
cy.intercept('DELETE', '/rest/projects/**').as('deleteFolder');
|
||||
getFolderCard(folderName).click();
|
||||
|
||||
@@ -16,6 +16,8 @@ import {
|
||||
deleteFolderWithContentsFromListDropdown,
|
||||
dragAndDropToFolder,
|
||||
dragAndDropToProjectRoot,
|
||||
duplicateWorkflowFromCardActions,
|
||||
duplicateWorkflowFromWorkflowPage,
|
||||
getAddResourceDropdown,
|
||||
getCurrentBreadcrumb,
|
||||
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', () => {
|
||||
it('should drag and drop folders into folders', () => {
|
||||
const PROJECT_NAME = 'Drag and Drop Test';
|
||||
|
||||
@@ -17,7 +17,13 @@ import { useTelemetry } from '@/composables/useTelemetry';
|
||||
const props = defineProps<{
|
||||
modalName: string;
|
||||
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();
|
||||
@@ -72,7 +78,7 @@ const save = async (): Promise<void> => {
|
||||
return;
|
||||
}
|
||||
|
||||
const parentFolderId = router.currentRoute.value.params.folderId as string | undefined;
|
||||
const parentFolderId = props.data.parentFolderId;
|
||||
|
||||
const currentWorkflowId = props.data.id;
|
||||
isSaving.value = true;
|
||||
|
||||
@@ -408,6 +408,7 @@ async function onWorkflowMenuSelect(action: WORKFLOW_MENU_ACTIONS): Promise<void
|
||||
id: props.id,
|
||||
name: props.name,
|
||||
tags: props.tags,
|
||||
parentFolderId: currentFolder?.value?.id,
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
@@ -220,6 +220,7 @@ async function onAction(action: string) {
|
||||
typeof tag !== 'string' && 'id' in tag ? tag.id : tag,
|
||||
),
|
||||
externalEventBus: props.workflowListEventBus,
|
||||
parentFolderId: props.data.parentFolder?.id,
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user