From 4860e74d347552476c77e313c85502787b6d7dfe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Kuty=C5=82a?= Date: Tue, 16 Feb 2021 23:18:22 +0100 Subject: [PATCH] 17306: Fixed copying of a collection elements MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła --- cypress/integration/favorites.spec.js | 91 +++++++++++++++---- .../collection-partial-copy-actions.ts | 13 ++- .../projects-tree-picker.tsx | 5 +- .../tree-picker-field.tsx | 3 +- .../sharing-invitation-form-component.tsx | 4 +- 5 files changed, 93 insertions(+), 23 deletions(-) diff --git a/cypress/integration/favorites.spec.js b/cypress/integration/favorites.spec.js index a7ff4d6e..beee7618 100644 --- a/cypress/integration/favorites.spec.js +++ b/cypress/integration/favorites.spec.js @@ -57,9 +57,9 @@ describe('Favorites tests', function () { cy.createGroup(adminUser.token, { name: `my-shared-writable-project ${Math.floor(Math.random() * 999999)}`, group_class: 'project', - }).as('mySharedProject1').then(function (mySharedProject1) { + }).as('mySharedWritableProject').then(function (mySharedWritableProject) { cy.contains('Refresh').click(); - cy.get('main').contains(mySharedProject1.name).rightclick(); + cy.get('main').contains(mySharedWritableProject.name).rightclick(); cy.get('[data-cy=context-menu]').within(() => { cy.contains('Share').click(); }); @@ -67,24 +67,24 @@ describe('Favorites tests', function () { cy.get('@selectPermissions').click(); cy.contains('Write').click(); cy.get('.sharing-dialog').as('sharingDialog'); - cy.get('@sharingDialog').find('input').first().type(activeUser.user.email); + cy.get('[data-cy=invite-people-field]').find('input').type(activeUser.user.email); cy.get('[role=tooltip]').click(); - cy.get('@sharingDialog').find('button').last().click(); + cy.get('@sharingDialog').contains('Save').click(); }); cy.createGroup(adminUser.token, { name: `my-shared-readonly-project ${Math.floor(Math.random() * 999999)}`, group_class: 'project', - }).as('mySharedProject2').then(function (mySharedProject2) { + }).as('mySharedReadonlyProject').then(function (mySharedReadonlyProject) { cy.contains('Refresh').click(); - cy.get('main').contains(mySharedProject2.name).rightclick(); + cy.get('main').contains(mySharedReadonlyProject.name).rightclick(); cy.get('[data-cy=context-menu]').within(() => { cy.contains('Share').click(); }); cy.get('.sharing-dialog').as('sharingDialog'); - cy.get('@sharingDialog').find('input').first().type(activeUser.user.email); + cy.get('[data-cy=invite-people-field]').find('input').type(activeUser.user.email); cy.get('[role=tooltip]').click(); - cy.get('@sharingDialog').find('button').last().click(); + cy.get('@sharingDialog').contains('Save').click(); }); cy.createGroup(activeUser.token, { @@ -99,18 +99,18 @@ describe('Favorites tests', function () { }) .as('testCollection'); - cy.getAll('@mySharedProject1', '@mySharedProject2', '@myProject1', '@testCollection') - .then(function ([mySharedProject1, mySharedProject2, myProject1, testCollection]) { + cy.getAll('@mySharedWritableProject', '@mySharedReadonlyProject', '@myProject1', '@testCollection') + .then(function ([mySharedWritableProject, mySharedReadonlyProject, myProject1, testCollection]) { cy.loginAs(activeUser); cy.contains('Shared with me').click(); - cy.get('main').contains(mySharedProject1.name).rightclick(); + cy.get('main').contains(mySharedWritableProject.name).rightclick(); cy.get('[data-cy=context-menu]').within(() => { cy.contains('Add to favorites').click(); }); - cy.get('main').contains(mySharedProject2.name).rightclick(); + cy.get('main').contains(mySharedReadonlyProject.name).rightclick(); cy.get('[data-cy=context-menu]').within(() => { cy.contains('Add to favorites').click(); }); @@ -128,12 +128,71 @@ describe('Favorites tests', function () { }); cy.get('[data-cy=form-dialog]').within(function () { - cy.get('ul').last().find('i').click(); + cy.get('[data-cy=projects-tree-favourites-tree-pciker]').find('i').click(); cy.contains(myProject1.name); - cy.contains(mySharedProject1.name); - cy.get('ul').last() - .should('not.contain', mySharedProject2.name); + cy.contains(mySharedWritableProject.name); + cy.get('[data-cy=projects-tree-favourites-tree-pciker]') + .should('not.contain', mySharedReadonlyProject.name); + cy.contains(mySharedWritableProject.name).click(); + cy.get('[data-cy=form-submit-btn]').click(); }); + + cy.doSearch(`${mySharedWritableProject.uuid}`); + cy.get('main').contains(testCollection.name); + }); + }); + + it('can copy selected into the collection', () => { + cy.loginAs(activeUser); + + cy.createCollection(adminUser.token, { + name: `Test source collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: activeUser.user.uuid, + manifest_text: ". 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }) + .as('testSourceCollection'); + + cy.createCollection(adminUser.token, { + name: `Test target collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: activeUser.user.uuid + }) + .as('testTargetCollection'); + + cy.getAll('@testSourceCollection', '@testTargetCollection') + .then(function ([testSourceCollection, testTargetCollection]) { + cy.loginAs(activeUser); + + cy.get('.layout-pane-primary') + .contains('Projects').click(); + + cy.get('main').contains(testTargetCollection.name).rightclick(); + cy.get('[data-cy=context-menu]').within(() => { + cy.contains('Add to favorites').click(); + }); + + cy.get('main').contains(testSourceCollection.name).click(); + cy.get('[data-cy=collection-files-panel]').contains('bar'); + cy.get('[data-cy=collection-files-panel]').find('input[type=checkbox]').click(); + cy.get('[data-cy=collection-files-panel-options-btn]').click(); + cy.get('[data-cy=context-menu]') + .contains('Copy selected into the collection').click(); + + cy.get('[data-cy=projects-tree-favourites-tree-pciker]') + .find('i') + .click(); + + cy.get('[data-cy=projects-tree-favourites-tree-pciker]') + .contains(testTargetCollection.name) + .click(); + + cy.get('[data-cy=form-submit-btn]').click(); + + cy.get('.layout-pane-primary') + .contains('Projects').click(); + + cy.get('main').contains(testTargetCollection.name).click(); + + cy.get('[data-cy=collection-files-panel]').contains('bar'); }); }); }); \ No newline at end of file diff --git a/src/store/collections/collection-partial-copy-actions.ts b/src/store/collections/collection-partial-copy-actions.ts index 74fa17b3..09c6bb66 100644 --- a/src/store/collections/collection-partial-copy-actions.ts +++ b/src/store/collections/collection-partial-copy-actions.ts @@ -112,6 +112,13 @@ export const copyCollectionPartialToSelectedCollection = ({ collectionUuid }: Co dispatch(startSubmit(COLLECTION_PARTIAL_COPY_TO_SELECTED_COLLECTION)); const state = getState(); const currentCollection = state.collectionPanel.item; + + if (currentCollection && !currentCollection.manifestText) { + const fetchedCurrentCollection = await services.collectionService.get(currentCollection.uuid); + currentCollection.manifestText = fetchedCurrentCollection.manifestText; + currentCollection.unsignedManifestText = fetchedCurrentCollection.unsignedManifestText; + } + if (currentCollection) { try { dispatch(progressIndicatorActions.START_WORKING(COLLECTION_PARTIAL_COPY_TO_SELECTED_COLLECTION)); @@ -127,10 +134,10 @@ export const copyCollectionPartialToSelectedCollection = ({ collectionUuid }: Co } }); const diffPathToRemove = _.difference(paths, pathsToRemove); - await services.collectionService.deleteFiles(selectedCollection.uuid, pathsToRemove); + await services.collectionService.deleteFiles(selectedCollection.uuid, pathsToRemove.map(path => path.replace(currentCollection.uuid, collectionUuid))); const collectionWithDeletedFiles = await services.collectionService.get(collectionUuid); - await services.collectionService.update(collectionUuid, { manifestText: `${collectionWithDeletedFiles.manifestText}${currentCollection.manifestText ? currentCollection.manifestText : currentCollection.unsignedManifestText}` }); - await services.collectionService.deleteFiles(collectionWithDeletedFiles.uuid, diffPathToRemove); + await services.collectionService.update(collectionUuid, { manifestText: `${collectionWithDeletedFiles.manifestText}${(currentCollection.manifestText ? currentCollection.manifestText : currentCollection.unsignedManifestText) || ''}` }); + await services.collectionService.deleteFiles(collectionWithDeletedFiles.uuid, diffPathToRemove.map(path => path.replace(currentCollection.uuid, collectionUuid))); dispatch(dialogActions.CLOSE_DIALOG({ id: COLLECTION_PARTIAL_COPY_TO_SELECTED_COLLECTION })); dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Files has been copied to selected collection.', diff --git a/src/views-components/projects-tree-picker/projects-tree-picker.tsx b/src/views-components/projects-tree-picker/projects-tree-picker.tsx index edb3f261..37a4c4d9 100644 --- a/src/views-components/projects-tree-picker/projects-tree-picker.tsx +++ b/src/views-components/projects-tree-picker/projects-tree-picker.tsx @@ -17,6 +17,7 @@ export interface ProjectsTreePickerProps { includeCollections?: boolean; includeFiles?: boolean; showSelection?: boolean; + options?: { showOnlyOwned: boolean, showOnlyWritable: boolean }; toggleItemActive?: (event: React.MouseEvent, item: TreeItem, pickerId: string) => void; toggleItemSelection?: (event: React.MouseEvent, item: TreeItem, pickerId: string) => void; } @@ -33,7 +34,9 @@ export const ProjectsTreePicker = ({ pickerId, ...props }: ProjectsTreePickerPro - +
+ +
; }; diff --git a/src/views-components/projects-tree-picker/tree-picker-field.tsx b/src/views-components/projects-tree-picker/tree-picker-field.tsx index a8ab05f6..dabc89e3 100644 --- a/src/views-components/projects-tree-picker/tree-picker-field.tsx +++ b/src/views-components/projects-tree-picker/tree-picker-field.tsx @@ -14,7 +14,8 @@ export const ProjectTreePickerField = (props: WrappedFieldProps & PickerIdProp)
+ toggleItemActive={handleChange(props)} + options={{ showOnlyOwned: false, showOnlyWritable: true }} /> {props.meta.dirty && props.meta.error && {props.meta.error} diff --git a/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx b/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx index 59456fb3..b23ee6b6 100644 --- a/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx +++ b/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx @@ -10,10 +10,10 @@ import { ParticipantSelect, Participant } from './participant-select'; export default () => - + - + ; -- 2.30.2