@extends('partials.app') @section('title', 'Dashboard') @php $user = auth()->user(); $firstName = strtok($user->name ?? 'Team', ' '); $hour = now()->hour; $greeting = $hour < 12 ? 'Good morning' : ($hour < 18 ? 'Good afternoon' : 'Good evening'); @endphp @section('content')
{{-- ── PAGE HEADER ─────────────────────────────────────────── --}}
@if($isAdmin) Admin Workspace @elseif($isCoordinator) Coordinator Workspace @elseif($isTrainer) Trainer Workspace @elseif($isReviewer) Reviewer Workspace @elseif($isApprover) Approver Workspace @else My Training Dashboard @endif

{{ $greeting }}, {{ $firstName }}.

@if($isAdmin || $isCoordinator) Here's the live picture of your training operations — users, active programmes, and items waiting on action. @elseif($isTrainer) Your assigned trainings, pending acceptance requests, and upcoming sessions are below. @elseif($isReviewer) Trainings submitted for review are listed below — open any one to review and update its status. @elseif($isApprover) Trainings marked as reviewed are ready for your approval. Open any one to take action. @else Your active training assignments and next steps are shown below. @endif

@foreach($user->getRoleNames() as $role) {{ $role }} @endforeach
{{-- ═══════════════════════════════════════════════════════════ ADMIN DASHBOARD ═══════════════════════════════════════════════════════════════ --}} @if($isAdmin || $isCoordinator) {{-- Stats row --}}
Total Users

{{ $totalUsers }}

Trainers

{{ $totalTrainers }}

Active Trainings

{{ $activeTrainings }}

In Setup

{{ $setupTrainings }}

{{-- Exam stats strip --}}
Total Exam Attempts

{{ $examStats['total'] }}

Passed
{{ $examStats['passed'] }}
Failed
{{ $examStats['failed'] }}
@if($examStats['total'] > 0)
Pass Rate
@php $passRate = round(($examStats['passed'] / $examStats['total']) * 100) @endphp
{{ $passRate }}%
@endif View All Logs
{{-- Training summary table --}}
Training Summary
Dashboard Preview
Showing the latest 5 annual/induction trainings only.
View All
@php $trainingSummaryRows = $trainingSummaries ?? collect(); $trainingSummaryPreview = $trainingSummaryRows->take(5); @endphp
Programs
{{ $trainingSummaryRows->count() }}
Ended
{{ $trainingSummaryRows->where('is_expired', true)->count() }}
Register Total
{{ $trainingSummaryRows->sum('register_count') }}
@forelse($trainingSummaryPreview as $summary) @empty @endforelse
Training Name Date Register Present Absent Passed Count Failed Count
{{ $summary->name }}
@if($summary->is_expired) Ended @endif
{{ $summary->date ? \Carbon\Carbon::parse($summary->date)->format('d M Y') : '-' }} {{ $summary->register_count }} {{ $summary->present_count }} {{ $summary->absent_count }} {{ $summary->passed_count }} {{ $summary->failed_count }}
No training summary data available yet.
@if($trainingSummaryRows->count() > 5) @endif
{{-- Needs your attention --}}
Needs your attention
{{-- Pending review --}}
Awaiting Review
{{ $inreviewTrainings->count() }}
@forelse($inreviewTrainings as $t)
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }} · {{ $t->created_at->format('d M Y') }}
@if($t->isExpired()) Review @else Review @endif
@empty
No trainings awaiting review.
@endforelse
{{-- Pending approval --}}
Awaiting Approval
{{ $reviewedTrainings->count() }}
@forelse($reviewedTrainings as $t)
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }} · {{ $t->created_at->format('d M Y') }}
@if($t->isExpired()) Approve @else Approve @endif
@empty
No trainings awaiting approval.
@endforelse
{{-- Pending trainer acceptances --}}
Trainer Acceptances Pending
{{ $pendingAcceptanceModules->count() }}
@forelse($pendingAcceptanceModules as $module)
{{ $module->name }}
@foreach($module->trainers as $trainer) {{ $trainer->name }} @endforeach
@empty
All trainers have accepted.
@endforelse
{{-- Sessions pending approval --}}
Sessions Pending Sign-off
{{ $pendingSessions->count() }}
@forelse($pendingSessions as $session)
{{ $session->trainee->name ?? '—' }}
{{ $session->topic }} · {{ \Carbon\Carbon::parse($session->training_date)->format('d M Y') }}
Sign off
@empty
No sessions pending approval.
@endforelse
{{-- Rejected trainer assignments --}} @if(isset($rejectedTrainerAssignments) && $rejectedTrainerAssignments->count() > 0)
Rejected Trainer Assignments
@foreach($rejectedTrainerAssignments as $module)
{{ $module->name }}
Rejected trainer assignments are highlighted below.
Open training
@foreach($module->trainers as $trainer) {{ $trainer->name }} @endforeach
@endforeach
@endif {{-- Recent active trainings --}}
Active Training Programmes
@forelse($recentTrainings as $t) @empty @endforelse
Training Type Status Trainees Dates
{{ $t->name }} {{ $t->training_type === 'classroom' ? 'Classroom' : 'Self Training' }} @php $statusColor = ['created'=>'secondary','inreview'=>'warning','reviewed'=>'info','approved'=>'success'][$t->status] ?? 'secondary'; @endphp {{ ucfirst($t->status) }} {{ $t->trainees_count }} {{ $t->start_date ? \Carbon\Carbon::parse($t->start_date)->format('d M') : '—' }} @if($t->end_date) – {{ \Carbon\Carbon::parse($t->end_date)->format('d M Y') }} @endif View
No active trainings yet.
{{-- Refreshment training programmes falling in the current month --}}
Refreshment Training Programme — {{ $annualMonthLabel }}
@forelse($annualThisMonth as $annual) @empty @endforelse
Programme Date Trainees Status
{{ $annual->name }} {{ $annual->start_date ? \Carbon\Carbon::parse($annual->start_date)->format('d M') : '—' }} @if($annual->end_date) – {{ \Carbon\Carbon::parse($annual->end_date)->format('d M Y') }} @endif {{ $annual->trainees_count }} @php $annualStatusColor = ['created'=>'secondary','inreview'=>'warning','reviewed'=>'info','approved'=>'success'][$annual->status] ?? 'secondary'; @endphp {{ ucfirst($annual->status) }} View
No refreshment training scheduled for {{ $annualMonthLabel }}.
{{-- ═══════════════════════════════════════════════════════════ TRAINER DASHBOARD ═══════════════════════════════════════════════════════════════ --}} @elseif($isTrainer) {{-- Stats row --}}
Accepted

{{ $acceptedCount }}

Pending

{{ $pendingCount }}

Trainees

{{ $totalTrainees }}

{{-- Pending acceptances --}} @if($pendingAcceptances->count() > 0)
Action required
Training assignments awaiting your acceptance
@foreach($pendingAcceptances as $t)
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }} @if($t->start_date) · {{ \Carbon\Carbon::parse($t->start_date)->format('d M Y') }} @if($t->end_date) – {{ \Carbon\Carbon::parse($t->end_date)->format('d M Y') }} @endif @endif
View & Accept
@endforeach
@endif
{{-- Upcoming training dates --}}
Upcoming Trainings
@forelse($upcomingTrainings as $t)
{{ \Carbon\Carbon::parse($t->start_date)->format('d') }}
{{ \Carbon\Carbon::parse($t->start_date)->format('M') }}
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }}
@empty
No upcoming training dates scheduled.
@endforelse
{{-- Accepted trainings with trainee counts --}}
Your Active Trainings
@forelse($acceptedTrainings as $t)
{{ $t->name }}
{{ $t->trainees_count }} trainee{{ $t->trainees_count !== 1 ? 's' : '' }}
Attendance
@empty
No accepted trainings yet.
@endforelse
{{-- ═══════════════════════════════════════════════════════════ REVIEWER DASHBOARD ═══════════════════════════════════════════════════════════════ --}} @elseif($isReviewer) {{-- Stats strip --}}
Pending Review

{{ $pendingCount }}

Reviewed

{{ $reviewedCount }}

Approved

{{ $approvedCount }}

{{ $pendingCount > 0 ? 'Trainings waiting for your review' : 'Nothing pending — all clear' }}
@forelse($pendingReview as $t)
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }} · Created by {{ $t->creator->name ?? '—' }} · {{ $t->created_at->format('d M Y') }}
@if($t->isExpired()) Open & Review @else Open & Review @endif
@empty
No trainings currently require your review.
@endforelse
{{-- ═══════════════════════════════════════════════════════════ APPROVER DASHBOARD ═══════════════════════════════════════════════════════════════ --}} @elseif($isApprover)
Awaiting Approval

{{ $pendingCount }}

Approved Total

{{ $approvedCount }}

{{ $pendingCount > 0 ? 'Trainings waiting for your approval' : 'Nothing pending — all clear' }}
@forelse($pendingApproval as $t)
{{ $t->name }}
{{ ucfirst(str_replace('_', ' ', $t->training_type)) }} · Created by {{ $t->creator->name ?? '—' }} · {{ $t->created_at->format('d M Y') }}
@if($t->isExpired()) Open & Approve @else Open & Approve @endif
@empty
No trainings currently require your approval.
@endforelse
{{-- ═══════════════════════════════════════════════════════════ TRAINEE / EMPLOYEE DASHBOARD ═══════════════════════════════════════════════════════════════ --}} @else {{-- Stats row --}}
Enrolled

{{ $totalEnrolled }}

Passed

{{ $passedCount }}

Failed

{{ $failedCount }}

{{-- Pending action items --}} @if($pendingItems->count() > 0)
Your next steps
@foreach($pendingItems as $item) @php $stepLabel = match($item['next_step']) { 'read_documents' => 'Read documents first', 'take_exam' => 'Exam ready — take it now', 'retake_exam' => 'Exam failed — retake available', 'expired' => 'Training expired', 'waiting_reassign' => 'Exam failed — awaiting reassignment', default => 'In progress', }; $stepColor = match($item['next_step']) { 'read_documents' => '#d97706', 'take_exam' => '#2563eb', 'retake_exam' => '#dc2626', 'expired' => '#6b7280', 'waiting_reassign' => '#b45309', default => '#64748b', }; $stepIcon = match($item['next_step']) { 'read_documents' => 'mdi-book-open-page-variant-outline', 'take_exam' => 'mdi-clipboard-text-outline', 'retake_exam' => 'mdi-reload-alert', 'expired' => 'mdi-calendar-remove', 'waiting_reassign' => 'mdi-alert-circle-outline', default => 'mdi-dots-horizontal-circle-outline', }; $actionRoute = match($item['next_step']) { 'read_documents' => route('exams.read', $item['training']->id), 'take_exam' => route('exams.take', $item['training']->id), 'retake_exam' => route('exams.take', $item['training']->id), 'expired' => '#', default => '#', }; $actionLabel = match($item['next_step']) { 'read_documents' => 'Start Reading', 'take_exam' => 'Take Exam', 'retake_exam' => 'Retake Exam', 'expired' => 'Ended', 'waiting_reassign' => 'Awaiting Reassignment', default => 'Continue', }; @endphp
{{ $item['training']->name }}
{{ $stepLabel }}
@if($item['latest_result']) {{ round($item['latest_result']->percentage) }}% @endif
{{-- Mini progress --}}
Reading Assessment
@if(in_array($item['next_step'], ['waiting_reassign', 'expired'], true)) @else {{ $actionLabel }} @endif
@endforeach
@else
You're all caught up!
No pending actions on your active trainings right now.
@endif {{-- Recent exam results --}} @if($recentResults->count() > 0)
Recent exam results
@foreach($recentResults as $result)
{{ $result->module->name ?? '—' }}
{{ $result->created_at->format('d M Y, g:i A') }}
{{ round($result->percentage) }}%
{{ $result->is_passed ? 'PASSED' : 'FAILED' }}
Details
@endforeach
@endif @endif
@endsection