feat: estimate send mail drawer

This commit is contained in:
Ahmed Bouhuolia
2024-11-19 00:38:45 +02:00
parent 7df6aa4110
commit 7e65f3f642
11 changed files with 108 additions and 18 deletions

View File

@@ -11,7 +11,6 @@ import QuickPaymentMadeFormDialog from '@/containers/Dialogs/QuickPaymentMadeFor
import AllocateLandedCostDialog from '@/containers/Dialogs/AllocateLandedCostDialog'; import AllocateLandedCostDialog from '@/containers/Dialogs/AllocateLandedCostDialog';
import InvoicePdfPreviewDialog from '@/containers/Dialogs/InvoicePdfPreviewDialog'; import InvoicePdfPreviewDialog from '@/containers/Dialogs/InvoicePdfPreviewDialog';
import EstimatePdfPreviewDialog from '@/containers/Dialogs/EstimatePdfPreviewDialog'; import EstimatePdfPreviewDialog from '@/containers/Dialogs/EstimatePdfPreviewDialog';
import ReceiptPdfPreviewDialog from '@/containers/Dialogs/ReceiptPdfPreviewDialog';
import MoneyInDialog from '@/containers/CashFlow/MoneyInDialog'; import MoneyInDialog from '@/containers/CashFlow/MoneyInDialog';
import MoneyOutDialog from '@/containers/CashFlow/MoneyOutDialog'; import MoneyOutDialog from '@/containers/CashFlow/MoneyOutDialog';
import BadDebtDialog from '@/containers/Dialogs/BadDebtDialog'; import BadDebtDialog from '@/containers/Dialogs/BadDebtDialog';
@@ -45,7 +44,6 @@ import ProjectBillableEntriesFormDialog from '@/containers/Projects/containers/P
import TaxRateFormDialog from '@/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialog'; import TaxRateFormDialog from '@/containers/TaxRates/dialogs/TaxRateFormDialog/TaxRateFormDialog';
import { DialogsName } from '@/constants/dialogs'; import { DialogsName } from '@/constants/dialogs';
import InvoiceExchangeRateChangeDialog from '@/containers/Sales/Invoices/InvoiceForm/Dialogs/InvoiceExchangeRateChangeDialog'; import InvoiceExchangeRateChangeDialog from '@/containers/Sales/Invoices/InvoiceForm/Dialogs/InvoiceExchangeRateChangeDialog';
import ReceiptMailDialog from '@/containers/Sales/Receipts/ReceiptMailDialog/ReceiptMailDialog';
import PaymentMailDialog from '@/containers/Sales/PaymentsReceived/PaymentMailDialog/PaymentMailDialog'; import PaymentMailDialog from '@/containers/Sales/PaymentsReceived/PaymentMailDialog/PaymentMailDialog';
import { ExportDialog } from '@/containers/Dialogs/ExportDialog'; import { ExportDialog } from '@/containers/Dialogs/ExportDialog';
import { RuleFormDialog } from '@/containers/Banking/Rules/RuleFormDialog/RuleFormDialog'; import { RuleFormDialog } from '@/containers/Banking/Rules/RuleFormDialog/RuleFormDialog';
@@ -80,7 +78,6 @@ export default function DialogsContainer() {
/> />
<InvoicePdfPreviewDialog dialogName={DialogsName.InvoicePdfForm} /> <InvoicePdfPreviewDialog dialogName={DialogsName.InvoicePdfForm} />
<EstimatePdfPreviewDialog dialogName={DialogsName.EstimatePdfForm} /> <EstimatePdfPreviewDialog dialogName={DialogsName.EstimatePdfForm} />
<ReceiptPdfPreviewDialog dialogName={DialogsName.ReceiptPdfForm} />
<MoneyInDialog dialogName={DialogsName.MoneyInForm} /> <MoneyInDialog dialogName={DialogsName.MoneyInForm} />
<MoneyOutDialog dialogName={DialogsName.MoneyOutForm} /> <MoneyOutDialog dialogName={DialogsName.MoneyOutForm} />
@@ -142,7 +139,6 @@ export default function DialogsContainer() {
<InvoiceExchangeRateChangeDialog <InvoiceExchangeRateChangeDialog
dialogName={DialogsName.InvoiceExchangeRateChangeNotice} dialogName={DialogsName.InvoiceExchangeRateChangeNotice}
/> />
<ReceiptMailDialog dialogName={DialogsName.ReceiptMail} />
<PaymentMailDialog dialogName={DialogsName.PaymentMail} /> <PaymentMailDialog dialogName={DialogsName.PaymentMail} />
<ExportDialog dialogName={DialogsName.Export} /> <ExportDialog dialogName={DialogsName.Export} />
<RuleFormDialog dialogName={DialogsName.BankRuleForm} /> <RuleFormDialog dialogName={DialogsName.BankRuleForm} />

View File

@@ -33,6 +33,7 @@ import { BrandingTemplatesDrawer } from '@/containers/BrandingTemplates/Branding
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
import { InvoiceSendMailDrawer } from '@/containers/Sales/Invoices/InvoiceSendMailDrawer/InvoiceSendMailDrawer'; import { InvoiceSendMailDrawer } from '@/containers/Sales/Invoices/InvoiceSendMailDrawer/InvoiceSendMailDrawer';
import { EstimateSendMailDrawer } from '@/containers/Sales/Estimates/EstimateSendMailDrawer'; import { EstimateSendMailDrawer } from '@/containers/Sales/Estimates/EstimateSendMailDrawer';
import { ReceiptSendMailDrawer } from '@/containers/Sales/Receipts/ReceiptSendMailDrawer';
/** /**
* Drawers container of the dashboard. * Drawers container of the dashboard.
@@ -83,6 +84,7 @@ export default function DrawersContainer() {
<BrandingTemplatesDrawer name={DRAWERS.BRANDING_TEMPLATES} /> <BrandingTemplatesDrawer name={DRAWERS.BRANDING_TEMPLATES} />
<InvoiceSendMailDrawer name={DRAWERS.INVOICE_SEND_MAIL} /> <InvoiceSendMailDrawer name={DRAWERS.INVOICE_SEND_MAIL} />
<EstimateSendMailDrawer name={DRAWERS.ESTIMATE_SEND_MAIL} /> <EstimateSendMailDrawer name={DRAWERS.ESTIMATE_SEND_MAIL} />
<ReceiptSendMailDrawer name={DRAWERS.RECEIPT_SEND_MAIL} />
</div> </div>
); );
} }

View File

@@ -36,4 +36,5 @@ export enum DRAWERS {
STRIPE_PAYMENT_INTEGRATION_EDIT = 'STRIPE_PAYMENT_INTEGRATION_EDIT', STRIPE_PAYMENT_INTEGRATION_EDIT = 'STRIPE_PAYMENT_INTEGRATION_EDIT',
INVOICE_SEND_MAIL = 'INVOICE_SEND_MAIL', INVOICE_SEND_MAIL = 'INVOICE_SEND_MAIL',
ESTIMATE_SEND_MAIL = 'ESTIMATE_SEND_MAIL', ESTIMATE_SEND_MAIL = 'ESTIMATE_SEND_MAIL',
RECEIPT_SEND_MAIL = 'RECEIPT_SEND_MAIL',
} }

View File

@@ -1,7 +1,27 @@
import { Suspense } from 'react';
import { SendMailViewPreviewTabs } from '../SendMailViewDrawer/SendMailViewPreviewTabs';
import { Tab } from '@blueprintjs/core';
import { EstimateSendPdfPreviewConnected } from './EstimateSendPdfPreviewConnected';
export function EstimateSendMailPreviewTabs() { export function EstimateSendMailPreviewTabs() {
return ( return (
<h1>asdfsdf</h1> <SendMailViewPreviewTabs>
) <Tab
} id={'payment-page'}
title={'Payment page'}
panel={
<Suspense>{/* <InvoiceMailReceiptPreviewConnected /> */}</Suspense>
}
/>
<Tab
id="pdf-document"
title={'PDF document'}
panel={
<Suspense>
<EstimateSendPdfPreviewConnected />
</Suspense>
}
/>
</SendMailViewPreviewTabs>
);
}

View File

@@ -0,0 +1,13 @@
import { SendViewPreviewHeader } from '../SendMailViewDrawer/SendMailViewPreviewHeader';
export function EstimateSendMailPreviewHeader() {
return (
<SendViewPreviewHeader
companyName="A"
customerName="A"
subject={'adsfsdf'}
from={['a.bouhuolia@gmail.com']}
to={['a.bouhuolia@gmail.com']}
/>
);
}

View File

@@ -0,0 +1,31 @@
import { Spinner } from '@blueprintjs/core';
import { Stack } from '@/components';
import { useGetSaleEstimateHtml } from '@/hooks/query';
import { EstimateSendMailPreviewHeader } from './EstimateSendMailPreviewHeader';
import { SendMailViewPreviewPdfIframe } from '../SendMailViewDrawer/SendMailViewPreviewPdfIframe';
import { useDrawerContext } from '@/components/Drawer/DrawerProvider';
export function EstimateSendPdfPreviewConnected() {
return (
<Stack>
<EstimateSendMailPreviewHeader />
<Stack px={4} py={6}>
<EstimateSendPdfPreviewIframe />
</Stack>
</Stack>
);
}
function EstimateSendPdfPreviewIframe() {
const { payload } = useDrawerContext();
const { data, isLoading } = useGetSaleEstimateHtml(payload?.estimateId);
if (isLoading && data) {
return <Spinner size={20} />;
}
const iframeSrcDoc = data?.htmlContent;
return <SendMailViewPreviewPdfIframe srcDoc={iframeSrcDoc} />;
}

View File

@@ -1,3 +1,4 @@
// @ts-nocheck
import React, { createContext, useContext } from 'react'; import React, { createContext, useContext } from 'react';
import { Spinner } from '@blueprintjs/core'; import { Spinner } from '@blueprintjs/core';
import { useDrawerContext } from '@/components/Drawer/DrawerProvider'; import { useDrawerContext } from '@/components/Drawer/DrawerProvider';

View File

@@ -7,13 +7,13 @@ import { ReceiptSendMailForm } from './ReceiptSendMailForm';
import { ReceiptSendMailFormFields } from './ReceiptSendMailFormFields'; import { ReceiptSendMailFormFields } from './ReceiptSendMailFormFields';
import { ReceiptSendMailPreviewTabs } from './ReceiptSendMailPreviewTabs'; import { ReceiptSendMailPreviewTabs } from './ReceiptSendMailPreviewTabs';
export function InvoiceSendMailContent() { export function ReceiptSendMailContent() {
return ( return (
<Stack className={Classes.DRAWER_BODY}> <Stack className={Classes.DRAWER_BODY}>
<ReceiptSendMailBoot> <ReceiptSendMailBoot>
<ReceiptSendMailForm> <ReceiptSendMailForm>
<SendMailViewLayout <SendMailViewLayout
header={<SendMailViewHeader label={'Send Invoice Mail'} />} header={<SendMailViewHeader label={'Send Receipt Mail'} />}
fields={<ReceiptSendMailFormFields />} fields={<ReceiptSendMailFormFields />}
preview={<ReceiptSendMailPreviewTabs />} preview={<ReceiptSendMailPreviewTabs />}
/> />

View File

@@ -1,3 +1,4 @@
// @ts-nocheck
import { Form, Formik, FormikHelpers } from 'formik'; import { Form, Formik, FormikHelpers } from 'formik';
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';

View File

@@ -1,6 +1,3 @@
export function ReceiptSendMailPreviewTabs() { export function ReceiptSendMailPreviewTabs() {
return null; return null;
} }

View File

@@ -258,10 +258,10 @@ export function useSendSaleEstimateMail(props = {}) {
} }
/** /**
* *
* @param {number} estimateId * @param {number} estimateId
* @param props * @param props
* @returns * @returns
*/ */
export function useSaleEstimateMailState(estimateId: number, props?= {}) { export function useSaleEstimateMailState(estimateId: number, props?= {}) {
const apiRequest = useApiRequest(); const apiRequest = useApiRequest();
@@ -290,3 +290,31 @@ export function useGetSaleEstimatesState(
{ ...options }, { ...options },
); );
} }
interface GetEstimateHtmlResponse {
htmlContent: string;
}
/**
* Retrieves the sale estimate html content.
* @param {number} invoiceId
* @param {UseQueryOptions<GetEstimateHtmlResponse>} options
* @returns {UseQueryResult<GetEstimateHtmlResponse>}
*/
export const useGetSaleEstimateHtml = (
estimateId: number,
options?: UseQueryOptions<GetEstimateHtmlResponse>,
): UseQueryResult<GetEstimateHtmlResponse> => {
const apiRequest = useApiRequest();
return useQuery<GetEstimateHtmlResponse>(
['SALE_ESTIMATE_HTML', estimateId],
() =>
apiRequest
.get(`sales/estimates/${estimateId}`, {
headers: {
Accept: 'application/json+html',
},
})
.then((res) => transformToCamelCase(res.data)),
);
};