useDrawerForm
useModalForm hook allows you to manage a form within a <Modal> as well as a <Drawer>. It provides some useful methods to handle the form <Modal> or form <Drawer>.
We will use useModalForm hook as a useDrawerForm to manage a form within a <Drawer>.
useDrawerForm hook is extended from useForm hook from the @refinedev/mantine package. This means that you can use all the features of useForm hook.
Basic Usage
We'll show two examples, one for creating and one for editing a post. Let's see how useDrawerForm is used in both.
- create
- edit
In this example, we will show you how to "create" a record with useDrawerForm.
In this example, we will show you how to "edit" a record with useDrawerForm.
refine doesn't automatically add a <EditButton/> to the each record in <PostList> which opens "edit" form in <Drawer> when clicked.
So, we have to put the <EditButton/> on our list. In that way, "edit" form in <Drawer> can fetch data by the record id.
const columns = React.useMemo<ColumnDef<IPost>[]>(
    () => [
        // --
        {
            id: "actions",
            header: "Actions",
            accessorKey: "id",
            enableColumnFilter: false,
            enableSorting: false,
            cell: function render({ getValue }) {
                return (
                    <Group spacing="xs" noWrap>
                        <EditButton
                            hideText
                            onClick={() => show(getValue() as number)}
                        />
                    </Group>
                );
            },
        },
    ],
    [],
);
const table = useTable({
    columns,
});
Don't forget to pass the record "id" to show to fetch the record data. This is necessary for both "edit" and "clone" forms.
Properties
refineCoreProps
All useForm properties also available in useStepsForm. You can find descriptions on useForm docs.
const drawerForm = useDrawerForm({
    refineCoreProps: {
        action: "edit",
        resource: "posts",
        id: "1",
    },
});
initialValues
Only available in
"create"form.
Default values for the form. Use this to pre-populate the form with data that needs to be displayed.
const drawerForm = useDrawerForm({
    initialValues: {
        title: "Hello World",
    },
});
defaultVisible
Default:
false
When true, drawer will be visible by default.
const drawerForm = useDrawerForm({
    modalProps: {
        defaultVisible: true,
    },
});
autoSubmitClose
Default:
true
When true, drawer will be closed after successful submit.
const drawerForm = useDrawerForm({
    modalProps: {
        autoSubmitClose: false,
    },
});
autoResetForm
Default:
true
When true, form will be reset after successful submit.
const drawerForm = useDrawerForm({
    modalProps: {
        autoResetForm: false,
    },
});
syncWithLocation
Default:
false
When true, the drawers visibility state and the id of the record will be synced with the URL.
This property can also be set as an object { key: string; syncId?: boolean } to customize the key of the URL query parameter. id will be synced with the URL only if syncId is true.
const drawerForm = useDrawerForm({
    syncWithLocation: { key: "my-modal", syncId: true },
});
Return Values
All useForm return values also available in useDrawerForm. You can find descriptions on useForm docs.
All mantine useForm return values also available in useDrawerForm. You can find descriptions on mantine docs.
visible
Current visibility state of the drawer.
const drawerForm = useDrawerForm({
    defaultVisible: true,
});
console.log(drawerForm.modal.visible); // true
title
Title of the drawer. Based on resource and action values
const {
    modal: { title },
} = useDrawerForm({
    refineCoreProps: {
        resource: "posts",
        action: "create",
    },
});
console.log(title); // "Create Post"
close
A function that can close the drawer. It's useful when you want to close the drawer manually.
const {
    getInputProps,
    modal: { close, visible, title },
} = useDrawerForm();
return (
    <Drawer opened={visible} onClose={close} title={title}>
        <TextInput
            mt={8}
            label="Title"
            placeholder="Title"
            {...getInputProps("title")}
        />
        <Box mt={8} sx={{ display: "flex", justifyContent: "flex-end" }}>
            <SaveButton {...saveButtonProps} />
            <Button onClick={close}>Cancel</Button>
        </Box>
    </Drawer>
);
submit
A function that can submit the form. It's useful when you want to submit the form manually.
const {
    modal: { submit },
} = useDrawerForm();
// ---
return (
    <Drawer opened={visible} onClose={close} title={title}>
        <TextInput
            mt={8}
            label="Title"
            placeholder="Title"
            {...getInputProps("title")}
        />
        <Box mt={8} sx={{ display: "flex", justifyContent: "flex-end" }}>
            <Button onClick={submit}>Save</Button>
        </Box>
    </Drawer>
);
show
A function that can show the drawer.
const {
    getInputProps,
    modal: { close, visible, title, show },
} = useDrawerForm();
const onFinishHandler = (values) => {
    onFinish(values);
    show();
};
return (
    <>
        <Button onClick={}>Show Modal</Button>
        <Drawer opened={visible} onClose={close} title={title}>
            <TextInput
                mt={8}
                label="Title"
                placeholder="Title"
                {...getInputProps("title")}
            />
            <Box mt={8} sx={{ display: "flex", justifyContent: "flex-end" }}>
                <SaveButton {...saveButtonProps} />
            </Box>
        </Drawer>
    </>
);
saveButtonProps
It contains all the props needed by the "submit" button within the drawer (disabled,loading etc.). You can manually pass these props to your custom button.
const { getInputProps, modal, saveButtonProps } = useDrawerForm();
return (
    <Drawer {...modal}>
        <TextInput
            mt={8}
            label="Title"
            placeholder="Title"
            {...getInputProps("title")}
        />
        <Box mt={8} sx={{ display: "flex", justifyContent: "flex-end" }}>
            <Button
                {...saveButtonProps}
                onClick={(e) => {
                    // -- your custom logic
                    saveButtonProps.onClick(e);
                }}
            />
        </Box>
    </Drawer>
);
API Reference
Properties
| Property | Description | Type | 
|---|---|---|
| modalProps | Configuration object for the modal or drawer | ModalPropsType | 
| refineCoreProps | Configuration object for the core of the useForm | UseFormProps | 
| @mantine/form'suseFormproperties | See useForm documentation | 
ModalPropsType
Property Description Type Default defaultVisible Initial visibility state of the modal booleanfalseautoSubmitClose Whether the form should be submitted when the modal is closed booleantrueautoResetForm Whether the form should be reset when the form is submitted booleantrue
Type Parameters
| Property | Desription | Type | Default | 
|---|---|---|---|
| TData | Result data returned by the query function. Extends BaseRecord | BaseRecord | BaseRecord | 
| TError | Custom error object that extends HttpError | HttpError | HttpError | 
| TVariables | Form values for mutation function | {} | Record<string, unknown> | 
| TTransformed | Form values after transformation for mutation function | {} | TVariables | 
| TSelectData | Result data returned by the selectfunction. ExtendsBaseRecord. If not specified, the value ofTDatawill be used as the default value. | BaseRecord | TData | 
Return values
| Property | Description | Type | 
|---|---|---|
| modal | Relevant states and methods to control the modal or drawer | ModalReturnValues | 
| refineCore | The return values of the useFormin the core | UseFormReturnValues | 
| @mantine/form'suseFormreturn values | See useForm documentation | 
ModalReturnValues
Property Description Type visible State of modal visibility booleanshow Sets the visible state to true (id?: BaseKey) => voidclose Sets the visible state to false () => voidsubmit Submits the form (values: TVariables) => voidtitle Modal title based on resource and action value stringsaveButtonProps Props for a submit button { disabled: boolean, onClick: (e: React.FormEvent<HTMLFormElement>) => void; }
Example
npm create refine-app@latest -- --example form-mantine-use-drawer-form