Merged in release/2022-03-25 (pull request #431)
release/2022-03-25 Approved-by: Patrick Fic
This commit is contained in:
@@ -4598,6 +4598,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>md_from_emails</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
<name>md_hour_split</name>
|
<name>md_hour_split</name>
|
||||||
<children>
|
<children>
|
||||||
@@ -13231,6 +13252,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>from</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>subject</name>
|
<name>subject</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -16,9 +16,14 @@ import EmailDocumentsComponent from "../email-documents/email-documents.componen
|
|||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import {
|
||||||
|
selectBodyshop,
|
||||||
|
selectCurrentUser,
|
||||||
|
} from "../../redux/user/user.selectors";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
|
currentUser: selectCurrentUser,
|
||||||
});
|
});
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
||||||
@@ -28,7 +33,12 @@ export default connect(
|
|||||||
mapDispatchToProps
|
mapDispatchToProps
|
||||||
)(EmailOverlayComponent);
|
)(EmailOverlayComponent);
|
||||||
|
|
||||||
export function EmailOverlayComponent({ form, selectedMediaState, bodyshop }) {
|
export function EmailOverlayComponent({
|
||||||
|
form,
|
||||||
|
selectedMediaState,
|
||||||
|
bodyshop,
|
||||||
|
currentUser,
|
||||||
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const handleClick = ({ item, key, keyPath }) => {
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
const email = item.props.value;
|
const email = item.props.value;
|
||||||
@@ -51,6 +61,27 @@ export function EmailOverlayComponent({ form, selectedMediaState, bodyshop }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
<Form.Item
|
||||||
|
label={t("emails.fields.from")}
|
||||||
|
name="from"
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select>
|
||||||
|
<Select.Option key={currentUser.email}>
|
||||||
|
{currentUser.email}
|
||||||
|
</Select.Option>
|
||||||
|
<Select.Option key={bodyshop.email}>{bodyshop.email}</Select.Option>
|
||||||
|
{bodyshop.md_from_emails &&
|
||||||
|
bodyshop.md_from_emails.map((e) => (
|
||||||
|
<Select.Option key={e}>{e}</Select.Option>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={
|
label={
|
||||||
<Space>
|
<Space>
|
||||||
|
|||||||
@@ -56,13 +56,9 @@ export function EmailOverlayContainer({
|
|||||||
: bodyshop.shopname,
|
: bodyshop.shopname,
|
||||||
address: EmailSettings.fromAddress,
|
address: EmailSettings.fromAddress,
|
||||||
},
|
},
|
||||||
ReplyTo: {
|
|
||||||
Email: currentUser.validemail ? currentUser.email : bodyshop.email,
|
|
||||||
Name: currentUser.displayName,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async (allValues) => {
|
||||||
logImEXEvent("email_send_from_modal");
|
logImEXEvent("email_send_from_modal");
|
||||||
|
|
||||||
//const attachments = [];
|
//const attachments = [];
|
||||||
@@ -77,10 +73,15 @@ export function EmailOverlayContainer({
|
|||||||
// attachments.push(t);
|
// attachments.push(t);
|
||||||
// });
|
// });
|
||||||
|
|
||||||
|
const { from, ...values } = allValues;
|
||||||
setSending(true);
|
setSending(true);
|
||||||
try {
|
try {
|
||||||
await axios.post("/sendemail", {
|
await axios.post("/sendemail", {
|
||||||
...defaultEmailFrom,
|
...defaultEmailFrom,
|
||||||
|
ReplyTo: {
|
||||||
|
Email: from,
|
||||||
|
Name: currentUser.displayName,
|
||||||
|
},
|
||||||
...values,
|
...values,
|
||||||
html: rawHtml,
|
html: rawHtml,
|
||||||
attachments: [
|
attachments: [
|
||||||
@@ -138,6 +139,7 @@ export function EmailOverlayContainer({
|
|||||||
}
|
}
|
||||||
|
|
||||||
form.setFieldsValue({
|
form.setFieldsValue({
|
||||||
|
from: currentUser.validemail ? currentUser.email : bodyshop.email,
|
||||||
...emailConfig.messageOptions,
|
...emailConfig.messageOptions,
|
||||||
cc:
|
cc:
|
||||||
emailConfig.messageOptions.cc &&
|
emailConfig.messageOptions.cc &&
|
||||||
|
|||||||
@@ -507,6 +507,19 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
>
|
>
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
name={["md_from_emails"]}
|
||||||
|
label={t("bodyshop.fields.md_from_emails")}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
//message: t("general.validation.required"),
|
||||||
|
type: "array",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Select mode="tags" />
|
||||||
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
name={["md_email_cc", "parts_order"]}
|
name={["md_email_cc", "parts_order"]}
|
||||||
label={t("bodyshop.fields.md_email_cc", { template: "parts_order" })}
|
label={t("bodyshop.fields.md_email_cc", { template: "parts_order" })}
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ export const QUERY_BODYSHOP = gql`
|
|||||||
md_email_cc
|
md_email_cc
|
||||||
timezone
|
timezone
|
||||||
ss_configuration
|
ss_configuration
|
||||||
|
md_from_emails
|
||||||
employees {
|
employees {
|
||||||
user_email
|
user_email
|
||||||
id
|
id
|
||||||
@@ -201,6 +202,7 @@ export const UPDATE_SHOP = gql`
|
|||||||
md_email_cc
|
md_email_cc
|
||||||
timezone
|
timezone
|
||||||
ss_configuration
|
ss_configuration
|
||||||
|
md_from_emails
|
||||||
employees {
|
employees {
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
|
|||||||
@@ -285,6 +285,7 @@
|
|||||||
"md_classes": "Classes",
|
"md_classes": "Classes",
|
||||||
"md_ded_notes": "Deductible Notes",
|
"md_ded_notes": "Deductible Notes",
|
||||||
"md_email_cc": "Auto Email CC: $t(printcenter.subjects.jobs.{{template}})",
|
"md_email_cc": "Auto Email CC: $t(printcenter.subjects.jobs.{{template}})",
|
||||||
|
"md_from_emails": "Additional From Emails",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "Paint Hour Split",
|
"paint": "Paint Hour Split",
|
||||||
"prep": "Prep Hour Split"
|
"prep": "Prep Hour Split"
|
||||||
@@ -830,6 +831,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "CC",
|
"cc": "CC",
|
||||||
|
"from": "From",
|
||||||
"subject": "Subject",
|
"subject": "Subject",
|
||||||
"to": "To"
|
"to": "To"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -285,6 +285,7 @@
|
|||||||
"md_classes": "",
|
"md_classes": "",
|
||||||
"md_ded_notes": "",
|
"md_ded_notes": "",
|
||||||
"md_email_cc": "",
|
"md_email_cc": "",
|
||||||
|
"md_from_emails": "",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "",
|
"paint": "",
|
||||||
"prep": ""
|
"prep": ""
|
||||||
@@ -830,6 +831,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "",
|
"cc": "",
|
||||||
|
"from": "",
|
||||||
"subject": "",
|
"subject": "",
|
||||||
"to": ""
|
"to": ""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -285,6 +285,7 @@
|
|||||||
"md_classes": "",
|
"md_classes": "",
|
||||||
"md_ded_notes": "",
|
"md_ded_notes": "",
|
||||||
"md_email_cc": "",
|
"md_email_cc": "",
|
||||||
|
"md_from_emails": "",
|
||||||
"md_hour_split": {
|
"md_hour_split": {
|
||||||
"paint": "",
|
"paint": "",
|
||||||
"prep": ""
|
"prep": ""
|
||||||
@@ -830,6 +831,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"cc": "",
|
"cc": "",
|
||||||
|
"from": "",
|
||||||
"subject": "",
|
"subject": "",
|
||||||
"to": ""
|
"to": ""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -834,6 +834,7 @@
|
|||||||
- md_email_cc
|
- md_email_cc
|
||||||
- md_estimators
|
- md_estimators
|
||||||
- md_filehandlers
|
- md_filehandlers
|
||||||
|
- md_from_emails
|
||||||
- md_hour_split
|
- md_hour_split
|
||||||
- md_ins_cos
|
- md_ins_cos
|
||||||
- md_jobline_presets
|
- md_jobline_presets
|
||||||
@@ -916,6 +917,7 @@
|
|||||||
- md_email_cc
|
- md_email_cc
|
||||||
- md_estimators
|
- md_estimators
|
||||||
- md_filehandlers
|
- md_filehandlers
|
||||||
|
- md_from_emails
|
||||||
- md_hour_split
|
- md_hour_split
|
||||||
- md_ins_cos
|
- md_ins_cos
|
||||||
- md_jobline_presets
|
- md_jobline_presets
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."bodyshops" add column "md_from_emails" jsonb
|
||||||
|
-- null default jsonb_build_array();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."bodyshops" add column "md_from_emails" jsonb
|
||||||
|
null default jsonb_build_array();
|
||||||
@@ -576,6 +576,7 @@ const CreateRepairOrderTag = (job, errorCallback) => {
|
|||||||
SalesTaxTotal: Dinero(job.job_totals.totals.local_tax)
|
SalesTaxTotal: Dinero(job.job_totals.totals.local_tax)
|
||||||
.add(Dinero(job.job_totals.totals.state_tax))
|
.add(Dinero(job.job_totals.totals.state_tax))
|
||||||
.add(Dinero(job.job_totals.totals.federal_tax))
|
.add(Dinero(job.job_totals.totals.federal_tax))
|
||||||
|
.add(Dinero(job.job_totals.additional.pvrt))
|
||||||
.toFormat(AHDineroFormat),
|
.toFormat(AHDineroFormat),
|
||||||
SalesTaxTotalCost: 0,
|
SalesTaxTotalCost: 0,
|
||||||
GrossTotal: Dinero(job.job_totals.totals.total_repairs).toFormat(
|
GrossTotal: Dinero(job.job_totals.totals.total_repairs).toFormat(
|
||||||
|
|||||||
Reference in New Issue
Block a user