Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(editor): Add move resources option to workflows and credentials on #9654

Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
cb1ca5d
fix(editor): Add move action to workflow card and refactor the compon…
cstuncsik Jun 6, 2024
e01665b
Merge remote-tracking branch 'origin/master' into pay-1638-add-move-r…
cstuncsik Jun 6, 2024
3b629d2
fix(editor): Fix test
cstuncsik Jun 6, 2024
302fb9d
fix(editor): Refactor Modals to setup script
cstuncsik Jun 6, 2024
76a2223
fix(editor): Scaffolding resource move process
cstuncsik Jun 6, 2024
dcbeebc
fix(editor): Refactor credential card to setup script, fix unit test
cstuncsik Jun 7, 2024
4e5f6f4
fix(editor): Adding confirmation labels
cstuncsik Jun 7, 2024
bb3a9e8
fix(editor): Move tests
cstuncsik Jun 7, 2024
521e3f1
fix(editor): Move workflow to project
cstuncsik Jun 7, 2024
d764788
fix(editor): Add credential move
cstuncsik Jun 7, 2024
643f289
fix(editor): Add error toast to move resource
cstuncsik Jun 7, 2024
5b5234a
fix(editor): Fix some data and add test id
cstuncsik Jun 7, 2024
cc1a961
test: Add e2e test to move workflow from home project
cstuncsik Jun 7, 2024
0102295
fix(editor): Update translation
cstuncsik Jun 7, 2024
5953ff5
fix(editor): Add e2e test for credential move
cstuncsik Jun 10, 2024
5363d01
Merge remote-tracking branch 'origin/master' into pay-1638-add-move-r…
cstuncsik Jun 10, 2024
76a5835
fix(editor): Apply review requests
cstuncsik Jun 10, 2024
cf39c17
fix(editor): Roll back setup script implementation because of causing…
cstuncsik Jun 11, 2024
ff0e25d
Merge remote-tracking branch 'origin/master' into pay-1638-add-move-r…
cstuncsik Jun 11, 2024
2294838
fix(editor): Fix modals after conflict
cstuncsik Jun 11, 2024
4341581
fix(editor): Use sharedWithProjects length in label
cstuncsik Jun 11, 2024
8f70a9e
Merge remote-tracking branch 'origin/master' into pay-1638-add-move-r…
cstuncsik Jun 11, 2024
de01597
fix(editor): Fix e2e fixture path
cstuncsik Jun 11, 2024
52da916
fix(editor): Add scopes to resource list layout component
cstuncsik Jun 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion cypress/composables/projects.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import { CredentialsModal, WorkflowPage } from '../pages';

const workflowPage = new WorkflowPage();
const credentialsModal = new CredentialsModal();

export const getHomeButton = () => cy.getByTestId('project-home-menu-item');
export const getMenuItems = () => cy.getByTestId('project-menu-item');
export const getAddProjectButton = () => cy.getByTestId('add-project-menu-item');
Expand All @@ -11,8 +16,42 @@ export const getProjectSettingsCancelButton = () =>
export const getProjectSettingsDeleteButton = () =>
cy.getByTestId('project-settings-delete-button');
export const getProjectMembersSelect = () => cy.getByTestId('project-members-select');

export const addProjectMember = (email: string) => {
getProjectMembersSelect().click();
getProjectMembersSelect().get('.el-select-dropdown__item').contains(email.toLowerCase()).click();
};
export const getProjectNameInput = () => cy.get('#projectName');
export const getResourceMoveModal = () => cy.getByTestId('project-move-resource-modal');
export const getResourceMoveConfirmModal = () =>
cy.getByTestId('project-move-resource-confirm-modal');
export const getProjectMoveSelect = () => cy.getByTestId('project-move-resource-modal-select');

export function createProject(name: string) {
getAddProjectButton().should('be.visible').click();

getProjectNameInput()
.should('be.visible')
.should('be.focused')
.should('have.value', 'My project')
.clear()
.type(name);
getProjectSettingsSaveButton().click();
}

export function createWorkflow(fixtureKey: string, name: string) {
workflowPage.getters.workflowImportInput().selectFile(`fixtures/${fixtureKey}`, { force: true });
workflowPage.actions.setWorkflowName(name);
workflowPage.getters.saveButton().should('contain', 'Saved');
workflowPage.actions.zoomToFit();
}

export function createCredential(name: string) {
credentialsModal.getters.newCredentialModal().should('be.visible');
credentialsModal.getters.newCredentialTypeSelect().should('be.visible');
credentialsModal.getters.newCredentialTypeOption('Notion API').click();
credentialsModal.getters.newCredentialTypeButton().click();
credentialsModal.getters.connectionParameter('Internal Integration Secret').type('1234567890');
credentialsModal.actions.setName(name);
credentialsModal.actions.save();
credentialsModal.actions.close();
}
147 changes: 147 additions & 0 deletions cypress/e2e/39-projects.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -401,5 +401,152 @@ describe('Projects', () => {
.first()
.should('contain.text', 'Notion account personal project');
});

it('should move resources between projects', () => {
cy.signin(INSTANCE_OWNER);
cy.visit(workflowsPage.url);

// Create a workflow and a credential in the Home project
workflowsPage.getters.workflowCards().should('not.have.length');
workflowsPage.getters.newWorkflowButtonCard().click();
projects.createWorkflow('Test_workflow_1.json', 'Workflow in Home project');

projects.getHomeButton().click();
projects.getProjectTabCredentials().should('be.visible').click();
credentialsPage.getters.emptyListCreateCredentialButton().click();
projects.createCredential('Credential in Home project');

// Create a project and add a credential and a workflow to it
projects.createProject('Project 1');
projects.getProjectTabCredentials().click();
credentialsPage.getters.emptyListCreateCredentialButton().click();
projects.createCredential('Credential in Project 1');

projects.getProjectTabWorkflows().click();
workflowsPage.getters.newWorkflowButtonCard().click();
projects.createWorkflow('Test_workflow_1.json', 'Workflow in Project 1');

// Create another project and add a credential and a workflow to it
projects.createProject('Project 2');
projects.getProjectTabCredentials().click();
credentialsPage.getters.emptyListCreateCredentialButton().click();
projects.createCredential('Credential in Project 2');

projects.getProjectTabWorkflows().click();
workflowsPage.getters.newWorkflowButtonCard().click();
projects.createWorkflow('Test_workflow_1.json', 'Workflow in Project 2');

// Move the workflow owned by me from Home to Project 1
projects.getHomeButton().click();
workflowsPage.getters
.workflowCards()
.should('have.length', 3)
.filter(':contains("Owned by me")')
.should('exist');
workflowsPage.getters.workflowCardActions('Workflow in Home project').click();
workflowsPage.getters.workflowMoveButton().click();

projects
.getResourceMoveModal()
.should('be.visible')
.find('button:contains("Next")')
.should('be.disabled');
projects.getProjectMoveSelect().click();
getVisibleSelect()
.find('li')
.should('have.length', 2)
.first()
.should('contain.text', 'Project 1')
.click();
projects.getResourceMoveModal().find('button:contains("Next")').click();

projects
.getResourceMoveConfirmModal()
.should('be.visible')
.find('button:contains("Confirm")')
.should('be.disabled');

projects
.getResourceMoveConfirmModal()
.find('input[type="checkbox"]')
.first()
.parents('label')
.click();
projects
.getResourceMoveConfirmModal()
.find('button:contains("Confirm")')
.should('be.disabled');
projects
.getResourceMoveConfirmModal()
.find('input[type="checkbox"]')
.last()
.parents('label')
.click();
projects
.getResourceMoveConfirmModal()
.find('button:contains("Confirm")')
.should('not.be.disabled')
.click();

workflowsPage.getters
.workflowCards()
.should('have.length', 3)
.filter(':contains("Owned by me")')
.should('not.exist');

// Move the credential from Project 1 to Project 2
projects.getMenuItems().first().click();
workflowsPage.getters.workflowCards().should('have.length', 2);
projects.getProjectTabCredentials().click();
credentialsPage.getters.credentialCards().should('have.length', 1);
credentialsPage.getters.credentialCardActions('Credential in Project 1').click();
credentialsPage.getters.credentialMoveButton().click();

projects
.getResourceMoveModal()
.should('be.visible')
.find('button:contains("Next")')
.should('be.disabled');
projects.getProjectMoveSelect().click();
getVisibleSelect()
.find('li')
.should('have.length', 1)
.first()
.should('contain.text', 'Project 2')
.click();
projects.getResourceMoveModal().find('button:contains("Next")').click();

projects
.getResourceMoveConfirmModal()
.should('be.visible')
.find('button:contains("Confirm")')
.should('be.disabled');

projects
.getResourceMoveConfirmModal()
.find('input[type="checkbox"]')
.first()
.parents('label')
.click();
projects
.getResourceMoveConfirmModal()
.find('button:contains("Confirm")')
.should('be.disabled');
projects
.getResourceMoveConfirmModal()
.find('input[type="checkbox"]')
.last()
.parents('label')
.click();
projects
.getResourceMoveConfirmModal()
.find('button:contains("Confirm")')
.should('not.be.disabled')
.click();
credentialsPage.getters.credentialCards().should('not.have.length');
projects.getMenuItems().last().click();
projects.getProjectTabCredentials().click();
credentialsPage.getters.credentialCards().should('have.length', 2);
});
});
});
2 changes: 2 additions & 0 deletions cypress/pages/credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ export class CredentialsPage extends BasePage {
this.getters.credentialCard(credentialName).findChildByTestId('credential-card-actions'),
credentialDeleteButton: () =>
cy.getByTestId('action-toggle-dropdown').filter(':visible').contains('Delete'),
credentialMoveButton: () =>
cy.getByTestId('action-toggle-dropdown').filter(':visible').contains('Move'),
sort: () => cy.getByTestId('resources-list-sort').first(),
sortOption: (label: string) =>
cy.getByTestId('resources-list-sort-item').contains(label).first(),
Expand Down
2 changes: 2 additions & 0 deletions cypress/pages/workflows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ export class WorkflowsPage extends BasePage {
this.getters.workflowCard(workflowName).findChildByTestId('workflow-card-actions'),
workflowDeleteButton: () =>
cy.getByTestId('action-toggle-dropdown').filter(':visible').contains('Delete'),
workflowMoveButton: () =>
cy.getByTestId('action-toggle-dropdown').filter(':visible').contains('Move'),
workflowFilterButton: () => cy.getByTestId('resources-list-filters-trigger').filter(':visible'),
workflowTagsDropdown: () => cy.getByTestId('tags-dropdown'),
workflowTagItem: (tag: string) => cy.getByTestId('tag').contains(tag),
Expand Down
10 changes: 10 additions & 0 deletions packages/editor-ui/src/api/credentials.ee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,13 @@ export async function setCredentialSharedWith(
data as unknown as IDataObject,
);
}

export async function moveCredentialToProject(
context: IRestApiContext,
id: string,
destinationProjectId: string,
): Promise<void> {
return await makeRestApiRequest(context, 'PUT', `/credentials/${id}/transfer`, {
destinationProjectId,
});
}
10 changes: 10 additions & 0 deletions packages/editor-ui/src/api/workflows.ee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,13 @@ export async function setWorkflowSharedWith(
data as unknown as IDataObject,
);
}

export async function moveWorkflowToProject(
context: IRestApiContext,
id: string,
destinationProjectId: string,
): Promise<void> {
return await makeRestApiRequest(context, 'PUT', `/workflows/${id}/transfer`, {
destinationProjectId,
});
}
Loading
Loading