diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 8ec8d4156..adb7a9610 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -11,7 +11,7 @@ react-intl bodyshop_translations.babel - + client @@ -1723,6 +1723,27 @@ + + open_statuses + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -1751,6 +1772,48 @@ labels + + alljobstatuses + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + allopenjobstatuses + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + jobstatuses false @@ -7986,6 +8049,32 @@ owners + + actions + + + update + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + errors @@ -8398,6 +8487,69 @@ + + fromclaim + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + fromowner + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + updateowner + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -10266,7 +10418,7 @@ en-US - + client/src tab namespaced-json true diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index 2f26506dd..04de5d41c 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -1,10 +1,20 @@ -import React from "react"; import { Table } from "antd"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; +import { connect } from "react-redux"; import { Link } from "react-router-dom"; +import { createStructuredSelector } from "reselect"; +import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; -export default function OwnerDetailJobsComponent({ owner }) { +import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; + +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop +}); + +function OwnerDetailJobsComponent({ bodyshop, owner }) { const { t } = useTranslation(); + const [selectedJobs, setSelectedJobs] = useState([]); const columns = [ { title: t("jobs.fields.ro_number"), @@ -50,10 +60,31 @@ export default function OwnerDetailJobsComponent({ owner }) { return ( ( +
+ +
+ )} pagination={{ position: "bottom" }} columns={columns.map(item => ({ ...item }))} - rowKey="id" + rowKey='id' dataSource={owner.jobs} + rowSelection={{ + onSelect: props => { + setSelectedJobs([...selectedJobs, props.id]); + }, + // type: "radio", + selectedRowKeys: selectedJobs, + getCheckboxProps: record => ({ + disabled: bodyshop.md_ro_statuses.open_statuses + ? !bodyshop.md_ro_statuses.open_statuses.includes(record.status) + : true + }) + }} /> ); } +export default connect(mapStateToProps, null)(OwnerDetailJobsComponent); diff --git a/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx new file mode 100644 index 000000000..949a92b38 --- /dev/null +++ b/client/src/components/owner-detail-update-jobs/owner-detail-update-jobs.component.jsx @@ -0,0 +1,37 @@ +import React from "react"; +import { Button } from "antd"; +import { useTranslation } from "react-i18next"; +import { useMutation } from "@apollo/react-hooks"; +import { UPDATE_JOBS } from "../../graphql/jobs.queries"; + +export default function OwnerDetailUpdateJobsComponent({ + owner, + selectedJobs +}) { + const { t } = useTranslation(); + const [updateJobs] = useMutation(UPDATE_JOBS); + const handlecClick = e => { + updateJobs({ + variables: { + jobIds: selectedJobs, + fields: { + ownr_addr1: owner["ownr_addr1"], + ownr_addr2: owner["ownr_addr2"], + ownr_co_nm: owner["ownr_co_nm"], + ownr_city: owner["ownr_city"], + ownr_ctry: owner["ownr_ctry"], + ownr_ea: owner["ownr_ea"], + ownr_fn: owner["ownr_fn"], + ownr_ph1: owner["ownr_ph1"], + ownr_ln: owner["ownr_ln"], + ownr_ph2: owner["ownr_ph2"], + ownr_st: owner["ownr_st"], + ownr_title: owner["ownr_title"], + ownr_zip: owner["ownr_zip"] + } + } + }); + }; + + return ; +} diff --git a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx index 513ded7f7..69ccc602f 100644 --- a/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx +++ b/client/src/components/owner-tag-popover/owner-tag-popover.component.jsx @@ -1,26 +1,75 @@ -import { Button, Col, Popover, Row, Tag } from "antd"; +import { Button, Col, Popover, Row, Tag, Descriptions } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; - +import PhoneFormatter from "../../utils/PhoneFormatter"; export default function OwnerTagPopoverComponent({ job }) { const { t } = useTranslation(); const content = ( -
- The Content +
-
Claim Info - Owner Info + + + {`${job.ownr_fn || + ""} ${job.ownr_ln || ""} ${job.ownr_co_nm || + ""}`} + + {job.ownr_ph1 || ""} + + + {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || + ""} ${job.ownr_city || ""} ${job.ownr_st || + ""} ${job.ownr_zip || ""} ${job.ownr_ctry || + ""} ${job.ownr_city || ""}`} + + + {job.ownr_ea || ""} + { + //TODO Should add an email formatter. + } + + + + + + {`${job + .owner.ownr_fn || ""} ${job.owner.ownr_ln || ""} ${job.owner + .ownr_co_nm || ""}`} + + {job.owner.ownr_ph1 || ""} + + + {`${job.owner.ownr_addr1 || ""} ${job.owner.ownr_addr2 || + ""} ${job.owner.ownr_city || ""} ${job.owner.ownr_st || + ""} ${job.owner.ownr_zip || ""} ${job.owner.ownr_ctry || + ""} ${job.owner.ownr_city || ""}`} + + + {job.owner.ownr_ea || ""} + { + //TODO Should add an email formatter. + } + + + - + ); return ( - - + + {job.owner ? `${job.ownr_co_nm || ""}${job.ownr_fn || ""} ${job.ownr_ln || ""}` : t("jobs.errors.noowner")} diff --git a/client/src/components/shop-info/shop-info.rostatus.component.jsx b/client/src/components/shop-info/shop-info.rostatus.component.jsx index ab22c2ee9..59d07bb89 100644 --- a/client/src/components/shop-info/shop-info.rostatus.component.jsx +++ b/client/src/components/shop-info/shop-info.rostatus.component.jsx @@ -6,7 +6,7 @@ import styled from "styled-components"; const SelectorDiv = styled.div` .ant-form-item .ant-select { - width: 125px; + width: 200px; } `; //TODO Fix up styles. @@ -24,7 +24,8 @@ export default function ShopInfoROStatusComponent({ form }) { return (
-
+ + {t("bodyshop.labels.alljobstatuses")} {(fields, { add, remove }) => { return ( @@ -32,8 +33,7 @@ export default function ShopInfoROStatusComponent({ form }) { {fields.map((field, index) => ( + style={{ padding: 0, margin: 2 }}>
+ ]}> @@ -75,6 +73,24 @@ export default function ShopInfoROStatusComponent({ form }) {
+ + + + name={["md_ro_statuses", "default_scheduled"]}> {options.map((item, idx) => ( {item} @@ -115,8 +129,7 @@ export default function ShopInfoROStatusComponent({ form }) { message: t("general.validation.required") } ]} - name={["md_ro_statuses", "default_exported"]} - > + name={["md_ro_statuses", "default_exported"]}> {options.map((item, idx) => ( {item} @@ -147,8 +159,7 @@ export default function ShopInfoROStatusComponent({ form }) { message: t("general.validation.required") } ]} - name={["md_ro_statuses", "default_invoiced"]} - > + name={["md_ro_statuses", "default_invoiced"]}> {options.map((item, idx) => ( {item} @@ -179,8 +189,7 @@ export default function ShopInfoROStatusComponent({ form }) { message: t("general.validation.required") } ]} - name={["md_ro_statuses", "default_delivered"]} - > + name={["md_ro_statuses", "default_delivered"]}>