mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-01 03:53:11 +00:00
92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
import type {
|
|
WorkOrderBoardEditableField,
|
|
WorkOrderBoardPatchPayload,
|
|
} from "@/domain/work-orders/types/work-order-board";
|
|
import type {
|
|
WorkOrderTablePatch,
|
|
WorkOrderTableRow,
|
|
} from "@/domain/work-orders/types/work-order-table-row";
|
|
import {
|
|
expandScalarBoardOps,
|
|
mapDocStatusToApi,
|
|
type BoardFieldOp,
|
|
} from "@/domain/work-orders/mappers/expand-scalar-board-ops";
|
|
import { expandScheduleBoardOps } from "@/domain/work-orders/mappers/expand-schedule-board-ops";
|
|
|
|
export type { BoardFieldOp };
|
|
export { mapDocStatusToApi };
|
|
|
|
const DISPATCH_FIELDS = new Set<WorkOrderBoardEditableField>(["vendorId", "apptDate", "apptTime"]);
|
|
|
|
const LOCAL_ONLY_KEYS = new Set<keyof WorkOrderTablePatch>([
|
|
"mediaCount",
|
|
"dayGroup",
|
|
"dayLabel",
|
|
"dispatcherName",
|
|
"company",
|
|
"tech",
|
|
"techPhone",
|
|
"location",
|
|
"locationId",
|
|
"pocName",
|
|
"pocPhone",
|
|
"pocNotes",
|
|
"title",
|
|
"priority",
|
|
"apptStart",
|
|
"apptEnd",
|
|
"rescheduleCount",
|
|
"carriedOver",
|
|
"isPastDue",
|
|
"originalWeek",
|
|
"originalDate",
|
|
/** Optimistic overlay only — backend owns isAddOn after schedule ops (SH-184). */
|
|
"isAddOn",
|
|
]);
|
|
|
|
export function isLocalOnlyTablePatch(patch: WorkOrderTablePatch): boolean {
|
|
const keys = Object.keys(patch) as (keyof WorkOrderTablePatch)[];
|
|
return keys.length > 0 && keys.every((key) => LOCAL_ONLY_KEYS.has(key));
|
|
}
|
|
|
|
/**
|
|
* Expands a UI table patch into ordered board field ops (one PATCH each).
|
|
* Schedule/week-only fields are emitted first in a stable order.
|
|
*/
|
|
export function expandTablePatchToBoardFieldOps(patch: WorkOrderTablePatch): BoardFieldOp[] {
|
|
if (isLocalOnlyTablePatch(patch)) {
|
|
return [];
|
|
}
|
|
|
|
return [...expandScheduleBoardOps(patch), ...expandScalarBoardOps(patch)];
|
|
}
|
|
|
|
export function isDispatchBoardField(field: WorkOrderBoardEditableField): boolean {
|
|
return DISPATCH_FIELDS.has(field);
|
|
}
|
|
|
|
export function buildBoardPatchPayload(
|
|
op: BoardFieldOp,
|
|
row: Pick<WorkOrderTableRow, "rowVersion" | "dispatchRowVersion" | "primaryDispatchId">,
|
|
): WorkOrderBoardPatchPayload {
|
|
if (!row.rowVersion) {
|
|
throw new Error("workOrderVersion is required for board patch");
|
|
}
|
|
|
|
const payload: WorkOrderBoardPatchPayload = {
|
|
field: op.field,
|
|
value: op.value,
|
|
workOrderVersion: row.rowVersion,
|
|
};
|
|
|
|
if (isDispatchBoardField(op.field)) {
|
|
if (row.dispatchRowVersion) {
|
|
payload.dispatchVersion = row.dispatchRowVersion;
|
|
}
|
|
if (row.primaryDispatchId != null) {
|
|
payload.primaryDispatchId = row.primaryDispatchId;
|
|
}
|
|
}
|
|
|
|
return payload;
|
|
}
|