diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx
index 199bbd26d..1b2931d8b 100644
--- a/client/src/App/App.jsx
+++ b/client/src/App/App.jsx
@@ -4,7 +4,7 @@ import LogRocket from "logrocket";
import React, { lazy, Suspense, useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
-import { Route } from "react-router-dom";
+import { Route, Routes } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import DocumentEditorContainer from "../components/document-editor/document-editor.container";
import ErrorBoundary from "../components/error-boundary/error-boundary.component";
@@ -73,6 +73,7 @@ export function App({
window.addEventListener("online", function (e) {
setOnline(true);
});
+
useEffect(() => {
if (currentUser.authorized && bodyshop) {
client.setAttribute("imexshopid", bodyshop.imexshopid);
@@ -107,54 +108,77 @@ export function App({
/>
);
+ //
+ // }>
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+ //
+
+
return (
-
- }>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ }>
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ }>
+ } />
+
+ }>
+ } />
+
+ }>
+ } />
+
+
+
+
);
}
diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx
index f92a4a349..fd78843ad 100644
--- a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx
+++ b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx
@@ -1,21 +1,17 @@
-import { useMutation, useQuery } from "@apollo/client";
-import { Button, Form, PageHeader, Popconfirm, Space } from "antd";
+import {useMutation, useQuery} from "@apollo/client";
+import {Button, Form, PageHeader, Popconfirm, Space} from "antd";
import moment from "moment";
import queryString from "query-string";
-import React, { useState } from "react";
-import { useTranslation } from "react-i18next";
-import { connect } from "react-redux";
-import { useLocation } from "react-router-dom";
-import { createStructuredSelector } from "reselect";
-import {
- DELETE_BILL_LINE,
- INSERT_NEW_BILL_LINES,
- UPDATE_BILL_LINE
-} from "../../graphql/bill-lines.queries";
-import { QUERY_BILL_BY_PK, UPDATE_BILL } from "../../graphql/bills.queries";
-import { insertAuditTrail } from "../../redux/application/application.actions";
-import { setModalContext } from "../../redux/modals/modals.actions";
-import { selectBodyshop } from "../../redux/user/user.selectors";
+import React, {useState} from "react";
+import {useTranslation} from "react-i18next";
+import {connect} from "react-redux";
+import {useSearchParams} from "react-router-dom";
+import {createStructuredSelector} from "reselect";
+import {DELETE_BILL_LINE, INSERT_NEW_BILL_LINES, UPDATE_BILL_LINE} from "../../graphql/bill-lines.queries";
+import {QUERY_BILL_BY_PK, UPDATE_BILL} from "../../graphql/bills.queries";
+import {insertAuditTrail} from "../../redux/application/application.actions";
+import {setModalContext} from "../../redux/modals/modals.actions";
+import {selectBodyshop} from "../../redux/user/user.selectors";
import AuditTrailMapping from "../../utils/AuditTrailMappings";
import AlertComponent from "../alert/alert.component";
import BillFormContainer from "../bill-form/bill-form.container";
@@ -27,225 +23,223 @@ import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component";
import BillDetailEditReturn from "./bill-detail-edit-return.component";
const mapStateToProps = createStructuredSelector({
- bodyshop: selectBodyshop,
+ bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
- setPartsOrderContext: (context) =>
- dispatch(setModalContext({ context: context, modal: "partsOrder" })),
- insertAuditTrail: ({ jobid, operation }) =>
- dispatch(insertAuditTrail({ jobid, operation })),
+ setPartsOrderContext: (context) =>
+ dispatch(setModalContext({context: context, modal: "partsOrder"})),
+ insertAuditTrail: ({jobid, operation}) =>
+ dispatch(insertAuditTrail({jobid, operation})),
});
export default connect(
- mapStateToProps,
- mapDispatchToProps
+ mapStateToProps,
+ mapDispatchToProps
)(BillDetailEditcontainer);
-export function BillDetailEditcontainer({
- setPartsOrderContext,
- insertAuditTrail,
- bodyshop,
-}) {
- const search = queryString.parse(useLocation().search);
+export function BillDetailEditcontainer({setPartsOrderContext, insertAuditTrail, bodyshop,}) {
+ const search = queryString.parse(useSearchParams().toString());
- const { t } = useTranslation();
- const [form] = Form.useForm();
- const [visible, setVisible] = useState(false);
- const [updateLoading, setUpdateLoading] = useState(false);
- const [update_bill] = useMutation(UPDATE_BILL);
- const [insertBillLine] = useMutation(INSERT_NEW_BILL_LINES);
- const [updateBillLine] = useMutation(UPDATE_BILL_LINE);
- const [deleteBillLine] = useMutation(DELETE_BILL_LINE);
+ const {t} = useTranslation();
+ const [form] = Form.useForm();
+ const [visible, setVisible] = useState(false);
+ const [updateLoading, setUpdateLoading] = useState(false);
+ const [update_bill] = useMutation(UPDATE_BILL);
+ const [insertBillLine] = useMutation(INSERT_NEW_BILL_LINES);
+ const [updateBillLine] = useMutation(UPDATE_BILL_LINE);
+ const [deleteBillLine] = useMutation(DELETE_BILL_LINE);
- const { loading, error, data, refetch } = useQuery(QUERY_BILL_BY_PK, {
- variables: { billid: search.billid },
- skip: !!!search.billid,
- fetchPolicy: "network-only",
- nextFetchPolicy: "network-only",
- });
-
- const handleSave = () => {
- //It's got a previously deducted bill line!
- if (
- data.bills_by_pk.billlines.filter((b) => b.deductedfromlbr).length > 0 ||
- form.getFieldValue("billlines").filter((b) => b.deductedfromlbr).length >
- 0
- )
- setVisible(true);
- else {
- form.submit();
- }
- };
-
- const handleFinish = async (values) => {
- setUpdateLoading(true);
- //let adjustmentsToInsert = {};
-
- const { billlines, upload, ...bill } = values;
- const updates = [];
- updates.push(
- update_bill({
- variables: { billId: search.billid, bill: bill },
- })
- );
-
- billlines.forEach((l) => {
- delete l.selected;
+ const {loading, error, data, refetch} = useQuery(QUERY_BILL_BY_PK, {
+ variables: {billid: search.billid},
+ skip: !!!search.billid,
+ fetchPolicy: "network-only",
+ nextFetchPolicy: "network-only",
});
- //Find bill lines that were deleted.
- const deletedJobLines = [];
+ // ... rest of the code remains the same
- data.bills_by_pk.billlines.forEach((a) => {
- const matchingRecord = billlines.find((b) => b.id === a.id);
- if (!matchingRecord) {
- deletedJobLines.push(a);
- }
- });
+ const handleSave = () => {
+ //It's got a previously deducted bill line!
+ if (
+ data.bills_by_pk.billlines.filter((b) => b.deductedfromlbr).length > 0 ||
+ form.getFieldValue("billlines").filter((b) => b.deductedfromlbr).length >
+ 0
+ )
+ setVisible(true);
+ else {
+ form.submit();
+ }
+ };
- deletedJobLines.forEach((d) => {
- updates.push(deleteBillLine({ variables: { id: d.id } }));
- });
+ const handleFinish = async (values) => {
+ setUpdateLoading(true);
+ //let adjustmentsToInsert = {};
- billlines.forEach((billline) => {
- const { deductedfromlbr, inventories, jobline, ...il } = billline;
- delete il.__typename;
-
- if (il.id) {
+ const {billlines, upload, ...bill} = values;
+ const updates = [];
updates.push(
- updateBillLine({
- variables: {
- billLineId: il.id,
- billLine: {
- ...il,
- deductedfromlbr: deductedfromlbr,
- joblineid: il.joblineid === "noline" ? null : il.joblineid,
- },
- },
- })
+ update_bill({
+ variables: {billId: search.billid, bill: bill},
+ })
);
- } else {
- //It's a new line, have to insert it.
- updates.push(
- insertBillLine({
- variables: {
- billLines: [
- {
- ...il,
- deductedfromlbr: deductedfromlbr,
- billid: search.billid,
- joblineid: il.joblineid === "noline" ? null : il.joblineid,
- },
- ],
- },
- })
- );
- }
- });
- await Promise.all(updates);
+ billlines.forEach((l) => {
+ delete l.selected;
+ });
- insertAuditTrail({
- jobid: bill.jobid,
- billid: search.billid,
- operation: AuditTrailMapping.billupdated(bill.invoice_number),
- });
+ //Find bill lines that were deleted.
+ const deletedJobLines = [];
- await refetch();
- form.setFieldsValue(transformData(data));
- form.resetFields();
- setVisible(false);
- setUpdateLoading(false);
- };
+ data.bills_by_pk.billlines.forEach((a) => {
+ const matchingRecord = billlines.find((b) => b.id === a.id);
+ if (!matchingRecord) {
+ deletedJobLines.push(a);
+ }
+ });
- if (error) return ;
- if (!search.billid) return <>>; //
{t("bills.labels.noneselected")}
;
+ deletedJobLines.forEach((d) => {
+ updates.push(deleteBillLine({variables: {id: d.id}}));
+ });
- const exported = data && data.bills_by_pk && data.bills_by_pk.exported;
+ billlines.forEach((billline) => {
+ const {deductedfromlbr, inventories, jobline, ...il} = billline;
+ delete il.__typename;
- return (
- <>
- {loading && }
- {data && (
+ if (il.id) {
+ updates.push(
+ updateBillLine({
+ variables: {
+ billLineId: il.id,
+ billLine: {
+ ...il,
+ deductedfromlbr: deductedfromlbr,
+ joblineid: il.joblineid === "noline" ? null : il.joblineid,
+ },
+ },
+ })
+ );
+ } else {
+ //It's a new line, have to insert it.
+ updates.push(
+ insertBillLine({
+ variables: {
+ billLines: [
+ {
+ ...il,
+ deductedfromlbr: deductedfromlbr,
+ billid: search.billid,
+ joblineid: il.joblineid === "noline" ? null : il.joblineid,
+ },
+ ],
+ },
+ })
+ );
+ }
+ });
+
+ await Promise.all(updates);
+
+ insertAuditTrail({
+ jobid: bill.jobid,
+ billid: search.billid,
+ operation: AuditTrailMapping.billupdated(bill.invoice_number),
+ });
+
+ await refetch();
+ form.setFieldsValue(transformData(data));
+ form.resetFields();
+ setVisible(false);
+ setUpdateLoading(false);
+ };
+
+ if (error) return ;
+ if (!search.billid) return <>>; //{t("bills.labels.noneselected")}
;
+
+ const exported = data && data.bills_by_pk && data.bills_by_pk.exported;
+
+ return (
<>
-
-
+ {loading && }
+ {data && (
+ <>
+
+
- form.submit()}
- onCancel={() => setVisible(false)}
- okButtonProps={{ loading: updateLoading }}
- title={t("bills.labels.editadjwarning")}
- >
-
-
-
-
-
- }
- />
-
+ >
)}
-
>
- )}
- >
- );
+ );
}
const transformData = (data) => {
- return data
- ? {
- ...data.bills_by_pk,
+ return data
+ ? {
+ ...data.bills_by_pk,
- billlines: data.bills_by_pk.billlines.map((i) => {
- return {
- ...i,
- joblineid: !!i.joblineid ? i.joblineid : "noline",
- applicable_taxes: {
- federal:
- (i.applicable_taxes && i.applicable_taxes.federal) || false,
- state: (i.applicable_taxes && i.applicable_taxes.state) || false,
- local: (i.applicable_taxes && i.applicable_taxes.local) || false,
- },
- };
- }),
- date: data.bills_by_pk ? moment(data.bills_by_pk.date) : null,
- }
- : {};
+ billlines: data.bills_by_pk.billlines.map((i) => {
+ return {
+ ...i,
+ joblineid: !!i.joblineid ? i.joblineid : "noline",
+ applicable_taxes: {
+ federal:
+ (i.applicable_taxes && i.applicable_taxes.federal) || false,
+ state: (i.applicable_taxes && i.applicable_taxes.state) || false,
+ local: (i.applicable_taxes && i.applicable_taxes.local) || false,
+ },
+ };
+ }),
+ date: data.bills_by_pk ? moment(data.bills_by_pk.date) : null,
+ }
+ : {};
};
diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx
index 32d27e3cd..987c03b38 100644
--- a/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx
+++ b/client/src/components/bill-detail-edit/bill-detail-edit-return.component.jsx
@@ -3,7 +3,7 @@ import queryString from "query-string";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
-import { useNavigate, useLocation } from "react-router-dom";
+import { useSearchParams, useNavigate } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import { insertAuditTrail } from "../../redux/application/application.actions";
import { setModalContext } from "../../redux/modals/modals.actions";
@@ -32,7 +32,7 @@ export function BillDetailEditReturn({
data,
disabled,
}) {
- const search = queryString.parse(useLocation().search);
+ const search = queryString.parse(useSearchParams().toString());
const history = useNavigate();
const { t } = useTranslation();
const [form] = Form.useForm();
@@ -67,7 +67,7 @@ export function BillDetailEditReturn({
});
delete search.billid;
- history.push({ search: queryString.stringify(search) });
+ history({ search: queryString.stringify(search) });
setVisible(false);
};
useEffect(() => {
diff --git a/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx b/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx
index dd9490d77..63a3180c7 100644
--- a/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx
+++ b/client/src/components/bill-detail-edit/bill-detail-edit.container.jsx
@@ -1,11 +1,11 @@
import { Drawer, Grid } from "antd";
import queryString from "query-string";
import React from "react";
-import { useNavigate, useLocation } from "react-router-dom";
+import { useSearchParams, useNavigate } from "react-router-dom";
import BillDetailEditComponent from "./bill-detail-edit-component";
export default function BillDetailEditcontainer() {
- const search = queryString.parse(useLocation().search);
+ const search = queryString.parse(useSearchParams().toString());
const history = useNavigate();
const selectedBreakpoint = Object.entries(Grid.useBreakpoint())
@@ -29,7 +29,7 @@ export default function BillDetailEditcontainer() {
width={drawerPercentage}
onClose={() => {
delete search.billid;
- history.push({ search: queryString.stringify(search) });
+ history({ search: queryString.stringify(search) });
}}
destroyOnClose
open={search.billid}
diff --git a/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx b/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx
index 1fea48f5b..bf6200ed4 100644
--- a/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx
+++ b/client/src/components/billline-add-inventory/billline-add-inventory.component.jsx
@@ -13,7 +13,7 @@ import {
} from "../../redux/user/user.selectors";
import { CalculateBillTotal } from "../bill-form/bill-form.totals.utility";
import queryString from "query-string";
-import { useLocation } from "react-router-dom";
+import { useSearchParams } from "react-router-dom";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -35,7 +35,7 @@ export function BilllineAddInventory({
jobid,
}) {
const [loading, setLoading] = useState(false);
- const { billid } = queryString.parse(useLocation().search);
+ const { billid } = queryString.parse(useSearchParams().toString());
const [insertInventoryLine] = useMutation(INSERT_INVENTORY_AND_CREDIT);
diff --git a/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx b/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx
index 9af21662b..e9e24197d 100644
--- a/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx
+++ b/client/src/components/bills-vendors-list/bills-vendors-list.component.jsx
@@ -2,14 +2,14 @@ import React, { useState } from "react";
import { QUERY_ALL_VENDORS } from "../../graphql/vendors.queries";
import { useQuery } from "@apollo/client";
import queryString from "query-string";
-import { useNavigate, useLocation } from "react-router-dom";
+import { useSearchParams, useNavigate } from "react-router-dom";
import { Table, Input } from "antd";
import { useTranslation } from "react-i18next";
import { alphaSort } from "../../utils/sorters";
import AlertComponent from "../alert/alert.component";
export default function BillsVendorsList() {
- const search = queryString.parse(useLocation().search);
+ const search = queryString.parse(useSearchParams().toString());
const history = useNavigate();
const { loading, error, data } = useQuery(QUERY_ALL_VENDORS, {
diff --git a/client/src/components/contracts-list/contracts-list.component.jsx b/client/src/components/contracts-list/contracts-list.component.jsx
index 8495bf340..92136ba34 100644
--- a/client/src/components/contracts-list/contracts-list.component.jsx
+++ b/client/src/components/contracts-list/contracts-list.component.jsx
@@ -3,7 +3,7 @@ import { Button, Card, Input, Space, Table, Typography } from "antd";
import queryString from "query-string";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
-import { Link, useNavigate, useLocation } from "react-router-dom";
+import { Link, useNavigate, useSearchParams } from "react-router-dom";
import { setModalContext } from "../../redux/modals/modals.actions";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
@@ -40,7 +40,7 @@ export function ContractsList({
filteredInfo: { text: "" },
});
const history = useNavigate();
- const search = queryString.parse(useLocation().search);
+ const search = queryString.parse(useSearchParams().toString());
const { page } = search;
const { t } = useTranslation();
@@ -164,7 +164,7 @@ export function ContractsList({
search.page = pagination.current;
search.sortcolumn = sorter.columnKey;
search.sortorder = sorter.order;
- history.push({ search: queryString.stringify(search) });
+ history({ search: queryString.stringify(search) });
};
return (
@@ -179,7 +179,7 @@ export function ContractsList({