From: Daniel Kutyła Date: Thu, 23 Jun 2022 12:36:25 +0000 (+0200) Subject: Merge branch 'main' into 18692-frozen-projects-workbench-support X-Git-Tag: 2.5.0~33^2~32 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/a672dd5efb4c8ef394f61a7e7a5e513f80bf1427 Merge branch 'main' into 18692-frozen-projects-workbench-support Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła --- a672dd5efb4c8ef394f61a7e7a5e513f80bf1427 diff --cc cypress/integration/project.spec.js index 520ad26a,c4983e3e..0ad8da56 --- a/cypress/integration/project.spec.js +++ b/cypress/integration/project.spec.js @@@ -260,100 -278,4 +278,101 @@@ describe('Project tests', function() }); }); }); + + describe('Frozen projects', () => { + beforeEach(() => { + cy.createGroup(activeUser.token, { + name: `Main project ${Math.floor(Math.random() * 999999)}`, + group_class: 'project', + }).as('mainProject'); + + cy.createGroup(adminUser.token, { + name: `Admin project ${Math.floor(Math.random() * 999999)}`, + group_class: 'project', + }).as('adminProject').then((mainProject) => { + cy.shareWith(adminUser.token, activeUser.user.uuid, mainProject.uuid, 'can_write'); + }); + + cy.get('@mainProject').then((mainProject) => { + cy.createGroup(adminUser.token, { + name : `Sub project ${Math.floor(Math.random() * 999999)}`, + group_class: 'project', + owner_uuid: mainProject.uuid, + }).as('subProject'); + + cy.createCollection(adminUser.token, { + name: `Main collection ${Math.floor(Math.random() * 999999)}`, + owner_uuid: mainProject.uuid, + manifest_text: "./subdir 37b51d194a7513e45b56f6524f2d51f2+3 0:3:foo\n. 37b51d194a7513e45b56f6524f2d51f2+3 0:3:bar\n" + }).as('mainCollection'); + }); + }); + + it('should be able to froze own project', () => { + cy.getAll('@mainProject').then(([mainProject]) => { + cy.loginAs(activeUser); + + cy.get('[data-cy=project-panel]').contains(mainProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').click(); + + cy.get('[data-cy=project-panel]').contains(mainProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').should('not.exist'); + }); + }); + + it('should not be able to modify items within the frozen project', () => { + cy.getAll('@mainProject', '@mainCollection').then(([mainProject, mainCollection]) => { + cy.loginAs(activeUser); + + cy.get('[data-cy=project-panel]').contains(mainProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').click(); + + cy.get('[data-cy=project-panel]').contains(mainProject.name).click(); + + cy.get('[data-cy=project-panel]').contains(mainCollection.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Move to trash').should('not.exist'); + }); + }); + + it('should not be able to froze not owned project', () => { + cy.getAll('@adminProject').then(([adminProject]) => { + cy.loginAs(activeUser); + + cy.get('[data-cy=side-panel-tree]').contains('Shared with me').click(); + + cy.get('main').contains(adminProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').click(); + + cy.get('main').contains(adminProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').should('exist'); + }); + }); + + it('should be able to unfroze project if user is an admin', () => { + cy.getAll('@adminProject').then(([adminProject]) => { + cy.loginAs(adminUser); + + cy.get('main').contains(adminProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').click(); + + cy.wait(1000); + + cy.get('main').contains(adminProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Unfreeze').click(); + + cy.get('main').contains(adminProject.name).rightclick(); + + cy.get('[data-cy=context-menu]').contains('Freeze').should('exist'); + }); + }); + }); - }); + }); ++ diff --cc src/index.tsx index 4dde654c,03840d49..066b520c --- a/src/index.tsx +++ b/src/index.tsx @@@ -100,14 -101,9 +101,15 @@@ addMenuActionSet(ContextMenuKind.GROUP_ addMenuActionSet(ContextMenuKind.COLLECTION_ADMIN, collectionAdminActionSet); addMenuActionSet(ContextMenuKind.PROCESS_ADMIN, processResourceAdminActionSet); addMenuActionSet(ContextMenuKind.PROJECT_ADMIN, projectAdminActionSet); +addMenuActionSet(ContextMenuKind.FROZEN_PROJECT, [ + [ + ...frozenActionSet.reduce((prev, next) => prev.concat(next), []), + ...readOnlyProjectActionSet.reduce((prev, next) => prev.concat(next), []), + ] +]); addMenuActionSet(ContextMenuKind.FILTER_GROUP_ADMIN, filterGroupAdminActionSet); addMenuActionSet(ContextMenuKind.PERMISSION_EDIT, permissionEditActionSet); + addMenuActionSet(ContextMenuKind.WORKFLOW, workflowActionSet); storeRedirects(); diff --cc src/views-components/data-explorer/renderers.tsx index 245a6597,7822bdc6..c955ebec --- a/src/views-components/data-explorer/renderers.tsx +++ b/src/views-components/data-explorer/renderers.tsx @@@ -755,9 -739,13 +762,13 @@@ const _resourceWithName ; }); + export const ResourceOwnerWithName = ownerFromResourceId(_resourceWithName); + + export const ResourceWithName = userFromID(_resourceWithName); + export const UserNameFromID = compose(userFromID)( - (props: { uuid: string, userFullname: string, dispatch: Dispatch }) => { + (props: { uuid: string, displayAsText?: string, userFullname: string, dispatch: Dispatch }) => { const { uuid, userFullname, dispatch } = props; if (userFullname === '') { diff --cc src/views/project-panel/project-panel.tsx index f98f3a1a,ccb40d53..d9d14ae3 --- a/src/views/project-panel/project-panel.tsx +++ b/src/views/project-panel/project-panel.tsx @@@ -184,11 -180,9 +181,11 @@@ export const ProjectPanel = withStyles( name: resource.name, uuid: resource.uuid, ownerUuid: resource.ownerUuid, - isTrashed: ('isTrashed' in resource) ? resource.isTrashed: false, + isTrashed: ('isTrashed' in resource) ? resource.isTrashed : false, kind: resource.kind, menuKind, + isAdmin, + isFrozen: resourceIsFrozen(resource, resources), description: resource.description, storageClassesDesired: (resource as CollectionResource).storageClassesDesired, properties: ('properties' in resource) ? resource.properties : {},