import { EditFilled, SyncOutlined } from "@ant-design/icons"; import { Button, Card, Checkbox, Input, Space, Table, Typography } from "antd"; import axios from "axios"; import queryString from "query-string"; import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useHistory, useLocation } from "react-router-dom"; import BillDeleteButton from "../../components/bill-delete-button/bill-delete-button.component"; import PartsOrderModalContainer from "../../components/parts-order-modal/parts-order-modal.container"; import PrintWrapperComponent from "../../components/print-wrapper/print-wrapper.component"; import { setModalContext } from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { DateFormatter } from "../../utils/DateFormatter"; import { TemplateList } from "../../utils/TemplateConstants"; import { pageLimit } from "../../utils/config"; import { alphaSort, dateSort } from "../../utils/sorters"; const mapDispatchToProps = (dispatch) => ({ setPartsOrderContext: (context) => dispatch(setModalContext({ context: context, modal: "partsOrder" })), setBillEnterContext: (context) => dispatch(setModalContext({ context: context, modal: "billEnter" })), }); export function BillsListPage({ loading, data, refetch, total, setPartsOrderContext, setBillEnterContext, }) { const search = queryString.parse(useLocation().search); const [openSearchResults, setOpenSearchResults] = useState([]); const [searchLoading, setSearchLoading] = useState(false); const { page } = search; const history = useHistory(); const [state, setState] = useState({ sortedInfo: {}, filteredInfo: { text: "" }, }); const Templates = TemplateList("bill"); const { t } = useTranslation(); const columns = [ { title: t("bills.fields.vendorname"), dataIndex: "vendorname", key: "vendorname", // sortObject: (direction) => { // return { // vendor: { // name: direction // ? direction === "descend" // ? "desc" // : "asc" // : "desc", // }, // }; // }, // sorter: (a, b) => alphaSort(a.vendor.name, b.vendor.name), // sortOrder: // state.sortedInfo.columnKey === "vendorname" && state.sortedInfo.order, render: (text, record) => {record.vendor.name}, }, { title: t("bills.fields.invoice_number"), dataIndex: "invoice_number", key: "invoice_number", sorter: (a, b) => alphaSort(a.invoice_number, b.invoice_number), sortOrder: state.sortedInfo.columnKey === "invoice_number" && state.sortedInfo.order, }, { title: t("jobs.fields.ro_number"), dataIndex: "ro_number", key: "ro_number", // sortObject: (direction) => { // return { // job: { // ro_number: direction // ? direction === "descend" // ? "desc" // : "asc" // : "desc", // }, // }; // }, // sorter: (a, b) => alphaSort(a.job.ro_number, b.job.ro_number), // sortOrder: // state.sortedInfo.columnKey === "ro_number" && state.sortedInfo.order, render: (text, record) => record.job && ( {record.job.ro_number} ), }, { title: t("bills.fields.date"), dataIndex: "date", key: "date", sorter: (a, b) => dateSort(a.date, b.date), sortOrder: state.sortedInfo.columnKey === "date" && state.sortedInfo.order, render: (text, record) => {record.date}, }, { title: t("bills.fields.total"), dataIndex: "total", key: "total", sorter: (a, b) => a.total - b.total, sortOrder: state.sortedInfo.columnKey === "total" && state.sortedInfo.order, render: (text, record) => ( {record.total} ), }, { title: t("bills.fields.is_credit_memo"), dataIndex: "is_credit_memo", key: "is_credit_memo", sorter: (a, b) => a.is_credit_memo - b.is_credit_memo, sortOrder: state.sortedInfo.columnKey === "is_credit_memo" && state.sortedInfo.order, render: (text, record) => , }, { title: t("bills.fields.exported"), dataIndex: "exported", key: "exported", sorter: (a, b) => a.exported - b.exported, sortOrder: state.sortedInfo.columnKey === "exported" && state.sortedInfo.order, render: (text, record) => , }, { title: t("general.labels.actions"), dataIndex: "actions", key: "actions", render: (text, record) => ( { // } { //Filter out the state and set it again. setOpenSearchResults((currentResults) => currentResults.filter((bill) => bill.id !== deletedBillid) ); }} /> {record.isinhouse && ( )} ), }, ]; const handleTableChange = (pagination, filters, sorter) => { setState({ ...state, filteredInfo: filters, sortedInfo: sorter }); search.page = pagination.current; if (sorter && sorter.column && sorter.column.sortObject) { search.searchObj = JSON.stringify(sorter.column.sortObject(sorter.order)); } else { delete search.searchObj; search.sortcolumn = sorter.order ? sorter.columnKey : null; search.sortorder = sorter.order; } search.sort = JSON.stringify({ [sorter.columnKey]: sorter.order }); history.push({ search: queryString.stringify(search) }); }; useEffect(() => { if (search.search && search.search.trim() !== "") { searchBills(); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function searchBills(value) { try { setSearchLoading(true); const searchData = await axios.post("/search", { search: value || search.search, index: "bills", }); setOpenSearchResults(searchData.data.hits.hits.map((s) => s._source)); } catch (error) { console.log("Error while fetching search results", error); } finally { setSearchLoading(false); } } return ( {search.search && ( {t("general.labels.searchresults", { search: search.search })} )} { search.search = value; history.push({ search: queryString.stringify(search) }); searchBills(value); }} loading={loading || searchLoading} enterButton /> } > ); } export default connect(null, mapDispatchToProps)(BillsListPage);