From 3beafa3ac27a5ae5f7cfeb5dd475efc2f68fb23d Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 2 Jul 2026 15:01:23 +0800 Subject: [PATCH] feat(admin/trips): surface dumpsite release records in trip detail panel - Eager-load dumpsiteReleases.dumpsite + dumpsiteReleases.releasedByDriver in AdminTripController::show() - Add releases[] array to TripResource via whenLoaded('dumpsiteReleases') - Fields: weight_kg, released_at, dumpsite_name, driver_name, gate_pass_number, dumpsite_attendant, notes - Admin Trips detail panel now shows a 'Dumpsite Releases' section below the timeline with per-release cards - Load row updated to show release count e.g. '450 kg (2 releases)' --- .../Api/V1/Admin/AdminTripController.php | 1 + app/Http/Resources/TripResource.php | 11 +++++++++ resources/views/admin/trips.blade.php | 23 ++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/V1/Admin/AdminTripController.php b/app/Http/Controllers/Api/V1/Admin/AdminTripController.php index 93d578e..20f6881 100644 --- a/app/Http/Controllers/Api/V1/Admin/AdminTripController.php +++ b/app/Http/Controllers/Api/V1/Admin/AdminTripController.php @@ -99,6 +99,7 @@ class AdminTripController extends ApiController $trip->load([ 'route', 'team.driver', 'team.scanner', 'truck', 'dumpsite', 'stops.dropOffPoint', 'timelineEvents.recordedBy', + 'dumpsiteReleases.dumpsite', 'dumpsiteReleases.releasedByDriver', ]); return $this->ok(new TripResource($trip)); diff --git a/app/Http/Resources/TripResource.php b/app/Http/Resources/TripResource.php index 14f82db..c96da05 100644 --- a/app/Http/Resources/TripResource.php +++ b/app/Http/Resources/TripResource.php @@ -20,6 +20,7 @@ class TripResource extends JsonResource 'dumpsite_arrival_time' => $this->dumpsite_arrival_time?->toIso8601String(), 'dumpsite_departure_time' => $this->dumpsite_departure_time?->toIso8601String(), 'total_load_kg' => $this->total_load_kg, + 'current_load_kg' => $this->current_load_kg, 'is_detouring' => $this->is_detouring, 'route' => RouteResource::make($this->whenLoaded('route')), 'team' => CollectionTeamResource::make($this->whenLoaded('team')), @@ -28,6 +29,16 @@ class TripResource extends JsonResource 'stops' => TripStopResource::collection($this->whenLoaded('stops')), 'timeline' => TripTimelineEventResource::collection($this->whenLoaded('timelineEvents')), 'notes' => $this->notes, + 'releases' => $this->whenLoaded('dumpsiteReleases', fn () => $this->dumpsiteReleases->map(fn ($r) => [ + 'id' => $r->id, + 'weight_kg' => $r->weight_kg, + 'released_at' => $r->released_at?->toIso8601String(), + 'dumpsite_name' => $r->dumpsite?->name, + 'driver_name' => $r->releasedByDriver?->full_name, + 'gate_pass_number' => $r->gate_pass_number, + 'dumpsite_attendant' => $r->dumpsite_attendant_name, + 'notes' => $r->notes, + ])), 'created_at' => $this->created_at?->toIso8601String(), ]; } diff --git a/resources/views/admin/trips.blade.php b/resources/views/admin/trips.blade.php index d023b67..5138b4b 100644 --- a/resources/views/admin/trips.blade.php +++ b/resources/views/admin/trips.blade.php @@ -226,12 +226,33 @@
Date
${window.Verde.escapeHtml(t.scheduled_date)}
Route
${window.Verde.escapeHtml(t.route?.name ?? '—')}
Team
${window.Verde.escapeHtml(t.team?.name ?? '—')}
-
Load
${t.total_load_kg ? `${t.total_load_kg} kg` : '—'}
+
Load
${t.total_load_kg + ? `${t.total_load_kg} kg${t.releases?.length ? ` (${t.releases.length} release${t.releases.length > 1 ? 's' : ''})` : ''}` + : '—'}

Stops

Timeline

+

Dumpsite Releases

+ ${t.releases?.length + ? `` + : '

No releases recorded yet

' + } `; if (tripMapInstance) {