diff --git a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx index 45241dea5..d4ff3db4f 100644 --- a/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx +++ b/client/src/components/courtesy-car-fuel-select/courtesy-car-fuel-select.component.jsx @@ -1,8 +1,8 @@ import { Slider } from "antd"; -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, forwardRef } from "react"; import { useTranslation } from "react-i18next"; -const CourtesyCarFuelComponent = ({ value = 100, onChange }) => { +const CourtesyCarFuelComponent = ({ value = 100, onChange }, ref) => { const [option, setOption] = useState(value); const { t } = useTranslation(); @@ -15,9 +15,9 @@ const CourtesyCarFuelComponent = ({ value = 100, onChange }) => { const marks = { 0: { style: { - color: "#f50" + color: "#f50", }, - label: t("courtesycars.labels.fuel.empty") + label: t("courtesycars.labels.fuel.empty"), }, 13: t("courtesycars.labels.fuel.18"), 25: t("courtesycars.labels.fuel.14"), @@ -28,14 +28,15 @@ const CourtesyCarFuelComponent = ({ value = 100, onChange }) => { 88: t("courtesycars.labels.fuel.78"), 100: { style: { - color: "#008000" + color: "#008000", }, - label: {t("courtesycars.labels.fuel.full")} - } + label: {t("courtesycars.labels.fuel.full")}, + }, }; return ( { /> ); }; -export default CourtesyCarFuelComponent; +export default forwardRef(CourtesyCarFuelComponent); diff --git a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx index b60ca64cc..7f101590a 100644 --- a/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx +++ b/client/src/components/courtesy-car-status-select/courtesy-car-status-select.component.jsx @@ -1,12 +1,12 @@ -import React, { useState, useEffect } from "react"; +import React, { useState, useEffect, forwardRef } from "react"; import { Select } from "antd"; import { useTranslation } from "react-i18next"; const { Option } = Select; -const CourtesyCarStatusComponent = ({ - value = "courtesycars.status.in", - onChange -}) => { +const CourtesyCarStatusComponent = ( + { value = "courtesycars.status.in", onChange }, + ref +) => { const [option, setOption] = useState(value); const { t } = useTranslation(); @@ -18,9 +18,10 @@ const CourtesyCarStatusComponent = ({ return ( ); }; -export default CourtesyCarStatusComponent; +export default forwardRef(CourtesyCarStatusComponent); diff --git a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx index 8dcc53d58..aa3539770 100644 --- a/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx +++ b/client/src/components/courtesy-cars-list/courtesy-cars-list.component.jsx @@ -9,7 +9,7 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) { sortedInfo: {}, filteredInfo: { text: "" }, }); - + const [searchText, setSearchText] = useState(""); const { t } = useTranslation(); const columns = [ @@ -36,6 +36,17 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) { dataIndex: "status", key: "status", sorter: (a, b) => alphaSort(a.status, b.status), + filters: [ + { + text: t("courtesycars.status.in"), + value: "courtesycars.status.in", + }, + { + text: t("courtesycars.status.out"), + value: "courtesycars.status.out", + }, + ], + onFilter: (value, record) => value.includes(record.status), sortOrder: state.sortedInfo.columnKey === "status" && state.sortedInfo.order, render: (text, record) => t(record.status), @@ -64,17 +75,45 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) { sortOrder: state.sortedInfo.columnKey === "model" && state.sortedInfo.order, }, + { + title: t("courtesycars.fields.outwith"), + dataIndex: "outwith", + key: "outwith", + // sorter: (a, b) => alphaSort(a.model, b.model), + sortOrder: + state.sortedInfo.columnKey === "model" && state.sortedInfo.order, + render: (text, record) => ( +
+ {record.cccontracts.length === 1 + ? record.cccontracts[0].job.ro_number + : null} +
+ ), + }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); }; + const tableData = searchText + ? courtesycars.filter( + (c) => + (c.fleetnumber || "") + .toLowerCase() + .includes(searchText.toLowerCase()) || + (c.vin || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.year || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.make || "").toLowerCase().includes(searchText.toLowerCase()) || + (c.model || "").toLowerCase().includes(searchText.toLowerCase()) || + (t(c.status) || "").toLowerCase().includes(searchText.toLowerCase()) + ) + : courtesycars; return ( ( -
+
@@ -82,21 +121,21 @@ export default function CourtesyCarsList({ loading, courtesycars, refetch }) { { - //setSearchText(e.target.value); + setSearchText(e.target.value); }} - //value={searchText} + value={searchText} enterButton />
)} - size='small' + size="small" pagination={{ position: "top" }} columns={columns.map((item) => ({ ...item }))} - rowKey='id' - dataSource={courtesycars} + rowKey="id" + dataSource={tableData} onChange={handleTableChange} /> ); diff --git a/client/src/graphql/courtesy-car.queries.js b/client/src/graphql/courtesy-car.queries.js index 917e3a04a..a045348cb 100644 --- a/client/src/graphql/courtesy-car.queries.js +++ b/client/src/graphql/courtesy-car.queries.js @@ -55,6 +55,17 @@ export const QUERY_ALL_CC = gql` status vin year + cccontracts( + where: { status: { _eq: "contracts.status.out" } } + order_by: { contract_date: desc } + limit: 1 + ) { + id + job { + id + ro_number + } + } } } `; diff --git a/client/src/pages/invoices/invoices.page.component.jsx b/client/src/pages/invoices/invoices.page.component.jsx index 6c979ee71..a3d57ec95 100644 --- a/client/src/pages/invoices/invoices.page.component.jsx +++ b/client/src/pages/invoices/invoices.page.component.jsx @@ -33,7 +33,6 @@ export function InvoicesListPage({ const search = queryString.parse(useLocation().search); const { page } = search; - const selectedInvoice = search.invoiceid; const columns = [ { title: t("invoices.fields.vendorname"), @@ -131,18 +130,6 @@ export function InvoicesListPage({ history.push({ search: queryString.stringify(search) }); }; - const handleOnRowClick = (record) => { - if (record) { - if (record.id) { - search.invoiceid = record.id; - history.push({ search: queryString.stringify(search) }); - } - } else { - delete search.invoiceid; - history.push({ search: queryString.stringify(search) }); - } - }; - return (
diff --git a/client/src/pages/invoices/invoices.page.container.jsx b/client/src/pages/invoices/invoices.page.container.jsx index 791ac8d20..99376dc59 100644 --- a/client/src/pages/invoices/invoices.page.container.jsx +++ b/client/src/pages/invoices/invoices.page.container.jsx @@ -8,6 +8,7 @@ import InvoiceDetailEditContainer from "../../components/invoice-detail-edit/inv import { QUERY_ALL_INVOICES_PAGINATED } from "../../graphql/invoices.queries"; import { setBreadcrumbs } from "../../redux/application/application.actions"; import InvoicesPageComponent from "./invoices.page.component"; +import AlertComponent from "../../components/alert/alert.component"; const mapDispatchToProps = (dispatch) => ({ setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), @@ -45,6 +46,7 @@ export function InvoicesPageContainer({ setBreadcrumbs }) { } ); + if (error) return ; return (