Deploy Ladill Frontdesk / deploy (push) Successful in 25s
Replace inline teal button classes with shared btn-primary and indigo nav/link styling used by CRM and POS. Co-authored-by: Cursor <cursoragent@cursor.com>
100 lines
6.9 KiB
PHP
100 lines
6.9 KiB
PHP
<x-app-layout :title="$visit->visitor->full_name">
|
|
<div class="mx-auto max-w-3xl">
|
|
<div class="flex items-start justify-between">
|
|
<div>
|
|
<h1 class="text-xl font-semibold text-slate-900">{{ $visit->visitor->full_name }}</h1>
|
|
<p class="text-sm text-slate-500">{{ ucfirst(str_replace('_', ' ', $visit->visitor_type)) }} · Badge {{ $visit->badge_code }}</p>
|
|
</div>
|
|
<div class="flex flex-wrap gap-2">
|
|
@if ($visit->isInside())
|
|
<a href="{{ route('frontdesk.visits.badge', $visit) }}" target="_blank" class="rounded-lg border border-slate-200 px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Print badge</a>
|
|
<a href="{{ route('frontdesk.visits.badge.preview', $visit) }}" target="_blank" class="rounded-lg border border-slate-200 px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-50">Preview</a>
|
|
<form method="POST" action="{{ route('frontdesk.visits.checkout', $visit) }}">
|
|
@csrf
|
|
<button type="submit" class="rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white hover:bg-slate-800">Check out</button>
|
|
</form>
|
|
@elseif ($canManage && $visit->awaitingApproval())
|
|
<form method="POST" action="{{ route('frontdesk.visits.approve', $visit) }}">
|
|
@csrf
|
|
<button type="submit" class="btn-primary">Approve & check in</button>
|
|
</form>
|
|
@elseif ($canManage && $visit->canActivateCheckIn())
|
|
<form method="POST" action="{{ route('frontdesk.visits.activate', $visit) }}" class="flex items-center gap-2">
|
|
@csrf
|
|
<label class="flex items-center gap-1 text-xs text-slate-600">
|
|
<input type="checkbox" name="policies_accepted" value="1" required class="rounded border-slate-300 text-indigo-600">
|
|
Policies accepted
|
|
</label>
|
|
<button type="submit" class="btn-primary">Check in</button>
|
|
</form>
|
|
@elseif ($canManage && ! $visit->isInside())
|
|
<form method="POST" action="{{ route('frontdesk.visits.destroy', $visit) }}" onsubmit="return confirm('Archive this visit?')">
|
|
@csrf @method('DELETE')
|
|
<button type="submit" class="rounded-lg border border-red-200 px-3 py-2 text-sm text-red-700 hover:bg-red-50">Archive</button>
|
|
</form>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
|
|
@if ($visit->awaitingApproval())
|
|
<p class="mt-4 rounded-xl bg-amber-50 px-4 py-3 text-sm text-amber-800">Awaiting reception approval before badge issue.</p>
|
|
@endif
|
|
|
|
@if ($canManage && $visit->isPending() && ! $visit->awaitingApproval())
|
|
<div class="mt-4 flex flex-wrap gap-2">
|
|
@if (in_array($visit->status, ['expected', 'scheduled', 'overdue'], true))
|
|
<form method="POST" action="{{ route('frontdesk.visits.waiting', $visit) }}">
|
|
@csrf
|
|
<button type="submit" class="rounded-lg border border-slate-200 px-3 py-2 text-sm text-slate-700 hover:bg-slate-50">Mark waiting</button>
|
|
</form>
|
|
@endif
|
|
<form method="POST" action="{{ route('frontdesk.visits.cancel', $visit) }}" onsubmit="return confirm('Cancel this visit?')">
|
|
@csrf
|
|
<input type="hidden" name="reason" value="Cancelled by reception">
|
|
<button type="submit" class="rounded-lg border border-red-200 px-3 py-2 text-sm text-red-700 hover:bg-red-50">Cancel visit</button>
|
|
</form>
|
|
</div>
|
|
@endif
|
|
|
|
@php $typeDetails = $visit->typeDetailEntries(); @endphp
|
|
@if (count($typeDetails) > 0)
|
|
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-5">
|
|
<h2 class="text-sm font-semibold text-slate-900">{{ ucfirst(str_replace('_', ' ', $visit->visitor_type)) }} details</h2>
|
|
<dl class="mt-3 space-y-2 text-sm">
|
|
@foreach ($typeDetails as $label => $value)
|
|
<div class="flex justify-between gap-4">
|
|
<dt class="text-slate-500">{{ $label }}</dt>
|
|
<dd class="text-right font-medium text-slate-800">{{ $value }}</dd>
|
|
</div>
|
|
@endforeach
|
|
</dl>
|
|
</div>
|
|
@endif
|
|
|
|
<div class="mt-6 grid gap-4 sm:grid-cols-2">
|
|
<div class="rounded-2xl border border-slate-200 bg-white p-5">
|
|
<h2 class="text-sm font-semibold text-slate-900">Visit details</h2>
|
|
<dl class="mt-3 space-y-2 text-sm">
|
|
<div class="flex justify-between"><dt class="text-slate-500">Status</dt><dd class="font-medium capitalize @if($visit->status === 'overdue') text-amber-700 @endif">{{ str_replace('_', ' ', $visit->status) }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Scheduled</dt><dd>{{ $visit->scheduled_at?->format('M j, Y g:i A') ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Checked in</dt><dd>{{ $visit->checked_in_at?->format('M j, Y g:i A') ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Checked out</dt><dd>{{ $visit->checked_out_at?->format('M j, Y g:i A') ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Badge expires</dt><dd>{{ $visit->badge_expires_at?->format('g:i A') ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Purpose</dt><dd>{{ $visit->purpose ?? '—' }}</dd></div>
|
|
@if ($visit->notes)
|
|
<div><dt class="text-slate-500">Notes</dt><dd class="mt-1 whitespace-pre-wrap text-slate-700">{{ $visit->notes }}</dd></div>
|
|
@endif
|
|
</dl>
|
|
</div>
|
|
<div class="rounded-2xl border border-slate-200 bg-white p-5">
|
|
<h2 class="text-sm font-semibold text-slate-900">Host</h2>
|
|
<dl class="mt-3 space-y-2 text-sm">
|
|
<div class="flex justify-between"><dt class="text-slate-500">Name</dt><dd>{{ $visit->host?->name ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Department</dt><dd>{{ $visit->host?->department ?? '—' }}</dd></div>
|
|
<div class="flex justify-between"><dt class="text-slate-500">Office</dt><dd>{{ $visit->host?->office ?? '—' }}</dd></div>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</x-app-layout>
|