From 05bf94e8089e728c5e8cd96762ac251abedb4f5b Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 12 Jun 2020 17:54:20 -0700 Subject: [PATCH] UI fixes for manual job creation + owners pages + vehicles pages + all jobs BOD-155 --- bodyshop_translations.babel | 178 +++++- client/src/App/App.styles.scss | 5 + .../courtesy-cars-list.component.jsx | 30 +- .../job-detail-cards.component.jsx | 3 +- .../job-detail-cards.totals.component.jsx | 2 +- .../jobs-create-jobs-info.component.jsx | 510 +++++++++--------- .../jobs-create-owner-info.component.jsx | 15 +- .../jobs-create-owner-info.container.jsx | 12 +- .../jobs-create-owner-info.new.component.jsx | 193 +++---- ...obs-create-owner-info.search.component.jsx | 67 +-- .../jobs-create-vehicle-info.component.jsx | 11 +- .../jobs-create-vehicle-info.container.jsx | 4 +- ...jobs-create-vehicle-info.new.component.jsx | 342 ++++++------ ...s-create-vehicle-info.search.component.jsx | 61 ++- .../jobs-detail-dates.component.jsx | 2 +- .../jobs-list-paginated.component.jsx | 27 +- .../jobs-list/jobs-list.component.jsx | 2 +- .../layout-form-row.component.jsx | 19 +- .../owner-detail-form.component.jsx | 173 +++--- .../owner-detail-form.container.jsx | 14 +- .../owner-detail-jobs.component.jsx | 39 +- .../owners-list/owners-list.component.jsx | 53 +- .../owners-list/owners-list.container.jsx | 6 +- .../schedule-event.component.jsx | 95 ++-- .../vehicle-detail-form.component.jsx | 236 +++++--- .../vehicle-detail-form.container.jsx | 18 +- .../vehicle-detail-jobs.component.jsx | 45 +- .../vehicles-list/vehicles-list.component.jsx | 45 +- client/src/graphql/appointments.queries.js | 1 + .../courtesy-cars.page.component.jsx | 10 +- .../courtesy-cars.page.container.jsx | 5 +- .../jobs-create/jobs-create.component.jsx | 35 +- .../jobs-create/jobs-create.container.jsx | 16 +- .../vehicles-detail.page.container.jsx | 1 + client/src/translations/en_us/common.json | 12 +- client/src/translations/es/common.json | 12 +- client/src/translations/fr/common.json | 12 +- 37 files changed, 1339 insertions(+), 972 deletions(-) diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 9074af3c9..f269fd7d8 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -11077,27 +11077,6 @@ cards - - appraiser - false - - - - - - en-US - false - - - es-MX - false - - - fr-CA - false - - - customer false @@ -13867,6 +13846,27 @@ + + ownr_co_nm + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + ownr_ctry false @@ -14058,6 +14058,74 @@ + + forms + + + address + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + contact + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + labels @@ -17514,6 +17582,74 @@ + + forms + + + detail + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + misc + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + registration + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + labels diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index bab426d77..4f91d2556 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -22,7 +22,12 @@ &__margin { margin: 0.2rem 0.2rem; } + &__margin-large { margin: 0.5rem 0.5rem; } + + &__flex-space-around { + justify-content: space-around; + } } diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index 06b2128ad..8dcc53d58 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -1,10 +1,10 @@ -import { Table, Button } from "antd"; +import { Table, Button, Input } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { alphaSort } from "../../utils/sorters"; - -export default function CourtesyCarsList({ loading, courtesycars }) { +import { SyncOutlined } from "@ant-design/icons"; +export default function CourtesyCarsList({ loading, courtesycars, refetch }) { const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, @@ -74,14 +74,28 @@ export default function CourtesyCarsList({ loading, courtesycars }) { ( - - - +
+ + + + + { + //setSearchText(e.target.value); + }} + //value={searchText} + enterButton + /> +
)} - size="small" + size='small' pagination={{ position: "top" }} columns={columns.map((item) => ({ ...item }))} - rowKey="id" + rowKey='id' dataSource={courtesycars} onChange={handleTableChange} /> diff --git a/client/src/components/job-detail-cards/job-detail-cards.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.component.jsx index 94a5f7c15..2cfb25e78 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.component.jsx @@ -76,8 +76,7 @@ export function JobDetailCards({ setPrintCenterContext }) { destroyOnClose width={drawerPercentage} placement='right' - onClose={handleDrawerClose} - footer={
The footer.
}> + onClose={handleDrawerClose}> {loading ? : null} {error ? : null} {data ? ( diff --git a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx index e1e9768bd..8a6b6dd40 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.totals.component.jsx @@ -17,7 +17,7 @@ export default function JobDetailCardsTotalsComponent({ loading, data }) { return ( {totals ? ( -
+
- + - - - - - - - - - - - - - TODO: missing KOL field??? - - - - CAA # seems not correct based on field mapping Class seems not correct - based on field mapping - - - - - - - - - - - - - - - - - - - - - - Appraiser Info - - - - - - - - - - TODO: Field is pay date but title is inspection date. Likely - incorrect? - - - - - - - - - - - - - - - - - - - - - + key='insurance' + header={t("menus.jobsdetail.insurance")}> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Appraiser Info + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO How to handle different taxes and marking them as exempt? { // @@ -132,157 +150,125 @@ export default function JobsCreateJobsInfo({ form }) { // })()} // } - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO This is equivalent of GST payable. - - - - TODO equivalent of other customer amount - - - - - - - - - - - - - Totals Table - - - - - - - - - - - - - - - - - - - - - - - - - - - - Note //TODO Remove ATP rate? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + key='financial' + header={t("menus.jobsdetail.financials")}> + + + + + + + + + + + TODO This is equivalent of GST payable. + + + + + + + + + + + + + + + + Totals Table + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note //TODO Remove ATP rate? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx index b3de7c85a..d7e96772a 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.component.jsx @@ -1,8 +1,13 @@ +import { Col, Row, Typography } from "antd"; import React from "react"; -import { Row, Col, Typography } from "antd"; +import { useTranslation } from "react-i18next"; import JobsCreateOwnerInfoNewComponent from "./jobs-create-owner-info.new.component"; import JobsCreateOwnerInfoSearchComponent from "./jobs-create-owner-info.search.component"; -import { useTranslation } from "react-i18next"; + +const colSpan = { + sm: { span: 24 }, + lg: { span: 12 }, +}; export default function JobsCreateOwnerInfoComponent({ loading, owners }) { const { t } = useTranslation(); @@ -11,15 +16,15 @@ export default function JobsCreateOwnerInfoComponent({ loading, owners }) { {t("jobs.labels.create.ownerinfo")} - -
+ + - + diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx index b0b72d99f..27daef7d5 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.container.jsx @@ -1,18 +1,18 @@ -import React, { useContext } from "react"; -import JobsCreateOwnerInfoComponent from "./jobs-create-owner-info.component"; -import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; -import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; import { useQuery } from "@apollo/react-hooks"; +import React, { useContext } from "react"; +import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries"; +import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import AlertComponent from "../alert/alert.component"; +import JobsCreateOwnerInfoComponent from "./jobs-create-owner-info.component"; export default function JobsCreateOwnerContainer() { const [state] = useContext(JobCreateContext); const { loading, error, data } = useQuery(QUERY_SEARCH_OWNER_BY_IDX, { variables: { search: `%${state.owner.search}%` }, - skip: !state.owner.search + skip: !state.owner.search, }); - if (error) return ; + if (error) return ; return ( + }}> {t("jobs.labels.create.newowner")} - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx index 4704fd933..64cecf58a 100644 --- a/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx +++ b/client/src/components/jobs-create-owner-info/jobs-create-owner-info.search.component.jsx @@ -7,12 +7,12 @@ import { alphaSort } from "../../utils/sorters"; export default function JobsCreateOwnerInfoSearchComponent({ loading, - owners + owners, }) { const [state, setState] = useContext(JobCreateContext); const [tableState, setTableState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -25,7 +25,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), sortOrder: tableState.sortedInfo.columnKey === "ownr_ln" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_fn"), @@ -34,7 +34,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_fn, b.ownr_fn), sortOrder: tableState.sortedInfo.columnKey === "ownr_fn" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_addr1"), @@ -43,7 +43,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_addr1, b.ownr_addr1), sortOrder: tableState.sortedInfo.columnKey === "ownr_addr1" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_city"), @@ -52,7 +52,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_city, b.ownr_city), sortOrder: tableState.sortedInfo.columnKey === "ownr_city" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_ea"), @@ -61,7 +61,7 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ea, b.ownr_ea), sortOrder: tableState.sortedInfo.columnKey === "ownr_ea" && - tableState.sortedInfo.order + tableState.sortedInfo.order, }, { title: t("owners.fields.ownr_ph1"), @@ -73,51 +73,54 @@ export default function JobsCreateOwnerInfoSearchComponent({ sorter: (a, b) => alphaSort(a.ownr_ph1, b.ownr_ph1), sortOrder: tableState.sortedInfo.columnKey === "ownr_ph1" && - tableState.sortedInfo.order - } + tableState.sortedInfo.order, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); }; - //TODO Implement searching & pagination return (
{ return ( - { - setState({ - ...state, - owner: { ...state.owner, search: value } - }); - }} - enterButton - /> +
+ { + setState({ + ...state, + owner: { ...state.owner, search: value }, + }); + }} + enterButton + /> +
); }} - size="small" + size='small' + scroll={{ x: true }} pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' dataSource={owners} onChange={handleTableChange} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setState({ ...state, - owner: { ...state.owner, new: false, selectedid: props.id } + owner: { ...state.owner, new: false, selectedid: props.id }, }); }, type: "radio", - selectedRowKeys: [state.owner.selectedid] + selectedRowKeys: [state.owner.selectedid], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { if (record) { if (record.id) { setState({ @@ -125,18 +128,18 @@ export default function JobsCreateOwnerInfoSearchComponent({ owner: { ...state.owner, new: false, - selectedid: record.id - } + selectedid: record.id, + }, }); - + return; } } setState({ ...state, - owner: { ...state.owner, selectedid: null } + owner: { ...state.owner, selectedid: null }, }); - } + }, }; }} /> diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx index 39b3711a5..c964ffb7c 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.component.jsx @@ -4,19 +4,24 @@ import { useTranslation } from "react-i18next"; import JobsCreateVehicleInfoNewComponent from "./jobs-create-vehicle-info.new.component"; import JobsCreateVehicleInfoSearchComponent from "./jobs-create-vehicle-info.search.component"; +const colSpan = { + sm: { span: 24 }, + lg: { span: 12 }, +}; + export default function JobsCreateVehicleInfoComponent({ loading, vehicles }) { const { t } = useTranslation(); return (
{t("jobs.labels.create.vehicleinfo")} - -
+ + - + diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx index 6c899aabd..7cf36b082 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.container.jsx @@ -9,9 +9,11 @@ export default function JobsCreateVehicleInfoContainer({ form }) { const [state] = useContext(JobCreateContext); const { loading, error, data } = useQuery(SEARCH_VEHICLE_BY_VIN, { variables: { vin: `%${state.vehicle.search}%` }, - skip: !state.vehicle.search + skip: !state.vehicle.search, }); + if (error) return ; + return ( + }}> {t("jobs.labels.create.newvehicle")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - //TODO Add handling for paint code json - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx index 0a42d9707..fc770fe1a 100644 --- a/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx +++ b/client/src/components/jobs-create-vehicle-info/jobs-create-vehicle-info.search.component.jsx @@ -7,12 +7,12 @@ import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; export default function JobsCreateVehicleInfoSearchComponent({ loading, - vehicles + vehicles, }) { const [state, setState] = useContext(JobCreateContext); const [tableState, setTableState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -28,7 +28,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ tableState.sortedInfo.order, render: (text, record) => ( {record.v_vin} - ) + ), }, { title: t("vehicles.fields.description"), @@ -38,7 +38,7 @@ export default function JobsCreateVehicleInfoSearchComponent({ return ( {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -46,56 +46,59 @@ export default function JobsCreateVehicleInfoSearchComponent({ key: "plate", render: (text, record) => { return {`${record.plate_st} | ${record.plate_no}`}; - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setTableState({ ...tableState, filteredInfo: filters, sortedInfo: sorter }); }; - //TODO Implement searching & pagination return (
{ return ( - { - setState({ - ...state, - vehicle: { ...state.vehicle, search: value } - }); - }} - enterButton - /> +
+ { + setState({ + ...state, + vehicle: { ...state.vehicle, search: value }, + }); + }} + enterButton + /> +
); }} - size="small" + size='small' + scroll={{ x: true }} pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' dataSource={vehicles} onChange={handleTableChange} rowSelection={{ - onSelect: props => { + onSelect: (props) => { setState({ ...state, vehicle: { ...state.vehicle, new: false, selectedid: props.id, - vehicleObj: props - } + vehicleObj: props, + }, }); }, type: "radio", - selectedRowKeys: [state.vehicle.selectedid] + selectedRowKeys: [state.vehicle.selectedid], }} onRow={(record, rowIndex) => { return { - onClick: event => { + onClick: (event) => { if (record) { if (record.id) { setState({ @@ -104,8 +107,8 @@ export default function JobsCreateVehicleInfoSearchComponent({ ...state.vehicle, new: false, selectedid: record.id, - vehicleObj: record - } + vehicleObj: record, + }, }); return; @@ -113,9 +116,9 @@ export default function JobsCreateVehicleInfoSearchComponent({ } setState({ ...state, - vehicle: { ...state.vehicle, selectedid: null, vehicleObj: null } + vehicle: { ...state.vehicle, selectedid: null, vehicleObj: null }, }); - } + }, }; }} /> diff --git a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx index 61b031ab8..d456d6475 100644 --- a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx +++ b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx @@ -1,4 +1,4 @@ -import { DatePicker, Form } from "antd"; +import { Form } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; diff --git a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx index 9edcab14f..96701e83a 100644 --- a/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx +++ b/client/src/components/jobs-list-paginated/jobs-list-paginated.component.jsx @@ -167,7 +167,6 @@ export default function JobsList({ refetch, loading, jobs, total }) { const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); - console.log("handleTableChange -> sorter", sorter); search.page = pagination.current; search.sortcolumn = sorter.columnKey; search.sortorder = sorter.order; @@ -178,13 +177,26 @@ export default function JobsList({ refetch, loading, jobs, total }) {
{ return ( -
+
{ search.search = value; @@ -195,17 +207,6 @@ export default function JobsList({ refetch, loading, jobs, total }) {
); }} - size="small" - pagination={{ - position: "top", - pageSize: 25, - current: parseInt(page || 1), - total: total, - }} - columns={columns} - rowKey="id" - dataSource={jobs} - onChange={handleTableChange} />
); diff --git a/client/src/components/jobs-list/jobs-list.component.jsx b/client/src/components/jobs-list/jobs-list.component.jsx index cc79d6913..009db1917 100644 --- a/client/src/components/jobs-list/jobs-list.component.jsx +++ b/client/src/components/jobs-list/jobs-list.component.jsx @@ -261,7 +261,7 @@ export function JobsList({ bodyshop }) { onChange={(e) => { setSearchText(e.target.value); }} - vale={searchText} + value={searchText} enterButton /> diff --git a/client/src/components/layout-form-row/layout-form-row.component.jsx b/client/src/components/layout-form-row/layout-form-row.component.jsx index 65130b7ab..0bb53bb13 100644 --- a/client/src/components/layout-form-row/layout-form-row.component.jsx +++ b/client/src/components/layout-form-row/layout-form-row.component.jsx @@ -2,10 +2,17 @@ import React from "react"; import { Row, Col, Typography } from "antd"; import "./layout-form-row.styles.scss"; -export default function LayoutFormRow({ header, children }) { +export default function LayoutFormRow({ header, children, grow = false }) { if (!!!children.length) { //We have only one element. It's going to get the whole thing. - return children; + return ( +
+ {header ? ( + {header} + ) : null} + {children} +
+ ); } const rowGutter = { gutter: [16, 16] }; @@ -15,16 +22,16 @@ export default function LayoutFormRow({ header, children }) { span: 24, }, sm: { - span: 12, + span: !grow ? 12 : Math.max(12, 24 / children.length), }, md: { - span: 8, + span: !grow ? 8 : Math.max(8, 24 / children.length), }, lg: { - span: 6, + span: !grow ? 6 : Math.max(6, 24 / children.length), }, xl: { - span: 4, + span: !grow ? 4 : Math.max(4, 24 / children.length), }, }; }; diff --git a/client/src/components/owner-detail-form/owner-detail-form.component.jsx b/client/src/components/owner-detail-form/owner-detail-form.component.jsx index f7eff1b11..0988028ba 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.component.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.component.jsx @@ -1,75 +1,124 @@ -import { Button, Col, Form, Input, Row, Switch } from "antd"; +import { Button, Form, Input, Switch } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; import FormItemEmail from "../form-items-formatted/email-form-item.component"; import FormItemPhone from "../form-items-formatted/phone-form-item.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; export default function OwnerDetailFormComponent({ form }) { const { t } = useTranslation(); const { getFieldValue } = form; return (
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/owner-detail-form/owner-detail-form.container.jsx b/client/src/components/owner-detail-form/owner-detail-form.container.jsx index f938359bc..559a7dba1 100644 --- a/client/src/components/owner-detail-form/owner-detail-form.container.jsx +++ b/client/src/components/owner-detail-form/owner-detail-form.container.jsx @@ -11,12 +11,12 @@ function OwnerDetailFormContainer({ owner, refetch }) { const [updateOwner] = useMutation(UPDATE_OWNER); - const handleFinish = values => { + const handleFinish = (values) => { updateOwner({ - variables: { ownerId: owner.id, owner: values } - }).then(r => { + variables: { ownerId: owner.id, owner: values }, + }).then((r) => { notification["success"]({ - message: t("owners.successes.save") + message: t("owners.successes.save"), }); //TODO Better way to reset the field decorators? if (refetch) refetch().then(); @@ -28,9 +28,9 @@ function OwnerDetailFormContainer({ owner, refetch }) { + autoComplete='off' + layout='vertical' + initialValues={owner}> ); 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 a83b0d684..c32363d39 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 @@ -9,7 +9,7 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter"; import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); function OwnerDetailJobsComponent({ bodyshop, owner }) { @@ -25,7 +25,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {record.ro_number ? record.ro_number : `EST ${record.est_number}`} - ) + ), }, { title: t("jobs.fields.vehicle"), @@ -35,17 +35,17 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc}`} - ) + ), }, { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", - key: "clm_no" + key: "clm_no", }, { title: t("jobs.fields.status"), dataIndex: "status", - key: "status" + key: "status", }, { @@ -54,8 +54,8 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { key: "clm_total", render: (text, record) => ( {record.clm_total} - ) - } + ), + }, ]; return ( @@ -70,20 +70,31 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { )} pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + scroll={{ x: true }} + rowKey='id' dataSource={owner.jobs} rowSelection={{ onSelect: (record, selected, selectedRows) => { - setSelectedJobs(selectedRows ? selectedRows.map(i => i.id) : []); + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.open_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); }, - selectedRowKeys: selectedJobs, - getCheckboxProps: record => ({ + getCheckboxProps: (record) => ({ disabled: bodyshop.md_ro_statuses.open_statuses ? !bodyshop.md_ro_statuses.open_statuses.includes(record.status) - : true - }) + : true, + }), }} /> ); diff --git a/client/src/components/owners-list/owners-list.component.jsx b/client/src/components/owners-list/owners-list.component.jsx index beb3c3c1a..78c23b8ad 100644 --- a/client/src/components/owners-list/owners-list.component.jsx +++ b/client/src/components/owners-list/owners-list.component.jsx @@ -1,4 +1,5 @@ -import { Input, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; @@ -8,7 +9,7 @@ import { alphaSort } from "../../utils/sorters"; export default function OwnersListComponent({ loading, owners, refetch }) { const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -18,17 +19,14 @@ export default function OwnersListComponent({ loading, owners, refetch }) { title: t("owners.fields.name"), dataIndex: "name", key: "name", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), sortOrder: state.sortedInfo.columnKey === "name" && state.sortedInfo.order, - render: (text, record) => ( {`${record.ownr_fn} ${record.ownr_ln}`} - ) + ), }, { title: t("owners.fields.ownr_ph1"), @@ -39,12 +37,12 @@ export default function OwnersListComponent({ loading, owners, refetch }) { state.sortedInfo.columnKey === "ownr_ph1" && state.sortedInfo.order, render: (text, record) => { return {record.ownr_ph1}; - } + }, }, { title: t("owners.fields.ownr_ea"), dataIndex: "ownr_ea", - key: "ownr_ea" + key: "ownr_ea", }, { title: t("owners.fields.address"), @@ -52,36 +50,43 @@ export default function OwnersListComponent({ loading, owners, refetch }) { key: "address", render: (text, record) => { return ( -
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || - ""} ${record.ownr_city || ""} ${record.ownr_st || - ""} ${record.ownr_zip || ""}`}
+
{`${record.ownr_addr1 || ""} ${record.ownr_addr2 || ""} ${ + record.ownr_city || "" + } ${record.ownr_st || ""} ${record.ownr_zip || ""}`}
); - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; -//TODO Implement searching & pagination return (
{ return ( - { - console.log(value); - }} - enterButton - /> +
+ + { + //setSearchText(e.target.value); + }} + //vale={searchText} + enterButton + /> +
); }} - size="small" + size='small' pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' + scroll={{ x: true }} dataSource={owners} onChange={handleTableChange} /> diff --git a/client/src/components/owners-list/owners-list.container.jsx b/client/src/components/owners-list/owners-list.container.jsx index 0e8ebcd46..06589c325 100644 --- a/client/src/components/owners-list/owners-list.container.jsx +++ b/client/src/components/owners-list/owners-list.container.jsx @@ -1,15 +1,15 @@ -import React from "react"; import { useQuery } from "@apollo/react-hooks"; +import React from "react"; import { QUERY_ALL_OWNERS } from "../../graphql/owners.queries"; import AlertComponent from "../alert/alert.component"; import OwnersListComponent from "./owners-list.component"; export default function OwnersListContainer() { const { loading, error, data, refetch } = useQuery(QUERY_ALL_OWNERS, { - fetchPolicy: "network-only" + fetchPolicy: "network-only", }); - if (error) return ; + if (error) return ; return ( )} + {event.job ? (
-
{`${t("jobs.fields.ro_number")}: ${ - (event.job && event.job.ro_number) || "" - }`}
-
- {t("jobs.fields.clm_total")}: + + {(event.job && event.job.ro_number) || ""} + + {(event.job && event.job.clm_total) || ""} -
-
{`${t("jobs.fields.clm_no")}: ${ - (event.job && event.job.clm_no) || "" - }`}
-
- {t("jobs.fields.ownr_ea")}:{(event.job && event.job.ownr_ea) || ""} -
-
- {t("jobs.fields.ownr_ph1")}: + + + {(event.job && event.job.ins_co_nm) || ""} + + + {(event.job && event.job.clm_no) || ""} + + + {(event.job && event.job.ownr_ea) || ""} + + {(event.job && event.job.ownr_ph1) || ""} -
+
) : null} - { - //TODO Add phone 1 MessagingActionTypes. - } - {event.job ? ( - - - - ) : null} - - - {event.isintake ? ( - - - - ) : null} + +
+ {event.job ? ( + + + + ) : null} + + + {event.isintake ? ( + + + + ) : null} +
); @@ -96,14 +96,9 @@ export default function ScheduleEventComponent({ event, handleCancel }) { ); - const Load = ( -
- -
- ); return ( - -
{event.allDay ? Load : RegularEvent}
+ + {RegularEvent} ); } diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx index e6c8bf1a4..aa6b05381 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.component.jsx @@ -1,94 +1,160 @@ -import { Button, Col, DatePicker, Form, Input, Row } from "antd"; +import { Button, DatePicker, Form, Input, InputNumber } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; -export default function VehicleDetailFormComponent() { +import FormFieldsChanged from "../form-fields-changed-alert/form-fields-changed-alert.component"; +import LayoutFormRow from "../layout-form-row/layout-form-row.component"; + +export default function VehicleDetailFormComponent({ form }) { const { t } = useTranslation(); return (
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - //TODO Add handling for paint code json - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + //TODO Add handling for paint code json + } + + + + + + + + + + + + + + + + + + + + + + + + + ); } diff --git a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx index 47ce6ffa2..4b41cc4cf 100644 --- a/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx +++ b/client/src/components/vehicle-detail-form/vehicle-detail-form.container.jsx @@ -11,12 +11,12 @@ function VehicleDetailFormContainer({ vehicle, refetch }) { const [updateVehicle] = useMutation(UPDATE_VEHICLE); const [form] = Form.useForm(); - const handleFinish = values => { + const handleFinish = (values) => { updateVehicle({ - variables: { vehId: vehicle.id, vehicle: values } - }).then(r => { + variables: { vehId: vehicle.id, vehicle: values }, + }).then((r) => { notification["success"]({ - message: t("vehicles.successes.save") + message: t("vehicles.successes.save"), }); //TODO Better way to reset the field decorators? if (refetch) refetch(); @@ -27,13 +27,13 @@ function VehicleDetailFormContainer({ vehicle, refetch }) { - + v_prod_dt: vehicle.v_prod_dt ? moment(vehicle.v_prod_dt) : null, + }}> + ); } diff --git a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx index 652d2cafd..d019df9af 100644 --- a/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx +++ b/client/src/components/vehicle-detail-jobs/vehicle-detail-jobs.component.jsx @@ -1,15 +1,15 @@ -import React, { useState } from "react"; import { Table } from "antd"; +import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -import { Link } from "react-router-dom"; -import CurrencyFormatter from "../../utils/CurrencyFormatter"; 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"; import VehicleDetailUpdateJobsComponent from "../vehicle-detail-update-jobs/vehicle-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ - bodyshop: selectBodyshop + bodyshop: selectBodyshop, }); export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { @@ -26,7 +26,7 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {record.ro_number ? record.ro_number : `EST ${record.est_number}`} - ) + ), }, { title: t("jobs.fields.owner"), @@ -36,17 +36,17 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {`${record.ownr_fn} ${record.ownr_ln}`} - ) + ), }, { title: t("jobs.fields.clm_no"), dataIndex: "clm_no", - key: "clm_no" + key: "clm_no", }, { title: t("jobs.fields.status"), dataIndex: "status", - key: "status" + key: "status", }, { @@ -55,8 +55,8 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { key: "clm_total", render: (text, record) => ( {record.clm_total} - ) - } + ), + }, ]; return ( @@ -71,20 +71,31 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { )} pagination={{ position: "bottom" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' + scroll={{ x: true }} dataSource={vehicle.jobs} rowSelection={{ onSelect: (record, selected, selectedRows) => { - setSelectedJobs(selectedRows ? selectedRows.map(i => i.id) : []); + setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); + }, + onSelectAll: (selected, selectedRows, changeRows) => { + setSelectedJobs( + selectedRows + ? selectedRows + .filter((i) => + bodyshop.md_ro_statuses.open_statuses.includes(i.status) + ) + .map((i) => i.id) + : [] + ); }, - selectedRowKeys: selectedJobs, - getCheckboxProps: record => ({ + getCheckboxProps: (record) => ({ disabled: bodyshop.md_ro_statuses.open_statuses ? !bodyshop.md_ro_statuses.open_statuses.includes(record.status) - : true - }) + : true, + }), }} /> ); diff --git a/client/src/components/vehicles-list/vehicles-list.component.jsx b/client/src/components/vehicles-list/vehicles-list.component.jsx index 49362c74d..b4cfcebc7 100644 --- a/client/src/components/vehicles-list/vehicles-list.component.jsx +++ b/client/src/components/vehicles-list/vehicles-list.component.jsx @@ -1,4 +1,5 @@ -import { Input, Table } from "antd"; +import { SyncOutlined } from "@ant-design/icons"; +import { Button, Input, Table } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; @@ -7,7 +8,7 @@ import { alphaSort } from "../../utils/sorters"; export default function VehiclesListComponent({ loading, vehicles, refetch }) { const [state, setState] = useState({ sortedInfo: {}, - filteredInfo: { text: "" } + filteredInfo: { text: "" }, }); const { t } = useTranslation(); @@ -17,15 +18,13 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { title: t("vehicles.fields.v_vin"), dataIndex: "v_vin", key: "v_vin", - // onFilter: (value, record) => record.ro_number.includes(value), - // filteredValue: state.filteredInfo.text || null, sorter: (a, b) => alphaSort(a.v_vin, b.v_vin), sortOrder: state.sortedInfo.columnKey === "v_vin" && state.sortedInfo.order, render: (text, record) => ( {record.v_vin} - ) + ), }, { title: t("vehicles.fields.description"), @@ -35,7 +34,7 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { return ( {`${record.v_model_yr} ${record.v_make_desc} ${record.v_model_desc} ${record.v_color}`} ); - } + }, }, { title: t("vehicles.fields.plate_no"), @@ -43,32 +42,40 @@ export default function VehiclesListComponent({ loading, vehicles, refetch }) { key: "plate", render: (text, record) => { return {`${record.plate_st} | ${record.plate_no}`}; - } - } + }, + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; - //TODO Implement searching & pagination + return (
{ return ( - { - console.log(value); - }} - enterButton - /> +
+ + { + //setSearchText(e.target.value); + }} + //vale={searchText} + enterButton + /> +
); }} - size="small" + size='small' pagination={{ position: "top" }} - columns={columns.map(item => ({ ...item }))} - rowKey="id" + columns={columns} + rowKey='id' + scroll={{ x: true }} dataSource={vehicles} onChange={handleTableChange} /> diff --git a/client/src/graphql/appointments.queries.js b/client/src/graphql/appointments.queries.js index 701e96588..b34d76246 100644 --- a/client/src/graphql/appointments.queries.js +++ b/client/src/graphql/appointments.queries.js @@ -28,6 +28,7 @@ export const QUERY_ALL_ACTIVE_APPOINTMENTS = gql` clm_total id clm_no + ins_co_nm v_model_yr v_make_desc v_model_desc diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx index 4d59ebc34..0dd68ffcb 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.component.jsx @@ -1,6 +1,12 @@ import React from "react"; import CourtesyCarsListComponent from "../../components/courtesy-cars-list/courtesy-cars-list.component"; -export default function CourtesyCarsPageComponent({ loading, data }) { - return ; +export default function CourtesyCarsPageComponent({ loading, data, refetch }) { + return ( + + ); } diff --git a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx index cc464629a..59af1e7d6 100644 --- a/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx +++ b/client/src/pages/courtesy-cars/courtesy-cars.page.container.jsx @@ -12,7 +12,7 @@ const mapDispatchToProps = (dispatch) => ({ }); export function CourtesyCarsPageContainer({ setBreadcrumbs }) { - const { loading, error, data } = useQuery(QUERY_ALL_CC); + const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC); const { t } = useTranslation(); useEffect(() => { document.title = t("titles.courtesycars"); @@ -21,11 +21,12 @@ export function CourtesyCarsPageContainer({ setBreadcrumbs }) { { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, ]); }, [setBreadcrumbs, t]); - if (error) return ; + if (error) return ; return ( ); } diff --git a/client/src/pages/jobs-create/jobs-create.component.jsx b/client/src/pages/jobs-create/jobs-create.component.jsx index 33b646fbc..f29d03808 100644 --- a/client/src/pages/jobs-create/jobs-create.component.jsx +++ b/client/src/pages/jobs-create/jobs-create.component.jsx @@ -19,18 +19,18 @@ export default function JobsCreateComponent({ form }) { title: t("jobs.labels.create.vehicleinfo"), content: , validation: !!state.vehicle.new || !!state.vehicle.selectedid, - error: t("vehicles.errors.selectexistingornew") + error: t("vehicles.errors.selectexistingornew"), }, { title: t("jobs.labels.create.ownerinfo"), content: , validation: !!state.owner.new || !!state.owner.selectedid, - error: t("owners.errors.selectexistingornew") + error: t("owners.errors.selectexistingornew"), }, { title: t("jobs.labels.create.jobinfo"), - content: - } + content: , + }, ]; const next = () => { @@ -43,19 +43,15 @@ export default function JobsCreateComponent({ form }) { const ProgressButtons = () => { return ( -
- {pageIndex > 0 && ( - - )} +
+ {pageIndex > 0 && } {pageIndex < steps.length - 1 && ( @@ -85,7 +81,7 @@ export default function JobsCreateComponent({ form }) { status='success' title={t("jobs.successes.creatednoclick")} subTitle={t("jobs.successes.created_subtitle", { - est_number: state.newJobEstNum + est_number: state.newJobEstNum, })} extra={[ @@ -93,7 +89,7 @@ export default function JobsCreateComponent({ form }) { , - + , ]} />
@@ -108,7 +104,7 @@ export default function JobsCreateComponent({ form }) { onClick={() => { form .validateFields() - .then(r => { + .then((r) => { if (steps[pageIndex].validation) { setErrorMessage(null); setPageIndex(idx); @@ -116,7 +112,7 @@ export default function JobsCreateComponent({ form }) { setErrorMessage(steps[pageIndex].error); } }) - .catch(error => console.log("error", error)); + .catch((error) => console.log("error", error)); }} /> ))} @@ -130,7 +126,12 @@ export default function JobsCreateComponent({ form }) { ) : null} {steps.map((item, idx) => ( -
+
{item.content}
))} diff --git a/client/src/pages/jobs-create/jobs-create.container.jsx b/client/src/pages/jobs-create/jobs-create.container.jsx index 7aa4a87b2..f988e513b 100644 --- a/client/src/pages/jobs-create/jobs-create.container.jsx +++ b/client/src/pages/jobs-create/jobs-create.container.jsx @@ -74,6 +74,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { }; const handleFinish = (values) => { + console.log("handleFinish -> values", values); let job = Object.assign( {}, values, @@ -86,13 +87,14 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { ownerid: state.owner.selectedid || null, }, { - status: bodyshop.md_ro_statuses.default_imported || "Open*", //Pull from redux store. + status: bodyshop.md_ro_statuses.default_imported || "Open*", shopid: bodyshop.id, } ); //TODO Logic to ensure the owner is actually fetched. + console.log("job", job); let ownerData; - if (!!job.owner) { + if (!!!job.ownerid) { ownerData = job.owner.data; ownerData.shopid = bodyshop.id; delete ownerData.allow_text_message; @@ -103,7 +105,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { delete ownerData.id; delete ownerData.__typename; } - if (!!job.vehicle) { + if (!!!job.vehicleid) { delete job.vehicleid; job.vehicle.data.shopid = bodyshop.id; job.plate_no = job.vehicle.data.plate_no; @@ -114,8 +116,6 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { job.v_make_desc = job.vehicle.data.v_make_desc; job.v_color = job.vehicle.data.v_color; } else { - //Vehicle selected. - job.vehicle.data.shopid = bodyshop.id; job.plate_no = state.vehicle.vehicleObj.plate_no; job.plate_st = state.vehicle.vehicleObj.plate_st; job.v_vin = state.vehicle.vehicleObj.v_vin; @@ -131,7 +131,11 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { return ( -
+
diff --git a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx index 07e2f6126..dc2817762 100644 --- a/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx +++ b/client/src/pages/vehicles-detail/vehicles-detail.page.container.jsx @@ -15,6 +15,7 @@ const mapDispatchToProps = (dispatch) => ({ export function VehicleDetailContainer({ match, setBreadcrumbs }) { const { vehId } = match.params; const { t } = useTranslation(); + const { loading, data, error, refetch } = useQuery(QUERY_VEHICLE_BY_ID, { variables: { id: vehId }, fetchPolicy: "network-only", diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 9eab8fdcf..2c31e9bd4 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -686,7 +686,6 @@ "availablenew": "Available New Jobs", "availablesupplements": "Available Supplements", "cards": { - "appraiser": "Appraiser", "customer": "Customer Information", "damage": "Area of Damage", "dates": "Dates", @@ -855,6 +854,7 @@ "ownr_addr1": "Address", "ownr_addr2": "Address 2", "ownr_city": "City", + "ownr_co_nm": "Owner Co. Name", "ownr_ctry": "Country", "ownr_ea": "Email", "ownr_fn": "First Name", @@ -865,6 +865,11 @@ "ownr_zip": "Zip/Postal Code", "preferred_contact": "Preferred Contact Method" }, + "forms": { + "address": "Address", + "contact": "Contact Information", + "name": "Owner Details" + }, "labels": { "create_new": "Create a new owner record.", "existing_owners": "Existing Owners", @@ -1093,6 +1098,11 @@ "v_type": "Type", "v_vin": "Vehicle Identification Number" }, + "forms": { + "detail": "Vehicle Details", + "misc": "Miscellaneous", + "registration": "Registration" + }, "labels": { "updatevehicle": "Update Vehicle Information" }, diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 6bf9ece44..0abb9faef 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -686,7 +686,6 @@ "availablenew": "", "availablesupplements": "", "cards": { - "appraiser": "Tasador", "customer": "Información al cliente", "damage": "Área de Daño", "dates": "fechas", @@ -855,6 +854,7 @@ "ownr_addr1": "Dirección", "ownr_addr2": "Dirección 2", "ownr_city": "ciudad", + "ownr_co_nm": "", "ownr_ctry": "País", "ownr_ea": "Email", "ownr_fn": "Nombre de pila", @@ -865,6 +865,11 @@ "ownr_zip": "código postal", "preferred_contact": "Método de Contacto Preferido" }, + "forms": { + "address": "", + "contact": "", + "name": "" + }, "labels": { "create_new": "Crea un nuevo registro de propietario.", "existing_owners": "Propietarios existentes", @@ -1093,6 +1098,11 @@ "v_type": "Tipo", "v_vin": "Número de identificación del vehículo" }, + "forms": { + "detail": "", + "misc": "", + "registration": "" + }, "labels": { "updatevehicle": "" }, diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index e255d2d54..6cc2d6a73 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -686,7 +686,6 @@ "availablenew": "", "availablesupplements": "", "cards": { - "appraiser": "Expert", "customer": "Informations client", "damage": "Zone de dommages", "dates": "Rendez-vous", @@ -855,6 +854,7 @@ "ownr_addr1": "Adresse", "ownr_addr2": "Adresse 2 ", "ownr_city": "Ville", + "ownr_co_nm": "", "ownr_ctry": "Pays", "ownr_ea": "Email", "ownr_fn": "Prénom", @@ -865,6 +865,11 @@ "ownr_zip": "Zip / code postal", "preferred_contact": "Méthode de contact préférée" }, + "forms": { + "address": "", + "contact": "", + "name": "" + }, "labels": { "create_new": "Créez un nouvel enregistrement de propriétaire.", "existing_owners": "Propriétaires existants", @@ -1093,6 +1098,11 @@ "v_type": "Type", "v_vin": "Plaque d'immatriculation" }, + "forms": { + "detail": "", + "misc": "", + "registration": "" + }, "labels": { "updatevehicle": "" },