ajoute Quiz flash (chantier vrai cockpit, étape 2) : QCM et vrai/faux, lancé en direct, indépendant d'une séance de lab
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
45f8a69e26
commit
16d1293911
24 changed files with 1249 additions and 5 deletions
67
portail/resources/views/quiz/session-prof.blade.php
Normal file
67
portail/resources/views/quiz/session-prof.blade.php
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
@extends('layouts.vitrine')
|
||||
|
||||
@section('titre', $session->quiz->titre.' · en direct')
|
||||
|
||||
@php($etats = \App\Models\SessionQuiz::class)
|
||||
|
||||
@section('contenu')
|
||||
<div class="mx-auto max-w-3xl px-5 py-14 lg:px-10">
|
||||
<p class="font-mono text-sm font-semibold">{{ $session->quiz->classe->nom }}</p>
|
||||
<h1 class="mt-1 text-4xl font-extrabold tracking-tight">{{ $session->quiz->titre }}</h1>
|
||||
|
||||
@if ($session->statut === $etats::TERMINEE)
|
||||
<div class="mt-8 rounded-2xl border border-[#e3e5e8] bg-[#e6f4ea] p-8 text-center">
|
||||
<p class="text-2xl font-extrabold">Quiz terminé.</p>
|
||||
<a href="{{ route('mes-classes.quiz.show', [$session->quiz->classe, $session->quiz]) }}" class="mt-4 inline-flex h-11 items-center rounded-full bg-black px-5 font-bold text-white">Retour au quiz</a>
|
||||
</div>
|
||||
@elseif (! $session->questionCourante)
|
||||
<div class="mt-8 rounded-2xl border border-[#e3e5e8] bg-white p-8 text-center">
|
||||
<p class="text-xl font-semibold">Prêt à commencer ({{ $session->quiz->questions->count() }} question(s)).</p>
|
||||
<form action="{{ route('sessions-quiz.suivante', $session) }}" method="post" class="mt-4">
|
||||
@csrf
|
||||
<button type="submit" class="inline-flex h-12 items-center rounded-full bg-black px-6 text-lg font-bold text-white">Commencer</button>
|
||||
</form>
|
||||
</div>
|
||||
@else
|
||||
@php($question = $session->questionCourante)
|
||||
@php($numero = $session->quiz->questions->search(fn ($q) => $q->id === $question->id) + 1)
|
||||
<div class="mt-8 rounded-2xl border border-[#e3e5e8] bg-white p-8">
|
||||
<p class="font-mono text-sm font-semibold">Question {{ $numero }} / {{ $session->quiz->questions->count() }}</p>
|
||||
<p class="mt-2 text-2xl font-extrabold">{{ $question->enonce }}</p>
|
||||
@if ($question->type === \App\Models\QuestionQuiz::VRAI_FAUX)
|
||||
<p class="mt-4 font-mono font-semibold">Bonne réponse : {{ $question->reponse_vrai_faux ? 'Vrai' : 'Faux' }}</p>
|
||||
@else
|
||||
<ul class="mt-4 grid gap-1 font-semibold">
|
||||
@foreach ($question->choix as $choix)
|
||||
<li class="{{ $choix->est_correct ? 'text-[#3C8A5A]' : '' }}">{{ $choix->est_correct ? '✓' : '·' }} {{ $choix->texte }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
|
||||
<div class="mt-6 flex items-center gap-4 rounded-xl border border-[#dadce0] bg-[#f8f9fa] p-4">
|
||||
<p class="font-mono text-lg font-bold"><span data-repondu>{{ $decompte['repondu'] }}</span> / {{ $total_eleves }} ont répondu</p>
|
||||
<p class="font-mono text-lg font-bold text-[#3C8A5A]"><span data-correctes>{{ $decompte['correctes'] }}</span> correctes</p>
|
||||
</div>
|
||||
|
||||
<form action="{{ route('sessions-quiz.suivante', $session) }}" method="post" class="mt-6">
|
||||
@csrf
|
||||
<button type="submit" class="inline-flex h-12 items-center rounded-full bg-black px-6 text-lg font-bold text-white">{{ $numero === $session->quiz->questions->count() ? 'Terminer' : 'Question suivante' }}</button>
|
||||
</form>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<script nonce="{{ Vite::cspNonce() }}">
|
||||
(function () {
|
||||
var questionId = @json($session->question_quiz_courante_id);
|
||||
setInterval(function () {
|
||||
fetch('{{ route('sessions-quiz.etat', $session) }}', { headers: { 'Accept': 'application/json' } })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (e) {
|
||||
if (e.question_id !== questionId || e.statut === 'terminee') { location.reload(); return; }
|
||||
var r = document.querySelector('[data-repondu]'); if (r) r.textContent = e.decompte.repondu;
|
||||
var c = document.querySelector('[data-correctes]'); if (c) c.textContent = e.decompte.correctes;
|
||||
}).catch(function () {});
|
||||
}, 2000);
|
||||
})();
|
||||
</script>
|
||||
@endsection
|
||||
Loading…
Add table
Add a link
Reference in a new issue