Merge remote-tracking branch 'origin/release/2025-08-01' into feature/IO-3255-simplified-part-management

This commit is contained in:
Dave Richer
2025-07-30 13:10:59 -04:00
5 changed files with 22 additions and 21 deletions

View File

@@ -1,7 +1,7 @@
import React, { forwardRef } from "react"; import { forwardRef } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
const LaborTypeFormItem = ({ value, onChange }, ref) => { const LaborTypeFormItem = ({ value }) => {
const { t } = useTranslation(); const { t } = useTranslation();
if (!value) return null; if (!value) return null;

View File

@@ -1,11 +1,13 @@
import React, { forwardRef } from "react"; import { forwardRef } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
const PartTypeFormItem = ({ value, onChange }, ref) => { const PartTypeFormItem = ({ value }) => {
const { t } = useTranslation(); const { t } = useTranslation();
if (!value) return null; if (!value) return null;
return <div>{t(`joblines.fields.part_types.${value}`)}</div>; return (
<div style={{ wordWrap: "break-word", overflowWrap: "break-word" }}>{t(`joblines.fields.part_types.${value}`)}</div>
);
}; };
export default forwardRef(PartTypeFormItem); export default forwardRef(PartTypeFormItem);

View File

@@ -1,6 +1,5 @@
import Dinero from "dinero.js"; import Dinero from "dinero.js";
import React, { forwardRef } from "react"; import { forwardRef } from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -8,23 +7,24 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language)) //setUserLanguage: language => dispatch(setUserLanguage(language))
}); });
const ReadOnlyFormItem = ({ bodyshop, value, type = "text", onChange }, ref) => { const ReadOnlyFormItem = ({ bodyshop, value, type = "text" }) => {
if (!value) return null; if (!value) return null;
switch (type) { switch (type) {
case "employee": case "employee": {
const emp = bodyshop.employees.find((e) => e.id === value); const emp = bodyshop.employees.find((e) => e.id === value);
return `${emp?.first_name} ${emp?.last_name}`; return `${emp?.first_name} ${emp?.last_name}`;
}
case "text": case "text":
return <div>{value}</div>; return <div style={{ wordWrap: "break-word", overflowWrap: "break-word" }}>{value}</div>;
case "currency": case "currency":
return <div>{Dinero({ amount: Math.round(value * 100) }).toFormat()}</div>; return <div>{Dinero({ amount: Math.round(value * 100) }).toFormat()}</div>;
default: default:
return <div>{value}</div>; return <div style={{ wordWrap: "break-word", overflowWrap: "break-word" }}>{value}</div>;
} }
}; };

View File

@@ -1,5 +1,5 @@
import { WarningOutlined } from "@ant-design/icons";
import { Form, Select, Space, Tooltip } from "antd"; import { Form, Select, Space, Tooltip } from "antd";
import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
@@ -8,14 +8,13 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import LaborTypeFormItem from "../form-items-formatted/labor-type-form-item.component"; import LaborTypeFormItem from "../form-items-formatted/labor-type-form-item.component";
import PartTypeFormItem from "../form-items-formatted/part-type-form-item.component"; import PartTypeFormItem from "../form-items-formatted/part-type-form-item.component";
import ReadOnlyFormItem from "../form-items-formatted/read-only-form-item.component"; import ReadOnlyFormItem from "../form-items-formatted/read-only-form-item.component";
import { WarningOutlined } from "@ant-design/icons";
import "./jobs-close-lines.styles.scss"; import "./jobs-close-lines.styles.scss";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
jobRO: selectJobReadOnly jobRO: selectJobReadOnly
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = () => ({
//setUserLanguage: language => dispatch(setUserLanguage(language)) //setUserLanguage: language => dispatch(setUserLanguage(language))
}); });
@@ -24,7 +23,7 @@ export function JobsCloseLines({ bodyshop, job, jobRO }) {
return ( return (
<div> <div>
<Form.List name={["joblines"]}> <Form.List name={["joblines"]}>
{(fields, { add, remove, move }) => { {(fields) => {
return ( return (
<table className="jobs-close-table"> <table className="jobs-close-table">
<thead> <thead>

View File

@@ -271,7 +271,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, set
{ {
required: true required: true
}, },
({ getFieldValue }) => ({ () => ({
validator(_, value) { validator(_, value) {
if (!bodyshop.cdk_dealerid) return Promise.resolve(); if (!bodyshop.cdk_dealerid) return Promise.resolve();
if (!value || dayjs(value).isSameOrAfter(dayjs(), "day")) { if (!value || dayjs(value).isSameOrAfter(dayjs(), "day")) {
@@ -280,7 +280,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, set
return Promise.reject(new Error(t("jobs.labels.dms.invoicedatefuture"))); return Promise.reject(new Error(t("jobs.labels.dms.invoicedatefuture")));
} }
}), }),
({ getFieldValue }) => ({ () => ({
validator(_, value) { validator(_, value) {
if (ClosingPeriod.treatment === "on" && bodyshop.accountingconfig.ClosingPeriod) { if (ClosingPeriod.treatment === "on" && bodyshop.accountingconfig.ClosingPeriod) {
if ( if (
@@ -369,8 +369,8 @@ export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, set
<Form.List <Form.List
name={["qb_multiple_payers"]} name={["qb_multiple_payers"]}
rules={[ rules={[
({ getFieldValue }) => ({ () => ({
validator(_, value) { validator() {
let totalAllocated = Dinero(); let totalAllocated = Dinero();
const payers = form.getFieldValue("qb_multiple_payers"); const payers = form.getFieldValue("qb_multiple_payers");
@@ -492,7 +492,7 @@ export function JobsCloseComponent({ job, bodyshop, jobRO, insertAuditTrail, set
<Statistic <Statistic
title={t("jobs.labels.pimraryamountpayable")} title={t("jobs.labels.pimraryamountpayable")}
valueStyle={{ valueStyle={{
color: discrep.getAmount() > 0 ? "green" : "red" color: discrep.getAmount() >= 0 ? "green" : "red"
}} }}
value={discrep.toFormat()} value={discrep.toFormat()}
/> />