@@ -14,6 +14,8 @@ import createOrUpdateSubuser from '@/api/server/users/createOrUpdateSubuser';
1414import { ServerContext } from '@/state/server' ;
1515import { httpErrorToHuman } from '@/api/http' ;
1616import FlashMessageRender from '@/components/FlashMessageRender' ;
17+ import Can from '@/components/elements/Can' ;
18+ import { usePermissions } from '@/plugins/usePermissions' ;
1719
1820type Props = {
1921 subuser ?: Subuser ;
@@ -25,21 +27,32 @@ interface Values {
2527}
2628
2729const PermissionLabel = styled . label `
28- ${ tw `flex items-center border border-transparent rounded p-2 cursor-pointer ` } ;
30+ ${ tw `flex items-center border border-transparent rounded p-2` } ;
2931 text-transform: none;
3032
31- &:hover {
32- ${ tw `border-neutral-500 bg-neutral-800` } ;
33+ &:not(.disabled) {
34+ ${ tw `cursor-pointer` } ;
35+
36+ &:hover {
37+ ${ tw `border-neutral-500 bg-neutral-800` } ;
38+ }
3339 }
3440` ;
3541
3642const EditSubuserModal = forwardRef < HTMLHeadingElement , Props > ( ( { subuser, ...props } , ref ) => {
3743 const { values, isSubmitting, setFieldValue } = useFormikContext < Values > ( ) ;
44+ const [ canEditUser ] = usePermissions ( [ 'user.update' ] ) ;
3845 const permissions = useStoreState ( ( state : ApplicationStore ) => state . permissions . data ) ;
3946
4047 return (
4148 < Modal { ...props } showSpinnerOverlay = { isSubmitting } >
42- < h3 ref = { ref } > { subuser ? `Modify permissions for ${ subuser . email } ` : 'Create new subuser' } </ h3 >
49+ < h3 ref = { ref } >
50+ { subuser ?
51+ `${ canEditUser ? 'Modify' : 'View' } permissions for ${ subuser . email } `
52+ :
53+ 'Create new subuser'
54+ }
55+ </ h3 >
4356 < FlashMessageRender byKey = { 'user:edit' } className = { 'mt-4' } />
4457 { ! subuser &&
4558 < div className = { 'mt-6' } >
@@ -50,13 +63,14 @@ const EditSubuserModal = forwardRef<HTMLHeadingElement, Props>(({ subuser, ...pr
5063 />
5164 </ div >
5265 }
53- < div className = { 'mt -6' } >
66+ < div className = { 'my -6' } >
5467 { Object . keys ( permissions ) . filter ( key => key !== 'websocket' ) . map ( ( key , index ) => (
5568 < TitledGreyBox
5669 key = { key }
5770 title = {
5871 < div className = { 'flex items-center' } >
5972 < p className = { 'text-sm uppercase flex-1' } > { key } </ p >
73+ { canEditUser &&
6074 < input
6175 type = { 'checkbox' }
6276 onClick = { e => {
@@ -78,6 +92,7 @@ const EditSubuserModal = forwardRef<HTMLHeadingElement, Props>(({ subuser, ...pr
7892 }
7993 } }
8094 />
95+ }
8196 </ div >
8297 }
8398 className = { index !== 0 ? 'mt-4' : undefined }
@@ -87,9 +102,11 @@ const EditSubuserModal = forwardRef<HTMLHeadingElement, Props>(({ subuser, ...pr
87102 </ p >
88103 { Object . keys ( permissions [ key ] . keys ) . map ( ( pkey , index ) => (
89104 < PermissionLabel
105+ key = { `permission_${ key } _${ pkey } ` }
90106 htmlFor = { `permission_${ key } _${ pkey } ` }
91107 className = { classNames ( 'transition-colors duration-75' , {
92108 'mt-2' : index !== 0 ,
109+ disabled : ! canEditUser ,
93110 } ) }
94111 >
95112 < div className = { 'p-2' } >
@@ -98,6 +115,7 @@ const EditSubuserModal = forwardRef<HTMLHeadingElement, Props>(({ subuser, ...pr
98115 name = { 'permissions' }
99116 value = { `${ key } .${ pkey } ` }
100117 className = { 'w-5 h-5 mr-2' }
118+ disabled = { ! canEditUser }
101119 />
102120 </ div >
103121 < div className = { 'flex-1' } >
@@ -115,11 +133,13 @@ const EditSubuserModal = forwardRef<HTMLHeadingElement, Props>(({ subuser, ...pr
115133 </ TitledGreyBox >
116134 ) ) }
117135 </ div >
118- < div className = { 'mt-6 pb-6 flex justify-end' } >
119- < button className = { 'btn btn-primary btn-sm' } type = { 'submit' } >
120- { subuser ? 'Save' : 'Invite User' }
121- </ button >
122- </ div >
136+ < Can action = { subuser ? 'user.update' : 'user.delete' } >
137+ < div className = { 'pb-6 flex justify-end' } >
138+ < button className = { 'btn btn-primary btn-sm' } type = { 'submit' } >
139+ { subuser ? 'Save' : 'Invite User' }
140+ </ button >
141+ </ div >
142+ </ Can >
123143 </ Modal >
124144 ) ;
125145} ) ;
0 commit comments