From 5a6991dad631a52e730f4a6bf7eda257d0780e94 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Thu, 14 Jan 2021 16:40:16 -0800 Subject: [PATCH] General gendoc function & reprint parts orders IO-411 --- .../job-checklist-template-list.component.jsx | 22 ++--- .../parts-order-list-table.component.jsx | 98 ++++++++++++------- .../parts-order-modal.container.jsx | 49 +++++----- .../payment-modal/payment-modal.container.jsx | 45 +++------ .../print-center-item.component.jsx | 19 ++-- .../print-center-speed-print.component.jsx | 13 ++- client/src/utils/RenderTemplate.js | 17 ++++ 7 files changed, 146 insertions(+), 117 deletions(-) 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) => ( - + }); + }} + > + {t("parts_orders.actions.receivebill")} + + + 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)); + } +};