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>.
INFORMATION
useDrawerForm hook is extended from useForm hook from the @pankod/refine-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
create
In this example, we will show you how to "create" a record with useDrawerForm.
edit
In this example, we will show you how to "edit" a record with useDrawerForm.
CAUTION
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,
});
CAUTION
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,
},
});
Return Values
TIP
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's useForm properties | 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
Return values
| Property | Description | Type |
|---|---|---|
| modal | Relevant states and methods to control the modal or drawer | ModalReturnValues |
| refineCore | The return values of the useForm in the core | UseFormReturnValues |
@mantine/form's useForm return 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