diff --git a/RELEASE.md b/RELEASE.md index 754087ea9..af8b70063 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,13 +1,15 @@ -> v0.6.64 ~ "Order responses no longer fail when a vehicle is assigned" +> v0.6.65 ~ "First-class trailer operations" --- -## Bug Fixes -- **Orders with an assigned vehicle serialize again when expansions are requested.** The Vehicle and Fleet resources read the request's `with` list and loaded it onto the model they wrap. That is correct on their own endpoints, where the controller has already allowlisted the list, but both resources are also rendered nested inside Order and Driver responses. There the same request carries the parent's expansions, so `GET /v1/orders?with=payload` on an order with a vehicle assigned failed during serialisation with `RelationNotFoundException: Call to undefined relationship [payload] on model Vehicle`. Navigator order fetches and the console scheduler both hit this. Nested resources now keep only the relations the wrapped model actually defines; direct endpoint behaviour is unchanged. +## What's New +- **Trailers become a first-class Fleet-Ops resource.** Create and manage trailers independently, attach them to vehicles, connect equipment and telematics devices, and review operational, maintenance, location, and towing details from dedicated Trailer screens. +- **Vehicle and equipment relationships are easier to understand.** Vehicle details expose attached trailers and equipment, while Trailer details show the current towing vehicle and installed equipment. +- **Trailer APIs support complete integrations.** Internal and public endpoints cover trailer lifecycle, filtering, towing connections, equipment, devices, telemetry, imports, and exports. --- ## Testing -- Added resource-level regressions for parent expansions reaching a nested Vehicle or Fleet resource, for string and empty `with` forms, and for resources wrapping plain data. -- Added end-to-end checks resolving a real vehicle and a real fleet against an order-shaped request. +- Added frontend, backend, API-contract, attachment, telematics, spatial-data, permission, and serialization coverage for first-class trailers. +- Expanded the Fleetbase Postman collection and documentation alongside the Fleet-Ops implementation. --- ## Need help? diff --git a/addon/components/attachment-list.hbs b/addon/components/attachment-list.hbs new file mode 100644 index 000000000..a9a4e3f3a --- /dev/null +++ b/addon/components/attachment-list.hbs @@ -0,0 +1,65 @@ +
diff --git a/addon/components/attachment-list.js b/addon/components/attachment-list.js new file mode 100644 index 000000000..9068b0524 --- /dev/null +++ b/addon/components/attachment-list.js @@ -0,0 +1,8 @@ +import Component from '@glimmer/component'; + +/** + * Shared layout for "things attached to an asset" tabs (devices, equipment, + * trailers, towing history) so every attachment tab reads the same way: a + * header with a description and primary action, uniform rows, one empty state. + */ +export default class AttachmentListComponent extends Component {} diff --git a/addon/components/cell/attached-vehicle.hbs b/addon/components/cell/attached-vehicle.hbs index 6ad15e212..a79290f88 100644 --- a/addon/components/cell/attached-vehicle.hbs +++ b/addon/components/cell/attached-vehicle.hbs @@ -4,7 +4,7 @@ {{else}}- {{t "device.prompts.no-devices-attached-body" resourceType=(get-model-name @resource)}} -
-Fleet context for telemetry from this device.
+{{t "device.attachment.description"}}
| {{t "trailer.maintenance.summary"}} | +{{t "common.type"}} | +{{t "trailer.maintenance.odometer"}} | +{{t "trailer.maintenance.total-cost"}} | +{{t "trailer.maintenance.date"}} | ++ |
|---|---|---|---|---|---|
| {{record.summary}} | +{{n-a (smart-humanize record.type)}} | +{{n-a record.odometer_reading}} {{record.odometer_unit}} | +{{#if record.total_cost}}{{format-currency record.total_cost record.currency}}{{else}}-{{/if}} | +{{n-a (format-date-fns record.completed_at "dd MMM yyyy")}} | ++ + | +
{{t "trailer.empty.maintenance"}}
+{{t "trailer.empty.maintenance-description"}}
+ +| {{t "common.name"}} | +{{t "trailer.maintenance.interval"}} | +{{t "trailer.maintenance.next-due"}} | +{{t "common.status"}} | ++ |
|---|---|---|---|---|
| {{schedule.name}} | +{{schedule.interval_value}} {{schedule.interval_unit}} | +{{n-a (format-date-fns schedule.next_due_date "dd MMM yyyy")}} | ++ + | +
{{t "trailer.empty.schedules"}}
+{{t "trailer.empty.schedules-description"}}
+ +| {{t "trailer.maintenance.code"}} | +{{t "trailer.maintenance.subject"}} | +{{t "trailer.maintenance.priority"}} | +{{t "common.status"}} | +{{t "trailer.maintenance.due"}} | ++ |
|---|---|---|---|---|---|
| {{workOrder.code}} | +{{workOrder.subject}} | +{{n-a (smart-humanize workOrder.priority)}} | +{{n-a (format-date-fns workOrder.due_at "dd MMM yyyy")}} | ++ + | +
{{t "trailer.empty.work-orders"}}
+{{t "trailer.empty.work-orders-description"}}
+ +Fleet context for telemetry from this device.
+{{t "device.attachment.description"}}
Recent vehicle coordinates reported through this device attachment.
+{{t "device.attachment.positions-description"}}
- Choose a vehicle for + Choose an asset for {{this.selectedDeviceName}}
{{else}} -Attached devices grouped by vehicle.
+Attached devices grouped by vehicle or trailer.
{{/if}}