diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx index 87d1980a1..fca46457a 100644 --- a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx +++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx @@ -23,36 +23,40 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { const appt = []; // Flatten Data data.scheduled_in_today.forEach((item) => { - var i = { - canceled: item.canceled, - id: item.id, - alt_transport: item.job.alt_transport, - clm_no: item.job.clm_no, - jobid: item.job.jobid, - 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: moment(item.start).format("hh:mm a"), - title: item.title, - }; - appt.push(i); + 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, + 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: moment(item.start).format("hh:mm a"), + title: item.title, + }; + appt.push(i); + } + }); + appt.sort(function (a, b) { + return new moment(a.start) - new moment(b.start); }); - appt.sort ( function (a, b) { return new Date(a.start) - new Date(b.start); }); const columns = [ { @@ -182,7 +186,12 @@ export default function DashboardScheduledInToday({ data, ...cardProps }) { }; return ( - +
{t("appointments.actions.sendreminder")} ) : null} - { - handleCancel({ id: event.id, lost_sale_reason }); - }} - > - - ({ + label: lsr, + value: lsr, + }))} + /> + + + + } + > + + + )} + {event.isintake ? ( + + } + > + {t("menus.jobsactions.cancelallappointments")} + + )} diff --git a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx index c69712a0b..360954101 100644 --- a/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx +++ b/client/src/components/owner-detail-jobs/owner-detail-jobs.component.jsx @@ -6,6 +6,7 @@ import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; +import { alphaSort, statusSort } from "../../utils/sorters"; import OwnerDetailUpdateJobsComponent from "../owner-detail-update-jobs/owner-detail-update-jobs.component"; const mapStateToProps = createStructuredSelector({ @@ -15,6 +16,15 @@ const mapStateToProps = createStructuredSelector({ function OwnerDetailJobsComponent({ bodyshop, owner }) { const { t } = useTranslation(); const [selectedJobs, setSelectedJobs] = useState([]); + const [state, setState] = useState({ + sortedInfo: {}, + filteredInfo: { text: "" }, + }); + + const handleTableChange = (pagination, filters, sorter) => { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; + const columns = [ { title: t("jobs.fields.ro_number"), @@ -26,6 +36,9 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { {record.ro_number || t("general.labels.na")} ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, }, { title: t("jobs.fields.vehicle"), @@ -46,11 +59,17 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { 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, }, { title: t("jobs.fields.status"), dataIndex: "status", key: "status", + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, { @@ -60,6 +79,9 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { render: (text, record) => ( {record.clm_total} ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, }, ]; @@ -80,6 +102,7 @@ function OwnerDetailJobsComponent({ bodyshop, owner }) { scroll={{ x: true }} rowKey="id" dataSource={owner.jobs} + onChange={handleTableChange} rowSelection={{ onSelect: (record, selected, selectedRows) => { setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); diff --git a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx index ffb95adcc..e27d6ee4f 100644 --- a/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx +++ b/client/src/components/parts-order-list-table/parts-order-list-table.component.jsx @@ -113,6 +113,8 @@ export function PartsOrderListTableComponent({ id: pol.id, line_desc: pol.line_desc, quantity: pol.quantity, + act_price: pol.act_price, + oem_partno: pol.oem_partno, }; }), }, diff --git a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx index 92aaffd56..2fe6ac418 100644 --- a/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx +++ b/client/src/components/parts-receive-modal/parts-receive-modal.component.jsx @@ -79,6 +79,20 @@ export function PartsReceiveModalComponent({ bodyshop, form }) { > + + + + + + {t("timetickets.actions.enter")} - + + + + {isTechConsole === true ? ( + + ) : null} + ); diff --git a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx index 9f0fec612..a6939e2e7 100644 --- a/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx +++ b/client/src/components/time-ticket-shift/time-ticket-shift.container.jsx @@ -76,6 +76,7 @@ export function TimeTicketShiftContainer({ ) : ( { + setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); + }; const columns = [ { @@ -28,6 +37,9 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { {record.ro_number || t("general.labels.na")} ), + sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), + sortOrder: + state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, }, { title: t("jobs.fields.owner"), @@ -43,11 +55,17 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { 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, }, { title: t("jobs.fields.status"), dataIndex: "status", key: "status", + sorter: (a, b) => statusSort(a.status, b.status, bodyshop.md_ro_statuses.statuses), + sortOrder: + state.sortedInfo.columnKey === "status" && state.sortedInfo.order, }, { @@ -57,6 +75,9 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { render: (text, record) => ( {record.clm_total} ), + sorter: (a, b) => a.clm_total - b.clm_total, + sortOrder: + state.sortedInfo.columnKey === "clm_total" && state.sortedInfo.order, }, ]; @@ -76,6 +97,7 @@ export function VehicleDetailJobsComponent({ vehicle, bodyshop }) { rowKey="id" scroll={{ x: true }} dataSource={vehicle.jobs} + onChange={handleTableChange} rowSelection={{ onSelect: (record, selected, selectedRows) => { setSelectedJobs(selectedRows ? selectedRows.map((i) => i.id) : []); diff --git a/client/src/graphql/owners.queries.js b/client/src/graphql/owners.queries.js index 440dc3011..a4e5d1c80 100644 --- a/client/src/graphql/owners.queries.js +++ b/client/src/graphql/owners.queries.js @@ -69,7 +69,7 @@ export const QUERY_OWNER_BY_ID = gql` preferred_contact note tax_number - jobs { + jobs(order_by: { date_open: desc }) { id ro_number clm_no diff --git a/client/src/graphql/vehicles.queries.js b/client/src/graphql/vehicles.queries.js index 9fa2dd837..9df3c4238 100644 --- a/client/src/graphql/vehicles.queries.js +++ b/client/src/graphql/vehicles.queries.js @@ -28,11 +28,10 @@ export const QUERY_VEHICLE_BY_ID = gql` updated_at trim_color notes - jobs { + jobs(order_by: { date_open: desc }) { id ro_number ownr_fn - ownr_ln owner { id diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 519624aad..3467027c6 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -1135,6 +1135,10 @@ export const TemplateList = (type, context) => { key: "timetickets_employee", idtype: "employee", disabled: false, + rangeFilter: { + object: i18n.t("reportcenter.labels.objects.timetickets"), + field: i18n.t("timetickets.fields.date"), + }, group: "payroll", }, attendance_detail: {