Compare commits

...

15 Commits

Author SHA1 Message Date
Dave
784378a999 feature/IO-3571-Create-Job-Done-Loading - Fix set is submitting 2026-03-09 12:53:59 -04:00
Allan Carr
0d502d4dd4 IO-3571 Create Job Done Button Loading
Signed-off-by: Allan Carr <allan@imexsystems.ca>
2026-03-06 18:31:22 -08:00
Dave Richer
8980d3716b Merged in release/2026-03-13 (pull request #3092)
release/2026-02-27 - Final RR debug fix [FRONT END NOT REQUIRED]

Approved-by: Allan Carr
2026-03-04 20:31:22 +00:00
Dave Richer
764ec5f8f9 Merged in release/2026-02-27 (pull request #3091)
release/2026-02-27 - Final RR debug fix
2026-03-04 20:20:49 +00:00
Dave
a7a7551dae release/2026-02-27 - Final RR debug fix 2026-03-04 15:17:56 -05:00
Dave Richer
571536a7ec Merged in master-AIO (pull request #3089)
release/2026-02-27 - bump
2026-03-04 19:28:47 +00:00
Dave Richer
20e56fff6a Merged in release/2026-02-27 (pull request #3088)
release/2026-02-27 - bump
2026-03-04 19:28:21 +00:00
Dave
8f132ca14d release/2026-02-27 - bump 2026-03-04 14:27:23 -05:00
Dave Richer
99c002dac1 Merged in master-AIO (pull request #3086)
Master AIO
2026-03-04 19:24:37 +00:00
Dave Richer
0cd30ccdec Merged in release/2026-02-27 (pull request #3085)
Release/2026 02 27
2026-03-04 17:45:15 +00:00
Patrick Fic
acd69276a5 Merged in release/revert-revert-pr-3080 (pull request #3083)
Revert "Revert "Release/2026 02 27 (pull request #3070)" (pull request #3080)"
2026-03-04 17:41:44 +00:00
Patrick Fic
faf5878bdf Revert "Revert "Release/2026 02 27 (pull request #3070)" (pull request #3080)" 2026-03-04 17:41:10 +00:00
Patrick Fic
5a55798d2d Merged in release/revert-pr-3070-2026-03-04 (pull request #3080)
Revert "Release/2026 02 27 (pull request #3070)"
2026-03-04 16:20:15 +00:00
Patrick Fic
c9e41ba72a Revert "Release/2026 02 27 (pull request #3070)" 2026-03-04 16:18:44 +00:00
Dave Richer
522f2b9e26 Merged in release/2026-02-27 (pull request #3070)
Release/2026 02 27
2026-03-04 01:41:53 +00:00
9 changed files with 87 additions and 35 deletions

View File

@@ -10,14 +10,12 @@ import JobsCreateOwnerInfoContainer from "../../components/jobs-create-owner-inf
import JobsCreateVehicleInfoContainer from "../../components/jobs-create-vehicle-info/jobs-create-vehicle-info.container";
import JobCreateContext from "../../pages/jobs-create/jobs-create.context";
export default function JobsCreateComponent({ form }) {
export default function JobsCreateComponent({ form, isSubmitting }) {
const [pageIndex, setPageIndex] = useState(0);
const [errorMessage, setErrorMessage] = useState(null);
const [state] = useContext(JobCreateContext);
const { t } = useTranslation();
const steps = [
{
title: t("jobs.labels.create.vehicleinfo"),
@@ -42,11 +40,9 @@ export default function JobsCreateComponent({ form }) {
const next = () => {
setPageIndex(pageIndex + 1);
console.log("Next");
};
const prev = () => {
setPageIndex(pageIndex - 1);
console.log("Previous");
};
const ProgressButtons = ({ top }) => {
@@ -79,17 +75,19 @@ export default function JobsCreateComponent({ form }) {
{pageIndex === steps.length - 1 && (
<Button
type="primary"
loading={isSubmitting}
onClick={() => {
form
.validateFields()
.then(() => {
// NO OP
form.submit();
})
.catch((error) => console.log("error", error));
form.submit();
.catch((error) => {
console.log("error", error);
});
}}
>
Done
{t("general.actions.done")}
</Button>
)}
</Space>
@@ -146,13 +144,11 @@ export default function JobsCreateComponent({ form }) {
) : (
<div>
<ProgressButtons top />
{errorMessage ? (
<div>
<AlertComponent title={errorMessage} type="error" />
</div>
) : null}
{steps.map((item, idx) => (
<div
key={idx}

View File

@@ -46,6 +46,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, curr
});
const [form] = Form.useForm();
const [state, setState] = contextState;
const [isSubmitting, setIsSubmitting] = useState(false);
const [insertJob] = useMutation(INSERT_NEW_JOB);
const [loadOwner, remoteOwnerData] = useLazyQuery(QUERY_OWNER_FOR_JOB_CREATION);
@@ -83,16 +84,19 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, curr
newJobId: resp.data.insert_jobs.returning[0].id
});
logImEXEvent("manual_job_create_completed", {});
setIsSubmitting(false);
})
.catch((error) => {
notification.error({
title: t("jobs.errors.creating", { error: error })
});
setState({ ...state, error: error });
setIsSubmitting(false);
});
};
const handleFinish = (values) => {
setIsSubmitting(true);
let job = Object.assign(
{},
values,
@@ -297,7 +301,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader, curr
})
}}
>
<JobsCreateComponent form={form} />
<JobsCreateComponent form={form} isSubmitting={isSubmitting} />
</Form>
</RbacWrapper>
</JobCreateContext.Provider>

View File

@@ -1295,6 +1295,7 @@
"delete": "Delete",
"deleteall": "Delete All",
"deselectall": "Deselect All",
"done": "Done",
"download": "Download",
"edit": "Edit",
"gotoadmin": "Go to Admin Panel",

View File

@@ -1295,6 +1295,7 @@
"delete": "Borrar",
"deleteall": "",
"deselectall": "",
"done": "",
"download": "",
"edit": "Editar",
"gotoadmin": "",

View File

@@ -1295,6 +1295,7 @@
"delete": "Effacer",
"deleteall": "",
"deselectall": "",
"done": "",
"download": "",
"edit": "modifier",
"gotoadmin": "",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,7 @@
* @returns {number|null}
*/
const parseVendorStatusCode = (err) => {
// Prefer explicit numeric props when available
// Prefer explicit numeric props when available.
const codeProp = err?.code ?? err?.statusCode ?? err?.meta?.status?.StatusCode ?? err?.status?.StatusCode;
const num = Number(codeProp);
if (!Number.isNaN(num) && num > 0) return num;

View File

@@ -12,7 +12,7 @@ const { createRRCustomer } = require("./rr-customers");
const { ensureRRServiceVehicle } = require("./rr-service-vehicles");
const { classifyRRVendorError } = require("./rr-errors");
const { markRRExportSuccess, insertRRFailedExportLog } = require("./rr-export-logs");
const { withRRRequestXml } = require("./rr-log-xml");
const { withRRRequestXml, extractRRXmlPair } = require("./rr-log-xml");
const {
makeVehicleSearchPayloadFromJob,
ownersFromVinBlocks,
@@ -49,6 +49,21 @@ const resolveJobId = (explicit, payload, job) => explicit || payload?.jobId || j
*/
const resolveVin = ({ tx, job }) => tx?.jobData?.vin || job?.v_vin || null;
/**
* Add request/response XML to socket event payloads when available.
* @param rrObj
* @param payload
* @returns {*}
*/
const withRRXmlSocketPayload = (rrObj, payload = {}) => {
const { requestXml, responseXml } = extractRRXmlPair(rrObj);
return {
...payload,
...(requestXml ? { requestXml } : {}),
...(responseXml ? { responseXml } : {})
};
};
/**
* Sort vehicle owners first in the list, preserving original order otherwise.
* @param list
@@ -474,7 +489,14 @@ const registerRREvents = ({ socket, redisHelpers }) => {
);
try {
socket.emit("export-failed", { vendor: "rr", jobId: rid, error: error.message });
socket.emit(
"export-failed",
withRRXmlSocketPayload(error, {
vendor: "rr",
jobId: rid,
error: error.message
})
);
} catch {
//
}
@@ -870,9 +892,11 @@ const registerRREvents = ({ socket, redisHelpers }) => {
});
socket.emit("export-failed", {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || result?.error || "RR early RO creation failed",
...withRRXmlSocketPayload(result, {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || result?.error || "RR early RO creation failed"
}),
...cls
});
@@ -923,9 +947,11 @@ const registerRREvents = ({ socket, redisHelpers }) => {
try {
socket.emit("export-failed", {
vendor: "rr",
jobId: rid,
error: error.message,
...withRRXmlSocketPayload(error, {
vendor: "rr",
jobId: rid,
error: error.message
}),
...cls
});
socket.emit("rr-user-notice", { jobId: rid, ...cls });
@@ -1173,7 +1199,14 @@ const registerRREvents = ({ socket, redisHelpers }) => {
);
try {
socket.emit("export-failed", { vendor: "rr", jobId: rid, error: error.message });
socket.emit(
"export-failed",
withRRXmlSocketPayload(error, {
vendor: "rr",
jobId: rid,
error: error.message
})
);
} catch {
//
}
@@ -1538,9 +1571,11 @@ const registerRREvents = ({ socket, redisHelpers }) => {
});
socket.emit("export-failed", {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || result?.error || "RR export failed",
...withRRXmlSocketPayload(result, {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || result?.error || "RR export failed"
}),
...cls
});
@@ -1591,9 +1626,11 @@ const registerRREvents = ({ socket, redisHelpers }) => {
try {
socket.emit("export-failed", {
vendor: "rr",
jobId: rid,
error: error.message,
...withRRXmlSocketPayload(error, {
vendor: "rr",
jobId: rid,
error: error.message
}),
...cls
});
socket.emit("rr-user-notice", { jobId: rid, ...cls });
@@ -1725,9 +1762,11 @@ const registerRREvents = ({ socket, redisHelpers }) => {
});
socket.emit("export-failed", {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || finalizeResult?.error || "RR finalize failed",
...withRRXmlSocketPayload(finalizeResult, {
vendor: "rr",
jobId: rid,
error: cls?.friendlyMessage || finalizeResult?.error || "RR finalize failed"
}),
...cls
});
ack?.({ ok: false, error: cls.friendlyMessage || "RR finalize failed", classification: cls });
@@ -1770,7 +1809,17 @@ const registerRREvents = ({ socket, redisHelpers }) => {
});
try {
socket.emit("export-failed", { vendor: "rr", jobId: rid, error: error.message, ...cls });
socket.emit(
"export-failed",
{
...withRRXmlSocketPayload(error, {
vendor: "rr",
jobId: rid,
error: error.message
}),
...cls
}
);
} catch {
//
}