Deploy Ladill Frontdesk / deploy (push) Successful in 43s
Visits, devices, and admin destructive actions now use the shared modal UI. Co-authored-by: Cursor <cursoragent@cursor.com>
115 lines
6.9 KiB
PHP
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>
|