import { SyncOutlined } from "@ant-design/icons"; import { useQuery } from "@apollo/client"; import { Button, Card, Input, Space, Table } from "antd"; import _ from "lodash"; import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { QUERY_PARTS_QUEUE } from "../../graphql/jobs.queries"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { DateTimeFormatter, TimeAgoFormatter } from "../../utils/DateFormatter"; import { onlyUnique } from "../../utils/arrayHelper"; import { pageLimit } from "../../utils/config"; import { alphaSort, dateSort } from "../../utils/sorters"; import useLocalStorage from "../../utils/useLocalStorage"; import AlertComponent from "../alert/alert.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; import JobRemoveFromPartsQueue from "../job-remove-from-parst-queue/job-remove-from-parts-queue.component"; import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; import ProductionListColumnComment from "../production-list-columns/production-list-columns.comment.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); export function PartsQueueListComponent({ bodyshop }) { const searchParams = queryString.parse(useLocation().search); const { selected, sortcolumn, sortorder, statusFilters } = searchParams; const history = useNavigate(); const [filter, setFilter] = useLocalStorage("filter_parts_queue", null); const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, { fetchPolicy: "network-only", nextFetchPolicy: "network-only", variables: { statuses: (statusFilters && JSON.parse(statusFilters)) || bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"] } }); const { t } = useTranslation(); const [searchText, setSearchText] = useState(""); if (error) return ; const jobs = data ? searchText === "" ? data.jobs : data.jobs.filter( (j) => (j.ro_number || "").toString().toLowerCase().includes(searchText.toLowerCase()) || (j.ownr_co_nm || "").toLowerCase().includes(searchText.toLowerCase()) || (j.ownr_fn || "").toLowerCase().includes(searchText.toLowerCase()) || (j.ownr_ln || "").toLowerCase().includes(searchText.toLowerCase()) || (j.clm_no || "").toLowerCase().includes(searchText.toLowerCase()) || (j.plate_no || "").toLowerCase().includes(searchText.toLowerCase()) || (j.v_model_desc || "").toLowerCase().includes(searchText.toLowerCase()) || (j.v_make_desc || "").toLowerCase().includes(searchText.toLowerCase()) ) : []; const handleTableChange = (pagination, filters, sorter) => { // searchParams.page = pagination.current; searchParams.sortcolumn = sorter.columnKey; searchParams.sortorder = sorter.order; if (filters.status) { searchParams.statusFilters = JSON.stringify(_.flattenDeep(filters.status)); } else { delete searchParams.statusFilters; } setFilter(filters); history({ search: queryString.stringify(searchParams) }); }; const handleOnRowClick = (record) => { if (record?.id) { history({ search: queryString.stringify({ ...searchParams, selected: record.id }) }); } }; const columns = [ { title: t("jobs.fields.ro_number"), dataIndex: "ro_number", key: "ro_number", sorter: (a, b) => alphaSort(a.ro_number, b.ro_number), sortOrder: sortcolumn === "ro_number" && sortorder, render: (text, record) => ( {record.ro_number || t("general.labels.na")} ) }, { title: t("jobs.fields.owner"), dataIndex: "ownr_ln", key: "ownr_ln", sorter: (a, b) => alphaSort(OwnerNameDisplayFunction(a), OwnerNameDisplayFunction(b)), sortOrder: sortcolumn === "ownr_ln" && sortorder, render: (text, record) => { return record.ownerid ? ( ) : ( ); } }, { 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: sortcolumn === "vehicle" && sortorder, render: (text, record) => { return record.vehicleid ? ( {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} ) : ( {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${record.v_model_desc || ""}`} ); } }, { title: t("jobs.fields.ins_co_nm_short"), dataIndex: "ins_co_nm", key: "ins_co_nm", ellipsis: true, sorter: (a, b) => alphaSort(a.ins_co_nm, b.ins_co_nm), sortOrder: sortcolumn === "ins_co_nm" && sortorder, filteredValue: filter?.ins_co_nm || null, filters: (jobs && jobs .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("jobs.fields.status"), dataIndex: "status", key: "status", sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: sortcolumn === "status" && sortorder, filteredValue: statusFilters ? JSON.parse(statusFilters) : null, filters: bodyshop.md_ro_statuses.active_statuses.map((s) => { return { text: s || "No Status*", value: [s] }; }) || [], render: (text, record) => { return record.status || t("general.labels.na"); } }, { title: t("jobs.fields.scheduled_in"), dataIndex: "scheduled_in", key: "scheduled_in", ellipsis: true, sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in), sortOrder: sortcolumn === "scheduled_in" && sortorder, render: (text, record) => {record.scheduled_in} }, { title: t("jobs.fields.scheduled_completion"), dataIndex: "scheduled_completion", key: "scheduled_completion", ellipsis: true, sorter: (a, b) => dateSort(a.scheduled_completion, b.scheduled_completion), sortOrder: sortcolumn === "scheduled_completion" && sortorder, render: (text, record) => {record.scheduled_completion} }, // { // title: t("vehicles.fields.plate_no"), // dataIndex: "plate_no", // key: "plate_no", // sorter: (a, b) => alphaSort(a.plate_no, b.plate_no), // sortOrder: sortcolumn === "plate_no" && sortorder, // render: (text, record) => { // return record.plate_no ? record.plate_no : ""; // }, //}, // { // title: t("jobs.fields.clm_total"), // dataIndex: "clm_total", // key: "clm_total", // sorter: (a, b) => a.clm_total - b.clm_total, // sortOrder: sortcolumn === "clm_total" && sortorder, // render: (text, record) => { // return record.clm_total ? ( // {record.clm_total} // ) : ( // t("general.labels.unknown") // ); // }, // }, { title: t("jobs.fields.updated_at"), dataIndex: "updated_at", key: "updated_at", sorter: (a, b) => dateSort(a.updated_at, b.updated_at), sortOrder: sortcolumn === "updated_at" && sortorder, render: (text, record) => {record.updated_at} }, { title: t("jobs.fields.partsstatus"), dataIndex: "partsstatus", key: "partsstatus", render: (text, record) => }, { title: t("jobs.fields.comment"), dataIndex: "comment", key: "comment", render: (text, record) => }, { title: t("jobs.fields.queued_for_parts"), dataIndex: "queued_for_parts", key: "queued_for_parts", sorter: (a, b) => a.queued_for_parts - b.queued_for_parts, sortOrder: sortcolumn === "queued_for_parts" && sortorder, filteredValue: filter?.queued_for_parts || null, filters: [ { text: "Queued", value: true }, { text: "Unqueued", value: false } ], onFilter: (value, record) => record.queued_for_parts === value, render: (text, record) => } ]; return ( { setSearchText(e.target.value); }} value={searchText} enterButton /> } > { handleOnRowClick(record); }, selectedRowKeys: [selected], type: "radio" }} onRow={(record, rowIndex) => { return { onClick: (event) => { // handleOnRowClick(record); } }; }} /> ); } export default connect(mapStateToProps, null)(PartsQueueListComponent);