Skip to content

Commit f063750

Browse files
committed
feat: Enhance trip management functionality and updated UI components
1 parent 9ff0348 commit f063750

13 files changed

Lines changed: 1006 additions & 13 deletions

File tree

app/Actions/Admin/Trip/GetTripsListAction.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function execute(AdminTripListData $data): LengthAwarePaginator
2222
{
2323
return (new TripQueryBuilder)
2424
->orderByDeparture()
25-
->with(['bus:id,bus_code,type'])
25+
->with(['bus:id,bus_code,type,capacity'])
2626
->when($data->hasSearch(), fn ($query): \App\Queries\Builders\TripQueryBuilder => $query->search($data->search, ['origin', 'destination']))
2727
->when($data->hasActive(), fn ($query): \App\Queries\Builders\TripQueryBuilder => $query->active($data->active))
2828
->when($data->hasBusId(), fn ($query) => $query->where('bus_id', $data->busId))

app/DTOs/Admin/Trip/TripData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ public static function fromRequest(Request $request): self
2727
return new self(
2828
origin: (string) $request->string('origin'),
2929
destination: (string) $request->string('destination'),
30-
departureTime: Carbon::parse((string) $request->string('departure_time')),
31-
arrivalTime: Carbon::parse((string) $request->string('arrival_time')),
30+
departureTime: Carbon::createFromFormat('H:i', (string) $request->string('departure_time')),
31+
arrivalTime: Carbon::createFromFormat('H:i', (string) $request->string('arrival_time')),
3232
price: (float) (string) $request->string('price'),
3333
busId: $request->integer('bus_id'),
3434
isActive: $request->boolean('is_active', true),

app/Http/Controllers/Admin/TripController.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public function create(): Response
4848
{
4949
$buses = (new BusQueryBuilder(['id', 'bus_code', 'capacity', 'type']))
5050
->active()
51-
->orderBy('bus_code')
5251
->get();
5352

5453
return Inertia::render('admin/trips/create', [
@@ -75,7 +74,6 @@ public function edit(Trip $trip): Response
7574
{
7675
$buses = (new BusQueryBuilder(['id', 'bus_code', 'capacity', 'type']))
7776
->active()
78-
->orderBy('bus_code')
7977
->get();
8078

8179
return Inertia::render('admin/trips/edit', [

app/Http/Requests/Admin/Trip/CreateTripRequest.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,34 @@ public function rules(): array
3030
return [
3131
'origin' => ['required', 'string', 'max:255'],
3232
'destination' => ['required', 'string', 'max:255', 'different:origin'],
33-
'departure_time' => ['required', 'date', 'after:now'],
34-
'arrival_time' => ['required', 'date', 'after:departure_time'],
33+
'departure_time' => ['required', 'date_format:H:i'],
34+
'arrival_time' => ['required', 'date_format:H:i'],
3535
'price' => ['required', 'numeric', 'min:0', 'max:9999.99'],
3636
'bus_id' => ['required', 'integer', 'exists:buses,id'],
3737
'is_active' => ['nullable', 'boolean'],
3838
];
3939
}
4040

41+
/**
42+
* Configure the validator instance.
43+
*/
44+
public function withValidator(\Illuminate\Validation\Validator $validator): void
45+
{
46+
$validator->after(function ($validator): void {
47+
$departureTime = $this->input('departure_time');
48+
$arrivalTime = $this->input('arrival_time');
49+
50+
if ($departureTime && $arrivalTime) {
51+
$departure = \Carbon\Carbon::createFromFormat('H:i', $departureTime);
52+
$arrival = \Carbon\Carbon::createFromFormat('H:i', $arrivalTime);
53+
54+
if ($arrival->lte($departure)) {
55+
$validator->errors()->add('arrival_time', 'The arrival time must be after the departure time.');
56+
}
57+
}
58+
});
59+
}
60+
4161
/**
4262
* Convert the request data to a TripData DTO.
4363
*/

app/Http/Requests/Admin/Trip/UpdateTripRequest.php

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,34 @@ public function rules(): array
3030
return [
3131
'origin' => ['required', 'string', 'max:255'],
3232
'destination' => ['required', 'string', 'max:255', 'different:origin'],
33-
'departure_time' => ['required', 'date'],
34-
'arrival_time' => ['required', 'date', 'after:departure_time'],
33+
'departure_time' => ['required', 'date_format:H:i'],
34+
'arrival_time' => ['required', 'date_format:H:i'],
3535
'price' => ['required', 'numeric', 'min:0', 'max:9999.99'],
3636
'bus_id' => ['required', 'integer', 'exists:buses,id'],
3737
'is_active' => ['nullable', 'boolean'],
3838
];
3939
}
4040

41+
/**
42+
* Configure the validator instance.
43+
*/
44+
public function withValidator(\Illuminate\Validation\Validator $validator): void
45+
{
46+
$validator->after(function ($validator): void {
47+
$departureTime = $this->input('departure_time');
48+
$arrivalTime = $this->input('arrival_time');
49+
50+
if ($departureTime && $arrivalTime) {
51+
$departure = \Carbon\Carbon::createFromFormat('H:i', $departureTime);
52+
$arrival = \Carbon\Carbon::createFromFormat('H:i', $arrivalTime);
53+
54+
if ($arrival->lte($departure)) {
55+
$validator->errors()->add('arrival_time', 'The arrival time must be after the departure time.');
56+
}
57+
}
58+
});
59+
}
60+
4161
/**
4262
* Convert the request data to a TripData DTO.
4363
*/

app/Queries/Builders/TripQueryBuilder.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,4 +150,28 @@ public function orderByDeparture(string $direction = 'asc'): self
150150

151151
return $this;
152152
}
153+
154+
/**
155+
* Eager load relationships while maintaining the query builder chain.
156+
*
157+
* @param array<int, string>|string $relations
158+
* @return $this
159+
*/
160+
public function with(array|string $relations): self
161+
{
162+
$this->addFilter(new class($relations) implements \App\Contracts\Queries\QueryFilterInterface
163+
{
164+
/**
165+
* @param array<int, string>|string $relations
166+
*/
167+
public function __construct(private readonly array|string $relations) {}
168+
169+
public function apply(\Illuminate\Database\Eloquent\Builder $query): \Illuminate\Database\Eloquent\Builder
170+
{
171+
return $query->with($this->relations);
172+
}
173+
});
174+
175+
return $this;
176+
}
153177
}

resources/js/pages/admin/buses/edit.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ export default function EditBus({ bus }: EditBusProps) {
191191
<div className="flex items-center justify-between">
192192
<span className="text-sm font-medium">Created</span>
193193
<span className="text-sm text-muted-foreground">
194-
{new Date(bus.created_at).toLocaleDateString()}
194+
{new Date(bus.created_at).toLocaleDateString('en-EG')}
195195
</span>
196196
</div>
197197
</div>

resources/js/pages/admin/buses/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ export default function BusesIndex({ buses, filters }: BusesIndexProps) {
188188
</Badge>
189189
</TableCell>
190190
<TableCell>
191-
{new Date(bus.created_at).toLocaleDateString()}
191+
{new Date(bus.created_at).toLocaleDateString('en-EG')}
192192
</TableCell>
193193
<TableCell>
194194
<DropdownMenu>

0 commit comments

Comments
 (0)