Files
ladill-frontdesk/resources/views/frontdesk/visitors/show.blade.php
T
isaaccladandCursor 8f555bf2bf
Deploy Ladill Frontdesk / deploy (push) Successful in 43s
Replace native browser confirms with Ladill confirm dialogs.
Visits, devices, and admin destructive actions now use the shared modal UI.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-12 17:51:22 +00:00

117 lines
6.5 KiB
PHP

<x-app-layout :title="$visitor->full_name">
<div class="flex items-start justify-between">
<div>
<h1 class="text-xl font-semibold text-slate-900">{{ $visitor->full_name }}</h1>
<p class="text-sm text-slate-500">{{ $visitor->company }} · {{ $visitor->visit_count }} visits · {{ ucfirst(str_replace('_', ' ', $visitor->watchlist_status)) }}</p>
</div>
@if ($canManage)
<div class="btn-group">
<x-btn href="{{ route('frontdesk.visitors.check-in', $visitor) }}">Quick check-in</x-btn>
<x-confirm-dialog
:name="'archive-visitor-'.$visitor->id"
title="Archive this visitor?"
message="Their profile and visit history will be archived."
:action="route('frontdesk.visitors.destroy', $visitor)"
method="DELETE"
confirm-label="Archive visitor"
>
<x-slot:trigger>
<x-btn type="button" variant="danger">Archive</x-btn>
</x-slot:trigger>
</x-confirm-dialog>
</div>
@endif
</div>
@if ($canManage)
<form method="POST" action="{{ route('frontdesk.visitors.update', $visitor) }}" enctype="multipart/form-data" class="mt-4 max-w-xl space-y-3 rounded-2xl border border-slate-200 bg-white p-4">
@csrf @method('PATCH')
<h2 class="text-sm font-semibold text-slate-900">Profile</h2>
<div class="grid gap-3 sm:grid-cols-2">
<div>
<label class="block text-sm font-medium text-slate-700">Full name</label>
<input type="text" name="full_name" value="{{ $visitor->full_name }}" required class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Company</label>
<input type="text" name="company" value="{{ $visitor->company }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Phone</label>
<input type="tel" name="phone" value="{{ $visitor->phone }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Email</label>
<input type="email" name="email" value="{{ $visitor->email }}" class="mt-1 w-full rounded-lg border-slate-300 text-sm">
</div>
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Notes</label>
<textarea name="notes" rows="2" class="mt-1 w-full rounded-lg border-slate-300 text-sm">{{ $visitor->notes }}</textarea>
</div>
<div class="grid gap-3 sm:grid-cols-2">
<div>
<label class="block text-sm font-medium text-slate-700">Photo</label>
<input type="file" name="photo" accept="image/*" class="mt-1 w-full text-sm">
@if ($visitor->photo_path)
<p class="mt-1 text-xs text-slate-500">Current photo on file</p>
@endif
</div>
<div>
<label class="block text-sm font-medium text-slate-700">ID document</label>
<input type="file" name="id_document" accept=".pdf,image/*" class="mt-1 w-full text-sm">
@if ($visitor->id_document_path)
<p class="mt-1 text-xs text-slate-500">Current document on file</p>
@endif
</div>
</div>
<button type="submit" class="btn-primary btn-primary-sm">Save profile</button>
</form>
<form method="POST" action="{{ route('frontdesk.visitors.watchlist', $visitor) }}" class="mt-4 max-w-md space-y-3 rounded-2xl border border-slate-200 bg-white p-4">
@csrf @method('PATCH')
<h2 class="text-sm font-semibold text-slate-900">Watchlist</h2>
<div>
<label class="block text-sm font-medium text-slate-700">Watchlist status</label>
<select name="watchlist_status" class="mt-1 w-full rounded-lg border-slate-300 text-sm">
@foreach ($watchlistStatuses as $key => $label)
<option value="{{ $key }}" @selected($visitor->watchlist_status === $key)>{{ $label }}</option>
@endforeach
</select>
</div>
<x-btn type="submit" variant="secondary" size="sm">Update watchlist</x-btn>
</form>
@endif
@if ($activity->isNotEmpty())
<div class="mt-6 rounded-2xl border border-slate-200 bg-white">
<div class="border-b border-slate-100 px-5 py-4">
<h2 class="text-sm font-semibold text-slate-900">Activity</h2>
</div>
@foreach ($activity as $log)
<div class="border-b border-slate-50 px-5 py-3 last:border-0 text-sm">
<p class="font-medium text-slate-800">{{ $auditActions[$log->action] ?? $log->action }}</p>
<p class="text-xs text-slate-400">{{ $log->created_at?->format('M j, Y g:i A') }} · {{ $log->actor_ref ?? 'System' }}</p>
</div>
@endforeach
</div>
@endif
<div class="mt-6 rounded-2xl border border-slate-200 bg-white">
<div class="border-b border-slate-100 px-5 py-4">
<h2 class="text-sm font-semibold text-slate-900">Visit history</h2>
</div>
@forelse ($visitor->visits as $visit)
<a href="{{ route('frontdesk.visits.show', $visit) }}" class="flex items-center justify-between border-b border-slate-50 px-5 py-3 last:border-0 hover:bg-slate-50">
<div>
<p class="text-sm text-slate-800">{{ $visit->purpose ?? ucfirst(str_replace('_', ' ', $visit->visitor_type)) }}</p>
<p class="text-xs text-slate-400">{{ $visit->checked_in_at?->format('M j, Y') ?? $visit->scheduled_at?->format('M j, Y g:i A') ?? $visit->created_at->format('M j, Y') }}</p>
</div>
<span class="text-xs capitalize text-slate-500">{{ str_replace('_', ' ', $visit->status) }}</span>
</a>
@empty
<p class="px-5 py-8 text-center text-sm text-slate-400">No visits recorded.</p>
@endforelse
</div>
</x-app-layout>