fix: Permettre l'affectation de classe pour les élèves sans affectation existante

Le handler ChangeStudentClass exigeait une affectation existante pour
l'année scolaire en cours avant de pouvoir changer la classe. Un élève
créé sans ClassAssignment (import direct, année précédente) provoquait
une erreur "Élève non trouvé" au lieu d'être simplement affecté.

Le handler crée désormais une nouvelle affectation quand aucune n'existe,
et l'erreur de changement de classe s'affiche dans la modale au lieu de
la page principale.
This commit is contained in:
2026-03-09 11:20:29 +01:00
parent bf753d1367
commit bda63bd98c
5 changed files with 35 additions and 37 deletions

View File

@@ -62,6 +62,7 @@
let changeClassTarget = $state<Student | null>(null);
let newClassForChange = $state('');
let isChangingClass = $state(false);
let changeClassError = $state<string | null>(null);
// Classes grouped by level for optgroup
let classesByLevel = $derived.by(() => {
@@ -300,7 +301,7 @@
changeClassTarget = student;
newClassForChange = '';
showChangeClassModal = true;
error = null;
changeClassError = null;
}
function closeChangeClassModal() {
@@ -338,7 +339,7 @@
successMessage = `${changeClassTarget.firstName} ${changeClassTarget.lastName} a été transféré vers ${targetClass?.name ?? 'la nouvelle classe'}.`;
closeChangeClassModal();
} catch (e) {
error = e instanceof Error ? e.message : 'Erreur lors du changement de classe';
changeClassError = e instanceof Error ? e.message : 'Erreur lors du changement de classe';
} finally {
isChangingClass = false;
}
@@ -720,6 +721,13 @@
</select>
</div>
{#if changeClassError}
<div class="alert alert-error modal-error">
{changeClassError}
<button class="alert-close" onclick={() => (changeClassError = null)}>×</button>
</div>
{/if}
{#if newClassForChange}
{@const targetClass = classes.find((c) => c.id === newClassForChange)}
<div class="change-confirm-info">
@@ -1244,6 +1252,10 @@
justify-content: flex-end;
}
.modal-error {
margin-bottom: 0;
}
.change-confirm-info {
padding: 0.75rem 1rem;
background: #eff6ff;