diff --git a/apps/edr-freight-web/backoffice/src/pages/fleet/FleetResourcePage.tsx b/apps/edr-freight-web/backoffice/src/pages/fleet/FleetResourcePage.tsx index 50f3fe26c..746d0118a 100644 --- a/apps/edr-freight-web/backoffice/src/pages/fleet/FleetResourcePage.tsx +++ b/apps/edr-freight-web/backoffice/src/pages/fleet/FleetResourcePage.tsx @@ -224,6 +224,21 @@ const FleetResourcePage = () => { secondary: true, toParams: dateRangeParams("createdFrom", "createdTo"), }; + // Wagons-only: "last maintenance" is a derived value (latest status-log + // flip to MAINTENANCE), not a column other fleet resources have. + const dateDefs: FilterDef[] = + slug === "wagons" + ? [ + dateDef, + { + key: "lastMaintenance", + label: "Last maintenance", + type: "date", + secondary: true, + toParams: dateRangeParams("maintenanceFrom", "maintenanceTo"), + }, + ] + : [dateDef]; if (config?.listFilters?.length) { return [ ...config.listFilters.map((filter): FilterDef => ({ @@ -235,13 +250,13 @@ const FleetResourcePage = () => { ? (dynamicOptions[filter.dynamicOptions] ?? []) : (filter.options ?? []), })), - dateDef, + ...dateDefs, ]; } const fallback = FALLBACK_STATUS_OPTIONS[slug]; return fallback - ? [{ key: "status", label: "Status", type: "enum", multiple: false, options: fallback }, dateDef] - : [dateDef]; + ? [{ key: "status", label: "Status", type: "enum", multiple: false, options: fallback }, ...dateDefs] + : dateDefs; }, [config, dynamicOptions, slug]); const controls = useFilters(filterDefs, { pageSize: 10 }); diff --git a/apps/edr-freight-web/backoffice/src/services/wagon.service.ts b/apps/edr-freight-web/backoffice/src/services/wagon.service.ts index f2c4ece8e..e484632e6 100644 --- a/apps/edr-freight-web/backoffice/src/services/wagon.service.ts +++ b/apps/edr-freight-web/backoffice/src/services/wagon.service.ts @@ -51,6 +51,10 @@ export interface WagonListFilters { /** Registration day range (YYYY-MM-DD), both ends inclusive. */ createdFrom?: string; createdTo?: string; + /** Last-maintenance day range (YYYY-MM-DD), both ends inclusive — matches + * the latest status-log flip to MAINTENANCE, not a stored column. */ + maintenanceFrom?: string; + maintenanceTo?: string; /** Only read by `getPaged`. */ page?: number; pageSize?: number; @@ -67,6 +71,8 @@ const wagonListQuery = (filters: WagonListFilters): string => { if (filters.trainNumber) params.set('trainNumber', filters.trainNumber); if (filters.createdFrom) params.set('createdFrom', filters.createdFrom); if (filters.createdTo) params.set('createdTo', filters.createdTo); + if (filters.maintenanceFrom) params.set('maintenanceFrom', filters.maintenanceFrom); + if (filters.maintenanceTo) params.set('maintenanceTo', filters.maintenanceTo); if (filters.page) params.set('page', String(filters.page)); if (filters.pageSize) params.set('pageSize', String(filters.pageSize)); const qs = params.toString();