IO-1492 Add estimator Presets
This commit is contained in:
@@ -8019,6 +8019,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>estimators</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>insurancecos</name>
|
<name>insurancecos</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -17449,6 +17470,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>changestimator</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>convert</name>
|
<name>convert</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export const PhoneItemFormatterValidation = (getFieldValue, name) => ({
|
|||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
} else {
|
} else {
|
||||||
const p = parsePhoneNumber(value, "CA");
|
const p = parsePhoneNumber(value, "CA");
|
||||||
if (p.isValid()) {
|
if (p && p.isValid()) {
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
} else {
|
} else {
|
||||||
return Promise.reject(i18n.t("general.validation.invalidphone"));
|
return Promise.reject(i18n.t("general.validation.invalidphone"));
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
|
import { Dropdown, Menu } from "antd";
|
||||||
|
import React from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
|
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
});
|
||||||
|
|
||||||
|
export function JobsDetailChangeEstimator({ disabled, form, bodyshop }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const handleClick = ({ item, key, keyPath }) => {
|
||||||
|
const est = item.props.value;
|
||||||
|
form.setFieldsValue(est);
|
||||||
|
};
|
||||||
|
|
||||||
|
const menu = (
|
||||||
|
<div>
|
||||||
|
<Menu onClick={handleClick}>
|
||||||
|
{bodyshop.md_estimators.map((est, idx) => (
|
||||||
|
<Menu.Item value={est} key={idx}>
|
||||||
|
{`${est.est_ct_fn} ${est.est_ct_ln}`}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Dropdown overlay={menu} disabled={disabled}>
|
||||||
|
<a
|
||||||
|
className="ant-dropdown-link"
|
||||||
|
href=" #"
|
||||||
|
onClick={(e) => e.preventDefault()}
|
||||||
|
>
|
||||||
|
{t("jobs.actions.changestimator")} <DownOutlined />
|
||||||
|
</a>
|
||||||
|
</Dropdown>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, null)(JobsDetailChangeEstimator);
|
||||||
@@ -1,4 +1,14 @@
|
|||||||
import { Col, Form, Input, InputNumber, Row, Select, Switch } from "antd";
|
import {
|
||||||
|
Col,
|
||||||
|
Divider,
|
||||||
|
Form,
|
||||||
|
Input,
|
||||||
|
InputNumber,
|
||||||
|
Row,
|
||||||
|
Select,
|
||||||
|
Space,
|
||||||
|
Switch,
|
||||||
|
} from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
@@ -12,6 +22,7 @@ import FormItemPhone, {
|
|||||||
PhoneItemFormatterValidation,
|
PhoneItemFormatterValidation,
|
||||||
} from "../form-items-formatted/phone-form-item.component";
|
} from "../form-items-formatted/phone-form-item.component";
|
||||||
import Car from "../job-damage-visual/job-damage-visual.component";
|
import Car from "../job-damage-visual/job-damage-visual.component";
|
||||||
|
import JobsDetailChangeEstimator from "../jobs-detail-change-estimator/jobs-detail-change-estimator.component";
|
||||||
import FormRow from "../layout-form-row/layout-form-row.component";
|
import FormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -194,8 +205,16 @@ export function JobsDetailGeneral({ bodyshop, jobRO, job, form }) {
|
|||||||
)}
|
)}
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
<Divider
|
||||||
|
orientation="left"
|
||||||
|
type="horizontal"
|
||||||
|
style={{ marginTop: ".8rem", float: "right" }}
|
||||||
|
>
|
||||||
|
{t("jobs.forms.appraiserinfo")}
|
||||||
|
</Divider>
|
||||||
|
|
||||||
<FormRow header={t("jobs.forms.appraiserinfo")}>
|
<JobsDetailChangeEstimator form={form} disabled={jobRO} />
|
||||||
|
<FormRow noDivider>
|
||||||
<Form.Item label={t("jobs.fields.est_co_nm")} name="est_co_nm">
|
<Form.Item label={t("jobs.fields.est_co_nm")} name="est_co_nm">
|
||||||
<Input disabled={jobRO} />
|
<Input disabled={jobRO} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|||||||
@@ -124,7 +124,6 @@ export function JobsDetailRates({ jobRO, form, job, bodyshop }) {
|
|||||||
{t("jobs.forms.laborrates")}
|
{t("jobs.forms.laborrates")}
|
||||||
</Divider>
|
</Divider>
|
||||||
<Space>
|
<Space>
|
||||||
<div></div>
|
|
||||||
<JobsDetailRatesChangeButton form={form} disabled={jobRO} />
|
<JobsDetailRatesChangeButton form={form} disabled={jobRO} />
|
||||||
<JobsMarkPstExempt form={form} />
|
<JobsMarkPstExempt form={form} />
|
||||||
</Space>
|
</Space>
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ import PhoneFormItem, {
|
|||||||
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
|
||||||
|
import FormItemEmail from "../form-items-formatted/email-form-item.component";
|
||||||
|
|
||||||
export default function ShopInfoGeneral({ form }) {
|
export default function ShopInfoGeneral({ form }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
return (
|
return (
|
||||||
@@ -706,7 +708,7 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Space wrap>
|
<Space>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.md_ins_co.zip")}
|
label={t("bodyshop.fields.md_ins_co.zip")}
|
||||||
key={`${index}zip`}
|
key={`${index}zip`}
|
||||||
@@ -744,6 +746,95 @@ export default function ShopInfoGeneral({ form }) {
|
|||||||
}}
|
}}
|
||||||
</Form.List>
|
</Form.List>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
<LayoutFormRow grow header={t("bodyshop.labels.estimators")}>
|
||||||
|
<Form.List name={["md_estimators"]}>
|
||||||
|
{(fields, { add, remove, move }) => {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{fields.map((field, index) => (
|
||||||
|
<Form.Item key={field.key}>
|
||||||
|
<LayoutFormRow noDivider>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.est_co_nm")}
|
||||||
|
key={`${index}est_co_nm`}
|
||||||
|
name={[field.name, "est_co_nm"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.est_ct_fn")}
|
||||||
|
key={`${index}est_ct_fn`}
|
||||||
|
name={[field.name, "est_ct_fn"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.est_ct_ln")}
|
||||||
|
key={`${index}est_ct_ln`}
|
||||||
|
name={[field.name, "est_ct_ln"]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.est_ph1")}
|
||||||
|
key={`${index}est_ph1`}
|
||||||
|
name={[field.name, "est_ph1"]}
|
||||||
|
rules={[
|
||||||
|
({ getFieldValue }) =>
|
||||||
|
PhoneItemFormatterValidation(getFieldValue, [
|
||||||
|
field.name,
|
||||||
|
"est_ph",
|
||||||
|
]),
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("jobs.fields.est_ea")}
|
||||||
|
key={`${index}est_ea`}
|
||||||
|
name={[field.name, "est_ea"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
type: "email",
|
||||||
|
message: "This is not a valid email address.",
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<FormItemEmail
|
||||||
|
email={form.getFieldValue([field.name, "est_ea"])}
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
<Space>
|
||||||
|
<DeleteFilled
|
||||||
|
onClick={() => {
|
||||||
|
remove(field.name);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<FormListMoveArrows
|
||||||
|
move={move}
|
||||||
|
index={index}
|
||||||
|
total={fields.length}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
</LayoutFormRow>
|
||||||
|
</Form.Item>
|
||||||
|
))}
|
||||||
|
<Form.Item>
|
||||||
|
<Button
|
||||||
|
type="dashed"
|
||||||
|
onClick={() => {
|
||||||
|
add();
|
||||||
|
}}
|
||||||
|
style={{ width: "100%" }}
|
||||||
|
>
|
||||||
|
{t("general.actions.add")}
|
||||||
|
</Button>
|
||||||
|
</Form.Item>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.List>
|
||||||
|
</LayoutFormRow>
|
||||||
<LayoutFormRow grow header={t("bodyshop.fields.md_ccc_rates")}>
|
<LayoutFormRow grow header={t("bodyshop.fields.md_ccc_rates")}>
|
||||||
<Form.List name={["md_ccc_rates"]}>
|
<Form.List name={["md_ccc_rates"]}>
|
||||||
{(fields, { add, remove, move }) => {
|
{(fields, { add, remove, move }) => {
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ export const QUERY_BODYSHOP = gql`
|
|||||||
attach_pdf_to_email
|
attach_pdf_to_email
|
||||||
tt_allow_post_to_invoiced
|
tt_allow_post_to_invoiced
|
||||||
cdk_configuration
|
cdk_configuration
|
||||||
|
md_estimators
|
||||||
employees {
|
employees {
|
||||||
id
|
id
|
||||||
active
|
active
|
||||||
@@ -184,6 +185,7 @@ export const UPDATE_SHOP = gql`
|
|||||||
attach_pdf_to_email
|
attach_pdf_to_email
|
||||||
tt_allow_post_to_invoiced
|
tt_allow_post_to_invoiced
|
||||||
cdk_configuration
|
cdk_configuration
|
||||||
|
md_estimators
|
||||||
employees {
|
employees {
|
||||||
id
|
id
|
||||||
first_name
|
first_name
|
||||||
|
|||||||
@@ -499,6 +499,7 @@
|
|||||||
},
|
},
|
||||||
"emaillater": "Email Later",
|
"emaillater": "Email Later",
|
||||||
"employees": "Employees",
|
"employees": "Employees",
|
||||||
|
"estimators": "Estimators",
|
||||||
"insurancecos": "Insurance Companies",
|
"insurancecos": "Insurance Companies",
|
||||||
"intakechecklist": "Intake Checklist",
|
"intakechecklist": "Intake Checklist",
|
||||||
"jobstatuses": "Job Statuses",
|
"jobstatuses": "Job Statuses",
|
||||||
@@ -1089,6 +1090,7 @@
|
|||||||
"autoallocate": "Auto Allocate",
|
"autoallocate": "Auto Allocate",
|
||||||
"changelaborrate": "Change Labor Rate",
|
"changelaborrate": "Change Labor Rate",
|
||||||
"changestatus": "Change Status",
|
"changestatus": "Change Status",
|
||||||
|
"changestimator": "Change Estimator",
|
||||||
"convert": "Convert",
|
"convert": "Convert",
|
||||||
"deliver": "Deliver",
|
"deliver": "Deliver",
|
||||||
"dms": {
|
"dms": {
|
||||||
|
|||||||
@@ -499,6 +499,7 @@
|
|||||||
},
|
},
|
||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
"employees": "",
|
"employees": "",
|
||||||
|
"estimators": "",
|
||||||
"insurancecos": "",
|
"insurancecos": "",
|
||||||
"intakechecklist": "",
|
"intakechecklist": "",
|
||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
@@ -1089,6 +1090,7 @@
|
|||||||
"autoallocate": "",
|
"autoallocate": "",
|
||||||
"changelaborrate": "",
|
"changelaborrate": "",
|
||||||
"changestatus": "Cambiar Estado",
|
"changestatus": "Cambiar Estado",
|
||||||
|
"changestimator": "",
|
||||||
"convert": "Convertir",
|
"convert": "Convertir",
|
||||||
"deliver": "",
|
"deliver": "",
|
||||||
"dms": {
|
"dms": {
|
||||||
|
|||||||
@@ -499,6 +499,7 @@
|
|||||||
},
|
},
|
||||||
"emaillater": "",
|
"emaillater": "",
|
||||||
"employees": "",
|
"employees": "",
|
||||||
|
"estimators": "",
|
||||||
"insurancecos": "",
|
"insurancecos": "",
|
||||||
"intakechecklist": "",
|
"intakechecklist": "",
|
||||||
"jobstatuses": "",
|
"jobstatuses": "",
|
||||||
@@ -1089,6 +1090,7 @@
|
|||||||
"autoallocate": "",
|
"autoallocate": "",
|
||||||
"changelaborrate": "",
|
"changelaborrate": "",
|
||||||
"changestatus": "Changer le statut",
|
"changestatus": "Changer le statut",
|
||||||
|
"changestimator": "",
|
||||||
"convert": "Convertir",
|
"convert": "Convertir",
|
||||||
"deliver": "",
|
"deliver": "",
|
||||||
"dms": {
|
"dms": {
|
||||||
|
|||||||
@@ -824,6 +824,7 @@
|
|||||||
- md_categories
|
- md_categories
|
||||||
- md_ccc_rates
|
- md_ccc_rates
|
||||||
- md_classes
|
- md_classes
|
||||||
|
- md_estimators
|
||||||
- md_hour_split
|
- md_hour_split
|
||||||
- md_ins_cos
|
- md_ins_cos
|
||||||
- md_jobline_presets
|
- md_jobline_presets
|
||||||
@@ -900,6 +901,7 @@
|
|||||||
- md_categories
|
- md_categories
|
||||||
- md_ccc_rates
|
- md_ccc_rates
|
||||||
- md_classes
|
- md_classes
|
||||||
|
- md_estimators
|
||||||
- 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_estimators" jsonb
|
||||||
|
-- null default jsonb_build_array();
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."bodyshops" add column "md_estimators" jsonb
|
||||||
|
null default jsonb_build_array();
|
||||||
Reference in New Issue
Block a user