mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 13:28:11 +00:00
Merge pull request #757 from Tria-plc/freight/feature/user_management_UI
Freight/feature/user management UI
This commit is contained in:
@@ -40,6 +40,13 @@ export interface FleetResourceColumn {
|
||||
export interface FleetFormFieldDef extends FormFieldDef {
|
||||
dynamicOptions?: FleetDynamicOptions;
|
||||
noneOption?: boolean;
|
||||
/**
|
||||
* Read-only field whose value is computed from the other fields rather than
|
||||
* typed. Rendered non-editable and recomputed on every change, so the stored
|
||||
* form value for this field is never trusted — the function is the source of
|
||||
* truth at both render and submit.
|
||||
*/
|
||||
derivedValue?: (values: Record<string, unknown>) => string;
|
||||
/**
|
||||
* Field is owned by the Fayda identity — populated only by verification and
|
||||
* never hand-edited. Rendered disabled in the form.
|
||||
@@ -116,6 +123,32 @@ const WAGON_STATUS_OPTIONS = [
|
||||
{ label: "Detained", value: Freight.WagonStatus.Detained },
|
||||
];
|
||||
|
||||
/**
|
||||
* EDR run-number pairs, keyed by the odd EXPORT run (Ethiopia → Djibouti). The
|
||||
* even IMPORT run (Djibouti → Ethiopia) is fixed by the export run, so choosing
|
||||
* an export number fully determines the import one. Listed explicitly rather
|
||||
* than computed as export+1, so a pair that ever breaks that convention stays
|
||||
* correct here.
|
||||
*/
|
||||
const TRAIN_RUN_PAIRS: Record<string, string> = {
|
||||
"8001": "8002",
|
||||
"81001": "81002",
|
||||
"82001": "82002",
|
||||
"83001": "83002",
|
||||
"84001": "84002",
|
||||
"85001": "85002",
|
||||
"86001": "86002",
|
||||
"87001": "87002",
|
||||
"88001": "88002",
|
||||
"8901": "8902",
|
||||
"9001": "9002",
|
||||
};
|
||||
|
||||
const EXPORT_TRAIN_OPTIONS = Object.keys(TRAIN_RUN_PAIRS).map((run) => ({
|
||||
label: run,
|
||||
value: run,
|
||||
}));
|
||||
|
||||
|
||||
|
||||
export const FLEET_RESOURCES: FleetResourceConfig[] = [
|
||||
@@ -271,6 +304,26 @@ export const FLEET_RESOURCES: FleetResourceConfig[] = [
|
||||
{ id: "status", header: "Status", accessorKey: "status", format: "statusBadge" },
|
||||
],
|
||||
formFields: [
|
||||
// Run numbers are optional — a wagon sits in the fleet unassigned to any
|
||||
// run until an operator picks an export run. The import run is fixed by
|
||||
// that choice, so it is derived rather than typed.
|
||||
{
|
||||
name: "exportTrainNumber",
|
||||
label: "Export train number",
|
||||
type: "select",
|
||||
description: "Odd — Ethiopia → Djibouti runs",
|
||||
placeholder: "e.g. 8001",
|
||||
options: EXPORT_TRAIN_OPTIONS,
|
||||
},
|
||||
{
|
||||
name: "importTrainNumber",
|
||||
label: "Import train number",
|
||||
type: "text",
|
||||
description: "Even — Djibouti → Ethiopia runs",
|
||||
placeholder: "e.g. 8002",
|
||||
derivedValue: (values) =>
|
||||
TRAIN_RUN_PAIRS[String(values.exportTrainNumber ?? "")] ?? "",
|
||||
},
|
||||
{ name: "wagonNumber", label: "Wagon number", type: "text", required: true },
|
||||
{ name: "wagonTypeId", label: "Wagon type", type: "select", required: true, dynamicOptions: "wagonTypes" },
|
||||
{ name: "currentYardId", label: "Current Yard", type: "select", dynamicOptions: "yards" },
|
||||
@@ -278,6 +331,8 @@ export const FLEET_RESOURCES: FleetResourceConfig[] = [
|
||||
{ name: "notes", label: "Notes", type: "textarea" },
|
||||
],
|
||||
emptyValues: {
|
||||
exportTrainNumber: "",
|
||||
importTrainNumber: "",
|
||||
wagonNumber: "",
|
||||
wagonTypeId: "",
|
||||
currentYardId: "",
|
||||
|
||||
Reference in New Issue
Block a user