@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); @endphp @empty @endforelse
User Profile Type App User ID Join Count First Join Last Join Left At Meeting Time Talk Time Talk Opens Last Talk Open Last Talk Close Mic Muted Webcam Time Webcam Opens Last Webcam Open Last Webcam Close Status
{{ $initials ?: 'U' }} @if($attendee['profile_url']) {{ $attendee['name'] }} @else {{ $attendee['name'] }} @endif
{{ $attendee['profile_type'] ?? 'N/A' }} {{ $attendee['app_user_id'] ?? 'N/A' }} {{ $attendee['join_count'] ?? 0 }} {{ !empty($attendee['first_joined_at']) ? \Carbon\Carbon::parse($attendee['first_joined_at'])->format('M d, h:i A') : 'N/A' }} {{ !empty($attendee['last_joined_at']) ? \Carbon\Carbon::parse($attendee['last_joined_at'])->format('M d, h:i A') : 'N/A' }} {{ !empty($attendee['left_at']) ? \Carbon\Carbon::parse($attendee['left_at'])->format('M d, h:i A') : 'N/A' }} {{ gmdate('H:i:s', max(0, (int) ($attendee['attendance_total_seconds'] ?? 0))) }} @if(($attendee['has_joined_voice'] ?? 'No') === 'Yes' && ($attendee['is_listening_only'] ?? 'No') !== 'Yes') {{ ($attendee['mic_is_muted'] ?? 'No') === 'Yes' ? 'Muted' : 'Active' }} {{ gmdate('H:i:s', max(0, (int) ($attendee['mic_total_seconds'] ?? 0))) }} @else {{ gmdate('H:i:s', max(0, (int) ($attendee['mic_total_seconds'] ?? 0))) }} @endif {{ $attendee['mic_open_count'] ?? 0 }} {{ !empty($attendee['mic_opened_at']) ? \Carbon\Carbon::parse($attendee['mic_opened_at'])->format('M d, h:i A') : 'N/A' }} {{ !empty($attendee['mic_closed_at']) ? \Carbon\Carbon::parse($attendee['mic_closed_at'])->format('M d, h:i A') : 'N/A' }} {{ $attendee['mic_is_muted'] ?? 'No' }} @if(($attendee['has_video'] ?? 'No') === 'Yes') Active {{ gmdate('H:i:s', max(0, (int) ($attendee['webcam_total_seconds'] ?? 0))) }} @else {{ gmdate('H:i:s', max(0, (int) ($attendee['webcam_total_seconds'] ?? 0))) }} @endif {{ $attendee['webcam_open_count'] ?? 0 }} {{ !empty($attendee['webcam_opened_at']) ? \Carbon\Carbon::parse($attendee['webcam_opened_at'])->format('M d, h:i A') : 'N/A' }} {{ !empty($attendee['webcam_closed_at']) ? \Carbon\Carbon::parse($attendee['webcam_closed_at'])->format('M d, h:i A') : 'N/A' }} {{ $isOnline ? 'Online' : 'Offline' }}
No attendees data yet. BigBlueButton sends attendee rows while the meeting is running.
@endsection @push('styles') @endpush