v0.5.0 — panel admin complet : évaluations, météo, membres, flash, classe

- Seed : plus de membres fictifs, seuls les vrais apparaissent
- Panel admin centralise TOUT :
  - Flash info du jour
  - Édition de la classe (nom + niveau)
  - Gestion des évaluations (liste, ajout, modification, suppression)
  - Météo par jour (override admin avec bouton forcé/auto)
  - Gestion des membres (promotion/rétrogradation)
- Formulaire d'évaluation complet (matière, prof, salle, chapitre, date, heure, durée, coeff, note)
- Modale météo par jour (soleil, brouillard, vent, orage, tempête)
This commit is contained in:
Mathis 2026-10-04 22:09:07 +02:00
parent 24e9b73b40
commit 8c79476d96
3 changed files with 429 additions and 151 deletions

View file

@ -6,7 +6,6 @@
import { existsSync, rmSync } from 'node:fs'
import { resolve } from 'node:path'
import { db, nowIso } from './db.js'
import { newToken } from './auth.js'
import type { WeatherKind } from '@meteo-exam/shared'
const DB_PATH = process.env['METEO_DB'] ?? resolve(process.cwd(), 'data/meteo-exam.db')
@ -88,13 +87,9 @@ const seed = db.transaction(() => {
const classId = db.prepare<[string], { id: number }>('SELECT id FROM classes WHERE code = ?')
.get(CLASS_CODE)!.id
// Pas de membre admin créé par le seed : la première personne qui rejoint
// la classe via l'app devient automatiquement admin (cf. joinClass).
// Quelques élèves fictifs pour donner du volume aux votes du radar plus tard.
for (const nick of ['Léa M.', 'Karim B.', 'Chloé D.', 'Inès R.', 'Lucas P.', 'Mehdi A.']) {
db.prepare('INSERT INTO members (class_id, nickname, role, is_creator, token, created_at) VALUES (?, ?, ?, ?, ?, ?)')
.run(classId, nick, 'student', 0, newToken(), nowIso())
}
// Pas de membre fictif : la première personne qui rejoint la classe
// via l'app devient automatiquement admin (cf. joinClass).
// Les vrais membres apparaissent ici quand ils rejoignent.
const insert = db.prepare(
`INSERT INTO exams