feat: enhance contract clearance functionality and UI, update routing and status handling

This commit is contained in:
Marshal
2026-06-28 21:02:37 +00:00
parent fc1adce909
commit 01172daaa5
7 changed files with 191 additions and 219 deletions

View File

@@ -112,7 +112,9 @@ export function ContractClearanceReviewSection({
);
const glDocs = useMemo(
() =>
(clearance?.documents ?? []).filter((d) => d.uploadedBy === "gl"),
(clearance?.documents ?? []).filter(
(d) => d.uploadedBy === "gl_et" || d.uploadedBy === "gl_dj",
),
[clearance],
);

View File

@@ -90,6 +90,20 @@ export default function GlCreateBookingForm() {
return [...sizes];
}, [contract?.cargoScope]);
// Bulk cargo types declared on the contract scope (prefill, no free-text).
const bulkCargoOptions = useMemo(() => {
const seen = new Map<string, string>();
(contract?.cargoScope ?? []).forEach((s) => {
if (s.containerSize || !s.cargoTypeId) return;
if (!seen.has(s.cargoTypeId)) {
seen.set(s.cargoTypeId, s.cargoFreeText?.trim() || s.cargoTypeId);
}
});
return [...seen.entries()].map(([value, label]) => ({ value, label }));
}, [contract?.cargoScope]);
const defaultBulkCargoTypeId = bulkCargoOptions[0]?.value ?? "";
if (isLoading) {
return (
<PageContainer>
@@ -105,7 +119,7 @@ export default function GlCreateBookingForm() {
<PageContainer>
<PageHeader
title="Contract not found"
backTo="/dashboard/contracts/clearance"
backTo="/dashboard/clearance"
/>
</PageContainer>
);
@@ -151,7 +165,12 @@ export default function GlCreateBookingForm() {
const addBulkLine = () =>
setBulkLines((prev) => [
...prev,
{ cargoTypeId: "", cargoWeightTons: "", itemCount: "", hazardousQuantity: "" },
{
cargoTypeId: defaultBulkCargoTypeId,
cargoWeightTons: "",
itemCount: "",
hazardousQuantity: "",
},
]);
const removeBulkLine = (idx: number) =>
setBulkLines((prev) => prev.filter((_, i) => i !== idx));
@@ -214,12 +233,12 @@ export default function GlCreateBookingForm() {
<PageHeader
title="Create booking (GL)"
subtitle={`Enter the shipment details on behalf of the customer for contract ${contract.reference}.`}
backTo={`/dashboard/contracts/clearance/${contract.id}`}
backTo={`/dashboard/clearance/${contract.id}`}
breadcrumbs={[
{ label: "Contract Clearance", href: "/dashboard/contracts/clearance" },
{ label: "Document Clearance", href: "/dashboard/clearance" },
{
label: contract.reference,
href: `/dashboard/contracts/clearance/${contract.id}`,
href: `/dashboard/clearance/${contract.id}`,
},
{ label: "Create booking" },
]}
@@ -486,14 +505,28 @@ export default function GlCreateBookingForm() {
</Group>
<Grid gap="sm">
<Grid.Col span={{ base: 12, sm: 6 }}>
<TextInput
label="Cargo type id"
placeholder="Optional"
value={line.cargoTypeId}
onChange={(e) =>
patchBulk(idx, { cargoTypeId: e.currentTarget.value })
}
/>
{bulkCargoOptions.length > 0 ? (
<Select
label="Cargo type"
placeholder="Select cargo type"
value={line.cargoTypeId || null}
onChange={(v) =>
patchBulk(idx, { cargoTypeId: v ?? "" })
}
data={bulkCargoOptions}
/>
) : (
<TextInput
label="Cargo type id"
placeholder="Optional"
value={line.cargoTypeId}
onChange={(e) =>
patchBulk(idx, {
cargoTypeId: e.currentTarget.value,
})
}
/>
)}
</Grid.Col>
<Grid.Col span={{ base: 6, sm: 6 }}>
<NumberInput
@@ -545,9 +578,7 @@ export default function GlCreateBookingForm() {
<Group justify="flex-end">
<Button
variant="default"
onClick={() =>
navigate(`/dashboard/contracts/clearance/${contract.id}`)
}
onClick={() => navigate(`/dashboard/clearance/${contract.id}`)}
>
Cancel
</Button>