feat(webapp): showing up mail popup once saving invoice, receipt and estimate

This commit is contained in:
Ahmed Bouhuolia
2024-01-25 21:56:18 +02:00
parent 760dbc6cfc
commit 63708ae839
29 changed files with 482 additions and 138 deletions

View File

@@ -53,4 +53,8 @@ export enum DialogsName {
EstimateMail = 'estimate-mail', EstimateMail = 'estimate-mail',
ReceiptMail = 'receipt-mail', ReceiptMail = 'receipt-mail',
PaymentMail = 'payment-mail', PaymentMail = 'payment-mail',
InvoiceFormMailDeliver = 'InvoiceFormMailDeliver',
EstimateFormMailDeliver = 'EstimateFormMailDeliver',
ReceiptFormMailDeliver = 'ReceiptFormMailDeliver',
} }

View File

@@ -0,0 +1,39 @@
// @ts-nocheck
import React from 'react';
import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils';
const EstimateFormMailDeliverDialogContent = React.lazy(
() => import('./EstimateFormMailDeliverDialogContent'),
);
/**
* Estimate mail dialog.
*/
function EstimateFormMailDeliverDialog({
dialogName,
payload: { estimateId = null },
isOpen,
}) {
return (
<Dialog
name={dialogName}
title={'Estimate Mail'}
isOpen={isOpen}
canEscapeJeyClose={false}
isCloseButtonShown={false}
autoFocus={true}
style={{ width: 600 }}
>
<DialogSuspense>
<EstimateFormMailDeliverDialogContent
dialogName={dialogName}
estimateId={estimateId}
/>
</DialogSuspense>
</Dialog>
);
}
export default compose(withDialogRedux())(EstimateFormMailDeliverDialog);

View File

@@ -0,0 +1,40 @@
// @ts-nocheck
import * as R from 'ramda';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { useHistory } from 'react-router-dom';
import EstimateMailDialogContent from '../../EstimateMailDialog/EstimateMailDialogContent';
import { DialogsName } from '@/constants/dialogs';
interface EstimateFormDeliverDialogContent {
estimateId: number;
}
function EstimateFormDeliverDialogContentRoot({
estimateId,
// #withDialogActions
closeDialog,
}: EstimateFormDeliverDialogContent) {
const history = useHistory();
const handleSubmit = () => {
closeDialog(DialogsName.EstimateFormMailDeliver);
history.push('/estimates');
};
const handleCancel = () => {
closeDialog(DialogsName.EstimateFormMailDeliver);
history.push('/estimates');
};
return (
<EstimateMailDialogContent
estimateId={estimateId}
onFormSubmit={handleSubmit}
onCancelClick={handleCancel}
/>
);
}
export default R.compose(withDialogActions)(
EstimateFormDeliverDialogContentRoot,
);

View File

@@ -29,7 +29,7 @@ export default function EstimateFloatingActions() {
// Handle submit & deliver button click. // Handle submit & deliver button click.
const handleSubmitDeliverBtnClick = (event) => { const handleSubmitDeliverBtnClick = (event) => {
setSubmitPayload({ redirect: true, deliver: true }); setSubmitPayload({ redirect: false, deliverViaMail: true });
submitForm(); submitForm();
}; };

View File

@@ -36,11 +36,16 @@ import {
handleErrors, handleErrors,
resetFormState, resetFormState,
} from './utils'; } from './utils';
import { DialogsName } from '@/constants/dialogs';
import withDialogActions from '@/containers/Dialog/withDialogActions';
/** /**
* Estimate form. * Estimate form.
*/ */
function EstimateForm({ function EstimateForm({
// #withDialogActions
openDialog,
// #withSettings // #withSettings
estimateNextNumber, estimateNextNumber,
estimateNumberPrefix, estimateNumberPrefix,
@@ -108,7 +113,7 @@ function EstimateForm({
delivered: submitPayload.deliver, delivered: submitPayload.deliver,
}; };
// Handle the request success. // Handle the request success.
const onSuccess = (response) => { const onSuccess = (res) => {
AppToaster.show({ AppToaster.show({
message: intl.get( message: intl.get(
isNewMode isNewMode
@@ -126,6 +131,11 @@ function EstimateForm({
if (submitPayload.resetForm) { if (submitPayload.resetForm) {
resetFormState({ resetForm, initialValues, values }); resetFormState({ resetForm, initialValues, values });
} }
if (submitPayload.deliverViaMail) {
openDialog(DialogsName.EstimateFormMailDeliver, {
estimateId: res.data.id,
});
}
}; };
// Handle the request error. // Handle the request error.
const onError = ({ const onError = ({
@@ -180,6 +190,7 @@ function EstimateForm({
} }
export default compose( export default compose(
withDialogActions,
withSettings(({ estimatesSettings }) => ({ withSettings(({ estimatesSettings }) => ({
estimateNextNumber: estimatesSettings?.nextNumber, estimateNextNumber: estimatesSettings?.nextNumber,
estimateNumberPrefix: estimatesSettings?.numberPrefix, estimateNumberPrefix: estimatesSettings?.numberPrefix,

View File

@@ -2,6 +2,8 @@
import React from 'react'; import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import EstimateNumberDialog from '@/containers/Dialogs/EstimateNumberDialog'; import EstimateNumberDialog from '@/containers/Dialogs/EstimateNumberDialog';
import EstimateFormMailDeliverDialog from './Dialogs/EstimateFormMailDeliverDialog';
import { DialogsName } from '@/constants/dialogs';
/** /**
* Estimate form dialogs. * Estimate form dialogs.
@@ -25,6 +27,9 @@ export default function EstimateFormDialogs() {
dialogName={'estimate-number-form'} dialogName={'estimate-number-form'}
onConfirm={handleEstimateNumberFormConfirm} onConfirm={handleEstimateNumberFormConfirm}
/> />
<EstimateFormMailDeliverDialog
dialogName={DialogsName.EstimateFormMailDeliver}
/>
</> </>
); );
} }

View File

@@ -4,21 +4,16 @@ import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect'; import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils'; import { compose } from '@/utils';
const EstimateMailDialogContent = React.lazy( const EstimateMailDialogBody = React.lazy(
() => import('./EstimateMailDialogContent'), () => import('./EstimateMailDialogBody'),
); );
/** /**
* Invoice mail dialog. * Estimate mail dialog.
*/ */
function EstimateMailDialog({ function EstimateMailDialog({
dialogName, dialogName,
payload: { payload: { estimateId = null },
estimateId = null,
// Redirect to the estimates list after mail submitting.
redirectToEstimatesList = false,
},
isOpen, isOpen,
}) { }) {
return ( return (
@@ -31,11 +26,7 @@ function EstimateMailDialog({
style={{ width: 600 }} style={{ width: 600 }}
> >
<DialogSuspense> <DialogSuspense>
<EstimateMailDialogContent <EstimateMailDialogBody estimateId={estimateId} />
dialogName={dialogName}
estimateId={estimateId}
redirectToEstimatesList={redirectToEstimatesList}
/>
</DialogSuspense> </DialogSuspense>
</Dialog> </Dialog>
); );

View File

@@ -0,0 +1,33 @@
// @ts-nocheck
import * as R from 'ramda';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import EstimateMailDialogContent from './EstimateMailDialogContent';
import { DialogsName } from '@/constants/dialogs';
interface EstimateMailDialogBodyProps {
estimateId: number;
}
function EstimateMailDialogBodyRoot({
estimateId,
// #withDialogActions
closeDialog,
}: EstimateMailDialogBodyProps) {
const handleSubmit = () => {
closeDialog(DialogsName.EstimateMail);
};
const handleCancelClick = () => {
closeDialog(DialogsName.EstimateMail);
};
return (
<EstimateMailDialogContent
estimateId={estimateId}
onFormSubmit={handleSubmit}
onCancelClick={handleCancelClick}
/>
);
}
export default R.compose(withDialogActions)(EstimateMailDialogBodyRoot);

View File

@@ -2,21 +2,21 @@ import { EstimateMailDialogBoot } from './EstimateMailDialogBoot';
import { EstimateMailDialogForm } from './EstimateMailDialogForm'; import { EstimateMailDialogForm } from './EstimateMailDialogForm';
interface EstimateMailDialogContentProps { interface EstimateMailDialogContentProps {
dialogName: string;
estimateId: number; estimateId: number;
redirectToEstimatesList?: boolean; onFormSubmit?: () => void;
onCancelClick?: () => void;
} }
export default function EstimateMailDialogContent({ export default function EstimateMailDialogContent({
dialogName,
estimateId, estimateId,
redirectToEstimatesList, onFormSubmit,
onCancelClick,
}: EstimateMailDialogContentProps) { }: EstimateMailDialogContentProps) {
return ( return (
<EstimateMailDialogBoot <EstimateMailDialogBoot estimateId={estimateId}>
estimateId={estimateId} <EstimateMailDialogForm
redirectToEstimatesList={redirectToEstimatesList} onFormSubmit={onFormSubmit}
> onCancelClick={onCancelClick}
<EstimateMailDialogForm /> />
</EstimateMailDialogBoot> </EstimateMailDialogBoot>
); );
} }

View File

@@ -2,7 +2,6 @@
import { Formik } from 'formik'; import { Formik } from 'formik';
import * as R from 'ramda'; import * as R from 'ramda';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { useHistory } from 'react-router-dom';
import { useEstimateMailDialogBoot } from './EstimateMailDialogBoot'; import { useEstimateMailDialogBoot } from './EstimateMailDialogBoot';
import { DialogsName } from '@/constants/dialogs'; import { DialogsName } from '@/constants/dialogs';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
@@ -26,6 +25,9 @@ interface EstimateMailFormValues extends MailNotificationFormValues {
} }
function EstimateMailDialogFormRoot({ function EstimateMailDialogFormRoot({
onFormSubmit,
onCancelClick,
// #withDialogClose // #withDialogClose
closeDialog, closeDialog,
}) { }) {
@@ -33,8 +35,6 @@ function EstimateMailDialogFormRoot({
const { mailOptions, saleEstimateId, redirectToEstimatesList } = const { mailOptions, saleEstimateId, redirectToEstimatesList } =
useEstimateMailDialogBoot(); useEstimateMailDialogBoot();
const history = useHistory();
const initialValues = transformMailFormToInitialValues( const initialValues = transformMailFormToInitialValues(
mailOptions, mailOptions,
initialFormValues, initialFormValues,
@@ -52,10 +52,7 @@ function EstimateMailDialogFormRoot({
}); });
closeDialog(DialogsName.EstimateMail); closeDialog(DialogsName.EstimateMail);
setSubmitting(false); setSubmitting(false);
onFormSubmit && onFormSubmit();
if (redirectToEstimatesList) {
history.push('/estimates');
}
}) })
.catch(() => { .catch(() => {
setSubmitting(false); setSubmitting(false);
@@ -64,6 +61,7 @@ function EstimateMailDialogFormRoot({
message: 'Something went wrong.', message: 'Something went wrong.',
intent: Intent.DANGER, intent: Intent.DANGER,
}); });
onCancelClick && onCancelClick();
}); });
}; };

View File

@@ -0,0 +1,39 @@
// @ts-nocheck
import React from 'react';
import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils';
const InvoiceFormMailDeliverDialogContent = React.lazy(
() => import('./InvoiceFormMailDeliverDialogContent'),
);
/**
* Invoice mail dialog.
*/
function InvoiceFormMailDeliverDialog({
dialogName,
payload: { invoiceId = null },
isOpen,
}) {
return (
<Dialog
name={dialogName}
title={'Invoice Mail'}
isOpen={isOpen}
canEscapeJeyClose={false}
isCloseButtonShown={false}
autoFocus={true}
style={{ width: 600 }}
>
<DialogSuspense>
<InvoiceFormMailDeliverDialogContent
dialogName={dialogName}
invoiceId={invoiceId}
/>
</DialogSuspense>
</Dialog>
);
}
export default compose(withDialogRedux())(InvoiceFormMailDeliverDialog);

View File

@@ -0,0 +1,40 @@
// @ts-nocheck
import * as R from 'ramda';
import { useHistory } from 'react-router-dom';
import InvoiceMailDialogContent from '../../../InvoiceMailDialog/InvoiceMailDialogContent';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { DialogsName } from '@/constants/dialogs';
interface InvoiceFormDeliverDialogContent {
invoiceId: number;
}
function InvoiceFormDeliverDialogContentRoot({
invoiceId,
// #withDialogActions
closeDialog,
}: InvoiceFormDeliverDialogContent) {
const history = useHistory();
const handleSubmit = () => {
history.push('/invoices');
closeDialog(DialogsName.InvoiceFormMailDeliver);
};
const handleCancel = () => {
history.push('/invoices');
closeDialog(DialogsName.InvoiceFormMailDeliver);
};
return (
<InvoiceMailDialogContent
invoiceId={invoiceId}
onFormSubmit={handleSubmit}
onCancelClick={handleCancel}
/>
);
}
export default R.compose(withDialogActions)(
InvoiceFormDeliverDialogContentRoot,
);

View File

@@ -30,19 +30,19 @@ export default function InvoiceFloatingActions() {
const { setSubmitPayload, invoice } = useInvoiceFormContext(); const { setSubmitPayload, invoice } = useInvoiceFormContext();
// Handle submit & deliver button click. // Handle submit & deliver button click.
const handleSubmitDeliverBtnClick = (event) => { const handleSubmitDeliverBtnClick = () => {
setSubmitPayload({ redirect: true, deliver: true }); setSubmitPayload({ redirectToEdit: true, deliverViaMail: true });
submitForm(); submitForm();
}; };
// Handle submit, deliver & new button click. // Handle submit, deliver & new button click.
const handleSubmitDeliverAndNewBtnClick = (event) => { const handleSubmitDeliverAndNewBtnClick = () => {
setSubmitPayload({ redirect: false, deliver: true, resetForm: true }); setSubmitPayload({ redirect: false, deliver: true, resetForm: true });
submitForm(); submitForm();
}; };
// Handle submit, deliver & continue editing button click. // Handle submit, deliver & continue editing button click.
const handleSubmitDeliverContinueEditingBtnClick = (event) => { const handleSubmitDeliverContinueEditingBtnClick = () => {
setSubmitPayload({ redirect: false, deliver: true }); setSubmitPayload({ redirect: false, deliver: true });
submitForm(); submitForm();
}; };

View File

@@ -34,12 +34,20 @@ import {
transformValueToRequest, transformValueToRequest,
resetFormState, resetFormState,
} from './utils'; } from './utils';
import { InvoiceExchangeRateSync, InvoiceNoSyncSettingsToForm } from './components'; import {
InvoiceExchangeRateSync,
InvoiceNoSyncSettingsToForm,
} from './components';
import { DialogsName } from '@/constants/dialogs';
import withDialogActions from '@/containers/Dialog/withDialogActions';
/** /**
* Invoice form. * Invoice form.
*/ */
function InvoiceForm({ function InvoiceForm({
// #withDialogActions
openDialog,
// #withSettings // #withSettings
invoiceNextNumber, invoiceNextNumber,
invoiceNumberPrefix, invoiceNumberPrefix,
@@ -111,7 +119,7 @@ function InvoiceForm({
from_estimate_id: estimateId, from_estimate_id: estimateId,
}; };
// Handle the request success. // Handle the request success.
const onSuccess = () => { const onSuccess = (res) => {
AppToaster.show({ AppToaster.show({
message: intl.get( message: intl.get(
isNewMode isNewMode
@@ -123,6 +131,11 @@ function InvoiceForm({
}); });
setSubmitting(false); setSubmitting(false);
if (submitPayload.deliverViaMail) {
openDialog(DialogsName.InvoiceFormMailDeliver, {
invoiceId: res.data.id,
});
}
if (submitPayload.redirect) { if (submitPayload.redirect) {
history.push('/invoices'); history.push('/invoices');
} }
@@ -201,4 +214,5 @@ export default compose(
invoiceTermsConditions: invoiceSettings?.termsConditions, invoiceTermsConditions: invoiceSettings?.termsConditions,
})), })),
withCurrentOrganization(), withCurrentOrganization(),
withDialogActions,
)(InvoiceForm); )(InvoiceForm);

View File

@@ -1,8 +1,8 @@
// @ts-nocheck // @ts-nocheck
import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import InvoiceNumberDialog from '@/containers/Dialogs/InvoiceNumberDialog'; import InvoiceNumberDialog from '@/containers/Dialogs/InvoiceNumberDialog';
import { DialogsName } from '@/constants/dialogs'; import { DialogsName } from '@/constants/dialogs';
import InvoiceFormMailDeliverDialog from './Dialogs/InvoiceFormMailDeliverDialog/InvoiceFormMailDeliverDialog';
/** /**
* Invoice form dialogs. * Invoice form dialogs.
@@ -23,9 +23,14 @@ export default function InvoiceFormDialogs() {
}; };
return ( return (
<InvoiceNumberDialog <>
dialogName={DialogsName.InvoiceNumberSettings} <InvoiceNumberDialog
onConfirm={handleInvoiceNumberFormConfirm} dialogName={DialogsName.InvoiceNumberSettings}
/> onConfirm={handleInvoiceNumberFormConfirm}
/>
<InvoiceFormMailDeliverDialog
dialogName={DialogsName.InvoiceFormMailDeliver}
/>
</>
); );
} }

View File

@@ -4,8 +4,8 @@ import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect'; import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils'; import { compose } from '@/utils';
const InvoiceMailDialogContent = React.lazy( const InvoiceMailDialogBody = React.lazy(
() => import('./InvoiceMailDialogContent'), () => import('./InvoiceMailDialogBody'),
); );
/** /**
@@ -13,12 +13,7 @@ const InvoiceMailDialogContent = React.lazy(
*/ */
function InvoiceMailDialog({ function InvoiceMailDialog({
dialogName, dialogName,
payload: { payload: { invoiceId = null },
invoiceId = null,
// Redirects to the invoices list.
redirectToInvoicesList = false,
},
isOpen, isOpen,
}) { }) {
return ( return (
@@ -26,16 +21,13 @@ function InvoiceMailDialog({
name={dialogName} name={dialogName}
title={'Invoice Mail'} title={'Invoice Mail'}
isOpen={isOpen} isOpen={isOpen}
canEscapeJeyClose={true} canEscapeJeyClose={false}
isCloseButtonShown={false}
autoFocus={true} autoFocus={true}
style={{ width: 600 }} style={{ width: 600 }}
> >
<DialogSuspense> <DialogSuspense>
<InvoiceMailDialogContent <InvoiceMailDialogBody invoiceId={invoiceId} />
dialogName={dialogName}
invoiceId={invoiceId}
redirectToInvoicesList={redirectToInvoicesList}
/>
</DialogSuspense> </DialogSuspense>
</Dialog> </Dialog>
); );

View File

@@ -0,0 +1,36 @@
// @ts-nocheck
import * as R from 'ramda';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import InvoiceMailDialogContent, {
InvoiceMailDialogContentProps,
} from './InvoiceMailDialogContent';
import { DialogsName } from '@/constants/dialogs';
export interface InvoiceMailDialogBodyProps
extends InvoiceMailDialogContentProps {}
function InvoiceMailDialogBodyRoot({
invoiceId,
onCancelClick,
onFormSubmit,
// #withDialogActions
closeDialog,
}: InvoiceMailDialogBodyProps) {
const handleCancelClick = () => {
closeDialog(DialogsName.InvoiceMail);
};
const handleSubmitClick = () => {
closeDialog(DialogsName.InvoiceMail);
};
return (
<InvoiceMailDialogContent
invoiceId={invoiceId}
onCancelClick={handleCancelClick}
onFormSubmit={handleSubmitClick}
/>
);
}
export default R.compose(withDialogActions)(InvoiceMailDialogBodyRoot);

View File

@@ -1,24 +1,22 @@
import { InvoiceMailDialogBoot } from './InvoiceMailDialogBoot'; import { InvoiceMailDialogBoot } from './InvoiceMailDialogBoot';
import { InvoiceMailDialogForm } from './InvoiceMailDialogForm'; import { InvoiceMailDialogForm } from './InvoiceMailDialogForm';
interface InvoiceMailDialogContentProps { export interface InvoiceMailDialogContentProps {
dialogName: string;
invoiceId: number; invoiceId: number;
onFormSubmit?: () => void;
// Redirect to invoices list after submitting the message. onCancelClick?: () => void;
redirectToInvoicesList?: boolean;
} }
export default function InvoiceMailDialogContent({ export default function InvoiceMailDialogContent({
dialogName,
invoiceId, invoiceId,
redirectToInvoicesList, onFormSubmit,
onCancelClick,
}: InvoiceMailDialogContentProps) { }: InvoiceMailDialogContentProps) {
return ( return (
<InvoiceMailDialogBoot <InvoiceMailDialogBoot invoiceId={invoiceId}>
invoiceId={invoiceId} <InvoiceMailDialogForm
redirectToInvoicesList={redirectToInvoicesList} onFormSubmit={onFormSubmit}
> onCancelClick={onCancelClick}
<InvoiceMailDialogForm /> />
</InvoiceMailDialogBoot> </InvoiceMailDialogBoot>
); );
} }

View File

@@ -1,12 +1,9 @@
// @ts-nocheck // @ts-nocheck
import { Formik } from 'formik'; import { Formik } from 'formik';
import * as R from 'ramda';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { useInvoiceMailDialogBoot } from './InvoiceMailDialogBoot'; import { useInvoiceMailDialogBoot } from './InvoiceMailDialogBoot';
import { DialogsName } from '@/constants/dialogs';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
import { useSendSaleInvoiceMail } from '@/hooks/query'; import { useSendSaleInvoiceMail } from '@/hooks/query';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { InvoiceMailDialogFormContent } from './InvoiceMailDialogFormContent'; import { InvoiceMailDialogFormContent } from './InvoiceMailDialogFormContent';
import { InvoiceMailFormSchema } from './InvoiceMailDialogForm.schema'; import { InvoiceMailFormSchema } from './InvoiceMailDialogForm.schema';
import { import {
@@ -15,7 +12,6 @@ import {
transformMailFormToRequest, transformMailFormToRequest,
transformMailFormToInitialValues, transformMailFormToInitialValues,
} from '@/containers/SendMailNotification/utils'; } from '@/containers/SendMailNotification/utils';
import { useHistory } from 'react-router-dom';
const initialFormValues = { const initialFormValues = {
...initialMailNotificationValues, ...initialMailNotificationValues,
@@ -26,13 +22,8 @@ interface InvoiceMailFormValues extends MailNotificationFormValues {
attachInvoice: boolean; attachInvoice: boolean;
} }
function InvoiceMailDialogFormRoot({ export function InvoiceMailDialogForm({ onFormSubmit, onCancelClick }) {
// #withDialogActions const { mailOptions, saleInvoiceId } = useInvoiceMailDialogBoot();
closeDialog,
}) {
const history = useHistory();
const { mailOptions, saleInvoiceId, redirectToInvoicesList } =
useInvoiceMailDialogBoot();
const { mutateAsync: sendInvoiceMail } = useSendSaleInvoiceMail(); const { mutateAsync: sendInvoiceMail } = useSendSaleInvoiceMail();
const initialValues = transformMailFormToInitialValues( const initialValues = transformMailFormToInitialValues(
@@ -50,13 +41,8 @@ function InvoiceMailDialogFormRoot({
message: 'The mail notification has been sent successfully.', message: 'The mail notification has been sent successfully.',
intent: Intent.SUCCESS, intent: Intent.SUCCESS,
}); });
closeDialog(DialogsName.InvoiceMail);
setSubmitting(false); setSubmitting(false);
onFormSubmit && onFormSubmit(values);
// Redirect to the dashboard if the option was enabled.
if (redirectToInvoicesList) {
history.push('/invoices');
}
}) })
.catch(() => { .catch(() => {
AppToaster.show({ AppToaster.show({
@@ -68,7 +54,7 @@ function InvoiceMailDialogFormRoot({
}; };
// Handle the close button click. // Handle the close button click.
const handleClose = () => { const handleClose = () => {
closeDialog(DialogsName.InvoiceMail); onCancelClick && onCancelClick();
}; };
return ( return (
@@ -81,7 +67,3 @@ function InvoiceMailDialogFormRoot({
</Formik> </Formik>
); );
} }
export const InvoiceMailDialogForm = R.compose(withDialogActions)(
InvoiceMailDialogFormRoot,
);

View File

@@ -1 +1,2 @@
export * from './InvoiceMailDialog'; export * from './InvoiceMailDialog';
export * from './InvoiceMailDialogContent';

View File

@@ -0,0 +1,39 @@
// @ts-nocheck
import React from 'react';
import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils';
const ReceiptFormMailDeliverDialogContent = React.lazy(
() => import('./ReceiptFormMailDeliverDialogContent'),
);
/**
* Receipt mail dialog.
*/
function ReceiptFormMailDeliverDialog({
dialogName,
payload: { receiptId = null },
isOpen,
}) {
return (
<Dialog
name={dialogName}
title={'Receipt Mail'}
isOpen={isOpen}
canEscapeJeyClose={false}
isCloseButtonShown={false}
autoFocus={true}
style={{ width: 600 }}
>
<DialogSuspense>
<ReceiptFormMailDeliverDialogContent
dialogName={dialogName}
receiptId={receiptId}
/>
</DialogSuspense>
</Dialog>
);
}
export default compose(withDialogRedux())(ReceiptFormMailDeliverDialog);

View File

@@ -0,0 +1,40 @@
// @ts-nocheck
import * as R from 'ramda';
import { useHistory } from 'react-router-dom';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import ReceiptMailDialogContent from '../../ReceiptMailDialog/ReceiptMailDialogContent';
import { DialogsName } from '@/constants/dialogs';
interface ReceiptFormDeliverDialogContent {
receiptId: number;
}
function ReceiptFormDeliverDialogContentRoot({
receiptId,
// #withDialogActions
closeDialog,
}: ReceiptFormDeliverDialogContent) {
const history = useHistory();
const handleSubmit = () => {
history.push('/receipts');
closeDialog(DialogsName.ReceiptFormMailDeliver);
};
const handleCancel = () => {
history.push('/receipts');
closeDialog(DialogsName.ReceiptFormMailDeliver);
};
return (
<ReceiptMailDialogContent
receiptId={receiptId}
onFormSubmit={handleSubmit}
onCancelClick={handleCancel}
/>
);
}
export default R.compose(withDialogActions)(
ReceiptFormDeliverDialogContentRoot,
);

View File

@@ -34,12 +34,20 @@ import {
transformFormValuesToRequest, transformFormValuesToRequest,
resetFormState, resetFormState,
} from './utils'; } from './utils';
import { ReceiptSyncAutoExRateToForm, ReceiptSyncIncrementSettingsToForm } from './components'; import {
ReceiptSyncAutoExRateToForm,
ReceiptSyncIncrementSettingsToForm,
} from './components';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import { DialogsName } from '@/constants/dialogs';
/** /**
* Receipt form. * Receipt form.
*/ */
function ReceiptForm({ function ReceiptForm({
// #withDialogActions
openDialog,
// #withSettings // #withSettings
receiptNextNumber, receiptNextNumber,
receiptNumberPrefix, receiptNumberPrefix,
@@ -84,10 +92,7 @@ function ReceiptForm({
}), }),
}; };
// Handle the form submit. // Handle the form submit.
const handleFormSubmit = ( const handleFormSubmit = (values, { setErrors, setSubmitting }) => {
values,
{ setErrors, setSubmitting, resetForm },
) => {
const entries = values.entries.filter( const entries = values.entries.filter(
(item) => item.item_id && item.quantity, (item) => item.item_id && item.quantity,
); );
@@ -124,6 +129,11 @@ function ReceiptForm({
if (submitPayload.resetForm) { if (submitPayload.resetForm) {
resetFormState(); resetFormState();
} }
if (submitPayload.deliverMail) {
openDialog(DialogsName.ReceiptFormMailDeliver, {
receiptId: response.data.id,
});
}
}; };
// Handle the request error. // Handle the request error.
@@ -179,6 +189,7 @@ function ReceiptForm({
} }
export default compose( export default compose(
withDialogActions,
withDashboardActions, withDashboardActions,
withSettings(({ receiptSettings }) => ({ withSettings(({ receiptSettings }) => ({
receiptNextNumber: receiptSettings?.nextNumber, receiptNextNumber: receiptSettings?.nextNumber,

View File

@@ -2,6 +2,8 @@
import React from 'react'; import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import ReceiptNumberDialog from '@/containers/Dialogs/ReceiptNumberDialog'; import ReceiptNumberDialog from '@/containers/Dialogs/ReceiptNumberDialog';
import ReceiptFormMailDeliverDialog from './Dialogs/ReceiptFormMailDeliverDialog';
import { DialogsName } from '@/constants/dialogs';
/** /**
* Receipt form dialogs. * Receipt form dialogs.
@@ -27,6 +29,9 @@ export default function ReceiptFormDialogs() {
dialogName={'receipt-number-form'} dialogName={'receipt-number-form'}
onConfirm={handleReceiptNumberFormConfirm} onConfirm={handleReceiptNumberFormConfirm}
/> />
<ReceiptFormMailDeliverDialog
dialogName={DialogsName.ReceiptFormMailDeliver}
/>
</> </>
); );
} }

View File

@@ -33,7 +33,7 @@ export default function ReceiptFormFloatingActions() {
// Handle submit & close button click. // Handle submit & close button click.
const handleSubmitCloseBtnClick = (event) => { const handleSubmitCloseBtnClick = (event) => {
setSubmitPayload({ redirect: true, status: true }); setSubmitPayload({ redirect: false, deliverMail: true, status: true });
submitForm(); submitForm();
}; };

View File

@@ -4,21 +4,16 @@ import { Dialog, DialogSuspense } from '@/components';
import withDialogRedux from '@/components/DialogReduxConnect'; import withDialogRedux from '@/components/DialogReduxConnect';
import { compose } from '@/utils'; import { compose } from '@/utils';
const ReceiptMailDialogContent = React.lazy( const ReceiptMailDialogBody = React.lazy(
() => import('./ReceiptMailDialogContent'), () => import('./ReceiptMailDialogBody'),
); );
/** /**
* Invoice mail dialog. * Receipt mail dialog.
*/ */
function ReceiptMailDialog({ function ReceiptMailDialog({
dialogName, dialogName,
payload: { payload: { receiptId = null },
receiptId = null,
// Redirects to receipts list after mail submitting.
redirectToReceiptsList = false,
},
isOpen, isOpen,
}) { }) {
return ( return (
@@ -31,11 +26,7 @@ function ReceiptMailDialog({
style={{ width: 600 }} style={{ width: 600 }}
> >
<DialogSuspense> <DialogSuspense>
<ReceiptMailDialogContent <ReceiptMailDialogBody receiptId={receiptId} />
dialogName={dialogName}
receiptId={receiptId}
redirectToReceiptsList={redirectToReceiptsList}
/>
</DialogSuspense> </DialogSuspense>
</Dialog> </Dialog>
); );

View File

@@ -0,0 +1,33 @@
// @ts-nocheck
import * as R from 'ramda';
import withDialogActions from '@/containers/Dialog/withDialogActions';
import ReceiptMailDialogContent, {
ReceiptMailDialogContentProps,
} from './ReceiptMailDialogContent';
import { DialogsName } from '@/constants/dialogs';
interface ReceiptMailDialogBodyProps extends ReceiptMailDialogContentProps {}
function ReceiptMailDialogBodyRoot({
receiptId,
// #withDialogActions
closeDialog,
}: ReceiptMailDialogBodyProps) {
const handleCancelClick = () => {
closeDialog(DialogsName.ReceiptMail);
};
const handleSubmitClick = () => {
closeDialog(DialogsName.ReceiptMail);
};
return (
<ReceiptMailDialogContent
receiptId={receiptId}
onFormSubmit={handleSubmitClick}
onCancelClick={handleCancelClick}
/>
);
}
export default R.compose(withDialogActions)(ReceiptMailDialogBodyRoot);

View File

@@ -2,22 +2,22 @@ import React from 'react';
import { ReceiptMailDialogBoot } from './ReceiptMailDialogBoot'; import { ReceiptMailDialogBoot } from './ReceiptMailDialogBoot';
import { ReceiptMailDialogForm } from './ReceiptMailDialogForm'; import { ReceiptMailDialogForm } from './ReceiptMailDialogForm';
interface ReceiptMailDialogContentProps { export interface ReceiptMailDialogContentProps {
dialogName: string;
receiptId: number; receiptId: number;
redirectToReceiptsList?: boolean; onFormSubmit?: () => void;
onCancelClick?: () => void;
} }
export default function ReceiptMailDialogContent({ export default function ReceiptMailDialogContent({
dialogName,
receiptId, receiptId,
redirectToReceiptsList = false, onFormSubmit,
onCancelClick
}: ReceiptMailDialogContentProps) { }: ReceiptMailDialogContentProps) {
return ( return (
<ReceiptMailDialogBoot <ReceiptMailDialogBoot receiptId={receiptId}>
receiptId={receiptId} <ReceiptMailDialogForm
redirectToReceiptsList={redirectToReceiptsList} onFormSubmit={onFormSubmit}
> onCancelClick={onCancelClick}
<ReceiptMailDialogForm /> />
</ReceiptMailDialogBoot> </ReceiptMailDialogBoot>
); );
} }

View File

@@ -2,7 +2,6 @@
import { Formik, FormikBag } from 'formik'; import { Formik, FormikBag } from 'formik';
import * as R from 'ramda'; import * as R from 'ramda';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { useHistory } from 'react-router-dom';
import { useReceiptMailDialogBoot } from './ReceiptMailDialogBoot'; import { useReceiptMailDialogBoot } from './ReceiptMailDialogBoot';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
import { DialogsName } from '@/constants/dialogs'; import { DialogsName } from '@/constants/dialogs';
@@ -24,12 +23,18 @@ interface ReceiptMailFormValues extends MailNotificationFormValues {
attachReceipt: boolean; attachReceipt: boolean;
} }
function ReceiptMailDialogFormRoot({ closeDialog }) { interface ReceiptMailDialogFormProps {
const { mailOptions, saleReceiptId, redirectToReceiptsList } = onFormSubmit?: () => void;
useReceiptMailDialogBoot(); onCancelClick?: () => void;
const { mutateAsync: sendReceiptMail } = useSendSaleReceiptMail(); }
const history = useHistory(); export function ReceiptMailDialogForm({
// #props
onFormSubmit,
onCancelClick,
}: ReceiptMailDialogFormProps) {
const { mailOptions, saleReceiptId } = useReceiptMailDialogBoot();
const { mutateAsync: sendReceiptMail } = useSendSaleReceiptMail();
// Transformes mail options to initial form values. // Transformes mail options to initial form values.
const initialValues = transformMailFormToInitialValues( const initialValues = transformMailFormToInitialValues(
@@ -50,12 +55,8 @@ function ReceiptMailDialogFormRoot({ closeDialog }) {
message: 'The mail notification has been sent successfully.', message: 'The mail notification has been sent successfully.',
intent: Intent.SUCCESS, intent: Intent.SUCCESS,
}); });
closeDialog(DialogsName.ReceiptMail);
setSubmitting(false); setSubmitting(false);
onFormSubmit && onFormSubmit(values);
if (redirectToReceiptsList) {
history.push('/receipts');
}
}) })
.catch(() => { .catch(() => {
AppToaster.show({ AppToaster.show({
@@ -67,7 +68,7 @@ function ReceiptMailDialogFormRoot({ closeDialog }) {
}; };
// Handle the close button click. // Handle the close button click.
const handleClose = () => { const handleClose = () => {
closeDialog(DialogsName.ReceiptMail); onCancelClick && onCancelClick();
}; };
return ( return (
@@ -76,7 +77,3 @@ function ReceiptMailDialogFormRoot({ closeDialog }) {
</Formik> </Formik>
); );
} }
export const ReceiptMailDialogForm = R.compose(withDialogActions)(
ReceiptMailDialogFormRoot,
);