ajoute les devoirs maison (chantier vrai cockpit, étape 3) : rendu en texte libre, suivi des rendus, notation
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
bd74eaf20f
commit
33531de44d
17 changed files with 582 additions and 2 deletions
41
portail/resources/views/devoirs/eleve.blade.php
Normal file
41
portail/resources/views/devoirs/eleve.blade.php
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
@extends('layouts.vitrine')
|
||||
|
||||
@section('titre', $devoir->titre)
|
||||
|
||||
@section('contenu')
|
||||
<div class="mx-auto max-w-3xl px-5 py-14 lg:px-10">
|
||||
<p class="font-mono text-sm font-semibold"><a href="{{ route('eleve') }}" class="underline underline-offset-4">Mon espace</a></p>
|
||||
<h1 class="mt-1 text-4xl font-extrabold tracking-tight">{{ $devoir->titre }}</h1>
|
||||
<p class="mt-2 font-mono text-sm font-semibold {{ $devoir->echeanceDepassee() ? 'text-[#A63D2A]' : '' }}">{{ $devoir->echeanceDepassee() ? 'Échéance dépassée le' : 'À rendre avant le' }} {{ $devoir->echeance->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}</p>
|
||||
<p class="mt-4 whitespace-pre-wrap rounded-2xl border border-[#e3e5e8] bg-white p-5 font-semibold">{{ $devoir->consigne }}</p>
|
||||
|
||||
@if (session('rendu_envoye'))
|
||||
<p class="mt-4 rounded-2xl border border-[#e3e5e8] bg-[#e6f4ea] p-4 font-semibold">Rendu envoyé.</p>
|
||||
@endif
|
||||
|
||||
@if ($rendu && $rendu->note !== null)
|
||||
<p class="mt-6 font-mono text-2xl font-extrabold">Note : {{ $rendu->note }}/20</p>
|
||||
@endif
|
||||
|
||||
@if ($devoir->echeanceDepassee() && ! $rendu)
|
||||
<p class="mt-6 rounded-2xl border border-[#A63D2A] bg-[#fce8e6] p-5 font-bold text-[#A63D2A]">Échéance dépassée : tu n'as pas rendu ce devoir.</p>
|
||||
@else
|
||||
<section class="mt-6 rounded-2xl border border-[#e3e5e8] bg-white p-6" aria-labelledby="t-rendre">
|
||||
<h2 id="t-rendre" class="text-xl font-extrabold">{{ $rendu ? 'Modifier mon rendu' : 'Rendre ce devoir' }}</h2>
|
||||
@if ($rendu)
|
||||
<p class="mt-2 font-semibold text-[#5f6368]">Rendu le {{ $rendu->rendu_a->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}. Un nouvel envoi remplace celui-ci{{ $devoir->echeanceDepassee() ? '' : ', jusqu\'à l\'échéance' }}.</p>
|
||||
@endif
|
||||
@error('reponse')<p class="mt-2 font-bold text-[#A63D2A]">{{ $message }}</p>@enderror
|
||||
@if (! $devoir->echeanceDepassee())
|
||||
<form action="{{ route('devoirs.eleve.rendre', $devoir) }}" method="post" class="mt-4 grid gap-3">
|
||||
@csrf
|
||||
<textarea name="reponse" required rows="8" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold">{{ old('reponse', $rendu->reponse ?? '') }}</textarea>
|
||||
<button type="submit" class="mt-2 inline-flex h-11 w-fit items-center rounded-full bg-black px-5 font-bold text-white">Envoyer</button>
|
||||
</form>
|
||||
@elseif ($rendu)
|
||||
<p class="mt-4 whitespace-pre-wrap font-semibold">{{ $rendu->reponse }}</p>
|
||||
@endif
|
||||
</section>
|
||||
@endif
|
||||
</div>
|
||||
@endsection
|
||||
46
portail/resources/views/devoirs/index.blade.php
Normal file
46
portail/resources/views/devoirs/index.blade.php
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
@extends('layouts.vitrine')
|
||||
|
||||
@section('titre', 'Devoirs · '.$classe->nom)
|
||||
|
||||
@section('contenu')
|
||||
<div class="mx-auto max-w-4xl px-5 py-14 lg:px-10">
|
||||
<p class="font-mono text-sm font-semibold"><a href="{{ route('mes-classes.show', $classe) }}" class="underline underline-offset-4">{{ $classe->nom }}</a></p>
|
||||
<h1 class="mt-1 text-4xl font-extrabold tracking-tight">Devoirs maison</h1>
|
||||
<p class="mt-2 font-semibold">Les élèves rendent un texte libre (pas de fichier pour l'instant) avant l'échéance. Passée l'échéance, le rendu n'est plus possible.</p>
|
||||
|
||||
<section class="mt-8 rounded-2xl border border-[#e3e5e8] bg-white p-6" aria-labelledby="t-nouveau">
|
||||
<h2 id="t-nouveau" class="text-xl font-extrabold">Nouveau devoir</h2>
|
||||
@error('titre')<p class="mt-2 font-bold text-[#A63D2A]">{{ $message }}</p>@enderror
|
||||
@error('consigne')<p class="mt-2 font-bold text-[#A63D2A]">{{ $message }}</p>@enderror
|
||||
@error('echeance')<p class="mt-2 font-bold text-[#A63D2A]">L'échéance doit être dans le futur.</p>@enderror
|
||||
<form action="{{ route('mes-classes.devoirs.store', $classe) }}" method="post" class="mt-4 grid gap-3">
|
||||
@csrf
|
||||
<input name="titre" required placeholder="Ex. Plan d'adressage" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold">
|
||||
<textarea name="consigne" required rows="4" placeholder="Consigne" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold"></textarea>
|
||||
<label class="grid gap-1 font-bold">Échéance<input type="datetime-local" name="echeance" required class="w-fit rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold"></label>
|
||||
<button type="submit" class="mt-2 inline-flex h-11 w-fit items-center rounded-full bg-[#0b57d0] px-5 font-bold text-white">Créer</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="mt-8" aria-labelledby="t-liste">
|
||||
<h2 id="t-liste" class="text-xl font-extrabold">Devoirs ({{ $devoirs->count() }})</h2>
|
||||
@if ($devoirs->isEmpty())
|
||||
<p class="mt-2 font-semibold">Aucun devoir pour l'instant.</p>
|
||||
@else
|
||||
<ul class="mt-4 grid gap-3">
|
||||
@foreach ($devoirs as $devoir)
|
||||
<li>
|
||||
<a href="{{ route('mes-classes.devoirs.show', [$classe, $devoir]) }}" class="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-[#e3e5e8] bg-white p-5 hover:bg-[#f8f9fa]">
|
||||
<span>
|
||||
<span class="block text-lg font-extrabold">{{ $devoir->titre }}</span>
|
||||
<span class="block font-mono text-sm font-semibold {{ $devoir->echeanceDepassee() ? 'text-[#A63D2A]' : '' }}">{{ $devoir->echeanceDepassee() ? 'Échéance dépassée' : 'À rendre' }} {{ $devoir->echeance->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}</span>
|
||||
</span>
|
||||
<span class="font-mono text-sm font-semibold">{{ $devoir->rendus_count }}/{{ $classe->eleves->count() }} rendu(s)</span>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
@endif
|
||||
</section>
|
||||
</div>
|
||||
@endsection
|
||||
52
portail/resources/views/devoirs/show.blade.php
Normal file
52
portail/resources/views/devoirs/show.blade.php
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
@extends('layouts.vitrine')
|
||||
|
||||
@section('titre', $devoir->titre)
|
||||
|
||||
@section('contenu')
|
||||
<div class="mx-auto max-w-4xl px-5 py-14 lg:px-10">
|
||||
<p class="font-mono text-sm font-semibold"><a href="{{ route('mes-classes.devoirs.index', $classe) }}" class="underline underline-offset-4">Devoirs · {{ $classe->nom }}</a></p>
|
||||
<div class="mt-1 flex flex-wrap items-start justify-between gap-4">
|
||||
<div>
|
||||
<h1 class="text-4xl font-extrabold tracking-tight">{{ $devoir->titre }}</h1>
|
||||
<p class="mt-2 font-mono text-sm font-semibold {{ $devoir->echeanceDepassee() ? 'text-[#A63D2A]' : '' }}">{{ $devoir->echeanceDepassee() ? 'Échéance dépassée le' : 'À rendre avant le' }} {{ $devoir->echeance->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}</p>
|
||||
</div>
|
||||
<form action="{{ route('mes-classes.devoirs.destroy', [$classe, $devoir]) }}" method="post" data-confirmer="Supprimer ce devoir et tous ses rendus ?">
|
||||
@csrf
|
||||
<button type="submit" class="font-bold text-[#A63D2A] underline underline-offset-4">Supprimer</button>
|
||||
</form>
|
||||
</div>
|
||||
<p class="mt-4 whitespace-pre-wrap font-semibold">{{ $devoir->consigne }}</p>
|
||||
|
||||
<section class="mt-8 rounded-2xl border border-[#e3e5e8] bg-white" aria-labelledby="t-rendus">
|
||||
<h2 id="t-rendus" class="px-6 pt-6 text-xl font-extrabold">Rendus ({{ $rendus->count() }}/{{ $eleves->count() }})</h2>
|
||||
<ul class="mt-4 divide-y divide-[#e3e5e8]">
|
||||
@foreach ($eleves as $eleve)
|
||||
@php($rendu = $rendus->get($eleve->id))
|
||||
<li class="p-6">
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<span class="text-lg font-extrabold">{{ $eleve->nomAffiche() }}</span>
|
||||
@if ($rendu)
|
||||
<span class="font-mono text-sm font-semibold text-[#3C8A5A]">Rendu le {{ $rendu->rendu_a->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}</span>
|
||||
@else
|
||||
<span class="font-mono text-sm font-semibold text-[#5f6368]">Pas encore rendu</span>
|
||||
@endif
|
||||
</div>
|
||||
@if ($rendu)
|
||||
<p class="mt-3 whitespace-pre-wrap rounded-xl border border-[#e3e5e8] bg-[#f8f9fa] p-4 font-semibold">{{ $rendu->reponse }}</p>
|
||||
<form action="{{ route('mes-classes.devoirs.noter', [$classe, $devoir, $rendu]) }}" method="post" class="mt-3 flex items-center gap-2">
|
||||
@csrf
|
||||
<label class="font-bold">Note <input type="number" name="note" min="0" max="20" value="{{ $rendu->note }}" class="w-20 rounded-xl border border-[#c4c7c5] bg-white px-2 py-1 font-semibold"> / 20</label>
|
||||
<button type="submit" class="inline-flex h-9 items-center rounded-full bg-[#0b57d0] px-4 text-sm font-bold text-white">Enregistrer</button>
|
||||
</form>
|
||||
@endif
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
<script nonce="{{ Vite::cspNonce() }}">
|
||||
document.querySelectorAll('form[data-confirmer]').forEach(function (f) {
|
||||
f.addEventListener('submit', function (e) { if (!window.confirm(f.dataset.confirmer)) e.preventDefault(); });
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
@ -43,6 +43,29 @@
|
|||
</ul>
|
||||
</section>
|
||||
@endif
|
||||
{{-- Chantier « vrai cockpit », étape 3 : Devoirs maison, réels. --}}
|
||||
@php($devoirsClasse = $eleve->classe->devoirs()->with(['rendus' => fn ($q) => $q->where('eleve_id', $eleve->id)])->where('echeance', '>=', now()->subDays(7))->get())
|
||||
@if ($devoirsClasse->isNotEmpty())
|
||||
<section class="mx-auto max-w-7xl px-5 pt-10 lg:px-10" aria-labelledby="t-devoirs">
|
||||
<h2 id="t-devoirs" class="text-2xl font-extrabold">Devoirs maison</h2>
|
||||
<ul class="mt-4 grid gap-3">
|
||||
@foreach ($devoirsClasse as $devoir)
|
||||
@php($monRendu = $devoir->rendus->first())
|
||||
<li>
|
||||
<a href="{{ route('devoirs.eleve.show', $devoir) }}" class="flex flex-wrap items-center justify-between gap-4 rounded-2xl border border-[#e3e5e8] p-5 {{ $monRendu ? 'bg-[#e6f4ea]' : ($devoir->echeanceDepassee() ? 'bg-[#fce8e6]' : 'bg-[#fef7e0]') }}">
|
||||
<span class="text-xl font-extrabold">{{ $devoir->titre }}</span>
|
||||
<span class="font-mono text-sm font-semibold">
|
||||
@if ($monRendu) Rendu
|
||||
@elseif ($devoir->echeanceDepassee()) Non rendu, échéance dépassée
|
||||
@else À rendre avant le {{ $devoir->echeance->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m H:i') }}
|
||||
@endif
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</section>
|
||||
@endif
|
||||
<div class="mx-auto grid max-w-7xl gap-12 px-5 py-14 lg:grid-cols-12 lg:px-10">
|
||||
<section class="lg:col-span-7" aria-labelledby="t-afaire">
|
||||
<h2 id="t-afaire" class="text-4xl font-extrabold tracking-tight">À faire</h2>
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -31,6 +31,7 @@
|
|||
<li><a href="#eleves" class="flex items-center rounded-lg border-2 border-transparent px-3 py-2 hover:border-black">Élèves</a></li>
|
||||
<li><a href="#seance" class="flex items-center rounded-lg border-2 border-transparent px-3 py-2 hover:border-black">{{ $classe->estArchivee() ? 'Classe archivée' : 'Séance' }}</a></li>
|
||||
<li><a href="{{ route('mes-classes.quiz.index', $classe) }}" class="flex items-center rounded-lg border-2 border-transparent px-3 py-2 hover:border-black">Quiz flash</a></li>
|
||||
<li><a href="{{ route('mes-classes.devoirs.index', $classe) }}" class="flex items-center rounded-lg border-2 border-transparent px-3 py-2 hover:border-black">Devoirs maison</a></li>
|
||||
</ul>
|
||||
@if ($seance)
|
||||
<div class="mt-6 rounded-lg border border-[#dadce0] bg-white p-3 text-sm font-semibold">
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue