diff --git a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogForm.tsx b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogForm.tsx index 53a818c86..15a3a5ec0 100644 --- a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogForm.tsx +++ b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogForm.tsx @@ -6,17 +6,24 @@ import { AppToaster } from '@/components'; import TaxRateFormDialogFormContent from './TaxRateFormDialogFormContent'; -import withDialogActions from '@/containers/Dialog/withDialogActions'; import { CreateTaxRateFormSchema, EditTaxRateFormSchema, } from './TaxRateForm.schema'; -import { transformApiErrors, transformFormToReq, transformTaxRateToForm } from './utils'; +import { + isTaxRateChange, + transformApiErrors, + transformFormToReq, + transformTaxRateToForm, +} from './utils'; import { useCreateTaxRate, useEditTaxRate } from '@/hooks/query/taxRates'; import { useTaxRateFormDialogContext } from './TaxRateFormDialogBoot'; import { TaxRateFormDialogFormFooter } from './TaxRateFormDialogFormFooter'; -import { compose, transformToForm } from '@/utils'; - +import { TaxRateFormDialogFormErrors } from './TaxRateFormDialogFormErrors'; +import withDrawerActions from '@/containers/Drawer/withDrawerActions'; +import withDialogActions from '@/containers/Dialog/withDialogActions'; +import { DRAWERS } from '@/constants/drawers'; +import { compose } from '@/utils'; /** * Tax rate form dialog content. @@ -24,6 +31,9 @@ import { compose, transformToForm } from '@/utils'; function TaxRateFormDialogForm({ // #withDialogActions closeDialog, + + // #withDrawerActions + closeDrawer, }) { // Account form context. const { taxRate, taxRateId, isNewMode, dialogName } = @@ -37,14 +47,34 @@ function TaxRateFormDialogForm({ const { mutateAsync: createTaxRateMutate } = useCreateTaxRate(); const { mutateAsync: editTaxRateMutate } = useEditTaxRate(); + // Form initial values in create and edit mode. + const initialValues = transformTaxRateToForm(taxRate); + // Callbacks handles form submit. const handleFormSubmit = (values, { setSubmitting, setErrors }) => { + const isTaxChanged = isTaxRateChange(initialValues, values); + + // Detarmines whether in edit mode and tax rate has been changed + // and confirm box is not checked. + if (!isNewMode && isTaxChanged && !values.confirm_edit) { + setErrors({ + confirm_edit: + 'Please review the terms and conditions below before proceeding', + }); + setSubmitting(false); + return; + } const form = transformFormToReq(values); + // Handle request success on edit. + const handleSuccessOnEdit = (response) => { + if (response?.data?.data?.id !== taxRateId) { + closeDrawer(DRAWERS.TAX_RATE_DETAILS); + } + }; // Handle request success. const handleSuccess = () => { closeDialog(dialogName); - AppToaster.show({ message: 'The tax rate has been created successfully.', intent: Intent.SUCCESS, @@ -68,12 +98,11 @@ function TaxRateFormDialogForm({ .catch(handleError); } else { editTaxRateMutate([taxRateId, { ...form }]) + .then(handleSuccessOnEdit) .then(handleSuccess) .catch(handleError); } }; - // Form initial values in create and edit mode. - const initialValues = transformTaxRateToForm(taxRate); return (
+
@@ -91,4 +121,7 @@ function TaxRateFormDialogForm({ ); } -export default compose(withDialogActions)(TaxRateFormDialogForm); +export default compose( + withDialogActions, + withDrawerActions, +)(TaxRateFormDialogForm); diff --git a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogFormContent.tsx b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogFormContent.tsx index 10633249a..01f6056ef 100644 --- a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogFormContent.tsx +++ b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialogFormContent.tsx @@ -108,7 +108,7 @@ function ConfirmEditingTaxRate() { return ( Please Note: - + {errors.confirm_edit}; +} diff --git a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/utils.ts b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/utils.ts index d3ef98025..3ea651a1b 100644 --- a/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/utils.ts +++ b/packages/webapp/src/containers/TaxRates/dialogs/TaxRateFormDialog/utils.ts @@ -15,18 +15,44 @@ export const defaultInitialValues = { confirm_edit: false, }; -export const transformApiErrors = () => { - return {}; +/** + * Transformers response errors to form errors. + * @returns {Record} + */ +export const transformApiErrors = (errors) => { + const fields = {}; + + if (errors.find((e) => e.type === 'TAX_CODE_NOT_UNIQUE')) { + fields.code = 'The tax rate is not unique.'; + } + return fields; }; +/** + * Tranformes form values to request values. + */ export const transformFormToReq = (form) => { return omit({ ...form }, ['confirm_edit']); }; +/** + * Detarmines whether the tax rate changed. + * @param initialValues + * @param formValues + * @returns {boolean} + */ +export const isTaxRateChange = (initialValues, formValues) => { + return initialValues.rate !== formValues.rate; +}; + +/** + * Detarmines whether the tax rate changed. + * @returns {boolean} + */ export const useIsTaxRateChanged = () => { const { initialValues, values } = useFormikContext(); - return initialValues.rate !== values.rate; + return isTaxRateChange(initialValues, values); }; const convertFormAttrsToBoolean = (form) => {