Files
ladill-frontdesk/resources/views/frontdesk/visits/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

115 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="btn-group">
@if ($visit->isInside())
<x-btn href="{{ route('frontdesk.visits.badge', $visit) }}" target="_blank" variant="secondary" size="sm">Print badge</x-btn>
<x-btn href="{{ route('frontdesk.visits.badge.preview', $visit) }}" target="_blank" variant="secondary" size="sm">Preview</x-btn>
<form method="POST" action="{{ route('frontdesk.visits.checkout', $visit) }}">
@csrf
<x-btn type="submit" size="sm">Check out</x-btn>
</form>
@elseif ($canManage && $visit->awaitingApproval())
<form method="POST" action="{{ route('frontdesk.visits.approve', $visit) }}">
@csrf
<x-btn type="submit">Approve & check in</x-btn>
</form>
@elseif ($canManage && $visit->canActivateCheckIn())
<form method="POST" action="{{ route('frontdesk.visits.activate', $visit) }}" class="flex flex-wrap 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>
<x-btn type="submit">Check in</x-btn>
</form>
@elseif ($canManage && ! $visit->isInside())
<x-confirm-dialog
:name="'archive-visit-'.$visit->id"
title="Archive this visit?"
:action="route('frontdesk.visits.destroy', $visit)"
method="DELETE"
confirm-label="Archive visit"
>
<x-slot:trigger>
<x-btn type="button" variant="danger" size="sm">Archive</x-btn>
</x-slot:trigger>
</x-confirm-dialog>
@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="btn-group mt-4">
@if (in_array($visit->status, ['expected', 'scheduled', 'overdue'], true))
<form method="POST" action="{{ route('frontdesk.visits.waiting', $visit) }}">
@csrf
<x-btn type="submit" variant="secondary" size="sm">Mark waiting</x-btn>
</form>
@endif
<x-confirm-dialog
:name="'cancel-visit-'.$visit->id"
title="Cancel this visit?"
:action="route('frontdesk.visits.cancel', $visit)"
confirm-label="Cancel visit"
>
<x-slot:trigger>
<x-btn type="button" variant="danger" size="sm">Cancel visit</x-btn>
</x-slot:trigger>
<x-slot:fields>
<input type="hidden" name="reason" value="Cancelled by reception">
</x-slot:fields>
</x-confirm-dialog>
</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>