diff --git a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx
index 994504b9e..28ecc01bb 100644
--- a/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx
+++ b/client/src/components/job-checklist/components/job-checklist-template-list/job-checklist-template-list.component.jsx
@@ -1,15 +1,13 @@
-import React from "react";
-import JobIntakeTemplateItem from "../job-checklist-template-item/job-checklist-template-item.component";
-import { useParams } from "react-router-dom";
-import RenderTemplate, {
- displayTemplateInWindow,
-} from "../../../../utils/RenderTemplate";
import { Button } from "antd";
-import { selectBodyshop } from "../../../../redux/user/user.selectors";
-import { connect } from "react-redux";
-import { createStructuredSelector } from "reselect";
+import React from "react";
import { useTranslation } from "react-i18next";
+import { connect } from "react-redux";
+import { useParams } from "react-router-dom";
+import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../../../firebase/firebase.utils";
+import { selectBodyshop } from "../../../../redux/user/user.selectors";
+import { GenerateDocument } from "../../../../utils/RenderTemplate";
+import JobIntakeTemplateItem from "../job-checklist-template-item/job-checklist-template-item.component";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
@@ -25,14 +23,14 @@ export function JobIntakeTemplateList({ bodyshop, templates }) {
const renderTemplate = async (templateKey) => {
logImEXEvent("job_checklist_template_render");
- const html = await RenderTemplate(
+ GenerateDocument(
{
name: templateKey,
variables: { id: jobId },
},
- bodyshop
+ {},
+ "p"
);
- displayTemplateInWindow(html);
};
const renderAllTemplates = () => {
diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx
index cad99e448..ca238bff1 100644
--- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx
+++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx
@@ -1,5 +1,5 @@
-import { SyncOutlined } from "@ant-design/icons";
-import { Button, Input, Table, Typography } from "antd";
+import { MailFilled, PrinterFilled, SyncOutlined } from "@ant-design/icons";
+import { Button, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -7,13 +7,15 @@ import { connect } from "react-redux";
import { useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
+import { selectJobReadOnly } from "../../redux/application/application.selectors";
import { setModalContext } from "../../redux/modals/modals.actions";
+import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter";
+import { GenerateDocument } from "../../utils/RenderTemplate";
import { alphaSort } from "../../utils/sorters";
+import { TemplateList } from "../../utils/TemplateConstants";
import PartsOrderLineBackorderButton from "../parts-order-line-backorder-button/parts-order-line-backorder-button.component";
-import { selectBodyshop } from "../../redux/user/user.selectors";
-import { selectJobReadOnly } from "../../redux/application/application.selectors";
const mapStateToProps = createStructuredSelector({
jobRO: selectJobReadOnly,
@@ -90,37 +92,67 @@ export function PartsOrderListTableComponent({
dataIndex: "actions",
key: "actions",
render: (text, record) => (
-
+
+ GenerateDocument(
+ {
+ name: record.isReturn
+ ? TemplateList().parts_return_confirmation.key
+ : TemplateList().parts_order_confirmation.key,
+ variables: { id: record.id },
+ },
+ {},
+ "p"
+ )
+ }
+ />
+
+ GenerateDocument(
+ {
+ name: record.isReturn
+ ? TemplateList().parts_return_confirmation.key
+ : TemplateList().parts_order_confirmation.key,
+ variables: { id: record.id },
+ },
+ {},
+ "e"
+ )
+ }
+ />
+
),
},
];
diff --git a/client/src/components/parts-order-modal/parts-order-modal.container.jsx b/client/src/components/parts-order-modal/parts-order-modal.container.jsx
index 06a7897be..513c7ca91 100644
--- a/client/src/components/parts-order-modal/parts-order-modal.container.jsx
+++ b/client/src/components/parts-order-modal/parts-order-modal.container.jsx
@@ -12,16 +12,14 @@ import { QUERY_ALL_VENDORS_FOR_ORDER } from "../../graphql/vendors.queries";
import { setEmailOptions } from "../../redux/email/email.actions";
import {
setModalContext,
- toggleModalVisible,
+ toggleModalVisible
} from "../../redux/modals/modals.actions";
import { selectPartsOrder } from "../../redux/modals/modals.selectors";
import {
selectBodyshop,
- selectCurrentUser,
+ selectCurrentUser
} from "../../redux/user/user.selectors";
-import RenderTemplate, {
- displayTemplateInWindow,
-} from "../../utils/RenderTemplate";
+import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
@@ -157,14 +155,9 @@ export function PartsOrderModalContainer({
const matchingVendor = data.vendors.filter(
(item) => item.id === values.vendorid
)[0];
- setEmailOptions({
- messageOptions: {
- to: matchingVendor ? [matchingVendor.email] : null,
- replyTo: bodyshop.email,
- subject: TemplateList("job", bodyshop.shopname)
- .parts_order_confirmation.subject,
- },
- template: {
+
+ GenerateDocument(
+ {
name: isReturn
? TemplateList().parts_return_confirmation.key
: TemplateList().parts_order_confirmation.key,
@@ -172,20 +165,26 @@ export function PartsOrderModalContainer({
id: insertResult.data.insert_parts_orders.returning[0].id,
},
},
- });
+ {
+ to: matchingVendor ? [matchingVendor.email] : null,
+ replyTo: bodyshop.email,
+ subject: TemplateList("job", bodyshop.shopname)
+ .parts_order_confirmation.subject,
+ },
+ "e"
+ );
} else {
- displayTemplateInWindow(
- await RenderTemplate(
- {
- name: isReturn
- ? TemplateList().parts_return_confirmation.key
- : TemplateList().parts_order_confirmation.key,
- variables: {
- id: insertResult.data.insert_parts_orders.returning[0].id,
- },
+ GenerateDocument(
+ {
+ name: isReturn
+ ? TemplateList().parts_return_confirmation.key
+ : TemplateList().parts_order_confirmation.key,
+ variables: {
+ id: insertResult.data.insert_parts_orders.returning[0].id,
},
- bodyshop
- )
+ },
+ {},
+ "p"
);
}
};
diff --git a/client/src/components/payment-modal/payment-modal.container.jsx b/client/src/components/payment-modal/payment-modal.container.jsx
index e58b1b3e3..8dece89be 100644
--- a/client/src/components/payment-modal/payment-modal.container.jsx
+++ b/client/src/components/payment-modal/payment-modal.container.jsx
@@ -9,18 +9,16 @@ import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import {
INSERT_NEW_PAYMENT,
- UPDATE_PAYMENT
+ UPDATE_PAYMENT,
} from "../../graphql/payments.queries";
import { setEmailOptions } from "../../redux/email/email.actions";
import { toggleModalVisible } from "../../redux/modals/modals.actions";
import { selectPayment } from "../../redux/modals/modals.selectors";
import {
selectBodyshop,
- selectCurrentUser
+ selectCurrentUser,
} from "../../redux/user/user.selectors";
-import RenderTemplate, {
- displayTemplateInWindow
-} from "../../utils/RenderTemplate";
+import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
import PaymentForm from "../payment-form/payment-form.component";
@@ -121,32 +119,19 @@ function BillEnterModalContainer({
notification["error"]({ message: t("payments.errors.payment") });
}
- if (sendby === "email") {
- setEmailOptions({
- messageOptions: {
- // to: [appData.email],
- replyTo: bodyshop.email,
+ GenerateDocument(
+ {
+ name: TemplateList().payment_receipt.key,
+ variables: {
+ id: newPayment.data.insert_payments.returning[0].id,
},
- template: {
- name: TemplateList().payment_receipt.key,
- variables: {
- id: newPayment.data.insert_payments.returning[0].id,
- },
- },
- });
- } else {
- displayTemplateInWindow(
- await RenderTemplate(
- {
- name: TemplateList().payment_receipt.key,
- variables: {
- id: newPayment.data.insert_payments.returning[0].id,
- },
- },
- bodyshop
- )
- );
- }
+ },
+ {
+ // to: [appData.email],
+ replyTo: bodyshop.email,
+ },
+ sendby === "email" ? "e" : "p"
+ );
} else {
const updatedPayment = await updatePayment({
variables: {
diff --git a/client/src/components/print-center-item/print-center-item.component.jsx b/client/src/components/print-center-item/print-center-item.component.jsx
index 27e225a23..1861792e6 100644
--- a/client/src/components/print-center-item/print-center-item.component.jsx
+++ b/client/src/components/print-center-item/print-center-item.component.jsx
@@ -5,7 +5,7 @@ import { createStructuredSelector } from "reselect";
import { setEmailOptions } from "../../redux/email/email.actions";
import { selectPrintCenter } from "../../redux/modals/modals.selectors";
import { selectBodyshop } from "../../redux/user/user.selectors";
-import RenderTemplate from "../../utils/RenderTemplate";
+import { GenerateDocument } from "../../utils/RenderTemplate";
const mapStateToProps = createStructuredSelector({
printCenterModal: selectPrintCenter,
bodyshop: selectBodyshop,
@@ -23,14 +23,14 @@ export function PrintCenterItemComponent({
disabled,
}) {
const renderToNewWindow = async () => {
- await RenderTemplate(
+ await GenerateDocument(
{
name: item.key,
variables: { id: id },
},
- bodyshop
+ {},
+ "p"
);
- // displayTemplateInWindow(html);
};
if (disabled) return {item.title} ;
@@ -40,15 +40,14 @@ export function PrintCenterItemComponent({
{
- setEmailOptions({
- messageOptions: {
- Subject: "",
- },
- template: {
+ GenerateDocument(
+ {
name: item.key,
variables: { id: id },
},
- });
+ {},
+ "e"
+ );
}}
/>
diff --git a/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx
index 512f78b93..7319e4f3e 100644
--- a/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx
+++ b/client/src/components/print-center-speed-print/print-center-speed-print.component.jsx
@@ -1,13 +1,11 @@
-import { Button, Typography, List } from "antd";
+import { Button, List, Typography } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { selectBodyshop } from "../../redux/user/user.selectors";
-import RenderTemplate, {
- displayTemplateInWindow,
-} from "../../utils/RenderTemplate";
+import { GenerateDocument } from "../../utils/RenderTemplate";
import { TemplateList } from "../../utils/TemplateConstants";
const mapStateToProps = createStructuredSelector({
@@ -20,17 +18,18 @@ const mapDispatchToProps = (dispatch) => ({
export function PrintCenterSpeedPrint({ bodyshop, jobId }) {
const { speedprint } = bodyshop;
const { t } = useTranslation();
+
const renderTemplate = async (templateKey) => {
logImEXEvent("speed_print_template_render");
- const html = await RenderTemplate(
+ GenerateDocument(
{
name: templateKey,
variables: { id: jobId },
},
- bodyshop
+ {},
+ "p"
);
- displayTemplateInWindow(html);
};
const renderAllTemplates = (templateKeys) => {
diff --git a/client/src/utils/RenderTemplate.js b/client/src/utils/RenderTemplate.js
index e06986c13..a5c8d98fe 100644
--- a/client/src/utils/RenderTemplate.js
+++ b/client/src/utils/RenderTemplate.js
@@ -3,6 +3,9 @@ import jsreport from "jsreport-browser-client-dist";
import client from "../utils/GraphQLClient";
import axios from "axios";
import { auth } from "../firebase/firebase.utils";
+import { TemplateList } from "./TemplateConstants";
+import { store } from "../redux/store";
+import { setEmailOptions } from "../redux/email/email.actions";
const server = process.env.REACT_APP_REPORTS_SERVER_URL;
jsreport.serverUrl = server;
@@ -120,3 +123,17 @@ export const displayTemplateInWindowNoprint = (html) => {
console.log("Unable to write to new window.", error);
}
};
+
+export const GenerateDocument = async (template, messageOptions, sendType) => {
+ const bodyshop = store.getState().user.bodyshop;
+ if (sendType === "e") {
+ store.dispatch(
+ setEmailOptions({
+ messageOptions,
+ template,
+ })
+ );
+ } else {
+ displayTemplateInWindow(await RenderTemplate(template, bodyshop));
+ }
+};