feat: add wagon usage computation and maintenance logging features

- Implemented  utility to calculate wagon usage metrics for train schedules.
- Created  for sending wagons to maintenance with optional notes.
- Added unit tests for train builder maintenance functionalities, including formatting train run labels and building maintenance notes.
- Developed  component for merging train schedules with detailed previews and reasons for merging.
- Introduced  component for selecting wagons with search functionality and selection limits.
- Created  for displaying and filtering audit logs, including detailed views of individual log entries.
- Added  for handling API interactions related to audit logs, including fetching logs and entity types.
This commit is contained in:
marshalyordanos
2026-08-12 09:36:50 +03:00
parent 35e5404b41
commit 5da36eb128
77 changed files with 6275 additions and 296 deletions

View File

@@ -156,6 +156,48 @@ export function transitPermitFileLabel(code: string, index?: number): string {
return code;
}
/** Legacy single Delivery Order code (pre multi-file uploads). */
export const LEGACY_DELIVERY_ORDER_CODE = "delivery_order";
/** Multi-file Delivery Order uploads use `delivery_order_0`, `delivery_order_1`, … */
export const DELIVERY_ORDER_FILE_PREFIX = "delivery_order_";
export function isDeliveryOrderFileCode(code: string | null | undefined): boolean {
if (!code) return false;
const lower = code.toLowerCase();
return lower === LEGACY_DELIVERY_ORDER_CODE || lower.startsWith(DELIVERY_ORDER_FILE_PREFIX);
}
export function deliveryOrderFileLabel(code: string, index?: number): string {
const lower = code.toLowerCase();
if (lower === LEGACY_DELIVERY_ORDER_CODE) return "Delivery Order";
if (lower.startsWith(DELIVERY_ORDER_FILE_PREFIX)) {
return index != null ? `Delivery Order ${index + 1}` : "Delivery Order";
}
return code;
}
/** Legacy single Release Order code (pre multi-file uploads). */
export const LEGACY_RELEASE_ORDER_CODE = "release_order";
/** Multi-file Release Order uploads use `release_order_0`, `release_order_1`, … */
export const RELEASE_ORDER_FILE_PREFIX = "release_order_";
export function isReleaseOrderFileCode(code: string | null | undefined): boolean {
if (!code) return false;
const lower = code.toLowerCase();
return lower === LEGACY_RELEASE_ORDER_CODE || lower.startsWith(RELEASE_ORDER_FILE_PREFIX);
}
export function releaseOrderFileLabel(code: string, index?: number): string {
const lower = code.toLowerCase();
if (lower === LEGACY_RELEASE_ORDER_CODE) return "Release Order";
if (lower.startsWith(RELEASE_ORDER_FILE_PREFIX)) {
return index != null ? `Release Order ${index + 1}` : "Release Order";
}
return code;
}
/** Legacy single T1 code (GL post-booking uploader). */
export const LEGACY_T1_TRANSPORT_CODE = "t1_transport_document";