Skip to content

Commit b026caf

Browse files
committed
fix: add custom refine for user form
1 parent ebea1d4 commit b026caf

1 file changed

Lines changed: 27 additions & 5 deletions

File tree

apps/web/src/features/admin/components/UpdateUserForm.tsx

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
1+
import { isAllUndefined } from '@douglasneuroinformatics/libjs';
12
import { Button, Form } from '@douglasneuroinformatics/libui/components';
23
import { useTranslation } from '@douglasneuroinformatics/libui/hooks';
34
import type { FormTypes } from '@opendatacapture/runtime-core';
4-
import { $UpdateUserData } from '@opendatacapture/schemas/user';
5+
import { $UserPermission } from '@opendatacapture/schemas/user';
56
import type { Promisable } from 'type-fest';
67
import { 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

1536
type 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

Comments
 (0)