Files
ladill-frontdesk/resources/views/frontdesk/reports/index.blade.php
T
isaaccladandCursor f46bebc1e3
Deploy Ladill Frontdesk / deploy (push) Successful in 55s
Unify Frontdesk secondary actions with shared button variants.
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>
2026-07-09 06:28:27 +00:00

122 lines
6.4 KiB
PHP

<x-app-layout title="Reports">
<div class="flex flex-wrap items-start justify-between gap-4">
<div>
<h1 class="text-xl font-semibold text-slate-900">Reports</h1>
<p class="text-sm text-slate-500">{{ $organization->name }}</p>
</div>
@if ($canExport)
<a href="{{ route('frontdesk.reports.export', request()->query()) }}" class="btn-primary">Export CSV</a>
@endif
</div>
<form method="GET" class="mt-4 flex flex-wrap gap-2">
<input type="date" name="from" value="{{ $from }}" class="rounded-lg border-slate-300 text-sm">
<input type="date" name="to" value="{{ $to }}" class="rounded-lg border-slate-300 text-sm">
<x-btn type="submit" variant="secondary" size="sm">Apply</x-btn>
</form>
<div class="mt-6 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
@foreach ($summary as $key => $value)
<div class="rounded-2xl border border-slate-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-slate-500">{{ str_replace('_', ' ', $key) }}</p>
<p class="mt-1 text-2xl font-semibold text-slate-900">{{ $value }}</p>
</div>
@endforeach
</div>
<div class="mt-8 grid gap-6 lg:grid-cols-2">
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h2 class="text-sm font-semibold text-slate-900">Peak check-in hours</h2>
<div class="mt-4 flex items-end gap-1 h-40">
@php $maxPeak = max(1, collect($peakHours)->max('count')); @endphp
@foreach ($peakHours as $row)
<div class="flex-1 flex flex-col items-center gap-1">
<div class="w-full rounded-t bg-indigo-500/80" style="height: {{ max(4, ($row['count'] / $maxPeak) * 100) }}%"></div>
<span class="text-[10px] text-slate-400">{{ $row['hour'] }}</span>
</div>
@endforeach
</div>
</section>
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h2 class="text-sm font-semibold text-slate-900">Security incidents</h2>
<dl class="mt-4 space-y-2 text-sm">
@foreach ($security as $key => $count)
<div class="flex justify-between"><dt class="text-slate-500">{{ str_replace('_', ' ', $key) }}</dt><dd class="font-medium">{{ $count }}</dd></div>
@endforeach
</dl>
</section>
</div>
<div class="mt-8 grid gap-6 lg:grid-cols-2">
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h2 class="text-sm font-semibold text-slate-900">Visits by department</h2>
<table class="mt-4 min-w-full text-sm">
@forelse ($departments as $row)
<tr class="border-t border-slate-100"><td class="py-2">{{ $row->department }}</td><td class="py-2 text-right font-medium">{{ $row->count }}</td></tr>
@empty
<tr><td class="py-4 text-slate-500">No data for this period.</td></tr>
@endforelse
</table>
</section>
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h2 class="text-sm font-semibold text-slate-900">Frequent visitors</h2>
<ul class="mt-4 space-y-2 text-sm">
@forelse ($frequentVisitors as $visitor)
<li class="flex justify-between"><span>{{ $visitor->full_name }}</span><span class="text-slate-500">{{ $visitor->visit_count }} visits</span></li>
@empty
<li class="text-slate-500">No frequent visitors yet.</li>
@endforelse
</ul>
</section>
</div>
<div class="mt-8">
<div class="flex flex-wrap items-center justify-between gap-3">
<h2 class="text-lg font-semibold text-slate-900">Staff attendance</h2>
@if ($canExport)
<x-btn href="{{ route('frontdesk.employees.export.attendance', request()->query()) }}" variant="link" size="sm" plain>Export HR CSV</x-btn>
@endif
</div>
<div class="mt-4 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
@foreach ($employeeSummary as $key => $value)
<div class="rounded-2xl border border-slate-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-slate-500">{{ str_replace('_', ' ', $key) }}</p>
<p class="mt-1 text-2xl font-semibold text-slate-900">{{ $value }}</p>
</div>
@endforeach
</div>
<div class="mt-6 grid gap-6 lg:grid-cols-2">
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h3 class="text-sm font-semibold text-slate-900">Recent staff events</h3>
<table class="mt-4 min-w-full text-sm">
@forelse ($employeeAttendance->take(10) as $event)
<tr class="border-t border-slate-100">
<td class="py-2">{{ $event->employee->full_name }}</td>
<td class="py-2 text-slate-500">{{ config('frontdesk.employee_presence_events.'.$event->event, $event->event) }}</td>
<td class="py-2 text-right text-slate-400">{{ $event->created_at->format('M j, g:i A') }}</td>
</tr>
@empty
<tr><td class="py-4 text-slate-500">No staff events in this period.</td></tr>
@endforelse
</table>
</section>
<section class="rounded-2xl border border-slate-200 bg-white p-5">
<h3 class="text-sm font-semibold text-slate-900">Step-out log</h3>
<ul class="mt-4 space-y-2 text-sm">
@forelse ($employeeStepOuts as $event)
<li>
<span class="font-medium">{{ $event->employee->full_name }}</span>
<span class="text-slate-500"> {{ $event->destination ?? '—' }}</span>
<span class="block text-xs text-slate-400">{{ $event->created_at->format('M j, g:i A') }}</span>
</li>
@empty
<li class="text-slate-500">No step-outs in this period.</li>
@endforelse
</ul>
</section>
</div>
</div>
</x-app-layout>