1+ import { isAllUndefined } from '@douglasneuroinformatics/libjs' ;
12import { Button , Form } from '@douglasneuroinformatics/libui/components' ;
23import { useTranslation } from '@douglasneuroinformatics/libui/hooks' ;
34import type { FormTypes } from '@opendatacapture/runtime-core' ;
4- import { $UpdateUserData } from '@opendatacapture/schemas/user' ;
5+ import { $UserPermission } from '@opendatacapture/schemas/user' ;
56import type { Promisable } from 'type-fest' ;
67import { z } from 'zod' ;
78
8- const $UpdateUserFormData = $UpdateUserData
9- . pick ( { additionalPermissions : true } )
10- . required ( )
11- . extend ( {
9+ const $UpdateUserFormData = z
10+ . object ( {
11+ additionalPermissions : z . array ( $UserPermission . partial ( ) ) . optional ( ) ,
1212 groupIds : z . set ( z . string ( ) )
13+ } )
14+ . transform ( ( arg ) => {
15+ const firstPermission = arg . additionalPermissions ?. [ 0 ] ;
16+ if ( firstPermission && isAllUndefined ( firstPermission ) ) {
17+ arg . additionalPermissions ?. pop ( ) ;
18+ }
19+ return arg ;
20+ } )
21+ . superRefine ( ( arg , ctx ) => {
22+ arg . additionalPermissions ?. forEach ( ( permission , i ) => {
23+ Object . entries ( permission ) . forEach ( ( [ key , val ] ) => {
24+ if ( ( val satisfies string ) === undefined ) {
25+ ctx . addIssue ( {
26+ code : z . ZodIssueCode . invalid_type ,
27+ expected : 'string' ,
28+ path : [ 'additionalPermissions' , i , key ] ,
29+ received : 'undefined'
30+ } ) ;
31+ }
32+ } ) ;
33+ } ) ;
1334 } ) ;
1435
1536type UpdateUserFormData = z . infer < typeof $UpdateUserFormData > ;
@@ -29,6 +50,7 @@ export const UpdateUserForm: React.FC<{
2950} > = ( { data, onDelete, onSubmit } ) => {
3051 const { disableDelete, groupOptions, initialValues } = data ;
3152 const { t } = useTranslation ( ) ;
53+
3254 return (
3355 < Form
3456 additionalButtons = { {
0 commit comments