@@ -61,11 +61,11 @@ import classNames from 'classnames'
61
61
import OrganisationProvider from 'common/providers/OrganisationProvider'
62
62
import { useHasPermission } from 'common/providers/Permission'
63
63
import PlanBasedAccess from './PlanBasedAccess'
64
- import { useGetTagsQuery } from 'common/services/useTag'
65
64
import { components } from 'react-select'
66
65
import { SingleValueProps } from 'react-select/lib/components/SingleValue'
67
66
import AddEditTags from './tags/AddEditTags'
68
67
import { RouterChildContext } from 'react-router'
68
+ import Utils from 'common/utils/utils'
69
69
70
70
const Project = require ( 'common/project' )
71
71
@@ -159,6 +159,46 @@ const withAdminPermissions = (InnerComponent: any) => {
159
159
}
160
160
return WrappedComponent
161
161
}
162
+
163
+ type RemoveViewPermissionModalProps = {
164
+ level : string
165
+ onConfirm : ( ) => void
166
+ onCancel : ( ) => void
167
+ }
168
+
169
+ const RemoveViewPermissionModal = ( {
170
+ level,
171
+ onCancel,
172
+ onConfirm,
173
+ } : RemoveViewPermissionModalProps ) => {
174
+ return (
175
+ < div >
176
+ < div >
177
+ Removing < b > view { level } permission</ b > will remove all other user
178
+ permissions for this { level } .
179
+ </ div >
180
+ < div className = 'text-right mt-2' >
181
+ < Button
182
+ className = 'mr-2'
183
+ onClick = { ( ) => {
184
+ onCancel ( )
185
+ } }
186
+ >
187
+ Cancel
188
+ </ Button >
189
+ < Button
190
+ theme = 'danger'
191
+ onClick = { ( ) => {
192
+ onConfirm ( )
193
+ } }
194
+ >
195
+ Confirm
196
+ </ Button >
197
+ </ div >
198
+ </ div >
199
+ )
200
+ }
201
+
162
202
const _EditPermissionsModal : FC < EditPermissionModalType > = withAdminPermissions (
163
203
forwardRef ( ( props : EditPermissionModalType ) => {
164
204
const {
@@ -199,11 +239,6 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
199
239
? props . parentId
200
240
: undefined
201
241
202
- const { data : tags , isLoading : tagsLoading } = useGetTagsQuery (
203
- { projectId : `${ projectId } ` } ,
204
- { skip : ! projectId } ,
205
- )
206
-
207
242
const [ permissionWasCreated , setPermissionWasCreated ] =
208
243
useState < boolean > ( false )
209
244
const [ rolesSelected , setRolesSelected ] = useState <
@@ -260,29 +295,52 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
260
295
} , [ groupWithRolesDataSuccesfull ] )
261
296
262
297
const processResults = ( results : ( UserPermission | GroupPermission ) [ ] ) => {
298
+ const findPermissionByGroup = ( ) => {
299
+ return find (
300
+ results || [ ] ,
301
+ ( r ) => ( r as GroupPermission ) . group . id === group ?. id ,
302
+ )
303
+ }
304
+
305
+ const findPermissionByRole = ( ) => {
306
+ return find (
307
+ results || [ ] ,
308
+ ( r ) => ( r as GroupPermission ) . role === role ?. id ,
309
+ )
310
+ }
311
+
312
+ const findPermissionByUser = ( ) => {
313
+ return find (
314
+ results || [ ] ,
315
+ ( r ) => ( r as UserPermission ) . user ?. id === user ?. id ,
316
+ )
317
+ }
318
+
263
319
const foundPermission = isGroup
264
- ? find (
265
- results || [ ] ,
266
- ( r ) => ( r as GroupPermission ) . group . id === group ?. id ,
267
- )
320
+ ? findPermissionByGroup ( )
268
321
: role
269
- ? find ( results || [ ] , ( r ) => ( r as GroupPermission ) . role === role ?. id )
270
- : find (
271
- results || [ ] ,
272
- ( r ) => ( r as UserPermission ) . user ?. id === user ?. id ,
273
- )
274
- const permissions =
275
- ( role && ( level === 'project' || level === 'environment' )
276
- ? foundPermission ?. permissions
277
- : ( foundPermission ?. permissions || [ ] ) . map ( ( v ) => ( {
278
- permission_key : v ,
279
- tags : [ ] ,
280
- } ) ) ) || [ ]
322
+ ? findPermissionByRole ( )
323
+ : findPermissionByUser ( )
324
+
325
+ const isProjectOrEnvironmentRole =
326
+ role && ( level === 'project' || level === 'environment' )
327
+
328
+ const processPermissions = ( ) => {
329
+ if ( isProjectOrEnvironmentRole ) {
330
+ return foundPermission ?. permissions || [ ]
331
+ }
332
+
333
+ return ( foundPermission ?. permissions || [ ] ) . map ( ( v ) => ( {
334
+ permission_key : v ,
335
+ tags : [ ] ,
336
+ } ) )
337
+ }
338
+
281
339
return {
282
340
...( foundPermission || { } ) ,
283
341
group : group ?. id ,
284
342
//Since role permissions and other permissions are different in data structure, adjust permissions to match
285
- permissions,
343
+ permissions : processPermissions ( ) ,
286
344
user : user ?. id ,
287
345
} as EntityPermissions
288
346
}
@@ -464,7 +522,7 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
464
522
} )
465
523
}
466
524
//eslint-disable-next-line
467
- } , [ ] )
525
+ } , [ ] )
468
526
469
527
const admin = ( ) => entityPermissions && entityPermissions . admin
470
528
@@ -490,22 +548,32 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
490
548
return 'GRANTED'
491
549
}
492
550
551
+ const requiresViewPermission = ( permissionKey : string ) => {
552
+ return (
553
+ level !== 'organisation' &&
554
+ permissionKey !== `VIEW_${ level . toUpperCase ( ) } `
555
+ )
556
+ }
557
+
493
558
const save = useCallback ( ( ) => {
494
- const entityId =
495
- typeof entityPermissions . id === 'undefined' ? '' : entityPermissions . id
559
+ const entityId = entityPermissions . id ?? ''
496
560
setValueChanged ( false )
497
561
if ( ! role ) {
498
562
const url = isGroup
499
563
? `${ level } s/${ id } /user-group-permissions/${ entityId } `
500
564
: `${ level } s/${ id } /user-permissions/${ entityId } `
565
+
566
+ const permissions = entityPermissions . permissions . map (
567
+ ( v ) => v . permission_key ,
568
+ )
569
+ const payload = {
570
+ ...entityPermissions ,
571
+ permissions,
572
+ }
573
+
501
574
setSaving ( true )
502
575
const action = entityId ? 'put' : 'post'
503
- _data [ action ] ( `${ Project . api } ${ url } ${ entityId && '/' } ` , {
504
- ...entityPermissions ,
505
- permissions : entityPermissions . permissions . map (
506
- ( v ) => v . permission_key ,
507
- ) ,
508
- } )
576
+ _data [ action ] ( `${ Project . api } ${ url } ${ entityId && '/' } ` , payload )
509
577
. then (
510
578
(
511
579
res : Omit < EntityPermissions , 'permissions' > & {
@@ -519,11 +587,7 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
519
587
tags : [ ] ,
520
588
} ) ) ,
521
589
} )
522
- toast (
523
- `${
524
- level . charAt ( 0 ) . toUpperCase ( ) + level . slice ( 1 )
525
- } Permissions Saved`,
526
- )
590
+ toast ( `${ Utils . capitalize ( level ) } Permissions Saved` )
527
591
onSave ?.( )
528
592
} ,
529
593
)
@@ -640,26 +704,31 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
640
704
updatedPermissions . splice ( index , 1 )
641
705
}
642
706
643
- setEntityPermissions ( {
707
+ return setEntityPermissions ( {
644
708
...entityPermissions ,
645
709
permissions : updatedPermissions ,
646
710
} )
647
- } else {
648
- const newEntityPermissions = { ...entityPermissions }
711
+ }
649
712
650
- const index = newEntityPermissions . permissions . findIndex (
651
- ( v ) => v . permission_key === key ,
652
- )
653
- if ( index === - 1 ) {
654
- newEntityPermissions . permissions . push ( {
655
- permission_key : key ,
656
- tags : [ ] ,
657
- } )
658
- } else {
659
- newEntityPermissions . permissions . splice ( index , 1 )
660
- }
661
- setEntityPermissions ( newEntityPermissions )
713
+ const newEntityPermissions = { ...entityPermissions }
714
+
715
+ const index = newEntityPermissions . permissions . findIndex (
716
+ ( v ) => v . permission_key === key ,
717
+ )
718
+ if ( index === - 1 ) {
719
+ newEntityPermissions . permissions . push ( {
720
+ permission_key : key ,
721
+ tags : [ ] ,
722
+ } )
723
+ } else if (
724
+ level !== 'organisation' &&
725
+ key === `VIEW_${ level . toUpperCase ( ) } `
726
+ ) {
727
+ newEntityPermissions . permissions = [ ]
728
+ } else {
729
+ newEntityPermissions . permissions . splice ( index , 1 )
662
730
}
731
+ setEntityPermissions ( newEntityPermissions )
663
732
}
664
733
665
734
const toggleAdmin = ( ) => {
@@ -855,10 +924,11 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
855
924
items = { permissions }
856
925
renderRow = { ( p ) => {
857
926
const levelUpperCase = level . toUpperCase ( )
858
- const disabled =
859
- level !== 'organisation' &&
860
- p . key !== `VIEW_${ levelUpperCase } ` &&
861
- ! hasPermission ( `VIEW_${ levelUpperCase } ` )
927
+ const viewPermission = `VIEW_${ levelUpperCase } `
928
+ const isPermissionDisabled =
929
+ requiresViewPermission ( p . key ) &&
930
+ ! hasPermission ( viewPermission )
931
+
862
932
const permission = entityPermissions . permissions . find (
863
933
( v ) => v . permission_key === p . key ,
864
934
)
@@ -897,7 +967,7 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
897
967
selectPermissions ( p . key , v . value )
898
968
} }
899
969
className = 'react-select select-sm'
900
- disabled = { disabled || admin ( ) || saving }
970
+ disabled = { isPermissionDisabled || admin ( ) || saving }
901
971
options = {
902
972
p . supports_tag
903
973
? permissionOptions
@@ -912,11 +982,37 @@ const _EditPermissionsModal: FC<EditPermissionModalType> = withAdminPermissions(
912
982
< Switch
913
983
data-test = { `permission-switch-${ p . key } ` }
914
984
onChange = { ( ) => {
985
+ if (
986
+ level !== 'organisation' &&
987
+ p . key === viewPermission &&
988
+ hasPermission ( viewPermission ) &&
989
+ entityPermissions . permissions . length > 1
990
+ ) {
991
+ return openModal2 (
992
+ `Remove View ${ Utils . capitalize (
993
+ level ,
994
+ ) } Permission`,
995
+ < RemoveViewPermissionModal
996
+ level = { level }
997
+ onConfirm = { ( ) => {
998
+ setValueChanged ( true )
999
+ togglePermission ( p . key )
1000
+ closeModal2 ( )
1001
+ } }
1002
+ onCancel = { ( ) => {
1003
+ closeModal2 ( )
1004
+ } }
1005
+ /> ,
1006
+ )
1007
+ }
1008
+
915
1009
setValueChanged ( true )
916
1010
togglePermission ( p . key )
917
1011
} }
918
- disabled = { disabled || admin ( ) || saving }
919
- checked = { ! disabled && hasPermission ( p . key ) }
1012
+ disabled = { isPermissionDisabled || admin ( ) || saving }
1013
+ checked = {
1014
+ ! isPermissionDisabled && hasPermission ( p . key )
1015
+ }
920
1016
/>
921
1017
) }
922
1018
</ Row >
0 commit comments