permet aux élèves de rejoindre leur classe avec son code, et les fiches en lot

L'élève saisit le code de classe et son prénom, le prof accepte, l'élève
voit une seule fois son identifiant et son code. Aucun e-mail. Le prof
peut aussi régénérer les fiches de plusieurs élèves d'un coup. Procédure
pour prouver la copie de la clé des sauvegardes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-09 22:18:53 +02:00
parent 1ac8d4773a
commit dd4f9c3c55
21 changed files with 573 additions and 26 deletions

View file

@ -0,0 +1,21 @@
@extends('layouts.vitrine')
@section('titre', 'Demande envoyée')
@section('contenu')
<div class="mx-auto max-w-xl px-5 py-20 text-center lg:px-10">
<p class="font-mono text-sm font-semibold">{{ $demande->classe->nom }}</p>
<h1 class="mt-2 text-4xl font-extrabold tracking-tight">Demande envoyée, {{ $demande->prenom }} !</h1>
<p class="mt-4 text-lg font-semibold">Attends que ton prof l'accepte. Garde cette page ouverte : ton identifiant et ton code s'afficheront ici.</p>
</div>
<script nonce="{{ Vite::cspNonce() }}">
(function () {
setInterval(function () {
fetch('{{ route('rejoindre.etat') }}', { headers: { 'Accept': 'application/json' } })
.then(function (r) { return r.json(); })
.then(function (d) { if (d.statut !== 'en_attente') location.reload(); })
.catch(function () {});
}, 2000);
})();
</script>
@endsection

View file

@ -0,0 +1,16 @@
@extends('layouts.vitrine')
@section('titre', 'Bienvenue')
@section('contenu')
<div class="mx-auto max-w-xl px-5 py-14 lg:px-10">
<h1 class="text-4xl font-extrabold tracking-tight">Bienvenue, {{ $eleve->prenom }} !</h1>
<p class="mt-3 text-lg font-semibold">Note ou photographie ces deux informations <strong>maintenant</strong> : elles ne s'afficheront plus jamais. Tu en auras besoin pour te reconnecter.</p>
<div class="mt-8 grid gap-4 rounded-2xl border-2 border-[#13233A] bg-[#fef7e0] p-6">
<p class="font-mono text-sm font-semibold">Identifiant<br><span class="text-3xl font-bold">{{ $eleve->identifiant }}</span></p>
<p class="font-mono text-sm font-semibold">Code secret<br><span class="text-3xl font-bold tracking-[0.2em]">{{ $codeSecret }}</span></p>
</div>
<p class="mt-4 font-semibold">Si tu le perds, ton prof peut te donner un nouveau code.</p>
<a href="{{ route('eleve') }}" class="mt-8 inline-flex h-12 items-center justify-center rounded-full bg-[#0b57d0] px-6 text-lg font-bold text-white">C'est noté, aller à mon espace</a>
</div>
@endsection

View file

@ -0,0 +1,28 @@
@extends('layouts.vitrine')
@section('titre', 'Rejoindre ma classe')
@section('contenu')
<div class="mx-auto max-w-xl px-5 py-14 lg:px-10">
<h1 class="text-4xl font-extrabold tracking-tight">Rejoindre ma classe</h1>
<p class="mt-3 text-lg font-semibold">Ton prof t'a donné un code de classe à 6 caractères. Ton prof va accepter ta demande, puis tu recevras ton identifiant et ton code secret sur cet écran.</p>
<form action="{{ route('rejoindre.demander') }}" method="post" class="mt-8 grid gap-4 rounded-2xl border border-[#e3e5e8] bg-white p-6">
@csrf
<label class="grid gap-1 font-bold">Code de la classe
<input name="code" value="{{ old('code', $code) }}" required maxlength="6" autocomplete="off" autocapitalize="characters" spellcheck="false"
class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-mono text-2xl font-bold uppercase tracking-[0.3em]">
</label>
@error('code')<p class="font-semibold text-[#A63D2A]">{{ $message }}</p>@enderror
<label class="grid gap-1 font-bold">Ton prénom
<input name="prenom" value="{{ old('prenom') }}" required maxlength="100" autocomplete="given-name" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold">
</label>
@error('prenom')<p class="font-semibold text-[#A63D2A]">{{ $message }}</p>@enderror
<label class="grid gap-1 font-bold">Ton nom <span class="font-medium">(facultatif, visible de ton prof seulement)</span>
<input name="nom" value="{{ old('nom') }}" maxlength="100" autocomplete="family-name" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold">
</label>
<p class="text-sm font-semibold text-[#5f6368]">Aucune adresse e-mail n'est demandée.</p>
<button type="submit" class="inline-flex h-12 items-center justify-center rounded-full bg-[#0b57d0] px-6 text-lg font-bold text-white">Envoyer ma demande</button>
</form>
<p class="mt-6 font-semibold">Tu as déjà un identifiant ? <a href="{{ route('login') }}" class="underline underline-offset-4">Connecte-toi</a>.</p>
</div>
@endsection

View file

@ -0,0 +1,10 @@
@extends('layouts.vitrine')
@section('titre', 'Demande refusée')
@section('contenu')
<div class="mx-auto max-w-xl px-5 py-20 text-center lg:px-10">
<h1 class="text-4xl font-extrabold tracking-tight">Ton prof n'a pas accepté la demande</h1>
<p class="mt-4 text-lg font-semibold">Vérifie le code de la classe et ton prénom avec lui, puis <a href="{{ route('rejoindre') }}" class="underline underline-offset-4">réessaie</a>.</p>
</div>
@endsection