From 8bd7e5cc6df0fba8a06dad793e950d358c3238f7 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 19 Jan 2026 13:17:39 -0500 Subject: [PATCH 1/3] feature/IO-3499-React-19: Email breaking bounds in job info / responsive.. --- .../data-label/data-label.component.jsx | 23 ++++++++++--------- .../jobs-change-status.component.jsx | 4 ++-- .../jobs-detail-header.component.jsx | 13 ++++++----- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/client/src/components/data-label/data-label.component.jsx b/client/src/components/data-label/data-label.component.jsx index c574600a6..5fa657754 100644 --- a/client/src/components/data-label/data-label.component.jsx +++ b/client/src/components/data-label/data-label.component.jsx @@ -13,31 +13,32 @@ export default function DataLabel({ if (!open || (hideIfNull && !children)) return null; return ( -
+
{`${label}:`}
+
- {typeof children === "string" ? ( - {children} - ) : ( - children - )} + {typeof children === "string" ? {children} : children}
); diff --git a/client/src/components/jobs-change-status/jobs-change-status.component.jsx b/client/src/components/jobs-change-status/jobs-change-status.component.jsx index c74a6dec9..22c65e459 100644 --- a/client/src/components/jobs-change-status/jobs-change-status.component.jsx +++ b/client/src/components/jobs-change-status/jobs-change-status.component.jsx @@ -86,10 +86,10 @@ export function JobsChangeStatus({ job, bodyshop, jobRO, insertAuditTrail, isPar const statusMenu = { items: [ - ...availableStatuses.map((item) => ({ + ...(availableStatuses?.map((item) => ({ key: item, label: item - })) + })) ?? []) ], onClick: (e) => updateJobStatus(e.key) }; diff --git a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx index 2bfddb369..0b05d66be 100644 --- a/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx +++ b/client/src/components/jobs-detail-header/jobs-detail-header.component.jsx @@ -65,8 +65,8 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is const colSpan = { xs: { span: 24 }, sm: { span: 24 }, - md: { span: isPartsEntry ? 8 : 12 }, - lg: { span: isPartsEntry ? 8 : 6 }, + md: { span: 12 }, + lg: { span: 12 }, xl: { span: isPartsEntry ? 8 : 6 } }; @@ -260,19 +260,19 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is )} - + {disabled || isPartsEntry ? ( {job.ownr_ph2} ) : ( )} - + {`${job.ownr_addr1 || ""} ${job.ownr_addr2 || ""} ${ job.ownr_city || "" } ${job.ownr_st || ""} ${job.ownr_zip || ""}`} - + {disabled || isPartsEntry ? ( <>{job.ownr_ea || ""} ) : job.ownr_ea ? ( @@ -280,13 +280,14 @@ export function JobsDetailHeader({ job, bodyshop, disabled, insertAuditTrail, is ) : null} {job.owner?.tax_number && ( - + {job.owner?.tax_number || ""} )} {job.owner?.note || ""} From 7a0187afbe2e638fbe20478d872ed0ae7c4856f8 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 19 Jan 2026 14:18:51 -0500 Subject: [PATCH 2/3] feature/IO-3499-React-19: Production Note + Comment edit in job details header / card --- ...duction-list-columns.comment.component.jsx | 56 ++++++++------ ...-list-columns.productionnote.component.jsx | 77 ++++++++++--------- 2 files changed, 76 insertions(+), 57 deletions(-) diff --git a/client/src/components/production-list-columns/production-list-columns.comment.component.jsx b/client/src/components/production-list-columns/production-list-columns.comment.component.jsx index c9b14fc0a..53b51d34f 100644 --- a/client/src/components/production-list-columns/production-list-columns.comment.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.comment.component.jsx @@ -18,6 +18,7 @@ export default function ProductionListColumnComment({ record }) { const handleSaveNote = (e) => { e.stopPropagation(); + e.preventDefault(); setOpen(false); updateAlert({ variables: { @@ -33,7 +34,6 @@ export default function ProductionListColumnComment({ record }) { }; const handleChange = (e) => { - e.stopPropagation(); setNote(e.target.value); }; @@ -42,26 +42,38 @@ export default function ProductionListColumnComment({ record }) { if (flag) setNote(record.comment || ""); }; + const content = ( +
e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + > + e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + /> +
+ +
+
+ ); + return ( - - -
- -
-
- } - trigger={["click"]} + trigger.parentElement} >
e.stopPropagation()} > {record.comment || " "} diff --git a/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx index aa7c11914..28ea33822 100644 --- a/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx +++ b/client/src/components/production-list-columns/production-list-columns.productionnote.component.jsx @@ -1,7 +1,7 @@ import Icon from "@ant-design/icons"; import { useMutation } from "@apollo/client/react"; import { Button, Input, Popover, Space } from "antd"; -import { useCallback, useMemo, useState } from "react"; +import { useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { FaRegStickyNote } from "react-icons/fa"; import { logImEXEvent } from "../../firebase/firebase.utils"; @@ -27,6 +27,7 @@ function ProductionListColumnProductionNote({ record, setNoteUpsertContext }) { (e) => { logImEXEvent("production_add_note"); e.stopPropagation(); + e.preventDefault(); setOpen(false); updateAlert({ variables: { @@ -46,7 +47,6 @@ function ProductionListColumnProductionNote({ record, setNoteUpsertContext }) { ); const handleChange = useCallback((e) => { - e.stopPropagation(); setNote(e.target.value); }, []); @@ -58,42 +58,48 @@ function ProductionListColumnProductionNote({ record, setNoteUpsertContext }) { [record] ); - const popoverContent = useMemo( - () => ( -
- - - - - -
- ), - [note, handleSaveNote, handleChange, record, setNoteUpsertContext, t] + const content = ( +
e.stopPropagation()} onClick={(e) => e.stopPropagation()}> + e.stopPropagation()} + onClick={(e) => e.stopPropagation()} + /> + + + + +
); return ( - + trigger.parentElement} + >
e.stopPropagation()} > {record.production_vars?.note || " "} From 89622f0af2d57d5c79cfc0196c404d0e16b6b1f3 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 19 Jan 2026 14:30:11 -0500 Subject: [PATCH 3/3] feature/IO-3499-React-19: Manual Appointment in Schedule, Email Form console error --- .../email-overlay/email-overlay.container.jsx | 12 ++- .../schedule-event.component.jsx | 74 ++++++++++--------- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/client/src/components/email-overlay/email-overlay.container.jsx b/client/src/components/email-overlay/email-overlay.container.jsx index 2ef0b6db2..0ae3b1779 100644 --- a/client/src/components/email-overlay/email-overlay.container.jsx +++ b/client/src/components/email-overlay/email-overlay.container.jsx @@ -32,6 +32,7 @@ export function EmailOverlayContainer({ emailConfig, modalVisible, toggleEmailOv const [loading, setLoading] = useState(false); const [sending, setSending] = useState(false); const [rawHtml, setRawHtml] = useState(""); + const [htmlSize, setHtmlSize] = useState(0); const [pdfCopytoAttach, setPdfCopytoAttach] = useState({ filename: null, pdf: null @@ -151,6 +152,13 @@ export function EmailOverlayContainer({ emailConfig, modalVisible, toggleEmailOv if (modalVisible) render(); }, [modalVisible]); + useEffect(() => { + const html = form.getFieldValue("html"); + if (html) { + setHtmlSize(new Blob([html]).size); + } + }, [form, rawHtml]); + return ( s.isSelected).reduce((acc, val) => (acc = acc + val.size), 0) >= - 10485760 - new Blob([form.getFieldValue("html")]).size || + 10485760 - htmlSize || selectedMedia.filter((s) => s.isSelected).length > 10) }} > @@ -195,7 +203,7 @@ export function EmailOverlayContainer({ emailConfig, modalVisible, toggleEmailOv disabled={ selectedMedia && (selectedMedia.filter((s) => s.isSelected).reduce((acc, val) => (acc = acc + val.size), 0) >= - 10485760 - new Blob([form.getFieldValue("html")]).size || + 10485760 - htmlSize || selectedMedia.filter((s) => s.isSelected).length > 10) } type="primary" diff --git a/client/src/components/job-at-change/schedule-event.component.jsx b/client/src/components/job-at-change/schedule-event.component.jsx index 18dd85453..ab8bb8683 100644 --- a/client/src/components/job-at-change/schedule-event.component.jsx +++ b/client/src/components/job-at-change/schedule-event.component.jsx @@ -120,6 +120,13 @@ export function ScheduleEventComponent({ ); const handleConvert = async (values) => { + if (!event.job?.id) { + notification.error({ + title: t("appointments.errors.nojob") + }); + return; + } + const res = await mutationUpdateJob({ variables: { jobId: event.job.id, @@ -397,21 +404,21 @@ export function ScheduleEventComponent({ (HasFeatureAccess({ featureName: "checklist", bodyshop }) ? ( ) : ( - { if (event.job?.id) { e.stopPropagation(); - getJobDetails({ id: event.job.id }); + getJobDetails({ variables: { id: event.job.id } }); } }} getPopupContainer={(trigger) => trigger.parentNode} @@ -434,37 +441,36 @@ export function ScheduleEventComponent({ return baseColor; }; - const RegularEvent = event.isintake ? ( - - {event.note && } - {`${event.job.ro_number || t("general.labels.na")}`} - - {`${(event.job && event.job.v_model_yr) || ""} ${ - (event.job && event.job.v_make_desc) || "" - } ${(event.job && event.job.v_model_desc) || ""}`} - {`(${(event.job && event.job.labhrs.aggregate.sum.mod_lb_hrs) || "0"} / ${ - (event.job && event.job.larhrs.aggregate.sum.mod_lb_hrs) || "0" - })`} - {event.job && event.job.alt_transport &&
{event.job.alt_transport}
} - {event?.job?.comment && `C: ${event.job.comment}`} -
- ) : ( -
- {`${event.title || ""}`} -
- ); + const RegularEvent = + event.isintake && event.job ? ( + + {event.note && } + {`${event.job.ro_number || t("general.labels.na")}`} + + {`${event.job.v_model_yr || ""} ${event.job.v_make_desc || ""} ${event.job.v_model_desc || ""}`} + {`(${event.job.labhrs?.aggregate?.sum?.mod_lb_hrs || "0"} / ${ + event.job.larhrs?.aggregate?.sum?.mod_lb_hrs || "0" + })`} + {event.job.alt_transport &&
{event.job.alt_transport}
} + {event.job.comment && `C: ${event.job.comment}`} +
+ ) : ( +
+ {`${event.title || ""}`} +
+ ); return (