19153: Use server configuration
authorDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Thu, 30 Jun 2022 10:41:29 +0000 (12:41 +0200)
committerDaniel Kutyła <daniel.kutyla@contractors.roche.com>
Thu, 30 Jun 2022 10:41:29 +0000 (12:41 +0200)
Arvados-DCO-1.1-Signed-off-by: Stephen Smith <stephen@curii.com>

cypress/integration/project.spec.js
src/common/config.ts
src/models/project.ts
src/views-components/context-menu/actions/lock-action.tsx

index 0ad8da5622747231283946072b7b315418ed2972..26b4a150879301cdd7da560b572c2a6f45a03c01 100644 (file)
@@ -338,7 +338,7 @@ describe('Project tests', function() {
             });
         });
 
-        it('should not be able to froze not owned project', () => {
+        it('should be able to froze not owned project', () => {
             cy.getAll('@adminProject').then(([adminProject]) => {
                 cy.loginAs(activeUser);
 
@@ -346,11 +346,7 @@ describe('Project tests', function() {
 
                 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');
+                cy.get('[data-cy=context-menu]').contains('Freeze').should('not.exist');
             });
         });
 
index 2954d70493b31676663cd00586583f4966f06d0a..574445df09b05f5f47a8b0b57fc190352a8e1237 100644 (file)
@@ -13,6 +13,9 @@ interface WorkbenchConfig {
 }
 
 export interface ClusterConfigJSON {
+    API: {
+        UnfreezeProjectRequiresAdmin: boolean
+    },
     ClusterID: string;
     RemoteClusters: {
         [key: string]: {
@@ -222,6 +225,9 @@ export const mapRemoteHosts = (clusterConfigJSON: ClusterConfigJSON, config: Con
 };
 
 export const mockClusterConfigJSON = (config: Partial<ClusterConfigJSON>): ClusterConfigJSON => ({
+    API: {
+        UnfreezeProjectRequiresAdmin: false,
+    },
     ClusterID: "",
     RemoteClusters: {},
     Services: {
index b490864d8ff539b8e6be82e3c2634a2ee2506a80..04dae4d22622a9ae44c39039167e011d7ba807a7 100644 (file)
@@ -6,6 +6,7 @@ import { GroupClass, GroupResource } from "./group";
 
 export interface ProjectResource extends GroupResource {
     frozenByUuid: null|string;
+    canManage: boolean;
     groupClass: GroupClass.PROJECT | GroupClass.FILTER | GroupClass.ROLE;
 }
 
index 9e66763091d95dbed40cf323ebbbb6e7cc67b55a..785de5831f156574afd40496d2e9644e9428eb23 100644 (file)
@@ -11,13 +11,15 @@ import { ProjectResource } from "models/project";
 import { withRouter, RouteComponentProps } from "react-router";
 
 const mapStateToProps = (state: RootState, props: { onClick: () => {} }) => ({
-    isAdmin: state.auth.user!.isAdmin,
+    isAdmin: !!state.auth.user?.isAdmin,
     isLocked: !!(state.resources[state.contextMenu.resource!.uuid] as ProjectResource).frozenByUuid,
+    canManage: (state.resources[state.contextMenu.resource!.uuid] as ProjectResource).canManage,
+    canUnfreeze: !state.auth.remoteHostsConfig[state.auth.homeCluster]?.clusterConfig?.API?.UnfreezeProjectRequiresAdmin,
     onClick: props.onClick
 });
 
-export const ToggleLockAction = withRouter(connect(mapStateToProps)((props: { isLocked: boolean, isAdmin: boolean, onClick: () => void } & RouteComponentProps) =>
-    props.isLocked && !props.isAdmin ? null :
+export const ToggleLockAction = withRouter(connect(mapStateToProps)((props: { state: RootState, isAdmin: boolean, isLocked: boolean, canManage: boolean, canUnfreeze: boolean, onClick: () => void } & RouteComponentProps) =>
+    (props.canManage && !props.isLocked) || (props.isLocked && props.canManage && (props.canUnfreeze || props.isAdmin))  ? 
         < ListItem
             button
             onClick={props.onClick} >
@@ -31,4 +33,4 @@ export const ToggleLockAction = withRouter(connect(mapStateToProps)((props: { is
                     ? <>Unfreeze project</>
                     : <>Freeze project</>}
             </ListItemText>
-        </ListItem >));
+        </ListItem > : null));