Add bill ref to job lines table. IO-582
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
<babeledit_project be_version="2.7.1" version="1.2">
|
<babeledit_project version="1.2" be_version="2.7.1">
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
BabelEdit project file
|
BabelEdit project file
|
||||||
@@ -12294,6 +12294,27 @@
|
|||||||
<folder_node>
|
<folder_node>
|
||||||
<name>labels</name>
|
<name>labels</name>
|
||||||
<children>
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>billref</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
<concept_node>
|
<concept_node>
|
||||||
<name>edit</name>
|
<name>edit</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
import { SyncOutlined, FilterFilled } from "@ant-design/icons";
|
import { FilterFilled, SyncOutlined } from "@ant-design/icons";
|
||||||
|
import { useQuery } from "@apollo/react-hooks";
|
||||||
import { Button, Dropdown, Input, Menu, Table } from "antd";
|
import { Button, Dropdown, Input, Menu, Table } from "antd";
|
||||||
import React, { useState } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { Link } from "react-router-dom";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { QUERY_BILLS_BY_JOB_REF } from "../../graphql/bill-lines.queries";
|
||||||
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
import { onlyUnique } from "../../utils/arrayHelper";
|
import { onlyUnique } from "../../utils/arrayHelper";
|
||||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||||
import { alphaSort } from "../../utils/sorters";
|
import { alphaSort } from "../../utils/sorters";
|
||||||
import JobLineLocationPopup from "../job-line-location-popup/job-line-location-popup.component";
|
import JobLineLocationPopup from "../job-line-location-popup/job-line-location-popup.component";
|
||||||
import JobLineNotePopup from "../job-line-note-popup/job-line-note-popup.component";
|
import JobLineNotePopup from "../job-line-note-popup/job-line-note-popup.component";
|
||||||
|
import JobLinesBillRefernece from "../job-lines-bill-reference/job-lines-bill-reference.component";
|
||||||
// import AllocationsAssignmentContainer from "../allocations-assignment/allocations-assignment.container";
|
// import AllocationsAssignmentContainer from "../allocations-assignment/allocations-assignment.container";
|
||||||
// import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container";
|
// import AllocationsBulkAssignmentContainer from "../allocations-bulk-assignment/allocations-bulk-assignment.container";
|
||||||
// import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container";
|
// import AllocationsEmployeeLabelContainer from "../allocations-employee-label/allocations-employee-label.container";
|
||||||
import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container";
|
import PartsOrderModalContainer from "../parts-order-modal/parts-order-modal.container";
|
||||||
|
|
||||||
import { createStructuredSelector } from "reselect";
|
|
||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly,
|
||||||
@@ -42,6 +44,29 @@ export function JobLinesComponent({
|
|||||||
setJobLineEditContext,
|
setJobLineEditContext,
|
||||||
form,
|
form,
|
||||||
}) {
|
}) {
|
||||||
|
const {
|
||||||
|
loading: billLinesLoading,
|
||||||
|
error: billLinesError,
|
||||||
|
data: billLinesData,
|
||||||
|
} = useQuery(QUERY_BILLS_BY_JOB_REF, {
|
||||||
|
variables: { jobId: job.id },
|
||||||
|
skip: loading,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("billLinesLoading :>> ", billLinesLoading);
|
||||||
|
const billLinesDataObj = useMemo(() => {
|
||||||
|
console.log("Memoized object called");
|
||||||
|
if (!billLinesData) return {};
|
||||||
|
const ret = {};
|
||||||
|
billLinesData.billlines.map((b) => {
|
||||||
|
if (b.joblineid) {
|
||||||
|
ret[b.joblineid] = { ...b, total: b.actual_price * b.quantity };
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
|
}, [billLinesData]);
|
||||||
|
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
sortedInfo: {},
|
sortedInfo: {},
|
||||||
filteredInfo: {},
|
filteredInfo: {},
|
||||||
@@ -200,6 +225,18 @@ export function JobLinesComponent({
|
|||||||
<JobLineLocationPopup jobline={record} disabled={jobRO} />
|
<JobLineLocationPopup jobline={record} disabled={jobRO} />
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: t("joblines.labels.billref"),
|
||||||
|
dataIndex: "billref",
|
||||||
|
key: "billref",
|
||||||
|
render: (text, record) => (
|
||||||
|
<JobLinesBillRefernece
|
||||||
|
jobline={record}
|
||||||
|
loading={billLinesLoading}
|
||||||
|
billLinesObject={billLinesDataObj}
|
||||||
|
/>
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t("joblines.fields.status"),
|
title: t("joblines.fields.status"),
|
||||||
dataIndex: "status",
|
dataIndex: "status",
|
||||||
@@ -383,25 +420,25 @@ export function JobLinesComponent({
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
expandedRowRender={(record) => (
|
// expandedRowRender={(record) => (
|
||||||
<div>
|
// <div>
|
||||||
<strong>{t("parts_orders.labels.orderhistory")}</strong>
|
// <strong>{t("parts_orders.labels.orderhistory")}</strong>
|
||||||
{record.parts_order_lines.map((item) => (
|
// {record.parts_order_lines.map((item) => (
|
||||||
<div key={item.id}>
|
// <div key={item.id}>
|
||||||
<Link
|
// <Link
|
||||||
to={`/manage/jobs/${job.id}?tab=partssublet&partsorderid=${item.parts_order.id}`}
|
// to={`/manage/jobs/${job.id}?tab=partssublet&partsorderid=${item.parts_order.id}`}
|
||||||
>
|
// >
|
||||||
{item.parts_order.order_number || ""}
|
// {item.parts_order.order_number || ""}
|
||||||
</Link>
|
// </Link>
|
||||||
-
|
// -
|
||||||
<Link to={`/manage/shop/vendors/${item.parts_order.vendor.id}`}>
|
// <Link to={`/manage/shop/vendors/${item.parts_order.vendor.id}`}>
|
||||||
{item.parts_order.vendor.name || ""}
|
// {item.parts_order.vendor.name || ""}
|
||||||
</Link>
|
// </Link>
|
||||||
{` on ${item.parts_order.order_date || ""}`}
|
// {` on ${item.parts_order.order_date || ""}`}
|
||||||
</div>
|
// </div>
|
||||||
))}
|
// ))}
|
||||||
</div>
|
// </div>
|
||||||
)}
|
// )}
|
||||||
rowClassName="table-small-margin"
|
rowClassName="table-small-margin"
|
||||||
rowSelection={{
|
rowSelection={{
|
||||||
selectedRowKeys: selectedLines.map((item) => item.id),
|
selectedRowKeys: selectedLines.map((item) => item.id),
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { Spin } from "antd";
|
||||||
|
import React from "react";
|
||||||
|
|
||||||
|
export default function JobLinesBillRefernece({
|
||||||
|
jobline,
|
||||||
|
loading,
|
||||||
|
billLinesObject,
|
||||||
|
}) {
|
||||||
|
if (loading)
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<Spin size="small" className="loading-spinner" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
if (!billLinesObject) return null;
|
||||||
|
|
||||||
|
const billLine = billLinesObject[jobline.id];
|
||||||
|
if (!billLine) return null;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>{`${(billLine.actual_price * billLine.quantity).toFixed(2)} (${
|
||||||
|
billLine.bill.vendor.name
|
||||||
|
})`}</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -22,3 +22,26 @@ export const INSERT_NEW_BILL_LINES = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const QUERY_BILLS_BY_JOB_REF = gql`
|
||||||
|
query QUERY_BILLS_BY_JOB_REF($jobId: uuid!) {
|
||||||
|
billlines(
|
||||||
|
where: { bill: { jobid: { _eq: $jobId } } }
|
||||||
|
limit: 1
|
||||||
|
order_by: { bill: { date: desc } }
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
quantity
|
||||||
|
actual_cost
|
||||||
|
actual_price
|
||||||
|
joblineid
|
||||||
|
bill {
|
||||||
|
id
|
||||||
|
vendor {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|||||||
@@ -803,6 +803,7 @@
|
|||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"billref": "Latest Bill",
|
||||||
"edit": "Edit Line",
|
"edit": "Edit Line",
|
||||||
"new": "New Line",
|
"new": "New Line",
|
||||||
"nostatus": "No Status"
|
"nostatus": "No Status"
|
||||||
|
|||||||
@@ -803,6 +803,7 @@
|
|||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"billref": "",
|
||||||
"edit": "Línea de edición",
|
"edit": "Línea de edición",
|
||||||
"new": "Nueva línea",
|
"new": "Nueva línea",
|
||||||
"nostatus": ""
|
"nostatus": ""
|
||||||
|
|||||||
@@ -803,6 +803,7 @@
|
|||||||
"unq_seq": "Seq #"
|
"unq_seq": "Seq #"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
|
"billref": "",
|
||||||
"edit": "Ligne d'édition",
|
"edit": "Ligne d'édition",
|
||||||
"new": "Nouvelle ligne",
|
"new": "Nouvelle ligne",
|
||||||
"nostatus": ""
|
"nostatus": ""
|
||||||
|
|||||||
Reference in New Issue
Block a user