sackey e839d40a99
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
Initial commit
2025-07-30 17:15:50 +00:00

289 lines
15 KiB
PHP

<div class="space-y-6">
<!-- Header -->
<div class="flex items-center justify-between">
<div>
<flux:heading size="xl">{{ $vehicle->display_name }}</flux:heading>
<flux:subheading>VIN: {{ $vehicle->vin_display }} Owner: {{ $vehicle->customer->full_name }}</flux:subheading>
</div>
<div class="flex space-x-3">
<flux:button href="/vehicles" variant="outline" size="sm">
<flux:icon name="arrow-left" class="size-4" />
Back to Vehicles
</flux:button>
<flux:button href="/vehicles/{{ $vehicle->id }}/edit" variant="outline" size="sm">
<flux:icon name="pencil" class="size-4" />
Edit Vehicle
</flux:button>
<flux:button href="/service-orders/create?vehicle={{ $vehicle->id }}" size="sm">
<flux:icon name="plus" class="size-4" />
New Service Order
</flux:button>
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Vehicle Information -->
<div class="lg:col-span-2 space-y-6">
<!-- Basic Information -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4">
<flux:heading size="lg">Vehicle Information</flux:heading>
</div>
<div class="p-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<flux:label>Make & Model</flux:label>
<div class="mt-1 text-sm font-medium">{{ $vehicle->display_name }}</div>
</div>
<div>
<flux:label>Color</flux:label>
<div class="mt-1 flex items-center space-x-2">
<div
class="w-6 h-6 rounded border border-zinc-300 dark:border-zinc-600"
style="background-color: {{ $vehicle->color }}"
title="{{ $vehicle->color }}"
></div>
<span class="text-sm">{{ $vehicle->color }}</span>
</div>
</div>
<div>
<flux:label>VIN</flux:label>
<div class="mt-1 text-sm font-mono">{{ $vehicle->vin }}</div>
</div>
<div>
<flux:label>License Plate</flux:label>
<div class="mt-1 text-sm">{{ $vehicle->license_plate }}</div>
</div>
<div>
<flux:label>Current Mileage</flux:label>
<div class="mt-1 text-sm">{{ number_format($vehicle->mileage) }} miles</div>
</div>
<div>
<flux:label>Status</flux:label>
<div class="mt-1">
<flux:badge
:color="$vehicle->status === 'active' ? 'green' : ($vehicle->status === 'sold' ? 'blue' : 'gray')"
size="sm"
>
{{ ucfirst($vehicle->status) }}
</flux:badge>
</div>
</div>
@if($vehicle->engine_type)
<div>
<flux:label>Engine Type</flux:label>
<div class="mt-1 text-sm">{{ $vehicle->engine_type }}</div>
</div>
@endif
@if($vehicle->transmission)
<div>
<flux:label>Transmission</flux:label>
<div class="mt-1 text-sm">{{ $vehicle->transmission }}</div>
</div>
@endif
@if($vehicle->notes)
<div class="md:col-span-2">
<flux:label>Notes</flux:label>
<div class="mt-1 text-sm">{{ $vehicle->notes }}</div>
</div>
@endif
</div>
</div>
</div>
<!-- Owner Information -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4 flex items-center justify-between">
<flux:heading size="lg">Owner Information</flux:heading>
<flux:button href="/customers/{{ $vehicle->customer->id }}" variant="outline" size="sm">
View Customer
</flux:button>
</div>
<div class="p-4">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<flux:label>Customer Name</flux:label>
<div class="mt-1 text-sm">{{ $vehicle->customer->full_name }}</div>
</div>
<div>
<flux:label>Email</flux:label>
<div class="mt-1 text-sm">
<a href="mailto:{{ $vehicle->customer->email }}" class="text-blue-600 hover:underline">
{{ $vehicle->customer->email }}
</a>
</div>
</div>
<div>
<flux:label>Phone</flux:label>
<div class="mt-1 text-sm">
<a href="tel:{{ $vehicle->customer->phone }}" class="text-blue-600 hover:underline">
{{ $vehicle->customer->phone }}
</a>
</div>
</div>
<div>
<flux:label>Customer Status</flux:label>
<div class="mt-1">
<flux:badge
:color="$vehicle->customer->status === 'active' ? 'green' : 'gray'"
size="sm"
>
{{ ucfirst($vehicle->customer->status) }}
</flux:badge>
</div>
</div>
</div>
</div>
</div>
<!-- Service History -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4">
<flux:heading size="lg">Service History</flux:heading>
</div>
<div class="overflow-x-auto">
<table class="min-w-full">
<thead>
<tr class="border-b border-zinc-200 dark:border-zinc-700">
<th class="text-left py-2 px-4">Order #</th>
<th class="text-left py-2 px-4">Date</th>
<th class="text-left py-2 px-4">Technician</th>
<th class="text-left py-2 px-4">Status</th>
<th class="text-left py-2 px-4">Total</th>
<th class="text-left py-2 px-4">Actions</th>
</tr>
</thead>
<tbody>
@forelse($vehicle->serviceOrders as $order)
<tr class="border-b border-zinc-200 dark:border-zinc-700">
<td class="py-2 px-4 font-medium">{{ $order->order_number }}</td>
<td class="py-2 px-4">{{ $order->created_at->format('M j, Y') }}</td>
<td class="py-2 px-4">{{ $order->assignedTechnician?->full_name ?? 'Unassigned' }}</td>
<td class="py-2 px-4">
<flux:badge
size="sm"
:color="$order->status === 'completed' ? 'green' : ($order->status === 'in_progress' ? 'blue' : 'gray')"
>
{{ ucfirst(str_replace('_', ' ', $order->status)) }}
</flux:badge>
</td>
<td class="py-2 px-4">${{ number_format($order->total_amount, 2) }}</td>
<td class="py-2 px-4">
<flux:button href="/service-orders/{{ $order->id }}" variant="outline" size="sm">View</flux:button>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="text-center py-8 text-zinc-500 dark:text-zinc-400">No service history yet.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="space-y-6">
<!-- Vehicle Image -->
@if($vehicle->vehicle_image)
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4">
<flux:heading size="lg">Vehicle Photo</flux:heading>
</div>
<div class="p-4">
<img
src="{{ Storage::url($vehicle->vehicle_image) }}"
alt="{{ $vehicle->display_name }}"
class="w-full h-48 object-cover rounded-lg border border-zinc-200"
>
</div>
</div>
@endif
<!-- Quick Stats -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4">
<flux:heading size="lg">Quick Stats</flux:heading>
</div>
<div class="p-4 space-y-3">
<div class="flex justify-between">
<span class="text-sm text-zinc-600 dark:text-zinc-400">Service Orders</span>
<span class="font-medium">{{ $vehicle->serviceOrders->count() }}</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-zinc-600 dark:text-zinc-400">Total Spent</span>
<span class="font-medium">${{ number_format($vehicle->serviceOrders->sum('total_amount'), 2) }}</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-zinc-600 dark:text-zinc-400">Last Service</span>
<span class="font-medium">
@if($vehicle->last_service_date)
{{ $vehicle->last_service_date->format('M j, Y') }}
@else
Never
@endif
</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-zinc-600 dark:text-zinc-400">Vehicle Age</span>
<span class="font-medium">{{ date('Y') - $vehicle->year }} years</span>
</div>
<div class="flex justify-between">
<span class="text-sm text-zinc-600 dark:text-zinc-400">Added</span>
<span class="font-medium">{{ $vehicle->created_at->format('M j, Y') }}</span>
</div>
</div>
</div>
<!-- Upcoming Appointments -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4 flex items-center justify-between">
<flux:heading size="lg">Upcoming Appointments</flux:heading>
<flux:button href="/appointments/create?vehicle={{ $vehicle->id }}" size="sm">
<flux:icon name="plus" class="size-4" />
Schedule
</flux:button>
</div>
<div class="p-4">
@forelse($vehicle->appointments->where('scheduled_datetime', '>=', now())->take(3) as $appointment)
<div class="mb-3 last:mb-0">
<div class="text-sm font-medium">{{ $appointment->scheduled_datetime->format('M j, Y g:i A') }}</div>
<div class="text-xs text-zinc-600 dark:text-zinc-400">{{ $appointment->service_requested }}</div>
<div class="text-xs">
<flux:badge size="sm" :color="$appointment->status === 'confirmed' ? 'green' : 'gray'">
{{ ucfirst($appointment->status) }}
</flux:badge>
</div>
</div>
@empty
<div class="text-sm text-zinc-500 dark:text-zinc-400">No upcoming appointments</div>
@endforelse
</div>
</div>
<!-- Recent Inspections -->
<div class="bg-white dark:bg-zinc-800 rounded-lg border border-zinc-200 dark:border-zinc-700">
<div class="border-b border-zinc-200 dark:border-zinc-700 p-4">
<flux:heading size="lg">Recent Inspections</flux:heading>
</div>
<div class="p-4">
@forelse($vehicle->inspections->take(3) as $inspection)
<div class="mb-3 last:mb-0">
<div class="text-sm font-medium">{{ $inspection->inspection_date->format('M j, Y') }}</div>
<div class="text-xs text-zinc-600 dark:text-zinc-400">{{ $inspection->inspection_type }}</div>
<div class="text-xs">
<flux:badge size="sm" :color="$inspection->status === 'passed' ? 'green' : 'red'">
{{ ucfirst($inspection->status) }}
</flux:badge>
</div>
</div>
@empty
<div class="text-sm text-zinc-500 dark:text-zinc-400">No inspections recorded</div>
@endforelse
</div>
</div>
</div>
</div>
</div>