- TODO:
{t("jobs.labels.cards.appraiser")}
{data?.est_ea ? (
diff --git a/client/src/components/job-detail-lines/job-lines-cell.component.jsx b/client/src/components/job-detail-lines/job-lines-cell.component.jsx
new file mode 100644
index 000000000..1ea38f1b2
--- /dev/null
+++ b/client/src/components/job-detail-lines/job-lines-cell.component.jsx
@@ -0,0 +1,52 @@
+import React from "react";
+import { Form, Input, InputNumber } from "antd";
+import JobDetailFormContext from "../../pages/jobs-detail/jobs-detail.page.context";
+
+export default class EditableCell extends React.Component {
+ getInput = () => {
+ if (this.props.inputType === "number") {
+ return ;
+ }
+ return ;
+ };
+
+ renderCell = ({ getFieldDecorator }) => {
+ const {
+ editing,
+ dataIndex,
+ title,
+ inputType,
+ record,
+ index,
+ children,
+ ...restProps
+ } = this.props;
+ return (
+
+ {editing ? (
+
+ {getFieldDecorator(dataIndex, {
+ rules: [
+ {
+ required: true,
+ message: `Please Input ${title}!`
+ }
+ ],
+ initialValue: record[dataIndex]
+ })(this.getInput())}
+
+ ) : (
+ children
+ )}
+ |
+ );
+ };
+
+ render() {
+ return (
+
+ {this.renderCell}
+
+ );
+ }
+}
diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx
new file mode 100644
index 000000000..135dc6dea
--- /dev/null
+++ b/client/src/components/job-detail-lines/job-lines.component.jsx
@@ -0,0 +1,124 @@
+import { Table, Button } from "antd";
+import React, { useContext, useState } from "react";
+import { useTranslation } from "react-i18next";
+import JobDetailFormContext from "../../pages/jobs-detail/jobs-detail.page.context";
+import CurrencyFormatter from "../../utils/CurrencyFormatter";
+import { alphaSort } from "../../utils/sorters";
+import EditableCell from "./job-lines-cell.component";
+
+export default function JobLinesComponent({ job }) {
+ //const form = useContext(JobDetailFormContext);
+ //const { getFieldDecorator } = form;
+ const [state, setState] = useState({
+ sortedInfo: {},
+ filteredInfo: { text: "" }
+ });
+ const [editingKey, setEditingKey] = useState("");
+ const { t } = useTranslation();
+
+ const columns = [
+ {
+ title: t("joblines.fields.unq_seq"),
+ dataIndex: "joblines.unq_seq",
+ key: "joblines.unq_seq",
+ // onFilter: (value, record) => record.ro_number.includes(value),
+ // filteredValue: state.filteredInfo.text || null,
+ sorter: (a, b) => alphaSort(a, b),
+ sortOrder:
+ state.sortedInfo.columnKey === "unq_seq" && state.sortedInfo.order,
+ //ellipsis: true,
+ editable: true
+ },
+ {
+ title: t("joblines.fields.line_desc"),
+ dataIndex: "line_desc",
+ key: "joblines.line_desc",
+ sorter: (a, b) => alphaSort(a.line_desc, b.line_desc),
+ sortOrder:
+ state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order,
+ ellipsis: true,
+ editable: true
+ },
+ {
+ title: t("joblines.fields.part_type"),
+ dataIndex: "part_type",
+ key: "joblines.part_type",
+ sorter: (a, b) => alphaSort(a.part_type, b.part_type),
+ sortOrder:
+ state.sortedInfo.columnKey === "part_type" && state.sortedInfo.order,
+ ellipsis: true,
+ editable: true
+ },
+ {
+ title: t("joblines.fields.db_price"),
+ dataIndex: "db_price",
+ key: "joblines.db_price",
+ sorter: (a, b) => a.db_price - b.db_price,
+ sortOrder:
+ state.sortedInfo.columnKey === "db_price" && state.sortedInfo.order,
+ ellipsis: true,
+ render: (text, record) => (
+
{record.db_price}
+ )
+ },
+ {
+ title: t("joblines.fields.act_price"),
+ dataIndex: "act_price",
+ key: "joblines.act_price",
+ sorter: (a, b) => a.act_price - b.act_price,
+ sortOrder:
+ state.sortedInfo.columnKey === "act_price" && state.sortedInfo.order,
+ ellipsis: true,
+ render: (text, record) => (
+
+ {" "}
+ {record.act_price}{" "}
+
+
+ )
+ }
+ ];
+
+ const handleTableChange = (pagination, filters, sorter) => {
+ setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
+ };
+
+ // const handleChange = event => {
+ // const { value } = event.target;
+ // setState({ ...state, filterinfo: { text: [value] } });
+ // };
+ return (
+
{
+ if (!col.editable) {
+ return col;
+ }
+ return {
+ ...col,
+ onCell: record => ({
+ record,
+ inputType: col.dataIndex === "age" ? "number" : "text",
+ dataIndex: col.dataIndex,
+ title: col.title,
+ editing: editingKey === record.id
+ })
+ };
+ })}
+ components={{
+ body: {
+ cell: EditableCell
+ }
+ }}
+ rowKey='id'
+ dataSource={job.joblines}
+ onChange={handleTableChange}
+ />
+ );
+}
diff --git a/client/src/components/job-lines/job-lines.container.component.jsx b/client/src/components/job-detail-lines/job-lines.container.jsx
similarity index 89%
rename from client/src/components/job-lines/job-lines.container.component.jsx
rename to client/src/components/job-detail-lines/job-lines.container.jsx
index 70e74c7c5..cf59100b2 100644
--- a/client/src/components/job-lines/job-lines.container.component.jsx
+++ b/client/src/components/job-detail-lines/job-lines.container.jsx
@@ -1,7 +1,7 @@
import React from "react";
import JobLinesComponent from "./job-lines.component";
import { useQuery } from "@apollo/react-hooks";
-import AlertComponent from "../../components/alert/alert.component";
+import AlertComponent from "../alert/alert.component";
import { GET_JOB_LINES_BY_PK } from "../../graphql/jobs-lines.queries";
@@ -16,3 +16,4 @@ export default function JobLinesContainer({ jobId }) {
);
}
+
\ No newline at end of file
diff --git a/client/src/components/job-lines/job-lines.component.jsx b/client/src/components/job-lines/job-lines.component.jsx
deleted file mode 100644
index 7b1f6cca8..000000000
--- a/client/src/components/job-lines/job-lines.component.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import React, { useState } from "react";
-import { Table } from "antd";
-import { alphaSort } from "../../utils/sorters";
-
-export default function JobLinesComponent({ loading, joblines }) {
- const [state, setState] = useState({
- sortedInfo: {},
- filteredInfo: { text: "" }
- });
-
- const columns = [
- {
- title: "Line #",
- dataIndex: "line_ind",
- key: "line_ind",
- // onFilter: (value, record) => record.ro_number.includes(value),
- // filteredValue: state.filteredInfo.text || null,
- sorter: (a, b) => alphaSort(a, b),
- sortOrder:
- state.sortedInfo.columnKey === "line_ind" && state.sortedInfo.order,
- ellipsis: true
- },
- {
- title: "Description",
- dataIndex: "line_desc",
- key: "line_desc",
- sorter: (a, b) => alphaSort(a, b),
- sortOrder:
- state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order,
- ellipsis: true
- }
- ];
-
- const handleTableChange = (pagination, filters, sorter) => {
- setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
- };
-
- // const handleChange = event => {
- // const { value } = event.target;
- // setState({ ...state, filterinfo: { text: [value] } });
- // };
-
- return (
- ({ ...item }))}
- rowKey='id'
- dataSource={joblines}
- onChange={handleTableChange}
- />
- );
-}
diff --git a/client/src/components/jobs-available-new/jobs-available-new.component.jsx b/client/src/components/jobs-available-new/jobs-available-new.component.jsx
new file mode 100644
index 000000000..b7dd1d880
--- /dev/null
+++ b/client/src/components/jobs-available-new/jobs-available-new.component.jsx
@@ -0,0 +1,212 @@
+import { Button, Icon, Input, notification, Table } from "antd";
+import React, { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { DateTimeFormatter } from "../../utils/DateFormatter";
+import { alphaSort } from "../../utils/sorters";
+import OwnerFindModalContainer from "../owner-find-modal/owner-find-modal.container";
+export default function JobsAvailableComponent({
+ loading,
+ data,
+ refetch,
+ deleteJob,
+ deleteAllNewJobs,
+ onModalOk,
+ onModalCancel,
+ modalVisible,
+ setModalVisible,
+ selectedOwner,
+ setSelectedOwner,
+ loadEstData,
+ estData
+}) {
+ const { t } = useTranslation();
+
+ const [state, setState] = useState({
+ sortedInfo: {},
+ filteredInfo: { text: "" }
+ });
+
+ const handleTableChange = (pagination, filters, sorter) => {
+ setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
+ };
+
+ const columns = [
+ {
+ title: t("jobs.fields.cieca_id"),
+ dataIndex: "cieca_id",
+ key: "cieca_id",
+ //width: "8%",
+ // onFilter: (value, record) => record.ro_number.includes(value),
+ // filteredValue: state.filteredInfo.text || null,
+ sorter: (a, b) => alphaSort(a, b),
+ sortOrder:
+ state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order
+ },
+ {
+ title: t("jobs.fields.owner"),
+ dataIndex: "ownr_name",
+ key: "ownr_name",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
+ //width: "25%",
+ sortOrder:
+ state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order
+ },
+ {
+ title: t("jobs.fields.vehicle"),
+ dataIndex: "vehicle_info",
+ key: "vehicle_info",
+ sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.clm_no"),
+ dataIndex: "clm_no",
+ key: "clm_no",
+ sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
+ sortOrder:
+ state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.clm_total"),
+ dataIndex: "clm_amt",
+ key: "clm_amt",
+ sorter: (a, b) => a.clm_amt - b.clm_amt,
+ sortOrder:
+ state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.uploaded_by"),
+ dataIndex: "uploaded_by",
+ key: "uploaded_by",
+ sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by),
+ sortOrder:
+ state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.updated_at"),
+ dataIndex: "updated_at",
+ key: "updated_at",
+ sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at),
+ sortOrder:
+ state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order,
+ render: (text, record) => (
+ {record.updated_at}
+ )
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("general.labels.actions"),
+ key: "actions",
+ render: (text, record) => (
+
+
+
+
+ )
+ //width: "12%",
+ //ellipsis: true
+ }
+ ];
+
+ const owner =
+ estData.data &&
+ estData.data.available_jobs_by_pk &&
+ estData.data.available_jobs_by_pk.est_data &&
+ estData.data.available_jobs_by_pk.est_data.owner &&
+ estData.data.available_jobs_by_pk.est_data.owner.data
+ ? estData.data.available_jobs_by_pk.est_data.owner.data
+ : null;
+
+ return (
+
+
+
+
{
+ return (
+
+ {
+ console.log(value);
+ }}
+ enterButton
+ />
+
+
+
+ );
+ }}
+ size="small"
+ pagination={{ position: "top" }}
+ columns={columns.map(item => ({ ...item }))}
+ rowKey="id"
+ dataSource={data && data.available_jobs}
+ onChange={handleTableChange}
+ />
+
+ );
+}
diff --git a/client/src/components/jobs-available-new/jobs-available-new.container.jsx b/client/src/components/jobs-available-new/jobs-available-new.container.jsx
new file mode 100644
index 000000000..7c1932d9d
--- /dev/null
+++ b/client/src/components/jobs-available-new/jobs-available-new.container.jsx
@@ -0,0 +1,125 @@
+import { notification } from "antd";
+import React, { useState } from "react";
+import { useMutation, useQuery } from "react-apollo";
+import { useTranslation } from "react-i18next";
+import { withRouter } from "react-router-dom";
+import { DELETE_ALL_AVAILABLE_NEW_JOBS, QUERY_AVAILABLE_NEW_JOBS } from "../../graphql/available-jobs.queries";
+import { INSERT_NEW_JOB } from "../../graphql/jobs.queries";
+import AlertComponent from "../alert/alert.component";
+import LoadingSpinner from "../loading-spinner/loading-spinner.component";
+import JobsAvailableComponent from "./jobs-available-new.component";
+
+export default withRouter(function JobsAvailableContainer({
+ deleteJob,
+ estDataLazyLoad,
+ history
+}) {
+ const { loading, error, data, refetch } = useQuery(QUERY_AVAILABLE_NEW_JOBS, {
+ fetchPolicy: "network-only"
+ });
+
+ const { t } = useTranslation();
+
+ const [modalVisible, setModalVisible] = useState(false);
+ const [selectedOwner, setSelectedOwner] = useState(null);
+ const [insertLoading, setInsertLoading] = useState(false);
+ const [deleteAllNewJobs] = useMutation(DELETE_ALL_AVAILABLE_NEW_JOBS);
+ const [insertNewJob] = useMutation(INSERT_NEW_JOB);
+ const [loadEstData, estData] = estDataLazyLoad;
+
+ const onModalOk = () => {
+ setModalVisible(false);
+ console.log("selectedOwner", selectedOwner);
+ setInsertLoading(true);
+ console.log(
+ "logitest",
+ estData.data &&
+ estData.data.available_jobs_by_pk &&
+ estData.data.available_jobs_by_pk.est_data
+ );
+
+ if (
+ !(
+ estData.data &&
+ estData.data.available_jobs_by_pk &&
+ estData.data.available_jobs_by_pk.est_data
+ )
+ ) {
+ //We don't have the right data. Error!
+ setInsertLoading(false);
+ notification["error"]({
+ message: t("jobs.errors.creating", { error: "No job data present." })
+ });
+ } else {
+ insertNewJob({
+ variables: {
+ job: selectedOwner
+ ? Object.assign(
+ {},
+ estData.data.available_jobs_by_pk.est_data,
+ { owner: null },
+ { ownerid: selectedOwner }
+ )
+ : estData.data.available_jobs_by_pk.est_data
+ }
+ })
+ .then(r => {
+ notification["success"]({
+ message: t("jobs.successes.created"),
+ onClick: () => {
+ console.log("r", r);
+ history.push(
+ `/manage/jobs/${r.data.insert_jobs.returning[0].id}`
+ );
+ }
+ });
+ //Job has been inserted. Clean up the available jobs record.
+ deleteJob({
+ variables: { id: estData.data.available_jobs_by_pk.id }
+ }).then(r => {
+ refetch();
+ setInsertLoading(false);
+ });
+ })
+ .catch(r => {
+ //error while inserting
+ notification["error"]({
+ message: t("jobs.errors.creating", { error: r.message })
+ });
+ refetch();
+ setInsertLoading(false);
+ });
+ }
+ };
+
+ const onModalCancel = () => {
+ setModalVisible(false);
+ setSelectedOwner(null);
+ };
+
+ if (error) return ;
+ return (
+
+
+
+ );
+});
diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx b/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx
new file mode 100644
index 000000000..a6c44f5df
--- /dev/null
+++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.component.jsx
@@ -0,0 +1,193 @@
+import { Input, Table, Button, Icon, notification } from "antd";
+import React, { useState } from "react";
+import { useTranslation } from "react-i18next";
+import { alphaSort } from "../../utils/sorters";
+import { DateTimeFormatter } from "../../utils/DateFormatter";
+export default function JobsAvailableSupplementComponent({
+ loading,
+ data,
+ refetch,
+ deleteJob,
+ deleteAllNewJobs,
+ estDataLazyLoad
+}) {
+ const { t } = useTranslation();
+
+ const [state, setState] = useState({
+ sortedInfo: {},
+ filteredInfo: { text: "" }
+ });
+
+ const handleTableChange = (pagination, filters, sorter) => {
+ setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
+ };
+
+ const columns = [
+ {
+ title: t("jobs.fields.cieca_id"),
+ dataIndex: "cieca_id",
+ key: "cieca_id",
+ //width: "8%",
+ // onFilter: (value, record) => record.ro_number.includes(value),
+ // filteredValue: state.filteredInfo.text || null,
+ sorter: (a, b) => alphaSort(a, b),
+ sortOrder:
+ state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order
+ },
+ {
+ title: t("jobs.fields.ro_number"),
+ dataIndex: "job_id",
+ key: "job_id",
+ //width: "8%",
+ // onFilter: (value, record) => record.ro_number.includes(value),
+ // filteredValue: state.filteredInfo.text || null,
+ sorter: (a, b) => alphaSort(a, b),
+ sortOrder:
+ state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order,
+ render: (text, record) => {record.job && record.job.ro_number}
+ },
+ {
+ title: t("jobs.fields.owner"),
+ dataIndex: "ownr_name",
+ key: "ownr_name",
+ ellipsis: true,
+ sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
+ //width: "25%",
+ sortOrder:
+ state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order
+ },
+ {
+ title: t("jobs.fields.vehicle"),
+ dataIndex: "vehicle_info",
+ key: "vehicle_info",
+ sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info),
+ sortOrder:
+ state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.clm_no"),
+ dataIndex: "clm_no",
+ key: "clm_no",
+ sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
+ sortOrder:
+ state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.clm_total"),
+ dataIndex: "clm_amt",
+ key: "clm_amt",
+ sorter: (a, b) => a.clm_amt - b.clm_amt,
+ sortOrder:
+ state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.uploaded_by"),
+ dataIndex: "uploaded_by",
+ key: "uploaded_by",
+ sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by),
+ sortOrder:
+ state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("jobs.fields.updated_at"),
+ dataIndex: "updated_at",
+ key: "updated_at",
+ sorter: (a, b) => new Date(a.updated_at) - new Date(b.updated_at),
+ sortOrder:
+ state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order,
+ render: (text, record) => (
+ {record.updated_at}
+ )
+ //width: "12%",
+ //ellipsis: true
+ },
+ {
+ title: t("general.labels.actions"),
+ key: "actions",
+ render: (text, record) => (
+
+
+
+
+ )
+ //width: "12%",
+ //ellipsis: true
+ }
+ ];
+
+ return (
+ {
+ return (
+
+ {
+ console.log(value);
+ }}
+ enterButton
+ />
+
+
+
+ );
+ }}
+ size="small"
+ pagination={{ position: "top" }}
+ columns={columns.map(item => ({ ...item }))}
+ rowKey="id"
+ dataSource={data && data.available_jobs}
+ onChange={handleTableChange}
+ />
+ );
+}
diff --git a/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx
new file mode 100644
index 000000000..306ba3a3d
--- /dev/null
+++ b/client/src/components/jobs-available-supplement/jobs-available-supplement.container.jsx
@@ -0,0 +1,30 @@
+import React from "react";
+import { useMutation, useQuery } from "react-apollo";
+import { DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS, QUERY_AVAILABLE_SUPPLEMENT_JOBS } from "../../graphql/available-jobs.queries";
+import AlertComponent from "../alert/alert.component";
+import JobsAvailableSupplementComponent from "./jobs-available-supplement.component";
+
+export default function JobsAvailableSupplementContainer({
+ deleteJob,
+ estDataLazyLoad
+}) {
+ const { loading, error, data, refetch } = useQuery(
+ QUERY_AVAILABLE_SUPPLEMENT_JOBS,
+ {
+ fetchPolicy: "network-only"
+ }
+ );
+ const [deleteAllNewJobs] = useMutation(DELETE_ALL_AVAILABLE_SUPPLEMENT_JOBS);
+
+ if (error) return ;
+ return (
+
+ );
+}
diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
index 4d8148ac6..b9da502d5 100644
--- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
+++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx
@@ -1,4 +1,12 @@
-import { Avatar, Button, Checkbox, Descriptions, notification, PageHeader, Tag } from "antd";
+import {
+ Avatar,
+ Button,
+ Checkbox,
+ Descriptions,
+ notification,
+ PageHeader,
+ Tag
+} from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import Moment from "react-moment";
@@ -16,7 +24,7 @@ export default function JobsDetailHeader({
const tombstoneTitle = (
-
+
{`${t("jobs.fields.ro_number")} ${
job.ro_number ? job.ro_number : t("general.labels.na")
}`}
@@ -25,26 +33,34 @@ export default function JobsDetailHeader({
const tombstoneSubtitle = (
- {job.owner
- ? (job.owner.first_name || "") + " " + (job.owner.last_name || "")
- : t("jobs.errors.noowner")}
+
+ {job.owner ? (
+
+ {`${job.ownr_co_nm || ""}${job.ownr_fn || ""} ${job.ownr_ln || ""}`}
+
+ ) : (
+ t("jobs.errors.noowner")
+ )}
+
- {job.vehicle ? (
-
- {job.vehicle.v_model_yr || t("general.labels.na")}{" "}
- {job.vehicle.v_make_desc || t("general.labels.na")}{" "}
- {job.vehicle.v_model_desc || t("general.labels.na")} |{" "}
- {job.vehicle.plate_no || t("general.labels.na")} |{" "}
- {job.vehicle.v_vin || t("general.labels.na")}
-
- ) : null}
+
+ {job.vehicle ? (
+
+ {job.vehicle.v_model_yr || t("general.labels.na")}{" "}
+ {job.vehicle.v_make_desc || t("general.labels.na")}{" "}
+ {job.vehicle.v_model_desc || t("general.labels.na")} |{" "}
+ {job.vehicle.plate_no || t("general.labels.na")} |{" "}
+ {job.vehicle.v_vin || t("general.labels.na")}
+
+ ) : null}
+
);
const menuExtra = [
,
-