119 lines
3.4 KiB
JavaScript
119 lines
3.4 KiB
JavaScript
import { Checkbox, Table, Typography } from "antd";
|
|
import React, { useState } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
|
import { alphaSort } from "../../utils/sorters";
|
|
|
|
export default function JobReconciliationBillsTable({
|
|
billLineState,
|
|
invoiceLineData,
|
|
}) {
|
|
const { t } = useTranslation();
|
|
|
|
const [state, setState] = useState({
|
|
sortedInfo: {},
|
|
});
|
|
|
|
const [selectedLines, setSelectedLines] = billLineState;
|
|
|
|
const columns = [
|
|
{
|
|
title: t("billlines.fields.line_desc"),
|
|
dataIndex: "line_desc",
|
|
key: "line_desc",
|
|
ellipsis: true,
|
|
width: "10rem",
|
|
sorter: (a, b) => alphaSort(a.line_desc, b.line_desc),
|
|
sortOrder:
|
|
state.sortedInfo.columnKey === "line_desc" && state.sortedInfo.order,
|
|
},
|
|
{
|
|
title: t("billlines.labels.from"),
|
|
dataIndex: "from",
|
|
key: "from",
|
|
|
|
ellipsis: true,
|
|
render: (text, record) =>
|
|
`${record.bill.vendor && record.bill.vendor.name} / ${
|
|
record.bill.invoice_number
|
|
}`,
|
|
},
|
|
{
|
|
title: t("billlines.fields.actual_price"),
|
|
dataIndex: "actual_price",
|
|
key: "actual_price",
|
|
sorter: (a, b) => a.actual_price - b.actual_price,
|
|
width: "7rem",
|
|
sortOrder:
|
|
state.sortedInfo.columnKey === "actual_price" && state.sortedInfo.order,
|
|
render: (text, record) => (
|
|
<CurrencyFormatter>{record.actual_price}</CurrencyFormatter>
|
|
),
|
|
},
|
|
{
|
|
title: t("billlines.fields.actual_cost"),
|
|
dataIndex: "actual_cost",
|
|
key: "actual_cost",
|
|
sorter: (a, b) => a.actual_cost - b.actual_cost,
|
|
width: "7rem",
|
|
sortOrder:
|
|
state.sortedInfo.columnKey === "actual_cost" && state.sortedInfo.order,
|
|
render: (text, record) => (
|
|
<CurrencyFormatter>{record.actual_cost}</CurrencyFormatter>
|
|
),
|
|
},
|
|
{
|
|
title: t("joblines.fields.part_qty"),
|
|
dataIndex: "quantity",
|
|
key: "quantity",
|
|
sorter: (a, b) => a.quantity - b.quantity,
|
|
width: "4rem",
|
|
sortOrder:
|
|
state.sortedInfo.columnKey === "quantity" && state.sortedInfo.order,
|
|
},
|
|
{
|
|
title: t("bills.fields.is_credit_memo_short"),
|
|
dataIndex: "is_credit_memo",
|
|
key: "is_credit_memo",
|
|
sorter: (a, b) => a.bill.is_credit_memo - b.bill.is_credit_memo,
|
|
width: "3rem",
|
|
sortOrder:
|
|
state.sortedInfo.columnKey === "is_credit_memo" &&
|
|
state.sortedInfo.order,
|
|
|
|
render: (text, record) => (
|
|
<Checkbox disabled checked={record.bill.is_credit_memo} />
|
|
),
|
|
},
|
|
];
|
|
|
|
const handleTableChange = (pagination, filters, sorter) => {
|
|
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
|
|
};
|
|
const handleOnRowClick = (selectedRecordKeys, selectedRecords) => {
|
|
setSelectedLines(selectedRecordKeys);
|
|
};
|
|
|
|
return (
|
|
<div>
|
|
<Typography.Title level={4}>{t("bills.labels.bills")}</Typography.Title>
|
|
<Table
|
|
pagination={false}
|
|
size="small"
|
|
scroll={{ y: "60vh" }}
|
|
columns={columns}
|
|
rowKey="id"
|
|
dataSource={invoiceLineData}
|
|
onChange={handleTableChange}
|
|
rowSelection={{
|
|
onChange: handleOnRowClick,
|
|
selectedRowKeys: selectedLines,
|
|
getCheckboxProps: (record) => {
|
|
return { disabled: record.deductedfromlbr };
|
|
},
|
|
}}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|