Deploy Ladill Frontdesk / deploy (push) Successful in 55s
Add warning, danger, and link button styles plus x-btn and x-danger-zone components so ghost text actions match the primary pill UI across edit screens and tables. Co-authored-by: Cursor <cursoragent@cursor.com>
109 lines
6.2 KiB
PHP
109 lines
6.2 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>
|
|
<form method="POST" action="{{ route('frontdesk.visitors.destroy', $visitor) }}" onsubmit="return confirm('Archive this visitor?')">
|
|
@csrf @method('DELETE')
|
|
<x-btn type="submit" variant="danger">Archive</x-btn>
|
|
</form>
|
|
</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>
|