Jitsi (docker-jitsi-meet, version figée) derrière Nginx sur meet.syllabuslab.fr, accès par jeton JWT signé par le portail, modération du micro, mains levées synchronisées avec l'application. Pare-feu : UDP 10000 et pont interne br-visio (accords d'Adam). Jicofo n'authentifie plus lui-même : il donnait le rôle de propriétaire aux élèves. Capacité ramenée à 20 VM. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
4.2 KiB
PHP
61 lines
4.2 KiB
PHP
@extends('layouts.vitrine')
|
|
|
|
@section('titre', "Salle d'attente")
|
|
|
|
@php($etats = \App\Models\LabSession::class)
|
|
|
|
@section('contenu')
|
|
<meta http-equiv="refresh" content="10">
|
|
<div class="mx-auto max-w-4xl px-5 py-14 lg:px-10">
|
|
<p class="font-mono text-sm font-semibold">{{ $seance->classe->nom }} · {{ $seance->lab->titre }}</p>
|
|
<h1 class="mt-1 text-4xl font-extrabold tracking-tight">Salle d'attente</h1>
|
|
<p class="mt-2 font-semibold">La page se rafraîchit toutes les 10 secondes.</p>
|
|
<p class="mt-4"><a href="{{ route('seances.visio.prof', $seance) }}" class="inline-flex h-11 items-center rounded-full bg-[#0b57d0] px-5 font-bold text-white">{{ $seance->visioOuverte() ? 'Retourner à la visio' : 'Visio de la classe' }}</a></p>
|
|
|
|
@if ($seance->labSessions->isEmpty())
|
|
<p class="mt-8 font-semibold">Personne n'a encore rejoint la séance.</p>
|
|
@else
|
|
<ul class="mt-8 grid gap-3">
|
|
@foreach ($seance->labSessions as $labSession)
|
|
<li class="flex flex-wrap items-center justify-between gap-4 rounded-2xl border border-[#e3e5e8] bg-white p-4">
|
|
<span class="font-extrabold">{{ $labSession->eleve->nomAffiche() }}</span>
|
|
<span class="flex flex-wrap items-center gap-3">
|
|
@switch($labSession->etat)
|
|
@case($etats::EN_ATTENTE)
|
|
<form action="{{ route('seances.admettre', [$seance, $labSession]) }}" method="post">
|
|
@csrf
|
|
<button type="submit" class="inline-flex h-10 items-center rounded-full bg-[#0b57d0] px-4 font-bold text-white">Admettre</button>
|
|
</form>
|
|
@break
|
|
@case($etats::ADMIS)
|
|
<span class="rounded-lg border border-[#dadce0] bg-[#fef7e0] px-3 py-1 font-mono text-sm font-bold">Préparation des VM…</span>
|
|
@break
|
|
@case($etats::ACTIF)
|
|
<span class="rounded-lg border border-[#dadce0] bg-[#e6f4ea] px-3 py-1 font-mono text-sm font-bold">Admis</span>
|
|
@if ($labSession->derniereCorrection)
|
|
<span class="font-mono text-sm font-bold">
|
|
{{ $labSession->derniereCorrection->reussi ? 'Réussi' : 'En cours' }} · {{ $labSession->derniereCorrection->note }}/{{ $labSession->derniereCorrection->note_max }}
|
|
</span>
|
|
@endif
|
|
<a href="{{ route('seances.console.prof.page', [$seance, $labSession]) }}" class="font-bold underline underline-offset-4">Voir sa console</a>
|
|
@break
|
|
@case($etats::ECHEC)
|
|
<span class="rounded-lg border border-[#A63D2A] bg-[#fce8e6] px-3 py-1 font-mono text-sm font-bold" title="{{ $labSession->raison_echec }}">Échec du lancement (3 essais)</span>
|
|
<form action="{{ route('seances.admettre', [$seance, $labSession]) }}" method="post">
|
|
@csrf
|
|
<button type="submit" class="inline-flex h-10 items-center rounded-full bg-black px-4 font-bold text-white">Réessayer</button>
|
|
</form>
|
|
@break
|
|
@default
|
|
<span class="rounded-lg border border-[#dadce0] px-3 py-1 font-mono text-sm font-bold">Terminé</span>
|
|
@endswitch
|
|
</span>
|
|
@if ($labSession->etat === $etats::ECHEC && $labSession->raison_echec)
|
|
<p class="w-full font-mono text-xs text-[#5f6368]">{{ $labSession->raison_echec }}</p>
|
|
@endif
|
|
</li>
|
|
@endforeach
|
|
</ul>
|
|
@endif
|
|
</div>
|
|
@endsection
|