@extends('layout.layout') @section('content') @php $attendees = collect($status['attendees'] ?? []); $sessionNumber = $session->session_number ?? $session->id; $courseName = $course->course_name_en ?? $status['meeting_name'] ?? 'Course Session'; $totalUsers = $status['participant_count'] ?? $attendees->count(); $onlineUsers = $attendees->filter(fn ($attendee) => $attendee['is_online'] ?? ($status['running'] ?? false))->count(); $talkActiveUsers = $attendees->filter(fn ($attendee) => ($attendee['has_joined_voice'] ?? 'No') === 'Yes' && ($attendee['is_listening_only'] ?? 'No') !== 'Yes')->count(); $webcamActiveUsers = $attendees->filter(fn ($attendee) => ($attendee['has_video'] ?? 'No') === 'Yes')->count(); @endphp @include('components.alert')
Learning Analytics Dashboard
{{ $courseName }} - Session {{ $sessionNumber }}
Total Users {{ $totalUsers }} {{ $onlineUsers }} online
Talk Active {{ $talkActiveUsers }} Mic currently open
Webcam Active {{ $webcamActiveUsers }} Camera currently open
Participants
Join history, mic usage, and webcam usage for this BBB session.
{{ $attendees->count() }} rows
@forelse($attendees as $attendee) @php $initials = collect(explode(' ', trim($attendee['name'] ?? 'Participant'))) ->filter() ->map(fn($part) => mb_substr($part, 0, 1)) ->take(2) ->implode(''); $isOnline = $attendee['is_online'] ?? ($status['running'] ?? false); $micActive = ($attendee['has_joined_voice'] ?? 'No') === 'Yes' && ($attendee['is_listening_only'] ?? 'No') !== 'Yes' && ($attendee['mic_is_muted'] ?? 'No') !== 'Yes'; $cameraActive = ($attendee['has_video'] ?? 'No') === 'Yes'; $formatDate = fn ($date) => !empty($date) ? \Carbon\Carbon::parse($date)->format('M d, h:i A') : 'N/A'; $formatSeconds = fn ($seconds) => gmdate('H:i:s', max(0, (int) $seconds)); @endphp @empty @endforelse
User Attendance Mic Camera Status
{{ $initials ?: 'U' }} @if($attendee['profile_url']) {{ $attendee['name'] }} @else {{ $attendee['name'] }} @endif
{{ $attendee['profile_type'] ?? 'N/A' }} {{ $attendee['join_count'] ?? 0 }} joins
{{ $formatSeconds($attendee['attendance_total_seconds'] ?? 0) }} First: {{ $formatDate($attendee['first_joined_at'] ?? null) }} Last: {{ $formatDate($attendee['last_joined_at'] ?? null) }} Left: {{ $formatDate($attendee['left_at'] ?? null) }}
{{ $micActive ? 'Mic On' : 'Mic Off' }}
{{ $formatSeconds($attendee['mic_total_seconds'] ?? 0) }} {{ $attendee['mic_open_count'] ?? 0 }} opens Opened: {{ $formatDate($attendee['mic_opened_at'] ?? null) }} Closed: {{ $formatDate($attendee['mic_closed_at'] ?? null) }}
{{ $cameraActive ? 'Camera On' : 'Camera Off' }}
{{ $formatSeconds($attendee['webcam_total_seconds'] ?? 0) }} {{ $attendee['webcam_open_count'] ?? 0 }} opens Opened: {{ $formatDate($attendee['webcam_opened_at'] ?? null) }} Closed: {{ $formatDate($attendee['webcam_closed_at'] ?? null) }}
{{ $isOnline ? 'Online' : 'Offline' }}
No attendees data yet. BigBlueButton sends attendee rows while the meeting is running.
@endsection @push('styles') @endpush