2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-08-10 05:40:55 +00:00
Files
InvenTree/src/frontend/src/hooks/UseForm.tsx
Matthias Mair 641310494e add new type
2024-04-15 21:15:14 +02:00

137 lines
3.5 KiB
TypeScript

import { t } from '@lingui/macro';
import { Alert, Divider, MantineSize, Stack } from '@mantine/core';
import { useId } from '@mantine/hooks';
import { useEffect, useMemo, useRef } from 'react';
import { ApiFormProps, OptionsApiForm } from '../components/forms/ApiForm';
import { UiSizeType } from '../defaults/formatters';
import { useModal } from './UseModal';
/**
* @param title : The title to display in the modal header
* @param cancelText : Optional custom text to display on the cancel button (default: Cancel)
* @param cancelColor : Optional custom color for the cancel button (default: blue)
* @param onClose : A callback function to call when the modal is closed.
* @param onOpen : A callback function to call when the modal is opened.
*/
export interface ApiFormModalProps extends ApiFormProps {
title: string;
cancelText?: string;
cancelColor?: string;
onClose?: () => void;
onOpen?: () => void;
closeOnClickOutside?: boolean;
size?: UiSizeType;
}
/**
* Construct and open a modal form
*/
export function useApiFormModal(props: ApiFormModalProps) {
const id = useId();
const modalClose = useRef(() => {});
const formProps = useMemo<ApiFormModalProps>(
() => ({
...props,
actions: [
...(props.actions || []),
{
text: props.cancelText ?? t`Cancel`,
color: props.cancelColor ?? 'blue',
onClick: () => {
modalClose.current();
}
}
],
onFormSuccess: (data) => {
modalClose.current();
props.onFormSuccess?.(data);
},
onFormError: () => {
modalClose.current();
props.onFormError?.();
}
}),
[props]
);
const modal = useModal({
title: formProps.title,
onOpen: formProps.onOpen,
onClose: formProps.onClose,
closeOnClickOutside: formProps.closeOnClickOutside,
size: props.size ?? 'xl',
children: (
<Stack gap={'xs'}>
<Divider />
<OptionsApiForm props={formProps} id={id} />
</Stack>
)
});
useEffect(() => {
modalClose.current = modal.close;
}, [modal.close]);
return modal;
}
/**
* Open a modal form to create a new model instance
*/
export function useCreateApiFormModal(props: ApiFormModalProps) {
const createProps = useMemo<ApiFormModalProps>(
() => ({
...props,
fetchInitialData: props.fetchInitialData ?? false,
successMessage: props.successMessage ?? t`Item Created`,
method: 'POST'
}),
[props]
);
return useApiFormModal(createProps);
}
/**
* Open a modal form to edit a model instance
*/
export function useEditApiFormModal(props: ApiFormModalProps) {
const editProps = useMemo<ApiFormModalProps>(
() => ({
...props,
fetchInitialData: props.fetchInitialData ?? true,
successMessage: props.successMessage ?? t`Item Updated`,
method: 'PATCH'
}),
[props]
);
return useApiFormModal(editProps);
}
/**
* Open a modal form to delete a model instance
*/
export function useDeleteApiFormModal(props: ApiFormModalProps) {
const deleteProps = useMemo<ApiFormModalProps>(
() => ({
...props,
method: 'DELETE',
submitText: t`Delete`,
submitColor: 'red',
successMessage: props.successMessage ?? t`Item Deleted`,
preFormContent: props.preFormContent ?? (
<Alert
color={'red'}
>{t`Are you sure you want to delete this item?`}</Alert>
),
fields: props.fields ?? {}
}),
[props]
);
return useApiFormModal(deleteProps);
}