Merge branch 'feature/IO-1828-Front-End-Package-Updates' into test-beta
This commit is contained in:
@@ -1,443 +1,455 @@
|
|||||||
import {BranchesOutlined, ExclamationCircleFilled, PauseCircleOutlined,} from "@ant-design/icons";
|
import {
|
||||||
import {Card, Space, Switch, Table, Tooltip, Typography} from "antd";
|
BranchesOutlined,
|
||||||
import dayjs from "../../../utils/day";
|
ExclamationCircleFilled,
|
||||||
import React, {useState} from "react";
|
PauseCircleOutlined,
|
||||||
import {useTranslation} from "react-i18next";
|
} from "@ant-design/icons";
|
||||||
import {Link} from "react-router-dom";
|
import { Card, Space, Switch, Table, Tooltip, Typography } from "antd";
|
||||||
import {TimeFormatter} from "../../../utils/DateFormatter";
|
import moment from "moment";
|
||||||
import {onlyUnique} from "../../../utils/arrayHelper";
|
import React, { useState } from "react";
|
||||||
import {alphaSort, dateSort} from "../../../utils/sorters";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { Link } from "react-router-dom";
|
||||||
|
import { TimeFormatter } from "../../../utils/DateFormatter";
|
||||||
|
import { onlyUnique } from "../../../utils/arrayHelper";
|
||||||
|
import { alphaSort, dateSort } from "../../../utils/sorters";
|
||||||
import useLocalStorage from "../../../utils/useLocalStorage";
|
import useLocalStorage from "../../../utils/useLocalStorage";
|
||||||
import ChatOpenButton from "../../chat-open-button/chat-open-button.component";
|
import ChatOpenButton from "../../chat-open-button/chat-open-button.component";
|
||||||
import OwnerNameDisplay, {OwnerNameDisplayFunction,} from "../../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay, {
|
||||||
|
OwnerNameDisplayFunction,
|
||||||
|
} from "../../owner-name-display/owner-name-display.component";
|
||||||
import DashboardRefreshRequired from "../refresh-required.component";
|
import DashboardRefreshRequired from "../refresh-required.component";
|
||||||
|
|
||||||
export default function DashboardScheduledInToday({data, ...cardProps}) {
|
export default function DashboardScheduledInToday({ data, ...cardProps }) {
|
||||||
const {t} = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
sortedInfo: {},
|
sortedInfo: {},
|
||||||
});
|
});
|
||||||
const [isTvModeScheduledIn, setIsTvModeScheduledIn] = useLocalStorage(
|
const [isTvModeScheduledIn, setIsTvModeScheduledIn] = useLocalStorage(
|
||||||
"isTvModeScheduledIn",
|
"isTvModeScheduledIn",
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
if (!data) return null;
|
|
||||||
if (!data.scheduled_in_today)
|
|
||||||
return <DashboardRefreshRequired {...cardProps} />;
|
|
||||||
|
|
||||||
const appt = []; // Flatten Data
|
if (!data) return null;
|
||||||
data.scheduled_in_today.forEach((item) => {
|
if (!data.scheduled_in_today)
|
||||||
if (item.job) {
|
return <DashboardRefreshRequired {...cardProps} />;
|
||||||
var i = {
|
|
||||||
canceled: item.canceled,
|
|
||||||
id: item.id,
|
|
||||||
alt_transport: item.job.alt_transport,
|
|
||||||
clm_no: item.job.clm_no,
|
|
||||||
jobid: item.job.jobid,
|
|
||||||
joblines_body: item.job.joblines
|
|
||||||
.filter((l) => l.mod_lbr_ty !== "LAR")
|
|
||||||
.reduce((acc, val) => acc + val.mod_lb_hrs, 0),
|
|
||||||
joblines_ref: item.job.joblines
|
|
||||||
.filter((l) => l.mod_lbr_ty === "LAR")
|
|
||||||
.reduce((acc, val) => acc + val.mod_lb_hrs, 0),
|
|
||||||
ins_co_nm: item.job.ins_co_nm,
|
|
||||||
iouparent: item.job.iouparent,
|
|
||||||
ownerid: item.job.ownerid,
|
|
||||||
ownr_co_nm: item.job.ownr_co_nm,
|
|
||||||
ownr_ea: item.job.ownr_ea,
|
|
||||||
ownr_fn: item.job.ownr_fn,
|
|
||||||
ownr_ln: item.job.ownr_ln,
|
|
||||||
ownr_ph1: item.job.ownr_ph1,
|
|
||||||
ownr_ph2: item.job.ownr_ph2,
|
|
||||||
production_vars: item.job.production_vars,
|
|
||||||
ro_number: item.job.ro_number,
|
|
||||||
suspended: item.job.suspended,
|
|
||||||
v_make_desc: item.job.v_make_desc,
|
|
||||||
v_model_desc: item.job.v_model_desc,
|
|
||||||
v_model_yr: item.job.v_model_yr,
|
|
||||||
v_vin: item.job.v_vin,
|
|
||||||
vehicleid: item.job.vehicleid,
|
|
||||||
note: item.note,
|
|
||||||
start: item.start,
|
|
||||||
title: item.title,
|
|
||||||
};
|
|
||||||
appt.push(i);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
appt.sort(function (a, b) {
|
|
||||||
return dayjs(a.start) - dayjs(b.start);
|
|
||||||
});
|
|
||||||
|
|
||||||
const tvFontSize = 16;
|
const appt = []; // Flatten Data
|
||||||
const tvFontWeight = "bold";
|
data.scheduled_in_today.forEach((item) => {
|
||||||
|
if (item.job) {
|
||||||
|
var i = {
|
||||||
|
canceled: item.canceled,
|
||||||
|
id: item.id,
|
||||||
|
alt_transport: item.job.alt_transport,
|
||||||
|
clm_no: item.job.clm_no,
|
||||||
|
jobid: item.job.jobid,
|
||||||
|
joblines_body: item.job.joblines
|
||||||
|
.filter((l) => l.mod_lbr_ty !== "LAR")
|
||||||
|
.reduce((acc, val) => acc + val.mod_lb_hrs, 0),
|
||||||
|
joblines_ref: item.job.joblines
|
||||||
|
.filter((l) => l.mod_lbr_ty === "LAR")
|
||||||
|
.reduce((acc, val) => acc + val.mod_lb_hrs, 0),
|
||||||
|
ins_co_nm: item.job.ins_co_nm,
|
||||||
|
iouparent: item.job.iouparent,
|
||||||
|
ownerid: item.job.ownerid,
|
||||||
|
ownr_co_nm: item.job.ownr_co_nm,
|
||||||
|
ownr_ea: item.job.ownr_ea,
|
||||||
|
ownr_fn: item.job.ownr_fn,
|
||||||
|
ownr_ln: item.job.ownr_ln,
|
||||||
|
ownr_ph1: item.job.ownr_ph1,
|
||||||
|
ownr_ph2: item.job.ownr_ph2,
|
||||||
|
production_vars: item.job.production_vars,
|
||||||
|
ro_number: item.job.ro_number,
|
||||||
|
suspended: item.job.suspended,
|
||||||
|
v_make_desc: item.job.v_make_desc,
|
||||||
|
v_model_desc: item.job.v_model_desc,
|
||||||
|
v_model_yr: item.job.v_model_yr,
|
||||||
|
v_vin: item.job.v_vin,
|
||||||
|
vehicleid: item.job.vehicleid,
|
||||||
|
note: item.note,
|
||||||
|
start: item.start,
|
||||||
|
title: item.title,
|
||||||
|
};
|
||||||
|
appt.push(i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
appt.sort(function (a, b) {
|
||||||
|
return new moment(a.start) - new moment(b.start);
|
||||||
|
});
|
||||||
|
|
||||||
const tvColumns = [
|
const tvFontSize = 16;
|
||||||
{
|
const tvFontWeight = "bold";
|
||||||
title: t("appointments.fields.time"),
|
|
||||||
dataIndex: "start",
|
const tvColumns = [
|
||||||
key: "start",
|
{
|
||||||
ellipsis: true,
|
title: t("appointments.fields.time"),
|
||||||
sorter: (a, b) => dateSort(a.start, b.start),
|
dataIndex: "start",
|
||||||
sortOrder:
|
key: "start",
|
||||||
state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
|
ellipsis: true,
|
||||||
render: (text, record) => (
|
sorter: (a, b) => dateSort(a.start, b.start),
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
|
||||||
|
render: (text, record) => (
|
||||||
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
<TimeFormatter>{record.start}</TimeFormatter>
|
<TimeFormatter>{record.start}</TimeFormatter>
|
||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
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: (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) => (
|
||||||
<Link
|
<Link
|
||||||
to={"/manage/jobs/" + record.jobid}
|
to={"/manage/jobs/" + record.jobid}
|
||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
>
|
>
|
||||||
<Space>
|
<Space>
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
{record.ro_number || t("general.labels.na")}
|
{record.ro_number || t("general.labels.na")}
|
||||||
{record.production_vars && record.production_vars.alert ? (
|
{record.production_vars && record.production_vars.alert ? (
|
||||||
<ExclamationCircleFilled className="production-alert"/>
|
<ExclamationCircleFilled className="production-alert" />
|
||||||
) : null}
|
) : null}
|
||||||
{record.suspended && (
|
{record.suspended && (
|
||||||
<PauseCircleOutlined style={{color: "orangered"}}/>
|
<PauseCircleOutlined style={{ color: "orangered" }} />
|
||||||
)}
|
)}
|
||||||
{record.iouparent && (
|
{record.iouparent && (
|
||||||
<Tooltip title={t("jobs.labels.iou")}>
|
<Tooltip title={t("jobs.labels.iou")}>
|
||||||
<BranchesOutlined style={{color: "orangered"}}/>
|
<BranchesOutlined style={{ color: "orangered" }} />
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
)}
|
)}
|
||||||
</span>
|
</span>
|
||||||
</Space>
|
</Space>
|
||||||
</Link>
|
</Link>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.owner"),
|
title: t("jobs.fields.owner"),
|
||||||
dataIndex: "owner",
|
dataIndex: "owner",
|
||||||
key: "owner",
|
key: "owner",
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
sorter: (a, b) =>
|
sorter: (a, b) =>
|
||||||
alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
||||||
render: (text, record) => {
|
render: (text, record) => {
|
||||||
return record.ownerid ? (
|
return record.ownerid ? (
|
||||||
<Link
|
<Link
|
||||||
to={"/manage/owners/" + record.ownerid}
|
to={"/manage/owners/" + record.ownerid}
|
||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
>
|
>
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
<OwnerNameDisplay ownerObject={record}/>
|
<OwnerNameDisplay ownerObject={record} />
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
<OwnerNameDisplay ownerObject={record}/>
|
<OwnerNameDisplay ownerObject={record} />
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.vehicle"),
|
title: t("jobs.fields.vehicle"),
|
||||||
dataIndex: "vehicle",
|
dataIndex: "vehicle",
|
||||||
key: "vehicle",
|
key: "vehicle",
|
||||||
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) => {
|
||||||
return record.vehicleid ? (
|
return record.vehicleid ? (
|
||||||
<Link
|
<Link
|
||||||
to={"/manage/vehicles/" + record.vehicleid}
|
to={"/manage/vehicles/" + record.vehicleid}
|
||||||
onClick={(e) => e.stopPropagation()}
|
onClick={(e) => e.stopPropagation()}
|
||||||
>
|
>
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
||||||
record.v_model_desc || ""
|
record.v_model_desc || ""
|
||||||
}`}
|
}`}
|
||||||
</span>
|
</span>
|
||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>{`${
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>{`${
|
||||||
record.v_model_yr || ""
|
record.v_model_yr || ""
|
||||||
} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`}</span>
|
} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`}</span>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("appointments.fields.alt_transport"),
|
title: t("appointments.fields.alt_transport"),
|
||||||
dataIndex: "alt_transport",
|
dataIndex: "alt_transport",
|
||||||
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.columnKey === "alt_transport" &&
|
||||||
state.sortedInfo.order,
|
state.sortedInfo.order,
|
||||||
filters:
|
filters:
|
||||||
(appt &&
|
(appt &&
|
||||||
appt
|
appt
|
||||||
.map((j) => j.alt_transport)
|
.map((j) => j.alt_transport)
|
||||||
.filter(onlyUnique)
|
.filter(onlyUnique)
|
||||||
.map((s) => {
|
.map((s) => {
|
||||||
return {
|
return {
|
||||||
text: s || "No Alt. Transport",
|
text: s || "No Alt. Transport",
|
||||||
value: [s],
|
value: [s],
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
[],
|
[],
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
{record.alt_transport}
|
{record.alt_transport}
|
||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.lab"),
|
title: t("jobs.fields.lab"),
|
||||||
dataIndex: "joblines_body",
|
dataIndex: "joblines_body",
|
||||||
key: "joblines_body",
|
key: "joblines_body",
|
||||||
sorter: (a, b) => a.joblines_body - b.joblines_body,
|
sorter: (a, b) => a.joblines_body - b.joblines_body,
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "joblines_body" &&
|
state.sortedInfo.columnKey === "joblines_body" &&
|
||||||
state.sortedInfo.order,
|
state.sortedInfo.order,
|
||||||
align: "right",
|
align: "right",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
{record.joblines_body.toFixed(1)}
|
{record.joblines_body.toFixed(1)}
|
||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.lar"),
|
title: t("jobs.fields.lar"),
|
||||||
dataIndex: "joblines_ref",
|
dataIndex: "joblines_ref",
|
||||||
key: "joblines_ref",
|
key: "joblines_ref",
|
||||||
sorter: (a, b) => a.joblines_ref - b.joblines_ref,
|
sorter: (a, b) => a.joblines_ref - b.joblines_ref,
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "joblines_ref" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "joblines_ref" && state.sortedInfo.order,
|
||||||
align: "right",
|
align: "right",
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{ fontSize: tvFontSize, fontWeight: tvFontWeight }}>
|
||||||
{record.joblines_ref.toFixed(1)}
|
{record.joblines_ref.toFixed(1)}
|
||||||
</span>
|
</span>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
const columns = [
|
|
||||||
{
|
|
||||||
title: t("appointments.fields.time"),
|
|
||||||
dataIndex: "start",
|
|
||||||
key: "start",
|
|
||||||
ellipsis: true,
|
|
||||||
sorter: (a, b) => dateSort(a.start, b.start),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
|
|
||||||
render: (text, record) => <TimeFormatter>{record.start}</TimeFormatter>,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("jobs.fields.ro_number"),
|
|
||||||
dataIndex: "ro_number",
|
|
||||||
key: "ro_number",
|
|
||||||
sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, render: (text, record) => (
|
|
||||||
<Link
|
|
||||||
to={"/manage/jobs/" + record.jobid}
|
|
||||||
onClick={(e) => e.stopPropagation()}
|
|
||||||
>
|
|
||||||
<Space>
|
|
||||||
{record.ro_number || t("general.labels.na")}
|
|
||||||
{record.production_vars && record.production_vars.alert ? (
|
|
||||||
<ExclamationCircleFilled className="production-alert"/>
|
|
||||||
) : null}
|
|
||||||
{record.suspended && (
|
|
||||||
<PauseCircleOutlined style={{color: "orangered"}}/>
|
|
||||||
)}
|
|
||||||
{record.iouparent && (
|
|
||||||
<Tooltip title={t("jobs.labels.iou")}>
|
|
||||||
<BranchesOutlined style={{color: "orangered"}}/>
|
|
||||||
</Tooltip>
|
|
||||||
)}
|
|
||||||
</Space>
|
|
||||||
</Link>
|
|
||||||
),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("jobs.fields.owner"),
|
|
||||||
dataIndex: "owner",
|
|
||||||
key: "owner",
|
|
||||||
ellipsis: true,
|
|
||||||
sorter: (a, b) =>
|
|
||||||
alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
|
||||||
render: (text, record) => {
|
|
||||||
return record.ownerid ? (
|
|
||||||
<Link
|
|
||||||
to={"/manage/owners/" + record.ownerid}
|
|
||||||
onClick={(e) => e.stopPropagation()}
|
|
||||||
>
|
|
||||||
<OwnerNameDisplay ownerObject={record}/>
|
|
||||||
</Link>
|
|
||||||
) : (
|
|
||||||
<span>
|
|
||||||
<OwnerNameDisplay ownerObject={record}/>
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("dashboard.labels.phone"),
|
|
||||||
dataIndex: "ownr_ph",
|
|
||||||
key: "ownr_ph",
|
|
||||||
ellipsis: true,
|
|
||||||
responsive: ["md"],
|
|
||||||
render: (text, record) => (<Space size="small" wrap>
|
|
||||||
<ChatOpenButton phone={record.ownr_ph1} jobid={record.jobid}/>
|
|
||||||
|
|
||||||
<ChatOpenButton phone={record.ownr_ph2} jobid={record.jobid}/>
|
const columns = [
|
||||||
</Space>),
|
{
|
||||||
},
|
title: t("appointments.fields.time"),
|
||||||
{
|
dataIndex: "start",
|
||||||
title: t("jobs.fields.ownr_ea"),
|
key: "start",
|
||||||
dataIndex: "ownr_ea",
|
ellipsis: true,
|
||||||
key: "ownr_ea",
|
sorter: (a, b) => dateSort(a.start, b.start),
|
||||||
ellipsis: true,
|
sortOrder:
|
||||||
responsive: ["md"],
|
state.sortedInfo.columnKey === "start" && state.sortedInfo.order,
|
||||||
render: (text, record) => (
|
render: (text, record) => <TimeFormatter>{record.start}</TimeFormatter>,
|
||||||
<a href={`mailto:${record.ownr_ea}`}>{record.ownr_ea}</a>
|
},
|
||||||
),
|
{
|
||||||
},
|
title: t("jobs.fields.ro_number"),
|
||||||
{
|
dataIndex: "ro_number",
|
||||||
title: t("jobs.fields.vehicle"),
|
key: "ro_number",
|
||||||
dataIndex: "vehicle",
|
sorter: (a, b) => alphaSort(a.ro_number, b.ro_number),
|
||||||
key: "vehicle",
|
sortOrder:
|
||||||
ellipsis: true,
|
state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order,
|
||||||
sorter: (a, b) =>
|
render: (text, record) => (
|
||||||
alphaSort(
|
<Link
|
||||||
`${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
|
to={"/manage/jobs/" + record.jobid}
|
||||||
a.v_model_desc || ""
|
onClick={(e) => e.stopPropagation()}
|
||||||
}`,
|
|
||||||
`${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
|
|
||||||
),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order, render: (text, record) => {
|
|
||||||
return record.vehicleid ? (
|
|
||||||
<Link
|
|
||||||
to={"/manage/vehicles/" + record.vehicleid}
|
|
||||||
onClick={(e) => e.stopPropagation()}
|
|
||||||
>
|
|
||||||
{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
|
||||||
record.v_model_desc || ""
|
|
||||||
}`}
|
|
||||||
</Link>
|
|
||||||
) : (
|
|
||||||
<span>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
|
||||||
record.v_model_desc || ""
|
|
||||||
}`}</span>
|
|
||||||
);
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("jobs.fields.ins_co_nm"),
|
|
||||||
dataIndex: "ins_co_nm",
|
|
||||||
key: "ins_co_nm",
|
|
||||||
ellipsis: true,
|
|
||||||
responsive: ["md"],
|
|
||||||
sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
|
|
||||||
filters:
|
|
||||||
(appt &&
|
|
||||||
appt
|
|
||||||
.map((j) => j.ins_co_nm)
|
|
||||||
.filter(onlyUnique)
|
|
||||||
.map((s) => {
|
|
||||||
return {
|
|
||||||
text: s || "No Ins. Co.*",
|
|
||||||
value: [s],
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
|
||||||
[],
|
|
||||||
onFilter: (value, record) => value.includes(record.ins_co_nm),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t("appointments.fields.alt_transport"),
|
|
||||||
dataIndex: "alt_transport",
|
|
||||||
key: "alt_transport",
|
|
||||||
ellipsis: true,
|
|
||||||
sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
|
|
||||||
sortOrder:
|
|
||||||
state.sortedInfo.columnKey === "alt_transport" &&
|
|
||||||
state.sortedInfo.order,
|
|
||||||
filters:
|
|
||||||
(appt &&
|
|
||||||
appt
|
|
||||||
.map((j) => j.alt_transport)
|
|
||||||
.filter(onlyUnique)
|
|
||||||
.map((s) => {
|
|
||||||
return {
|
|
||||||
text: s || "No Alt. Transport",
|
|
||||||
value: [s],
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
|
||||||
[],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const handleTableChange = (sorter) => {
|
|
||||||
setState({...state, sortedInfo: sorter});
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Card
|
|
||||||
title={t("dashboard.titles.scheduledindate", {
|
|
||||||
date: dayjs().startOf("day").format("MM/DD/YYYY"),
|
|
||||||
})}
|
|
||||||
extra={
|
|
||||||
<Space>
|
|
||||||
<Typography.Text>{t("general.labels.tvmode")}</Typography.Text>
|
|
||||||
<Switch
|
|
||||||
onClick={() => setIsTvModeScheduledIn(!isTvModeScheduledIn)}
|
|
||||||
defaultChecked={isTvModeScheduledIn}
|
|
||||||
/>
|
|
||||||
</Space>
|
|
||||||
}{...cardProps}
|
|
||||||
>
|
>
|
||||||
<div style={{height: "100%"}}>
|
<Space>
|
||||||
<Table
|
{record.ro_number || t("general.labels.na")}
|
||||||
onChange={handleTableChange}
|
{record.production_vars && record.production_vars.alert ? (
|
||||||
pagination={false}
|
<ExclamationCircleFilled className="production-alert" />
|
||||||
columns={isTvModeScheduledIn ? tvColumns : columns}
|
) : null}
|
||||||
scroll={{x: true, y: "calc(100% - 2em)"}}
|
{record.suspended && (
|
||||||
rowKey="id"
|
<PauseCircleOutlined style={{ color: "orangered" }} />
|
||||||
style={{height: "85%"}}
|
)}
|
||||||
dataSource={appt} size={isTvModeScheduledIn ? "small" : "middle"}
|
{record.iouparent && (
|
||||||
/>
|
<Tooltip title={t("jobs.labels.iou")}>
|
||||||
</div>
|
<BranchesOutlined style={{ color: "orangered" }} />
|
||||||
</Card>
|
</Tooltip>
|
||||||
);
|
)}
|
||||||
|
</Space>
|
||||||
|
</Link>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.owner"),
|
||||||
|
dataIndex: "owner",
|
||||||
|
key: "owner",
|
||||||
|
ellipsis: true,
|
||||||
|
sorter: (a, b) =>
|
||||||
|
alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)),
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
||||||
|
render: (text, record) => {
|
||||||
|
return record.ownerid ? (
|
||||||
|
<Link
|
||||||
|
to={"/manage/owners/" + record.ownerid}
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
>
|
||||||
|
<OwnerNameDisplay ownerObject={record} />
|
||||||
|
</Link>
|
||||||
|
) : (
|
||||||
|
<span>
|
||||||
|
<OwnerNameDisplay ownerObject={record} />
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("dashboard.labels.phone"),
|
||||||
|
dataIndex: "ownr_ph",
|
||||||
|
key: "ownr_ph",
|
||||||
|
ellipsis: true,
|
||||||
|
responsive: ["md"],
|
||||||
|
render: (text, record) => (
|
||||||
|
<Space size="small" wrap>
|
||||||
|
<ChatOpenButton phone={record.ownr_ph1} jobid={record.jobid} />
|
||||||
|
<ChatOpenButton phone={record.ownr_ph2} jobid={record.jobid} />
|
||||||
|
</Space>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.ownr_ea"),
|
||||||
|
dataIndex: "ownr_ea",
|
||||||
|
key: "ownr_ea",
|
||||||
|
ellipsis: true,
|
||||||
|
responsive: ["md"],
|
||||||
|
render: (text, record) => (
|
||||||
|
<a href={`mailto:${record.ownr_ea}`}>{record.ownr_ea}</a>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.vehicle"),
|
||||||
|
dataIndex: "vehicle",
|
||||||
|
key: "vehicle",
|
||||||
|
ellipsis: true,
|
||||||
|
sorter: (a, b) =>
|
||||||
|
alphaSort(
|
||||||
|
`${a.v_model_yr || ""} ${a.v_make_desc || ""} ${
|
||||||
|
a.v_model_desc || ""
|
||||||
|
}`,
|
||||||
|
`${b.v_model_yr || ""} ${b.v_make_desc || ""} ${b.v_model_desc || ""}`
|
||||||
|
),
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "vehicle" && state.sortedInfo.order,
|
||||||
|
render: (text, record) => {
|
||||||
|
return record.vehicleid ? (
|
||||||
|
<Link
|
||||||
|
to={"/manage/vehicles/" + record.vehicleid}
|
||||||
|
onClick={(e) => e.stopPropagation()}
|
||||||
|
>
|
||||||
|
{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
||||||
|
record.v_model_desc || ""
|
||||||
|
}`}
|
||||||
|
</Link>
|
||||||
|
) : (
|
||||||
|
<span>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
||||||
|
record.v_model_desc || ""
|
||||||
|
}`}</span>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.ins_co_nm"),
|
||||||
|
dataIndex: "ins_co_nm",
|
||||||
|
key: "ins_co_nm",
|
||||||
|
ellipsis: true,
|
||||||
|
responsive: ["md"],
|
||||||
|
sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm),
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
|
||||||
|
filters:
|
||||||
|
(appt &&
|
||||||
|
appt
|
||||||
|
.map((j) => j.ins_co_nm)
|
||||||
|
.filter(onlyUnique)
|
||||||
|
.map((s) => {
|
||||||
|
return {
|
||||||
|
text: s || "No Ins. Co.*",
|
||||||
|
value: [s],
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
|
[],
|
||||||
|
onFilter: (value, record) => value.includes(record.ins_co_nm),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: t("appointments.fields.alt_transport"),
|
||||||
|
dataIndex: "alt_transport",
|
||||||
|
key: "alt_transport",
|
||||||
|
ellipsis: true,
|
||||||
|
sorter: (a, b) => alphaSort(a.alt_transport, b.alt_transport),
|
||||||
|
sortOrder:
|
||||||
|
state.sortedInfo.columnKey === "alt_transport" &&
|
||||||
|
state.sortedInfo.order,
|
||||||
|
filters:
|
||||||
|
(appt &&
|
||||||
|
appt
|
||||||
|
.map((j) => j.alt_transport)
|
||||||
|
.filter(onlyUnique)
|
||||||
|
.map((s) => {
|
||||||
|
return {
|
||||||
|
text: s || "No Alt. Transport",
|
||||||
|
value: [s],
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
|
[],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const handleTableChange = (sorter) => {
|
||||||
|
setState({ ...state, sortedInfo: sorter });
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<Card
|
||||||
|
title={t("dashboard.titles.scheduledindate", {
|
||||||
|
date: moment().startOf("day").format("MM/DD/YYYY"),
|
||||||
|
})}
|
||||||
|
extra={
|
||||||
|
<Space>
|
||||||
|
<Typography.Text>{t("general.labels.tvmode")}</Typography.Text>
|
||||||
|
<Switch
|
||||||
|
onClick={() => setIsTvModeScheduledIn(!isTvModeScheduledIn)}
|
||||||
|
defaultChecked={isTvModeScheduledIn}
|
||||||
|
/>
|
||||||
|
</Space>
|
||||||
|
}
|
||||||
|
{...cardProps}
|
||||||
|
>
|
||||||
|
<div style={{ height: "100%" }}>
|
||||||
|
<Table
|
||||||
|
onChange={handleTableChange}
|
||||||
|
pagination={false}
|
||||||
|
columns={isTvModeScheduledIn ? tvColumns : columns}
|
||||||
|
scroll={{ x: true, y: "calc(100% - 2em)" }}
|
||||||
|
rowKey="id"
|
||||||
|
style={{ height: "85%" }}
|
||||||
|
dataSource={appt}
|
||||||
|
size={isTvModeScheduledIn ? "small" : "middle"}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const DashboardScheduledInTodayGql = `
|
export const DashboardScheduledInTodayGql = `
|
||||||
scheduled_in_today: appointments(where: {start: {_gte: "${dayjs()
|
scheduled_in_today: appointments(where: {start: {_gte: "${moment()
|
||||||
.startOf("day")
|
.startOf("day")
|
||||||
.toISOString()}", _lte: "${dayjs()
|
.toISOString()}", _lte: "${moment()
|
||||||
.endOf("day")
|
.endOf("day")
|
||||||
.toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) {
|
.toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) {
|
||||||
canceled
|
canceled
|
||||||
id
|
id
|
||||||
job {
|
job {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
const {t} = useTranslation();
|
const {t} = useTranslation();
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
sortedInfo: {},
|
sortedInfo: {},
|
||||||
});
|
filteredInfo: {},});
|
||||||
const [isTvModeScheduledOut, setIsTvModeScheduledOut] = useLocalStorage(
|
const [isTvModeScheduledOut, setIsTvModeScheduledOut] = useLocalStorage(
|
||||||
"isTvModeScheduledOut",
|
"isTvModeScheduledOut",
|
||||||
false
|
false
|
||||||
@@ -41,10 +41,11 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
joblines_body,
|
joblines_body,
|
||||||
joblines_ref,
|
joblines_ref,
|
||||||
};
|
};
|
||||||
}).sort(function (a, b) {
|
|
||||||
return new Date(a.scheduled_completion) - new Date(b.scheduled_completion);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log('Scheduled Out Today')
|
||||||
|
console.dir(scheduledOutToday);
|
||||||
|
|
||||||
const tvFontSize = 18;
|
const tvFontSize = 18;
|
||||||
const tvFontWeight = "bold";
|
const tvFontWeight = "bold";
|
||||||
|
|
||||||
@@ -106,6 +107,8 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "owner" && state.sortedInfo.order,
|
||||||
render: (text, record) => {
|
render: (text, record) => {
|
||||||
|
console.log('Render record out today');
|
||||||
|
console.dir(record);
|
||||||
return record.ownerid ? (
|
return record.ownerid ? (
|
||||||
<Link
|
<Link
|
||||||
to={"/manage/owners/" + record.ownerid}
|
to={"/manage/owners/" + record.ownerid}
|
||||||
@@ -150,8 +153,8 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
</Link>
|
</Link>
|
||||||
) : (
|
) : (
|
||||||
<span
|
<span
|
||||||
style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}
|
style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>{`${
|
||||||
>{`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
record.v_model_yr || ""} ${record.v_make_desc || ""} ${
|
||||||
record.v_model_desc || ""
|
record.v_model_desc || ""
|
||||||
}`}</span>
|
}`}</span>
|
||||||
);
|
);
|
||||||
@@ -178,7 +181,7 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
};
|
};
|
||||||
})
|
})
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
[],
|
[],onFilter: (value, record) => value.includes(record.alt_transport),
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
||||||
{record.alt_transport}
|
{record.alt_transport}
|
||||||
@@ -194,8 +197,8 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
|
||||||
filters:
|
filters:
|
||||||
(data.scheduled_out_today &&
|
(scheduledOutToday &&
|
||||||
data.scheduled_out_today
|
scheduledOutToday
|
||||||
.map((j) => j.status)
|
.map((j) => j.status)
|
||||||
.filter(onlyUnique)
|
.filter(onlyUnique)
|
||||||
.map((s) => {
|
.map((s) => {
|
||||||
@@ -206,7 +209,7 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
})
|
})
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
[],
|
[],
|
||||||
render: (text, record) => (
|
onFilter: (value, record) => value.includes(record.status),render: (text, record) => (
|
||||||
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
<span style={{fontSize: tvFontSize, fontWeight: tvFontWeight}}>
|
||||||
{record.status}
|
{record.status}
|
||||||
</span>
|
</span>
|
||||||
@@ -372,8 +375,8 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "ins_co_nm" && state.sortedInfo.order,
|
||||||
filters:
|
filters:
|
||||||
(data.scheduled_out_today &&
|
(scheduledOutToday &&
|
||||||
data.scheduled_out_today
|
scheduledOutToday
|
||||||
.map((j) => j.ins_co_nm)
|
.map((j) => j.ins_co_nm)
|
||||||
.filter(onlyUnique)
|
.filter(onlyUnique)
|
||||||
.map((s) => {
|
.map((s) => {
|
||||||
@@ -396,8 +399,8 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
state.sortedInfo.columnKey === "alt_transport" &&
|
state.sortedInfo.columnKey === "alt_transport" &&
|
||||||
state.sortedInfo.order,
|
state.sortedInfo.order,
|
||||||
filters:
|
filters:
|
||||||
(data.scheduled_out_today &&
|
(scheduledOutToday &&
|
||||||
data.scheduled_out_today
|
scheduledOutToday
|
||||||
.map((j) => j.alt_transport)
|
.map((j) => j.alt_transport)
|
||||||
.filter(onlyUnique)
|
.filter(onlyUnique)
|
||||||
.map((s) => {
|
.map((s) => {
|
||||||
@@ -408,11 +411,11 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
})
|
})
|
||||||
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
.sort((a, b) => alphaSort(a.text, b.text))) ||
|
||||||
[],
|
[],
|
||||||
},
|
onFilter: (value, record) => value.includes(record.alt_transport),},
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleTableChange = (sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
setState({...state, sortedInfo: sorter});
|
setState({...state, filteredInfo: filters, sortedInfo: sorter});
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -438,7 +441,7 @@ export default function DashboardScheduledOutToday({data, ...cardProps}) {
|
|||||||
scroll={{x: true, y: "calc(100% - 2em)"}}
|
scroll={{x: true, y: "calc(100% - 2em)"}}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
style={{height: "85%"}}
|
style={{height: "85%"}}
|
||||||
dataSource={data.scheduled_out_today}
|
dataSource={scheduledOutToday}
|
||||||
size={isTvModeScheduledOut ? "small" : "middle"}
|
size={isTvModeScheduledOut ? "small" : "middle"}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user