RAPPORT D'IMPLÉMENTATION — openboard-jauge.html
================================================
Date : 7 novembre 2026
Demande : la gestion des CSV de « jauge_son.html » dans « openboard-jauge.html »,
          l'import d'un dossier de fichiers jauge_*.csv, l'accès aux données des
          séances, un enregistrement horodaté à chaque fois, et la détection
          automatique des classes à l'import.


AVANT-PROPOS : QUEL FICHIER A SERVI DE MODÈLE
---------------------------------------------
Le fichier « jauge_son.html » n'existe pas dans le dépôt. Le sonomètre s'appelle
« jauge.html » (title : « Jauge Son — sonomètre de classe »). C'est donc lui qui
a été lu et repris. Si un « jauge_son.html » vit ailleurs, il faudra me le
signaler.


1. ÉTAT INITIAL DE openboard-jauge.html (rappel)
-----------------------------------------------
- Un seul bouton d'export : « Exporter en CSV », qui téléchargeait
  « capital-calme-seance.csv », une ligne unique, une colonne « Date » remplie
  avec new Date().toLocaleString('fr-FR') — un horodatage, mais en une seule
  colonne et non réimportable proprement.
- Aucun champ classe, aucun historique, aucun import, aucune mémoire entre deux
  rechargements (seuls les réglages du feu étaient en mémoire vive).


2. CHAMP CLASSE, LISTE ET PASTILLES  (dans « Suivi de séance »)
---------------------------------------------------------------
- Nouveau champ texte « Classe » (id js-classe, 40 caractères, placeholder 5B).
- Un <datalist> (js-classes-liste) propose les classes connues : on peut taper
  la sienne ou la choisir dans la liste native du navigateur.
- Une rangée de pastilles cliquables (js-chips) affiche les mêmes classes ; la
  classe active est marquée (aria-pressed), un clic la sélectionne.
- La classe choisie est mémorisée (localStorage) et réapparaît au rechargement.
- Les statistiques du haut affichent désormais « Classe » et « Début » en plus
  des six compteurs existants.


3. ENREGISTREMENT HORODATÉ À CHAQUE FOIS
----------------------------------------
Chaque séance porte un horodatage complet, et plus une simple chaîne :
  - date      : AAAA-MM-JJ (jour du début de séance)
  - heure     : HH:MM (début)
  - heure_fin : HH:MM (fin réelle, au moment de l'archivage ou de l'export)
  - startedAt : l'horodatage epoch, qui sert au tri chronologique
Deux formats d'affichage sont produits à partir de ces données :
  - « 07/11/2026 à 10:32 » pour l'interface (statistiques, messages) ;
  - « 2026-11-07_10-32 » pour le nom des fichiers.
La séance démarre à l'ouverture de la page ou au clic sur « Nouvelle séance » ;
« Début » est donc toujours renseigné, même si l'export se fait avant la fin.


4. CSV EXPORTÉ : NOUVEAU FORMAT, RÉIMPORTABLE
---------------------------------------------
Un seul en-tête pour les deux exports (séance courante et toutes les séances),
séparateur « ; », UTF-8 avec BOM, fins de ligne CRLF, décimales à la française :

  classe;heure;date;heure_fin;duree_s;temps_au_dessus_s;temps_calme_s;
  capital_tombe_a_zero;passages_orange;passages_rouge;moyenne_db;pic_db;
  seuil_db;feu_orange_des;feu_rouge_des

  (sur une seule ligne physique dans le fichier)

Les colonnes « capital_tombe_a_zero », « passages_orange », « passages_rouge »,
« feu_orange_des » et « feu_rouge_des » conservent les compteurs ajoutés lors de
la demande précédente. Les colonnes « classe / heure / date » sont en tête,
comme dans Jauge Son, pour que le fichier soit exploitable tel quel.

Changement de nom : « capital-calme-seance.csv » devient
« jauge_openboard-<classe>-<horodatage>.csv ». Le préfixe « jauge » est
volontaire : c'est lui qui rend le fichier repérable par l'import de dossier.


5. IMPORT : UN FICHIER OU UN DOSSIER ENTIER
-------------------------------------------
5.1 « Importer un CSV » : un seul fichier (CSV, TXT ou JSON).
    - CSV avec en-têtes : lecture des séances et des classes.
    - Liste simple (un nom par ligne, ou séparé par ; , tabulation) : classes.
    - JSON (tableau ou { classes: [...] }) : classes.

5.2 « Importer un dossier » : input webkitdirectory, donc le navigateur propose
    de choisir un dossier et livre tous ses fichiers (sous-dossiers compris).
    Filtre appliqué sur le NOM, insensible à la casse :
        /^jauge.*\.csv$/i
    Autrement dit : le nom commence par « jauge » et finit par « .csv ». Cela
    couvre « jauge_5B.csv », « jauge-son-5B-2026-11-07.csv » (exports de
    jauge.html), « jauge_openboard-seances-….csv » (nouveaux exports).
    Tout le reste est ignoré et COMPTÉ dans le message (« N fichier(s)
    ignoré(s) »), pour qu'on sache pourquoi un fichier ne remonte pas.
    Les fichiers sont lus avec file.text() (FileReader en secours), plusieurs
    en parallèle.

5.3 Lecture tolérante, reprise de jauge.html :
    - séparateur deviné sur la première ligne (« ; », « , » ou tabulation) ;
    - guillemets et doubles guillemets gérés ;
    - en-têtes reconnus sans accents, sans casse, sans ponctuation :
      « Durée (s) », « duree_s » et « durée » tombent sur la même colonne ;
    - l'ordre des colonnes n'a pas d'importance ;
    - deux formats de séances reconnus :
        * une ligne = une séance (format « séances » de jauge.html et le nôtre) ;
        * une ligne = une minute (format « par minute » de jauge.html) : les
          minutes sont regroupées en une séance par classe et par jour, avec
          totaux additionnés, moyenne pondérée par la durée et pic.
    - sans colonne « classe », aucune valeur n'est prise pour une classe : les
      heures, dates et nombres sont écartés ; un en-tête connu n'est jamais un
      nom de classe.


6. DÉTECTION AUTOMATIQUE DES CLASSES
------------------------------------
À chaque import (fichier ou dossier), les valeurs de la colonne « classe » sont
nettoyées (espaces et guillemets retirés, doublons supprimés, tri alphabétique
avec nombres) puis fusionnées avec les classes déjà connues. Elles alimentent
immédiatement :
  - les pastilles cliquables (js-chips),
  - la liste déroulante du champ (js-classes-liste),
  - et le champ lui-même s'il était vide (la première classe détectée est
    pré-sélectionnée ; c'est modifiable et cela reste un choix).
Le message d'état annonce le résultat, par exemple :
  « 3 fichier(s) lu(s) · 3 séance(s) ajoutée(s) · classes connues : 5B, 6A ·
    1 fichier(s) ignoré(s). »


7. HISTORIQUE DES SÉANCES (accès aux données)
---------------------------------------------
- Stockage local du navigateur (localStorage), clés :
    openboard_jauge.classe.v1     la classe choisie
    openboard_jauge.classes.v1    les classes connues
    openboard_jauge.seances.v1    les séances
- Une séance y entre automatiquement :
    * au clic sur « Nouvelle séance » (avant remise à zéro),
    * au clic sur « Exporter la séance (CSV) »,
    * au clic sur « Exporter les séances (CSV) ».
  Une même séance n'est archivée qu'une fois (drapeau interne).
- Déduplication à l'import : clé = classe + date + heure de début + durée
  arrondie. Un dossier réimporté n'ajoute donc aucun doublon (vérifié).
- Plafond : 500 séances, les plus anciennes sont retirées au-delà. Jauge Son
  plafonne à 40 ; 500 est un choix assumé, parce qu'un dossier importé peut
  contenir des dizaines de séances et que 40 les aurait tronquées en silence.
  En cas de quota plein, les plus anciennes sont sacrifiées jusqu'à ce que
  l'écriture passe.
- Liste : de la plus récente à la plus ancienne, « classe · jj/mm/aaaa hh:mm »
  et durée, avec la mention « importée » pour les séances venues d'un fichier.
- Un clic sur une séance ouvre son détail : classe, date, début et fin, durée,
  temps au-dessus du seuil, temps calme, chutes à zéro, passages orange,
  passages rouge, niveau moyen, pic.
- « Vider l'historique » efface la liste (avec message de confirmation d'état).


8. EXPORTS
----------
- « Exporter la séance (CSV) » : une ligne, séance en cours, horodatée.
- « Exporter les séances (CSV) » : toutes les séances de l'historique, même
  en-tête, fichier « jauge_openboard-seances-<horodatage>.csv ».
Les deux fichiers sont réimportables par cette page ET par jauge.html (dont
l'import lit classe, heure, date, durée).


9. LIMITES ET RÈGLES À CONNAÎTRE
--------------------------------
- L'import de dossier ne retient que les noms commençant par « jauge » et
  finissant par « .csv ». Un fichier renommé « 5B.csv » ne sera pas lu.
- Le CSV « par minute » de jauge.html n'a pas de colonne « classe » s'il a été
  exporté sans classe : ces séances arrivent alors sans nom de classe.
- La courbe détaillée n'existe pas dans openboard-jauge.html : l'historique
  conserve les totaux, pas les échantillons de niveau sonore.
- Aucun filtre « afficher seulement la classe X » dans l'historique : la
  sélection de classe sert à nommer la séance en cours et les prochains
  exports, pas à filtrer la liste. Jauge Son n'a pas ce filtre non plus.
- Rien ne sort du navigateur : les fichiers sont lus sur place, aucun envoi.


10. VÉRIFICATIONS EFFECTUÉES
----------------------------
- Syntaxe : le bloc <script id="jauge-script"> extrait puis contrôlé par
  « node --check » — OK.
- Test réel dans Microsoft Edge, mode headless, piloté par CDP :
    * page chargée sans aucune exception JavaScript (liste d'erreurs vide) ;
    * import d'un dossier de 4 fichiers, dont 3 « jauge_*.csv » et un
      « notes.txt » : 3 fichiers lus, 1 ignoré, message conforme ;
    * classes détectées : 5B et 6A (pastilles + liste + pré-sélection de 5B) ;
    * 3 séances créées, dont le CSV « par minute » correctement regroupé en une
      seule séance (5B, 05/11/2026, 3:00, 60 s au-dessus, moyenne 65 dB) ;
    * détail d'une séance : « 5B — 07/11/2026 de 10:15 à 10:55 », 40:00,
      5:00 au-dessus, pic 81 dB ;
    * clic sur la pastille 6A : champ, statistique et mémoire mis à jour ;
    * export de la séance : fichier « jauge_openboard-seance-2026-11-07_12-05
      .csv », en-tête complet, ligne « ;12:05;2026-11-07;12:05;0;0;0;0;0;0;;;65;1;3 » ;
    * réimport de ce fichier : 1 séance ajoutée ; réimport identique : toujours
      1 (dédoublonnage) ;
    * export global : en-tête + 2 lignes pour 1 séance (en-tête comprise).
- Suites du dépôt : « node --test tests/latex.test.mjs » passe. Le contrôle de
  structure (tests/structure.test.mjs) échoue sur « le dossier ne contient que
  les fichiers attendus » : cette liste ne prévoit ni jauge.html, ni
  openboard-jauge.html, ni archive/, ni backup16-10.html, tous antérieurs à
  cette modification. L'échec existait donc avant ; il n'a pas été touché.


11. CE QUI N'A PAS ÉTÉ FAIT
---------------------------
- Aucun filtre par classe dans l'historique.
- Aucun export JSON, aucune suppression séance par séance (seulement « vider »).
- Aucun graphique de courbe dans le détail (les CSV par minute ne portent que
  des moyennes par minute, pas une courbe continue).
- Rien de modifié hors de openboard-jauge.html ; index.html, jauge.html et les
  suites de tests sont intacts.
