diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 8d90d4760..a7de63bcb 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -14493,6 +14493,27 @@ + + priorsuccesfulexport + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + @@ -32395,6 +32416,27 @@ + + orderinhouse + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + diff --git a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx index 8b017991a..ed3a7b24c 100644 --- a/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx +++ b/client/src/components/accounting-payables-table/accounting-payables-table.component.jsx @@ -13,6 +13,7 @@ import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -131,11 +132,9 @@ export function AccountingPayablesTableComponent({ bodyshop, loading, bills }) { dataIndex: "attempts", key: "attempts", - render: (text, record) => { - const success = record.exportlogs.filter((e) => e.successful).length; - const attempts = record.exportlogs.length; - return `${success}/${attempts}`; - }, + render: (text, record) => ( + + ), }, { title: t("general.labels.actions"), diff --git a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx index 30ac03db3..3a8c0c6b4 100644 --- a/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx +++ b/client/src/components/accounting-payments-table/accounting-payments-table.component.jsx @@ -13,6 +13,7 @@ import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../redux/user/user.selectors"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; +import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -130,11 +131,9 @@ export function AccountingPayablesTableComponent({ dataIndex: "attempts", key: "attempts", - render: (text, record) => { - const success = record.exportlogs.filter((e) => e.successful).length; - const attempts = record.exportlogs.length; - return `${success}/${attempts}`; - }, + render: (text, record) => ( + + ), }, { title: t("general.labels.actions"), diff --git a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx index d49edecf7..d954448d4 100644 --- a/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx +++ b/client/src/components/accounting-receivables-table/accounting-receivables-table.component.jsx @@ -14,6 +14,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import QboAuthorizeComponent from "../qbo-authorize/qbo-authorize.component"; import { DateFormatter } from "../../utils/DateFormatter"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; +import ExportLogsCountDisplay from "../export-logs-count-display/export-logs-count-display.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -139,12 +140,9 @@ export function AccountingReceivablesTableComponent({ title: t("exportlogs.labels.attempts"), dataIndex: "attempts", key: "attempts", - - render: (text, record) => { - const success = record.exportlogs.filter((e) => e.successful).length; - const attempts = record.exportlogs.length; - return `${success}/${attempts}`; - }, + render: (text, record) => ( + + ), }, { title: t("general.labels.actions"), diff --git a/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx new file mode 100644 index 000000000..d0ad34dc5 --- /dev/null +++ b/client/src/components/export-logs-count-display/export-logs-count-display.component.jsx @@ -0,0 +1,25 @@ +import React from "react"; +import { WarningOutlined } from "@ant-design/icons"; +import { Space, Tooltip } from "antd"; +import { useTranslation } from "react-i18next"; + +const style = { + fontWeight: "bold", + color: "green", +}; + +export default function ExportLogsCountDisplay({ logs }) { + const success = logs.filter((e) => e.successful).length; + const attempts = logs.length; + const { t } = useTranslation(); + return ( + 0 ? style : {}}> + {`${success}/${attempts}`} + {success > 0 && ( + + + + )} + + ); +} diff --git a/client/src/components/job-detail-lines/job-lines.component.jsx b/client/src/components/job-detail-lines/job-lines.component.jsx index e6bff1185..401a5bba6 100644 --- a/client/src/components/job-detail-lines/job-lines.component.jsx +++ b/client/src/components/job-detail-lines/job-lines.component.jsx @@ -6,6 +6,7 @@ import { EditFilled, PlusCircleTwoTone, MinusCircleTwoTone, + HomeOutlined, } from "@ant-design/icons"; import { useMutation } from "@apollo/client"; import { @@ -42,6 +43,7 @@ import _ from "lodash"; import JobCreateIOU from "../job-create-iou/job-create-iou.component"; import JobLinesExpander from "./job-lines-expander.component"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import moment from "moment"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -54,6 +56,8 @@ const mapDispatchToProps = (dispatch) => ({ dispatch(setModalContext({ context: context, modal: "jobLineEdit" })), setPartsOrderContext: (context) => dispatch(setModalContext({ context: context, modal: "partsOrder" })), + setBillEnterContext: (context) => + dispatch(setModalContext({ context: context, modal: "billEnter" })), }); export function JobLinesComponent({ @@ -68,6 +72,7 @@ export function JobLinesComponent({ job, setJobLineEditContext, form, + setBillEnterContext, }) { const [deleteJobLine] = useMutation(DELETE_JOB_LINE_BY_PK); @@ -386,6 +391,62 @@ export function JobLinesComponent({ )} +