feat: Configuration du mode de notation par établissement

Les établissements scolaires utilisent des systèmes d'évaluation variés
(notes /20, /10, lettres, compétences, sans notes). Jusqu'ici l'application
imposait implicitement le mode notes /20, ce qui ne correspondait pas
à la réalité pédagogique de nombreuses écoles.

Cette configuration permet à chaque établissement de choisir son mode
de notation par année scolaire, avec verrouillage automatique dès que
des notes ont été saisies pour éviter les incohérences. Le Score Sérénité
adapte ses pondérations selon le mode choisi (les compétences sont
converties via un mapping, le mode sans notes exclut la composante notes).
This commit is contained in:
2026-02-07 01:06:55 +01:00
parent f19d0ae3ef
commit ff18850a43
51 changed files with 3963 additions and 79 deletions

View File

@@ -2,6 +2,11 @@
import type { SerenityScore } from '$types';
import { getSerenityEmoji, getSerenityLabel } from '$lib/features/dashboard/serenity-score';
// TODO: Adapter la formule et les poids affichés selon le mode de notation
// (no_grades: 0/50/50, competencies: renommer Notes→Compétences + note mapping).
// À traiter quand le Score Sérénité sera connecté aux vraies données.
// Voir backend SerenityScoreWeights::forMode() pour la logique de pondération.
let {
score,
isEnabled = false,
@@ -16,10 +21,9 @@
onToggleOptIn?: ((enabled: boolean) => void) | undefined;
} = $props();
let localEnabled = $state(isEnabled);
let localEnabled = $state(false);
// Sync local state with parent prop changes
$effect(() => {
$effect.pre(() => {
localEnabled = isEnabled;
});
@@ -43,8 +47,8 @@
<svelte:window onkeydown={handleKeydown} />
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions -->
<div class="modal-backdrop" onclick={handleBackdropClick}>
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_static_element_interactions a11y_no_noninteractive_element_interactions -->
<div class="modal-backdrop" onclick={handleBackdropClick} role="presentation">
<div class="modal-content" role="dialog" aria-modal="true" aria-labelledby="modal-title">
<header class="modal-header">
<h2 id="modal-title">Comment fonctionne le Score Sérénité ?</h2>

View File

@@ -46,6 +46,11 @@
<span class="action-label">Périodes scolaires</span>
<span class="action-hint">Trimestres et semestres</span>
</a>
<a class="action-card" href="/admin/pedagogy">
<span class="action-icon">🎓</span>
<span class="action-label">Pédagogie</span>
<span class="action-hint">Mode de notation</span>
</a>
<div class="action-card disabled" aria-disabled="true">
<span class="action-icon">📤</span>
<span class="action-label">Importer des données</span>

View File

@@ -82,6 +82,7 @@ export function createDefaultReporter(options: {
return (metric: VitalMetric) => {
// Log in development
if (options.debug) {
// eslint-disable-next-line no-console
console.log(`[WebVitals] ${metric.name}: ${metric.value.toFixed(2)} (${metric.rating})`);
}