import { SyncOutlined } from "@ant-design/icons"; import { useQuery } from "@apollo/client"; import { Button, Card, Input, Space, Table } from "antd"; import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useHistory, useLocation } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import AlertComponent from "../../components/alert/alert.component"; import JobPartsQueueCount from "../../components/job-parts-queue-count/job-parts-queue-count.component"; import JobRemoveFromPartsQueue from "../../components/job-remove-from-parst-queue/job-remove-from-parts-queue.component"; import OwnerNameDisplay from "../../components/owner-name-display/owner-name-display.component"; import ProductionListColumnComment from "../../components/production-list-columns/production-list-columns.comment.component"; import { QUERY_PARTS_QUEUE } from "../../graphql/jobs.queries"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { onlyUnique } from "../../utils/arrayHelper"; import { DateTimeFormatter, TimeAgoFormatter } from "../../utils/DateFormatter"; import { alphaSort, dateSort } from "../../utils/sorters"; import useLocalStorage from "../../utils/useLocalStorage"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, }); export function PartsQueuePageComponent({ bodyshop }) { const searchParams = queryString.parse(useLocation().search); const { //page, sortcolumn, sortorder, statusFilters, } = searchParams; const history = useHistory(); const [filter, setFilter] = useLocalStorage("filter_parts_queue", null); const { loading, error, data, refetch } = useQuery(QUERY_PARTS_QUEUE, { fetchPolicy: "network-only", nextFetchPolicy: "network-only", variables: { // offset: page ? (page - 1) * 25 : 0, // limit: 25, statuses: (statusFilters && JSON.parse(statusFilters)) || bodyshop.md_ro_statuses.active_statuses || ["Open", "Open*"], order: [ { [sortcolumn || "ro_number"]: sortorder ? sortorder === "descend" ? "desc" : "asc" : "desc", }, ], }, }); 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; setFilter(filters); history.push({ search: queryString.stringify(searchParams) }); }; 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(a.ownr_ln, b.ownr_ln), sortOrder: sortcolumn === "ownr_ln" && sortorder, render: (text, record) => { return record.ownerid ? ( ) : ( ); }, }, { title: t("jobs.fields.status"), dataIndex: "status", key: "status", sorter: (a, b) => alphaSort(a.status, b.status), sortOrder: sortcolumn === "status" && sortorder, filters: (jobs && jobs .map((j) => j.status) .filter(onlyUnique) .map((s) => { return { text: s || "No Status*", value: [s], }; })) || [], onFilter: (value, record) => value.includes(record.status), 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.vehicle"), dataIndex: "vehicle", key: "vehicle", ellipsis: true, 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("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_no"), dataIndex: "clm_no", key: "clm_no", ellipsis: true, sorter: (a, b) => alphaSort(a.clm_no, b.clm_no), sortOrder: sortcolumn === "clm_no" && sortorder, }, // { // 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 /> } > ); } export default connect(mapStateToProps, null)(PartsQueuePageComponent);