Merged in release/2024-08-16-LEGACY (pull request #1626)

Release/2024 08 16 LEGACY

Approved-by: Allan Carr
This commit is contained in:
Dave Richer
2024-08-16 23:31:21 +00:00
4 changed files with 139 additions and 270 deletions

View File

@@ -11,6 +11,7 @@ import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter"; import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { pageLimit } from "../../utils/config"; import { pageLimit } from "../../utils/config";
import { alphaSort, statusSort } from "../../utils/sorters";
import useLocalStorage from "../../utils/useLocalStorage"; import useLocalStorage from "../../utils/useLocalStorage";
import StartChatButton from "../chat-open-button/chat-open-button.component"; import StartChatButton from "../chat-open-button/chat-open-button.component";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
@@ -36,7 +37,10 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.ro_number"), title: t("jobs.fields.ro_number"),
dataIndex: "ro_number", dataIndex: "ro_number",
key: "ro_number", key: "ro_number",
sorter: true, //(a, b) => alphaSort(a.ro_number, b.ro_number), sorter: search?.search
? (a, b) =>
parseInt((a.ro_number || "0").replace(/\D/g, "")) - parseInt((b.ro_number || "0").replace(/\D/g, ""))
: true,
sortOrder: sortcolumn === "ro_number" && sortorder, sortOrder: sortcolumn === "ro_number" && sortorder,
render: (text, record) => ( render: (text, record) => (
<Link to={"/manage/jobs/" + record.id}> <Link to={"/manage/jobs/" + record.id}>
@@ -50,7 +54,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
key: "ownr_ln", key: "ownr_ln",
ellipsis: true, ellipsis: true,
//sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln), //sorter: true, // (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
//sortOrder: sortcolumn === "ownr_ln" && sortorder, //sortOrder: sortcolumn === "ownr_ln" && sortorder,
render: (text, record) => { render: (text, record) => {
return record.ownerid ? ( return record.ownerid ? (
@@ -68,7 +71,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.ownr_ph1"), title: t("jobs.fields.ownr_ph1"),
dataIndex: "ownr_ph1", dataIndex: "ownr_ph1",
key: "ownr_ph1", key: "ownr_ph1",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => (
<StartChatButton phone={record.ownr_ph1} jobid={record.id} /> <StartChatButton phone={record.ownr_ph1} jobid={record.id} />
@@ -78,7 +80,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.ownr_ph2"), title: t("jobs.fields.ownr_ph2"),
dataIndex: "ownr_ph2", dataIndex: "ownr_ph2",
key: "ownr_ph2", key: "ownr_ph2",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => (
<StartChatButton phone={record.ownr_ph2} jobid={record.id} /> <StartChatButton phone={record.ownr_ph2} jobid={record.id} />
@@ -88,9 +89,8 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.status"), title: t("jobs.fields.status"),
dataIndex: "status", dataIndex: "status",
key: "status", key: "status",
ellipsis: true, ellipsis: true,
sorter: true, // (a, b) => alphaSort(a.status, b.status), sorter: search?.search ? (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.active_statuses) : true,
sortOrder: sortcolumn === "status" && sortorder, sortOrder: sortcolumn === "status" && sortorder,
render: (text, record) => { render: (text, record) => {
return record.status || t("general.labels.na"); return record.status || t("general.labels.na");
@@ -106,7 +106,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.vehicle"), title: t("jobs.fields.vehicle"),
dataIndex: "vehicle", dataIndex: "vehicle",
key: "vehicle", key: "vehicle",
ellipsis: true, ellipsis: true,
render: (text, record) => { render: (text, record) => {
return record.vehicleid ? ( return record.vehicleid ? (
@@ -127,7 +126,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
dataIndex: "plate_no", dataIndex: "plate_no",
key: "plate_no", key: "plate_no",
ellipsis: true, ellipsis: true,
sorter: true, //(a, b) => alphaSort(a.plate_no, b.plate_no), sorter: search?.search ? (a, b) => alphaSort(a.plate_no, b.plate_no) : true,
sortOrder: sortcolumn === "plate_no" && sortorder, sortOrder: sortcolumn === "plate_no" && sortorder,
render: (text, record) => { render: (text, record) => {
return record.plate_no ? record.plate_no : ""; return record.plate_no ? record.plate_no : "";
@@ -138,7 +137,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
dataIndex: "clm_no", dataIndex: "clm_no",
key: "clm_no", key: "clm_no",
ellipsis: true, ellipsis: true,
sorter: true, //(a, b) => alphaSort(a.clm_no, b.clm_no), sorter: search?.search ? (a, b) => alphaSort(a.clm_no, b.clm_no) : true,
sortOrder: sortcolumn === "clm_no" && sortorder, sortOrder: sortcolumn === "clm_no" && sortorder,
render: (text, record) => render: (text, record) =>
`${record.clm_no || ""}${ `${record.clm_no || ""}${
@@ -156,7 +155,7 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
dataIndex: "clm_total", dataIndex: "clm_total",
key: "clm_total", key: "clm_total",
sorter: true, //(a, b) => a.clm_total - b.clm_total, sorter: search?.search ? (a, b) => a.clm_total - b.clm_total : true,
sortOrder: sortcolumn === "clm_total" && sortorder, sortOrder: sortcolumn === "clm_total" && sortorder,
render: (text, record) => { render: (text, record) => {
return record.clm_total ? ( return record.clm_total ? (
@@ -170,7 +169,6 @@ export function JobsList({ bodyshop, refetch, loading, jobs, total }) {
title: t("jobs.fields.owner_owing"), title: t("jobs.fields.owner_owing"),
dataIndex: "owner_owing", dataIndex: "owner_owing",
key: "owner_owing", key: "owner_owing",
render: (text, record) => ( render: (text, record) => (
<CurrencyFormatter>{record.owner_owing}</CurrencyFormatter> <CurrencyFormatter>{record.owner_owing}</CurrencyFormatter>
), ),

View File

@@ -9,9 +9,7 @@ import { onlyUnique } from "../../utils/arrayHelper";
import { alphaSort, dateSort, statusSort } from "../../utils/sorters"; import { alphaSort, dateSort, statusSort } from "../../utils/sorters";
import JobAltTransportChange from "../job-at-change/job-at-change.component"; import JobAltTransportChange from "../job-at-change/job-at-change.component";
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
import OwnerNameDisplay, { import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component";
OwnerNameDisplayFunction,
} from "../owner-name-display/owner-name-display.component";
import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component"; import ProductionSubletsManageComponent from "../production-sublets-manage/production-sublets-manage.component";
import ProductionListColumnAlert from "./production-list-columns.alert.component"; import ProductionListColumnAlert from "./production-list-columns.alert.component";
import ProductionListColumnBodyPriority from "./production-list-columns.bodypriority.component"; import ProductionListColumnBodyPriority from "./production-list-columns.bodypriority.component";
@@ -34,11 +32,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
dataIndex: "viewdetail", dataIndex: "viewdetail",
key: "viewdetail", key: "viewdetail",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <Link to={{ search: `?selected=${record.id}` }}>{i18n.t("general.labels.view")}</Link>
<Link to={{ search: `?selected=${record.id}` }}>
{i18n.t("general.labels.view")}
</Link>
),
}, },
{ {
title: i18n.t("jobs.fields.ro_number"), title: i18n.t("jobs.fields.ro_number"),
@@ -46,23 +40,18 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "ro_number", key: "ro_number",
ellipsis: true, ellipsis: true,
sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
sortOrder: sortOrder: state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
render: (text, record) => render: (text, record) =>
technician ? ( technician ? (
<Link to={`/tech/joblookup?selected=${record.id}`}> <Link to={`/tech/joblookup?selected=${record.id}`}>
{record.ro_number} {record.ro_number}
{record.suspended && ( {record.suspended && <PauseCircleOutlined style={{ color: "orangered" }} />}
<PauseCircleOutlined style={{ color: "orangered" }} />
)}
</Link> </Link>
) : ( ) : (
<Link to={`/manage/jobs/${record.id}`}> <Link to={`/manage/jobs/${record.id}`}>
<Space> <Space>
{record.ro_number} {record.ro_number}
{record.suspended && ( {record.suspended && <PauseCircleOutlined style={{ color: "orangered" }} />}
<PauseCircleOutlined style={{ color: "orangered" }} />
)}
{record.iouparent && ( {record.iouparent && (
<Tooltip title={i18n.t("jobs.labels.iou")}> <Tooltip title={i18n.t("jobs.labels.iou")}>
<BranchesOutlined style={{ color: "orangered" }} /> <BranchesOutlined style={{ color: "orangered" }} />
@@ -70,7 +59,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
)} )}
</Space> </Space>
</Link> </Link>
), )
}, },
{ {
title: i18n.t("jobs.fields.owner"), title: i18n.t("jobs.fields.owner"),
@@ -85,10 +74,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
<OwnerNameDisplay ownerObject={record} /> <OwnerNameDisplay ownerObject={record} />
</Link> </Link>
), ),
sorter: (a, b) => sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)), sortOrder: state.sortedInfo.columnKey === "ownr" && state.sortedInfo.order
sortOrder:
state.sortedInfo.columnKey === "ownr" && state.sortedInfo.order,
}, },
{ {
title: i18n.t("jobs.fields.vehicle"), title: i18n.t("jobs.fields.vehicle"),
@@ -97,13 +84,10 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
ellipsis: true, ellipsis: true,
sorter: (a, b) => sorter: (a, b) =>
alphaSort( alphaSort(
`${a.v_model_yr || ""} ${a.v_make_desc || ""} ${ `${a.v_model_yr || ""} ${a.v_make_desc || ""} ${a.v_model_desc || ""}`,
a.v_model_desc || ""
}`,
`${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}` `${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
), ),
sortOrder: sortOrder: state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
render: (text, record) => render: (text, record) =>
technician ? ( technician ? (
<>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ <>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
@@ -115,7 +99,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
} ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${ } ${record.v_make_desc || ""} ${record.v_model_desc || ""} ${
record.v_color || "" record.v_color || ""
} ${record.plate_no || ""}`}</Link> } ${record.plate_no || ""}`}</Link>
), )
}, },
{ {
title: i18n.t("jobs.fields.actual_in"), title: i18n.t("jobs.fields.actual_in"),
@@ -123,11 +107,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "actual_in", key: "actual_in",
ellipsis: true, ellipsis: true,
sorter: (a, b) => dateSort(a.actual_in, b.actual_in), sorter: (a, b) => dateSort(a.actual_in, b.actual_in),
sortOrder: sortOrder: state.sortedInfo.columnKey === "actual_in" && state.sortedInfo.order,
state.sortedInfo.columnKey === "actual_in" && state.sortedInfo.order, render: (text, record) => <ProductionListDate record={record} field="actual_in" time />
render: (text, record) => (
<ProductionListDate record={record} field="actual_in" time />
),
}, },
{ {
title: i18n.t("jobs.fields.actual_in") + " (HH:MM)", title: i18n.t("jobs.fields.actual_in") + " (HH:MM)",
@@ -135,28 +116,16 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "actual_in_time", key: "actual_in_time",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <TimeFormatter>{record.actual_in}</TimeFormatter>
<TimeFormatter>{record.actual_in}</TimeFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.scheduled_completion"), title: i18n.t("jobs.fields.scheduled_completion"),
dataIndex: "scheduled_completion", dataIndex: "scheduled_completion",
key: "scheduled_completion", key: "scheduled_completion",
ellipsis: true, ellipsis: true,
sorter: (a, b) => sorter: (a, b) => dateSort(a.scheduled_completion, b.scheduled_completion),
dateSort(a.scheduled_completion, b.scheduled_completion), sortOrder: state.sortedInfo.columnKey === "scheduled_completion" && state.sortedInfo.order,
sortOrder: render: (text, record) => <ProductionListDate record={record} field="scheduled_completion" pastIndicator time />
state.sortedInfo.columnKey === "scheduled_completion" &&
state.sortedInfo.order,
render: (text, record) => (
<ProductionListDate
record={record}
field="scheduled_completion"
pastIndicator
time
/>
),
}, },
{ {
title: i18n.t("jobs.fields.scheduled_completion") + " (HH:MM)", title: i18n.t("jobs.fields.scheduled_completion") + " (HH:MM)",
@@ -164,9 +133,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "scheduled_completion_time", key: "scheduled_completion_time",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <TimeFormatter>{record.scheduled_completion}</TimeFormatter>
<TimeFormatter>{record.scheduled_completion}</TimeFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.date_last_contacted"), title: i18n.t("jobs.fields.date_last_contacted"),
@@ -174,10 +141,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "date_last_contacted", key: "date_last_contacted",
ellipsis: true, ellipsis: true,
sorter: (a, b) => dateSort(a.date_last_contacted, b.date_last_contacted), sorter: (a, b) => dateSort(a.date_last_contacted, b.date_last_contacted),
sortOrder: sortOrder: state.sortedInfo.columnKey === "date_last_contacted" && state.sortedInfo.order,
state.sortedInfo.columnKey === "date_last_contacted" && render: (text, record) => <ProductionListLastContacted record={record} />
state.sortedInfo.order,
render: (text, record) => <ProductionListLastContacted record={record} />,
}, },
{ {
title: i18n.t("jobs.fields.date_next_contact"), title: i18n.t("jobs.fields.date_next_contact"),
@@ -185,17 +150,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "date_next_contact", key: "date_next_contact",
ellipsis: true, ellipsis: true,
sorter: (a, b) => dateSort(a.date_next_contact, b.date_next_contact), sorter: (a, b) => dateSort(a.date_next_contact, b.date_next_contact),
sortOrder: sortOrder: state.sortedInfo.columnKey === "date_next_contact" && state.sortedInfo.order,
state.sortedInfo.columnKey === "date_next_contact" && render: (text, record) => <ProductionListDate record={record} field="date_next_contact" pastIndicator time />
state.sortedInfo.order,
render: (text, record) => (
<ProductionListDate
record={record}
field="date_next_contact"
pastIndicator
time
/>
),
}, },
{ {
title: i18n.t("jobs.fields.scheduled_delivery"), title: i18n.t("jobs.fields.scheduled_delivery"),
@@ -203,17 +159,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "scheduled_delivery", key: "scheduled_delivery",
ellipsis: true, ellipsis: true,
sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery), sorter: (a, b) => dateSort(a.scheduled_delivery, b.scheduled_delivery),
sortOrder: sortOrder: state.sortedInfo.columnKey === "scheduled_delivery" && state.sortedInfo.order,
state.sortedInfo.columnKey === "scheduled_delivery" && render: (text, record) => <ProductionListDate record={record} field="scheduled_delivery" pastIndicator time />
state.sortedInfo.order,
render: (text, record) => (
<ProductionListDate
record={record}
field="scheduled_delivery"
pastIndicator
time
/>
),
}, },
{ {
title: i18n.t("jobs.fields.scheduled_delivery") + " (HH:MM)", title: i18n.t("jobs.fields.scheduled_delivery") + " (HH:MM)",
@@ -221,9 +168,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "scheduled_delivery_time", key: "scheduled_delivery_time",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <TimeFormatter>{record.scheduled_delivery}</TimeFormatter>
<TimeFormatter>{record.scheduled_delivery}</TimeFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.ins_co_nm"), title: i18n.t("jobs.fields.ins_co_nm"),
@@ -231,8 +176,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "ins_co_nm", key: "ins_co_nm",
ellipsis: true, ellipsis: true,
sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm),
sortOrder: sortOrder: state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order
state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
}, },
{ {
title: i18n.t("jobs.fields.clm_no"), title: i18n.t("jobs.fields.clm_no"),
@@ -240,8 +184,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "clm_no", key: "clm_no",
ellipsis: true, ellipsis: true,
sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
sortOrder: sortOrder: state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order
state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order,
}, },
{ {
title: i18n.t("jobs.fields.clm_total"), title: i18n.t("jobs.fields.clm_total"),
@@ -249,11 +192,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "clm_total", key: "clm_total",
ellipsis: true, ellipsis: true,
sorter: (a, b) => a.clm_total - b.clm_total, sorter: (a, b) => a.clm_total - b.clm_total,
sortOrder: sortOrder: state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order,
state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, render: (text, record) => <CurrencyFormatter>{record.clm_total}</CurrencyFormatter>
render: (text, record) => (
<CurrencyFormatter>{record.clm_total}</CurrencyFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.owner_owing"), title: i18n.t("jobs.fields.owner_owing"),
@@ -261,49 +201,36 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "owner_owing", key: "owner_owing",
ellipsis: true, ellipsis: true,
sorter: (a, b) => a.owner_owing - b.owner_owing, sorter: (a, b) => a.owner_owing - b.owner_owing,
sortOrder: sortOrder: state.sortedInfo.columnKey === "owner_owing" && state.sortedInfo.order,
state.sortedInfo.columnKey === "owner_owing" && state.sortedInfo.order, render: (text, record) => <CurrencyFormatter>{record.owner_owing}</CurrencyFormatter>
render: (text, record) => (
<CurrencyFormatter>{record.owner_owing}</CurrencyFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.ownr_ph1"), title: i18n.t("jobs.fields.ownr_ph1"),
dataIndex: "ownr_ph1", dataIndex: "ownr_ph1",
key: "ownr_ph1", key: "ownr_ph1",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <PhoneFormatter>{record.ownr_ph1}</PhoneFormatter>
<PhoneFormatter>{record.ownr_ph1}</PhoneFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.ownr_ph2"), title: i18n.t("jobs.fields.ownr_ph2"),
dataIndex: "ownr_ph2", dataIndex: "ownr_ph2",
key: "ownr_ph2", key: "ownr_ph2",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <PhoneFormatter>{record.ownr_ph2}</PhoneFormatter>
<PhoneFormatter>{record.ownr_ph2}</PhoneFormatter>
),
}, },
{ {
title: i18n.t("jobs.fields.specialcoveragepolicy"), title: i18n.t("jobs.fields.specialcoveragepolicy"),
dataIndex: "special_coverage_policy", dataIndex: "special_coverage_policy",
key: "special_coverage_policy", key: "special_coverage_policy",
ellipsis: true, ellipsis: true,
sorter: (a, b) => sorter: (a, b) => Number(a.special_coverage_policy) - Number(b.special_coverage_policy),
Number(a.special_coverage_policy) - Number(b.special_coverage_policy), sortOrder: state.sortedInfo.columnKey === "special_coverage_policy" && state.sortedInfo.order,
sortOrder:
state.sortedInfo.columnKey === "special_coverage_policy" &&
state.sortedInfo.order,
filters: [ filters: [
{ text: "True", value: true }, { text: "True", value: true },
{ text: "False", value: false }, { text: "False", value: false }
], ],
onFilter: (value, record) => onFilter: (value, record) => value === record.special_coverage_policy,
value.includes(record.special_coverage_policy), render: (text, record) => <Checkbox checked={record.special_coverage_policy} />
render: (text, record) => (
<Checkbox checked={record.special_coverage_policy} />
),
}, },
{ {
@@ -312,15 +239,13 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "alt_transport", key: "alt_transport",
ellipsis: true, ellipsis: true,
sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport), sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
sortOrder: sortOrder: state.sortedInfo.columnKey === "alt_transport" && state.sortedInfo.order,
state.sortedInfo.columnKey === "alt_transport" &&
state.sortedInfo.order,
filters: filters:
(bodyshop && (bodyshop &&
bodyshop.appt_alt_transport.map((s) => { bodyshop.appt_alt_transport.map((s) => {
return { return {
text: s, text: s,
value: [s], value: [s]
}; };
})) || })) ||
[], [],
@@ -330,7 +255,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
{record.alt_transport} {record.alt_transport}
<JobAltTransportChange job={record} /> <JobAltTransportChange job={record} />
</div> </div>
), )
}, },
{ {
title: i18n.t("jobs.fields.status"), title: i18n.t("jobs.fields.status"),
@@ -338,9 +263,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "status", key: "status",
ellipsis: true, ellipsis: true,
sorter: (a, b) => statusSort(a.status, b.status, activeStatuses), sorter: (a, b) => statusSort(a.status, b.status, activeStatuses),
sortOrder: sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
state.sortedInfo.columnKey === "status" && state.sortedInfo.order, render: (text, record) => <ProductionListColumnStatus record={record} />
render: (text, record) => <ProductionListColumnStatus record={record} />,
}, },
{ {
title: i18n.t("jobs.fields.category"), title: i18n.t("jobs.fields.category"),
@@ -353,37 +277,30 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
bodyshop.md_categories.map((s) => { bodyshop.md_categories.map((s) => {
return { return {
text: s, text: s,
value: [s], value: [s]
}; };
})) || })) ||
[], [],
onFilter: (value, record) => value.includes(record.category), onFilter: (value, record) => value.includes(record.category),
sorter: (a, b) => alphaSort(a.category, b.category), sorter: (a, b) => alphaSort(a.category, b.category),
sortOrder: sortOrder: state.sortedInfo.columnKey === "category" && state.sortedInfo.order,
state.sortedInfo.columnKey === "category" && state.sortedInfo.order, render: (text, record) => <ProductionListColumnCategory record={record} />
render: (text, record) => (
<ProductionListColumnCategory record={record} />
),
}, },
{ {
title: i18n.t("production.labels.bodyhours"), title: i18n.t("production.labels.bodyhours"),
dataIndex: "labhrs", dataIndex: "labhrs",
key: "labhrs", key: "labhrs",
sorter: (a, b) => sorter: (a, b) => a.labhrs.aggregate.sum.mod_lb_hrs - b.labhrs.aggregate.sum.mod_lb_hrs,
a.labhrs.aggregate.sum.mod_lb_hrs - b.labhrs.aggregate.sum.mod_lb_hrs, sortOrder: state.sortedInfo.columnKey === "labhrs" && state.sortedInfo.order,
sortOrder: render: (text, record) => record.labhrs.aggregate.sum.mod_lb_hrs
state.sortedInfo.columnKey === "labhrs" && state.sortedInfo.order,
render: (text, record) => record.labhrs.aggregate.sum.mod_lb_hrs,
}, },
{ {
title: i18n.t("production.labels.refinishhours"), title: i18n.t("production.labels.refinishhours"),
dataIndex: "larhrs", dataIndex: "larhrs",
key: "larhrs", key: "larhrs",
sorter: (a, b) => sorter: (a, b) => a.larhrs.aggregate.sum.mod_lb_hrs - b.larhrs.aggregate.sum.mod_lb_hrs,
a.larhrs.aggregate.sum.mod_lb_hrs - b.larhrs.aggregate.sum.mod_lb_hrs, sortOrder: state.sortedInfo.columnKey === "larhrs" && state.sortedInfo.order,
sortOrder: render: (text, record) => record.larhrs.aggregate.sum.mod_lb_hrs
state.sortedInfo.columnKey === "larhrs" && state.sortedInfo.order,
render: (text, record) => record.larhrs.aggregate.sum.mod_lb_hrs,
}, },
{ {
title: i18n.t("production.labels.totalhours"), title: i18n.t("production.labels.totalhours"),
@@ -393,38 +310,36 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
a.labhrs.aggregate.sum.mod_lb_hrs + a.labhrs.aggregate.sum.mod_lb_hrs +
a.larhrs.aggregate.sum.mod_lb_hrs - a.larhrs.aggregate.sum.mod_lb_hrs -
(b.labhrs.aggregate.sum.mod_lb_hrs + b.larhrs.aggregate.sum.mod_lb_hrs), (b.labhrs.aggregate.sum.mod_lb_hrs + b.larhrs.aggregate.sum.mod_lb_hrs),
sortOrder: sortOrder: state.sortedInfo.columnKey === "totalhours" && state.sortedInfo.order,
state.sortedInfo.columnKey === "totalhours" && state.sortedInfo.order,
render: (text, record) => render: (text, record) =>
( (record.labhrs.aggregate.sum.mod_lb_hrs + record.larhrs.aggregate.sum.mod_lb_hrs).toFixed(1)
record.labhrs.aggregate.sum.mod_lb_hrs +
record.larhrs.aggregate.sum.mod_lb_hrs
).toFixed(1),
}, },
{ {
title: i18n.t("production.labels.alert"), title: i18n.t("production.labels.alert"),
dataIndex: "alert", dataIndex: "alert",
key: "alert", key: "alert",
sorter: (a, b) => sorter: (a, b) => Number(a.production_vars?.alert || false) - Number(b.production_vars?.alert || false),
Number(a.production_vars?.alert || false) - sortOrder: state.sortedInfo.columnKey === "alert" && state.sortedInfo.order,
Number(b.production_vars?.alert || false), filters: [
sortOrder: { text: "True", value: true },
state.sortedInfo.columnKey === "alert" && state.sortedInfo.order, { text: "False", value: false }
render: (text, record) => <ProductionListColumnAlert record={record} />, ],
onFilter: (value, record) => value === (record.production_vars?.alert || false),
render: (text, record) => <ProductionListColumnAlert record={record} />
}, },
{ {
title: i18n.t("production.labels.note"), title: i18n.t("production.labels.note"),
dataIndex: "note", dataIndex: "note",
key: "note", key: "note",
ellipsis: true, ellipsis: true,
render: (text, record) => <ProductionListColumnNote record={record} />, render: (text, record) => <ProductionListColumnNote record={record} />
}, },
{ {
title: i18n.t("production.labels.comment"), title: i18n.t("production.labels.comment"),
dataIndex: "comment", dataIndex: "comment",
key: "comment", key: "comment",
ellipsis: true, ellipsis: true,
render: (text, record) => <ProductionListColumnComment record={record} />, render: (text, record) => <ProductionListColumnComment record={record} />
}, },
{ {
title: i18n.t("production.labels.touchtime"), title: i18n.t("production.labels.touchtime"),
@@ -432,7 +347,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "tt", key: "tt",
render: (text, record) => { render: (text, record) => {
return <ProductionlistColumnTouchTime job={record} />; return <ProductionlistColumnTouchTime job={record} />;
}, }
}, },
{ {
title: i18n.t("production.labels.bodypriority"), title: i18n.t("production.labels.bodypriority"),
@@ -442,11 +357,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
sorter: (a, b) => sorter: (a, b) =>
((a.production_vars && a.production_vars.bodypriority) || 11) - ((a.production_vars && a.production_vars.bodypriority) || 11) -
((b.production_vars && b.production_vars.bodypriority) || 11), ((b.production_vars && b.production_vars.bodypriority) || 11),
sortOrder: sortOrder: state.sortedInfo.columnKey === "bodypriority" && state.sortedInfo.order,
state.sortedInfo.columnKey === "bodypriority" && state.sortedInfo.order, render: (text, record) => <ProductionListColumnBodyPriority record={record} />
render: (text, record) => (
<ProductionListColumnBodyPriority record={record} />
),
}, },
{ {
title: i18n.t("production.labels.paintpriority"), title: i18n.t("production.labels.paintpriority"),
@@ -456,12 +368,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
sorter: (a, b) => sorter: (a, b) =>
((a.production_vars && a.production_vars.paintpriority) || 11) - ((a.production_vars && a.production_vars.paintpriority) || 11) -
((b.production_vars && b.production_vars.paintpriority) || 11), ((b.production_vars && b.production_vars.paintpriority) || 11),
sortOrder: sortOrder: state.sortedInfo.columnKey === "paintpriority" && state.sortedInfo.order,
state.sortedInfo.columnKey === "paintpriority" && render: (text, record) => <ProductionListColumnPaintPriority record={record} />
state.sortedInfo.order,
render: (text, record) => (
<ProductionListColumnPaintPriority record={record} />
),
}, },
{ {
title: i18n.t("production.labels.detailpriority"), title: i18n.t("production.labels.detailpriority"),
@@ -471,110 +379,74 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
sorter: (a, b) => sorter: (a, b) =>
((a.production_vars && a.production_vars.detailpriority) || 11) - ((a.production_vars && a.production_vars.detailpriority) || 11) -
((b.production_vars && b.production_vars.detailpriority) || 11), ((b.production_vars && b.production_vars.detailpriority) || 11),
sortOrder: sortOrder: state.sortedInfo.columnKey === "detailpriority" && state.sortedInfo.order,
state.sortedInfo.columnKey === "detailpriority" && render: (text, record) => <ProductionListColumnDetailPriority record={record} />
state.sortedInfo.order,
render: (text, record) => (
<ProductionListColumnDetailPriority record={record} />
),
}, },
{ {
title: i18n.t("production.labels.sublets"), title: i18n.t("production.labels.sublets"),
dataIndex: "sublets", dataIndex: "sublets",
key: "sublets", key: "sublets",
render: (text, record) => ( render: (text, record) => <ProductionSubletsManageComponent subletJobLines={record.subletLines} />
<ProductionSubletsManageComponent subletJobLines={record.subletLines} />
),
}, },
{ {
title: i18n.t("jobs.fields.employee_body"), title: i18n.t("jobs.fields.employee_body"),
dataIndex: "employee_body", dataIndex: "employee_body",
key: "employee_body", key: "employee_body",
sortOrder: sortOrder: state.sortedInfo.columnKey === "employee_body" && state.sortedInfo.order,
state.sortedInfo.columnKey === "employee_body" &&
state.sortedInfo.order,
sorter: (a, b) => sorter: (a, b) =>
alphaSort( alphaSort(
bodyshop.employees?.find((e) => e.id === a.employee_body)?.first_name, bodyshop.employees?.find((e) => e.id === a.employee_body)?.first_name,
bodyshop.employees?.find((e) => e.id === b.employee_body)?.first_name bodyshop.employees?.find((e) => e.id === b.employee_body)?.first_name
), ),
render: (text, record) => ( render: (text, record) => <ProductionListEmployeeAssignment record={record} type="employee_body" />
<ProductionListEmployeeAssignment
record={record}
type="employee_body"
/>
),
}, },
{ {
title: i18n.t("jobs.fields.employee_prep"), title: i18n.t("jobs.fields.employee_prep"),
dataIndex: "employee_prep", dataIndex: "employee_prep",
key: "employee_prep", key: "employee_prep",
sortOrder: sortOrder: state.sortedInfo.columnKey === "employee_prep" && state.sortedInfo.order,
state.sortedInfo.columnKey === "employee_prep" &&
state.sortedInfo.order,
sorter: (a, b) => sorter: (a, b) =>
alphaSort( alphaSort(
bodyshop.employees?.find((e) => e.id === a.employee_prep)?.first_name, bodyshop.employees?.find((e) => e.id === a.employee_prep)?.first_name,
bodyshop.employees?.find((e) => e.id === b.employee_prep)?.first_name bodyshop.employees?.find((e) => e.id === b.employee_prep)?.first_name
), ),
render: (text, record) => ( render: (text, record) => <ProductionListEmployeeAssignment record={record} type="employee_prep" />
<ProductionListEmployeeAssignment
record={record}
type="employee_prep"
/>
),
}, },
{ {
title: i18n.t("jobs.fields.employee_csr"), title: i18n.t("jobs.fields.employee_csr"),
dataIndex: "employee_csr", dataIndex: "employee_csr",
key: "employee_csr", key: "employee_csr",
sortOrder: sortOrder: state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
state.sortedInfo.columnKey === "employee_csr" && state.sortedInfo.order,
sorter: (a, b) => sorter: (a, b) =>
alphaSort( alphaSort(
bodyshop.employees?.find((e) => e.id === a.employee_csr)?.first_name, bodyshop.employees?.find((e) => e.id === a.employee_csr)?.first_name,
bodyshop.employees?.find((e) => e.id === b.employee_csr)?.first_name bodyshop.employees?.find((e) => e.id === b.employee_csr)?.first_name
), ),
render: (text, record) => ( render: (text, record) => <ProductionListEmployeeAssignment record={record} type="employee_csr" />
<ProductionListEmployeeAssignment record={record} type="employee_csr" />
),
}, },
{ {
title: i18n.t("jobs.fields.employee_refinish"), title: i18n.t("jobs.fields.employee_refinish"),
dataIndex: "employee_refinish", dataIndex: "employee_refinish",
key: "employee_refinish", key: "employee_refinish",
sortOrder: sortOrder: state.sortedInfo.columnKey === "employee_refinish" && state.sortedInfo.order,
state.sortedInfo.columnKey === "employee_refinish" &&
state.sortedInfo.order,
sorter: (a, b) => sorter: (a, b) =>
alphaSort( alphaSort(
bodyshop.employees?.find((e) => e.id === a.employee_refinish) bodyshop.employees?.find((e) => e.id === a.employee_refinish)?.first_name,
?.first_name, bodyshop.employees?.find((e) => e.id === b.employee_refinish)?.first_name
bodyshop.employees?.find((e) => e.id === b.employee_refinish)
?.first_name
), ),
render: (text, record) => ( render: (text, record) => <ProductionListEmployeeAssignment record={record} type="employee_refinish" />
<ProductionListEmployeeAssignment
record={record}
type="employee_refinish"
/>
),
}, },
{ {
title: i18n.t("jobs.labels.parts_received"), title: i18n.t("jobs.labels.parts_received"),
dataIndex: "parts_received", dataIndex: "parts_received",
key: "parts_received", key: "parts_received",
render: (text, record) => ( render: (text, record) => <ProductionListColumnPartsReceived record={record} />
<ProductionListColumnPartsReceived record={record} />
),
}, },
{ {
title: i18n.t("jobs.fields.partsstatus"), title: i18n.t("jobs.fields.partsstatus"),
dataIndex: "partsstatus", dataIndex: "partsstatus",
key: "partsstatus", key: "partsstatus",
render: (text, record) => ( render: (text, record) => <JobPartsQueueCount parts={record.joblines_status} record={record} />
<JobPartsQueueCount parts={record.joblines_status} record={record} />
),
}, },
{ {
title: i18n.t("jobs.labels.estimator"), title: i18n.t("jobs.labels.estimator"),
@@ -585,8 +457,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
`${a.est_ct_fn || ""} ${a.est_ct_ln || ""}`.trim(), `${a.est_ct_fn || ""} ${a.est_ct_ln || ""}`.trim(),
`${b.est_ct_fn || ""} ${b.est_ct_ln || ""}`.trim() `${b.est_ct_fn || ""} ${b.est_ct_ln || ""}`.trim()
), ),
sortOrder: sortOrder: state.sortedInfo.columnKey === "estimator" && state.sortedInfo.order,
state.sortedInfo.columnKey === "estimator" && state.sortedInfo.order,
filters: filters:
(data && (data &&
data data
@@ -595,16 +466,12 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
.map((s) => { .map((s) => {
return { return {
text: s || "N/A", text: s || "N/A",
value: [s], value: [s]
}; };
})) || })) ||
[], [],
onFilter: (value, record) => onFilter: (value, record) => value.includes(`${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim()),
value.includes( render: (text, record) => `${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim()
`${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim()
),
render: (text, record) =>
`${record.est_ct_fn || ""} ${record.est_ct_ln || ""}`.trim(),
}, },
//Added as a place holder for St Claude. Not implemented as it requires another join for a field used by only 1 client. //Added as a place holder for St Claude. Not implemented as it requires another join for a field used by only 1 client.
@@ -634,12 +501,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "date_repairstarted", key: "date_repairstarted",
ellipsis: true, ellipsis: true,
sorter: (a, b) => dateSort(a.date_repairstarted, b.date_repairstarted), sorter: (a, b) => dateSort(a.date_repairstarted, b.date_repairstarted),
sortOrder: sortOrder: state.sortedInfo.columnKey === "date_repairstarted" && state.sortedInfo.order,
state.sortedInfo.columnKey === "date_repairstarted" && render: (text, record) => <ProductionListDate record={record} field="date_repairstarted" time />
state.sortedInfo.order,
render: (text, record) => (
<ProductionListDate record={record} field="date_repairstarted" time />
),
}, },
{ {
title: i18n.t("jobs.fields.date_repairstarted") + " (HH:MM)", title: i18n.t("jobs.fields.date_repairstarted") + " (HH:MM)",
@@ -647,10 +510,8 @@ const r = ({ technician, state, activeStatuses, data, bodyshop }) => {
key: "date_repairstarted_time", key: "date_repairstarted_time",
ellipsis: true, ellipsis: true,
render: (text, record) => ( render: (text, record) => <TimeFormatter>{record.date_repairstarted}</TimeFormatter>
<TimeFormatter>{record.date_repairstarted}</TimeFormatter> }
),
},
]; ];
}; };
export default r; export default r;

View File

@@ -1,7 +1,7 @@
import { gql } from "@apollo/client"; import { gql } from "@apollo/client";
export const QUERY_ALL_ACTIVE_JOBS_PAGINATED = gql` export const QUERY_ALL_ACTIVE_JOBS_PAGINATED = gql`
query QUERY_ALL_JOBS_PAGINATED_STATUS_FILTERED( query QUERY_ALL_ACTIVE_JOBS_PAGINATED(
$offset: Int $offset: Int
$limit: Int $limit: Int
$order: [jobs_order_by!] $order: [jobs_order_by!]

View File

@@ -1,37 +1,47 @@
export const BETA_KEY = 'betaSwitchImex'; export const BETA_KEY = "betaSwitchImex";
export const checkBeta = () => { export const checkBeta = () => {
const cookie = document.cookie.split('; ').find(row => row.startsWith(BETA_KEY)); const cookie = document.cookie.split("; ").find((row) => row.startsWith(BETA_KEY));
return cookie ? cookie.split('=')[1] === 'true' : false; return cookie ? cookie.split("=")[1] === "true" : false;
} };
export const setBeta = (value) => { export const setBeta = (value) => {
const domain = window.location.hostname.split('.').slice(-2).join('.'); const domain = window.location.hostname.split(".").slice(-2).join(".");
document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`; document.cookie = `${BETA_KEY}=${value}; path=/; domain=.${domain}`;
} };
export const handleBeta = () => { export const handleBeta = () => {
// If the current host name does not start with beta or test, then we don't need to do anything. if (window.location.hostname.startsWith("localhost")) {
if (window.location.hostname.startsWith('localhost')) { console.log("Not on beta or test, so no need to handle beta.");
console.log('Not on beta or test, so no need to handle beta.'); return;
return; }
const isBeta = checkBeta();
const currentHostName = window.location.hostname;
// Determine if the host name starts with "beta" or "www.beta"
const isBetaHost = currentHostName.startsWith("beta.");
const isBetaHostWithWWW = currentHostName.startsWith("www.beta.");
if (isBeta) {
// If beta is on and we are not on a beta domain, redirect to the beta version
if (!isBetaHost && !isBetaHostWithWWW) {
const newHostName = currentHostName.startsWith("www.")
? `www.beta.${currentHostName.replace(/^www\./, "")}`
: `beta.${currentHostName}`;
const href = `${window.location.protocol}//${newHostName}${window.location.pathname}${window.location.search}${window.location.hash}`;
window.location.replace(href);
} }
// Otherwise, if beta is on and we're already on a beta domain, stay there
const isBeta = checkBeta(); } else {
// If beta is off and we are on a beta domain, redirect to the non-beta version
const currentHostName = window.location.hostname; if (isBetaHost || isBetaHostWithWWW) {
const newHostName = currentHostName.replace(/^www\.beta\./, "www.").replace(/^beta\./, "");
// Beta is enabled, but the current host name does start with beta. const href = `${window.location.protocol}//${newHostName}${window.location.pathname}${window.location.search}${window.location.hash}`;
if (isBeta && !currentHostName.startsWith('beta')) { window.location.replace(href);
const href= `${window.location.protocol}//beta.${currentHostName}${window.location.pathname}${window.location.search}${window.location.hash}`;
window.location.replace(href);
} }
// Otherwise, if beta is off and we're not on a beta domain, stay there
}
};
// Beta is not enabled, but the current host name does start with beta.
else if (!isBeta && currentHostName.startsWith('beta')) {
const href = `${window.location.protocol}//${currentHostName.replace('beta.', '')}${window.location.pathname}${window.location.search}${window.location.hash}`;
window.location.replace(href);
}
}
export default handleBeta; export default handleBeta;