diff --git a/apps/dashboard/src/components/data-table/user-table.tsx b/apps/dashboard/src/components/data-table/user-table.tsx index fe840b80f4..5e14b4732e 100644 --- a/apps/dashboard/src/components/data-table/user-table.tsx +++ b/apps/dashboard/src/components/data-table/user-table.tsx @@ -10,11 +10,12 @@ import { standardProviders } from "@stackframe/stack-shared/dist/interface/clien import { ActionCell, AvatarCell, BadgeCell, DateCell, TextCell } from "./elements/cells"; import { SearchToolbarItem } from "./elements/toolbar-items"; import { FormDialog } from "../form-dialog"; -import { DateField, InputField, SwitchField } from "../form-fields"; +import { DateField, InputField, SwitchField, TextAreaField } from "../form-fields"; import { ActionDialog } from "../action-dialog"; import Typography from "../ui/typography"; import { standardFilterFn } from "./elements/utils"; import { SimpleTooltip } from "../simple-tooltip"; +import { yupJsonValidator } from "@stackframe/stack-shared/dist/utils/yup"; export type ExtendedServerUser = ServerUser & { authType: string, @@ -50,6 +51,8 @@ const userEditFormSchema = yup.object({ primaryEmail: yup.string().email("Primary Email must be a valid email address"), signedUpAt: yup.date().required(), primaryEmailVerified: yup.boolean().required(), + clientMetadata: yupJsonValidator, + serverMetadata: yupJsonValidator, }); function EditUserDialog(props: { @@ -62,6 +65,8 @@ function EditUserDialog(props: { primaryEmail: props.user.primaryEmail || undefined, primaryEmailVerified: props.user.primaryEmailVerified, signedUpAt: props.user.signedUpAt, + clientMetadata: props.user.clientMetadata ? JSON.stringify(props.user.clientMetadata) : undefined, + serverMetadata: props.user.serverMetadata ? JSON.stringify(props.user.serverMetadata) : undefined, }; return + + + )} - onSubmit={async (values) => { await props.user.update(values); }} + onSubmit={async (values) => { await props.user.update({ + ...values, + clientMetadata: values.clientMetadata ? JSON.parse(values.clientMetadata) : undefined, + serverMetadata: values.serverMetadata ? JSON.parse(values.serverMetadata) : undefined + }); }} cancelButton />; } diff --git a/apps/dashboard/src/components/form-fields.tsx b/apps/dashboard/src/components/form-fields.tsx index b1d38424e3..5b3d3120ca 100644 --- a/apps/dashboard/src/components/form-fields.tsx +++ b/apps/dashboard/src/components/form-fields.tsx @@ -10,6 +10,7 @@ import { Button } from "./ui/button"; import { cn } from "@/lib/utils"; import { Checkbox } from "./ui/checkbox"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from "./ui/select"; +import { Textarea } from "./ui/textarea"; export function FieldLabel(props: { @@ -23,6 +24,39 @@ export function FieldLabel(props: { ; } +export function TextAreaField(props: { + rows?: number, + required?: boolean, + placeholder?: string, + helperText?: string | JSX.Element, + control: Control, + name: Path, + label: React.ReactNode, +}) { + return ( + ( + +