mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-19 14:20:31 +00:00
feat(webapp): showing up mail popup once saving invoice, receipt and estimate
This commit is contained in:
@@ -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',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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,
|
||||||
|
);
|
||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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,
|
||||||
|
);
|
||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
|
||||||
);
|
|
||||||
|
|||||||
@@ -1 +1,2 @@
|
|||||||
export * from './InvoiceMailDialog';
|
export * from './InvoiceMailDialog';
|
||||||
|
export * from './InvoiceMailDialogContent';
|
||||||
@@ -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);
|
||||||
@@ -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,
|
||||||
|
);
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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}
|
||||||
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
|
||||||
);
|
|
||||||
|
|||||||
Reference in New Issue
Block a user