Docs: ajouter nombre de commits par groupe fonctionnel dans livraisons mensuelles

This commit is contained in:
Pontoporeia
2026-06-29 17:57:13 +02:00
parent 4b6f9212b5
commit 00a106138e
+286 -208
View File
@@ -2,324 +2,402 @@
## Janvier 2026 (8 commits)
### Structure initiale
### Formulaire & soumission · 5
- Schéma SQLite : tables theses, auteurs, formats, langues, tags, fichiers
- Système de gestion des thèses avec migrations
- Formulaire admin : création + édition TFE
- Formulaire étudiant via liens de partage (share links)
### Structure & architecture · 3
- Monorepo : organisation en dossiers (formulaire, templates, src, admin)
- Justfile, .gitignore, documentation (READMEs)
- Justfile, .gitignore, READMEs
- Nginx config + déploiement fonctionnel
- Système de recherche sécurisé
---
## Février 2026 (29 commits)
### Formulaire & soumission
- Formulaire admin (ajout/édition TFE)
- Formulaire étudiant via liens de partage (share links)
- Structure formulaire : champs obligatoires, validation
- Uploads de fichiers (stockage, affichage)
### Répertoire & recherche · 9
- Moteur de recherche (par nom, année, orientation, AP, mot-clé)
- Cards en grille sur la page d'accueil (3×4 responsive)
- Footer avec années horizontales, scrollable
- Filtres combinables, header de recherche compact
### Visibilité & accès
- Système à 3 niveaux : Libre / Interne / Interdit
- Protection par mot de passe des fichiers « Interne »
- Authentification admin (login / session PHP)
### Pages statiques (début CMS)
- Pages éditables : À propos (Markdown → HTML)
- Templates header/footer, mise en page responsive
- Cards en grille sur la page d'accueil
### Admin
- Index admin : liste des TFE, pagination, stats
- Export / import CSV
### Admin & gestion des données · 7
- Export / import CSV des TFE
- Index admin : liste, pagination, stats
- Navigation admin dynamique
- CSS admin : composants réutilisables
- CSS admin : composants réutilisables, styles standardisés
### Sécurité
- Auth guard pour le panneau admin
- Correction des failles HIGH et LOW (TODO.SECURITY.md)
### Formulaire & soumission · 5
- Uploads de fichiers (stockage, affichage)
- Structure formulaire : champs obligatoires, validation
- Extraction buildSearchConditions partagé admin/public
### Sécurité · 3
- Auth guard PHP pour le panneau admin (CRITICAL)
- Correction failles HIGH et LOW (TODO.SECURITY.md)
### Autre · 5
- Renommage memoire.php → tfe.php
- CSS fixup, serveur dev avec live-reload
- Analyse de dépendances (TODO.md)
---
## Mars 2026 (74 commits)
### Contrôleurs & architecture
- ThesisCreateController, ThesisEditController : extraction depuis add.php/edit.php (530 lignes → contrôleurs dédiés)
- TfeController, SearchController, HomeController : extraction depuis les pages publiques
- SystemController : unifie status + logs en un onglet système
- App.php : classe fondation + flash messages unifiés
### Répertoire & recherche
- Répertoire en 6 colonnes : années, orientations, AP, mots-clés, noms, compte
- Filtres combinables (AP + mot-clé + orientation simultanément)
- Filtres HTMX sans rechargement de page, URL partageable
- Tri matched-first dans les colonnes de filtre
- Popover étudiant·e (pré-rendu serveur, lazy load)
### Page TFE publique
- Layout complet : auteur > titre > meta + synopsis > fichiers > jury
- Jury interne / externe affiché séparément
- Liens hypertextes vers le répertoire sur les métadonnées
- Open Graph / Twitter Card meta tags
### Base de données
- Migrations : superviseurs multi-rôles, tags renommés depuis keywords
- Vues SQL (v_theses_full, v_smtp_active)
- WAL mode pour SQLite
- Index composites (is_published, year) pour la perf
- Auto-migration au démarrage du serveur
### Sémantique HTML & accessibilité
- Refactor sémantique complet de toutes les pages publiques
- Head partagé, nav sémantique, aria-current, skip links
### Accessibilité & sémantique HTML · 15
- Refactor sémantique complet de toutes les pages publiques et admin
- ARIA : nav aria-label, search role=search, aria-current, skip links
- Status badges non dépendants de la couleur (WCAG 1.4.1)
- Autofocus premier champ invalide (WCAG 3.3.1)
- Sous-titres WebVTT pour vidéos (WCAG 4.1.2)
- Cibles tactiles 44×44px (WCAG 2.5.5)
- Open Graph / Twitter Card meta tags, meta description
- Head partagé public, favicon
### CSS & design
- Suppression de tous les assets externes (self-hosting)
- Polices : Combined (titres) → Ductus, corps en BBBDMSans
- Variables de couleur standardisées
- Dark mode prefers-color-scheme
- Header plus dense, recherche pleine largeur
- Remplacement EasyMDE (333KB) → OverType (118KB)
- Cache-busting par filemtime
### Architecture code · 16
- ThesisCreateController, ThesisEditController : extraction depuis add.php/edit.php (530 lignes → contrôleurs dédiés)
- TfeController, SearchController, HomeController : extraction depuis les pages publiques
- SystemController : unifie status + logs en onglet système
- App.php : classe fondation + flash messages unifiés
- Partials de formulaire réutilisables (jury-fieldset, etc.)
- Nettoyage code mort, suppression alias Database
### Admin
### Répertoire & recherche · 15
- Répertoire en 6 colonnes : années, orientations, AP, mots-clés, noms, compte
- Filtres HTMX sans rechargement, URL partageable
- Tri matched-first dans les colonnes de filtre
- Popover étudiant·e (pré-rendu serveur, lazy load)
- Page TFE publique : layout auteur > titre > meta+synopsis 2-col > fichiers > jury
- Liens hypertextes vers le répertoire sur les métadonnées
### Admin & gestion des données · 8
- Pagination serveur (25/page)
- Tri des colonnes dans l'index
- Merge status + logs → system.php avec onglets fetch()
- Paramètres : maintenance + compte
- Paramètres admin : maintenance + compte
- Dialogue d'import CSV inline
- Gestion des fichiers dans l'édition TFE (couverture, TFE, etc.)
### Formulaire
- Partials de champs de formulaire réutilisables (fieldset-academic, fieldset-metadata, etc.)
- Jury fieldset partagé add/edit
- Aide contextuelle Markdown dans le formulaire
### Formulaire & soumission · 6
- Jury : interne/externe, président·e, promoteurices, lecteurices
- Mode étudiant simulé dans l'admin (?mode=student)
- Aide contextuelle Markdown dans le formulaire
### Email & SMTP
### Email / SMTP · 7
- SmtpRelay : client SMTP natif (socket), AUTH PLAIN, TLS
- Test SMTP, vérification des credentials à la sauvegarde
- Champs from_name, notify_email
- Email de notification admin après soumission
### Ops
### Base de données · 5
- Migrations : superviseurs multi-rôles, tags renommés depuis keywords
- Vues SQL (v_theses_full, v_smtp_active)
- WAL mode pour SQLite
- Index composites (is_published, year)
- Auto-migration au démarrage du serveur
### CSS & design · 3
- Suppression de tous les assets externes (self-hosting)
- Polices : Combined → Ductus (titres), BBBDMSans (corps)
- Variables de couleur standardisées, dark mode
### Ops · 5
- Déploiement : scripts unifiés, justfile
- Renommage Posterg → XAMXAM (code, nginx, docs)
- Rate limiting sur les endpoints partage
- Exclusion du fichier DB et des uploads du rsync
### Autre · 4
- Analyse architecture PHP vs Flask, recommandations refactoring
- flake.nix pour shell de dev Nix
- Instructions DEV.md pour macOS
---
## Avril 2026 (207 commits)
### Uploads & fichiers
### Répertoire & recherche · 28
- Répertoire 6 colonnes : fixed headers, colonnes différenciées, scroll contenu
- Alignement baseline, padding minimal, police conforme maquette
- AP entre crochets (ex: Design et Politique du Multiple [DPM])
- Résultats : cartes sans couverture → gradient placeholder
- Popover étudiant·e : lazy via HTMX, Cache-Control
- Split search.php / repertoire.php (index seul)
- HTMX filter colonnes : contrôle scroll, swap sans perte d'état
### Admin & gestion des données · 34
- Tags admin : search, rename inline, merge bulk, delete
- Langues admin : search, rename, merge, delete, dédoublonnage
- Sidebar TOC (IntersectionObserver), lazy load HTMX
- Bulk actions : merge, delete, export (CSV + fichiers ZIP)
- Colonnes triables (Auteur, Accès)
- Dialogue <dialog> remplace alert/confirm navigateur
- Toasts repositionnés, durée plus longue
- Export DB → paramètres, bouton Mots-clés retiré
- Checkboxes auto-save admin en HTMX
- Import CSV : AP aliases, OUI/NON sanitization
- Index : sticky thead, colspan stats, barre de sélection bulk
### Formulaire & soumission · 45
- Partials de champs unifiés : text-field, select-field, checkbox-list, file-field
- Jury : promoteurices multiples avec ajout/suppression dynamique
- Jury ULB conditionnel (finalité Approfondi)
- Annexes : checkbox + fichier conditionnel dans Fichiers
- Contact visible / contact interne découplés
- Formulaire partage : rate limiting, flash messages, StudentEmail
- CC4r → CC2r renommé
- Fragments HTMX partagés admin / partage : formats+fichiers, licence, langue-autre
- Fragments conditionnels selon formats cochés
- Aide contextuelle Markdown via HTMX
- Identifiant TFE régénéré automatiquement au changement d'année
- Récapitulatif exhaustif admin + étudiant (tous les champs)
- Mode étudiant simulé dans l'admin
### Uploads & fichiers · 25
- **FilePond** remplace les queues custom (495 lignes de JS supprimées)
- Architecture upload asynchrone : process / revert / load / remove
- Pool unique TFE (tous formats : PDF, vidéo, audio)
- Barre de progression d'upload
- Intégration **PeerTube** : upload API, OAuth2, embed iframe
- Vidéos/audio auto-upload vers PeerTube quand activé
- Chiffrement credentials PeerTube + SMTP (AES-256-GCM)
### Fragments HTMX
- Fragments partagés admin / partage : formats + fichiers, licence, langue-autre
- Fragments conditionnels selon les formats cochés (Site web → URL, Vidéo → upload ou PeerTube)
- Aide contextuelle Markdown via HTMX
- Fragments admin wrappés avec auth guard
### Formulaire
- Partials de champs unifiés : text-field, select-field, checkbox-list
- Jury : promoteurices multiples avec ajout/suppression dynamique
- Jury ULB conditionnel (finalité Approfondi)
- Annexes : checkbox + fichier conditionnel
- Contact visible / contact interne découplés
- CC4r → CC2r renommé
- Identifiant TFE régénéré automatiquement au changement d'année
- Validation inline des fichiers (MIME, taille) via HTMX
- Contraintes : 100 MB PDF, 500 MB autres, bentopdf.com
- Bannières mergées dans covers (suppression banner_path)
- FilePond dans partage (endpoints, auth session)
- Prévisualisation des fichiers existants dans FilePond
### Pages statiques CMS
### PeerTube · 8
- Intégration API PeerTube : upload vidéo/audio, OAuth2
- Feature flag (désactivé par défaut, en attente de quota)
- Embed iframe dans tfe.php
- Gestion des fichiers vidéo/audio → PeerTube OU upload direct
### Pages statiques / CMS · 10
- À propos, Charte, Licence : Markdown → HTML, édition admin
- TOC sticky dans la sidebar
- Contenus-edit : OverType, auto-save, liens sidebar dynamiques
- Contacts admin : grille 3 colonnes, ajout/suppression
- Contenus-edit : remplacement EasyMDE → OverType (333→118KB)
- Aide formulaire : blocs d'aide éditables en admin
### Accessibilité
- aria-errormessage, aria-invalid, aria-describedby sur tout le formulaire
- Cibles tactiles 44×44px minimum (WCAG 2.5.5)
- Formulaire responsive mobile (colonnes empilées)
### Gestion des données
- Mots-clés : recherche, rename, merge, delete dans l'admin
- Langues : recherche, rename, merge bulk, dédoublonnage
- Tri des colonnes Auteur et Accès dans l'index admin
- Liens de partage : nom éditable, expiration, dialogue d'édition
### Sécurité
- Obfuscation des emails en entités HTML (EmailObfuscator)
- Content-Security-Policy, HSTS, SameSite cookies, COOP/CORP
- Script de scan passif de sécurité
- Rate limiting, flash messages sur partage
- Corrections non-constant-time (hash_equals)
### CSS & refactoring
### CSS & design · 21
- Architecture CSS en couches : reset → colors → typography → base → components
- Suppression de toutes les classes BEM au profit de sélecteurs sémantiques
- Suppression de toutes les classes BEM sélecteurs sémantiques
- Tokens de design unifiés (couleurs, typographie, espacement)
- Échelle fluide utopia pour typographie et espacement
- Suppression du dark mode, unification des thèmes
- Extraction de tous les styles inline vers CSS
- Polices : Ductus (display), BBBDMSans (body), @font-face corrigé
- Header plus haut, texte plus grand, text-shadow violet
- Cache-busting par filemtime
### Logs & monitoring
- Logging structuré pour les soumissions admin/partage
- AdminLogger : JSON-lines
### Accessibilité · 10
- ARIA complet sur le formulaire : aria-errormessage, aria-invalid, aria-describedby
- WCAG 2.5.5 : cibles tactiles 44×44px
- Formulaire responsive mobile (colonnes empilées à 600px)
- Sémantique HTML admin : dl stats, section cards, th scope, landmarks
### Ops & déploiement
### Sécurité · 9
- Obfuscation des emails en entités HTML (EmailObfuscator)
- Content-Security-Policy (admin + public), HSTS, SameSite cookies
- COOP / CORP headers
- Rate limiting, flash messages partage
- Chiffrement credentials PeerTube + SMTP (AES-256-GCM)
### Architecture code · 18
- Extraction des contrôleurs (create, edit, search, TFE, system)
- Partials de formulaire réutilisables, fragments HTMX partagés
- Dispatcher + front controller (index.php)
- Configuration externalisée (config/apropos.php → SQLite)
- Nettoyage code mort, suppression Parsedown, déduplication
- Tests unitaires + intégration (Phase 04 PHPUnit)
- Linting : PHPStan, PHP-CS-Fixer, Biome
### Email / SMTP · 5
- SmtpRelay : TLS peer verification, envelope injection fix, dot-stuffing
- SMTP test button, credentials probe on save (connect+auth+quit)
- notify_email, email de notification remanié
### Ops & déploiement · 15
- Déploiement automatisé (justfile) : code, dépendances, migrations
- Vérification des permissions post-déploiement
- Backups SQLite cron (horaire + quotidien)
- Merge de toutes les migrations dans schema.sql
- Renommage Posterg → XAMXAM complet
- Exclusion DB/fichiers/backups/logs du rsync
- Maintenance.flag, rate limit cache, .env permissions
- Script de scan passif de sécurité (pentest)
- Scripts de migration, merge schema.sql
### Architecture code
- Extraction des contrôleurs (create, edit, search, TFE, system)
- Partials de formulaire réutilisables
- Dispatcher + front controller (index.php)
- Configuration externalisée (config/apropos.php → SQLite)
### Logs · 5
- AdminLogger : JSON-lines
- Logging structuré pour les soumissions admin/partage
- Log viewer dans system.php avec tail
- Exclusion des logs du git et du déploiement
---
## Mai 2026 (156 commits)
### FilePond — corrections & hardening
- Correction crash « can't access property main, n.status is undefined »
- Tailles de fichiers en bytes (plus de confusion toInt('1GB') = 1)
- Fichiers temporaires survivent au rechargement de page (session-track)
### FilePond & uploads · 30
- Correction crash « can't access property main, n.status is undefined » (triple root cause)
- Tailles en bytes (plus de confusion toInt('1GB') = 1)
- Fichiers temporaires survivent au rechargement (session-track)
- Guard no-JS : filepond_mode désactivé par défaut, fallback serveur
- Relink fichiers orphelins (file browser + intégration FilePond)
- Relink fichiers orphelins : file browser + intégration FilePond
- Trash policy : suppression → tmp/_trash avec traçabilité DB
- Storage prefix : theses/ → documents/
- Nettoyage modal : fichiers orphelins listés, suppression
- Recap admin : suppressions figures, fichiers en table
- FilePond CSV import (storeAsFile, no async)
- Tous les inputs fichiers → FilePond standardisés
- Prévisualisation existante dans FilePond en mode édition
### Autosave & brouillons
### Formulaire & soumission · 42
- Brouillon automatique formulaire partage (HTMX POST/GET session)
- Auto-save admin checkboxes avec toasts de feedback
- Nettoyage périodique des brouillons orphelins (cron)
- Contenus-edit : auto-save avec debounce, toolbar OverType
- Autosave contenus-edit avec debounce, toolbar OverType
- Thesis status column (two-phase commit lifecycle)
- FormBootstrap : DRY entre add/edit
- Extraction partage chrome → form-page.php partagé
- Split form.css → form-base.css + form-admin.css
- Fragments admin/partage séparés (auth + shared templates)
- Licence : Libre→CC2r+licence, Interne→opt-in, Interdit→none
- Corrections formulaire : identifiant/année, contact, fichiers optionnels
- Author name casing (COLLATE NOCASE, idHint lookup)
- Contact visible / interne découplage complet (v2)
- is_published reset fix, note contextuelle label
- Promoteurice array repopulation, migration 028 fix
- Export fichiers ZIP avec LINK.txt (URLs PeerTube)
- Jury fieldset : old() avec signature corrigée pour partage
### Build & assets
- **Biome** : linting + formatting CSS/JS
- **Rolldown** : bundling JS par entrée
- **LightningCSS** : résolution @import, minification CSS
- Pipeline build orchestré (build.mjs)
- Dev-watch avec chokidar-cli (reconstruction ~200ms)
- dist/ pour les assets minifiés, .gitignore
### Gzip & extraction JS
- Gzip activé dans nginx
- ~730 lignes de JS inline → 15 fichiers externes
- Modules : admin-logs, clipboard, pill-search, access-request
### Tests
### Tests & QA · 15
- PHPUnit setup : 228 tests, couverture 21,27%
- Tests unitaires : Crypto, EmailObfuscator, SystemController, StudentEmail, TfeController
- Tests intégration : Database, ShareLink, RateLimit
- Tests validation : ThesisCreate, ThesisEdit, AutofocusField
- PHPStan + PHP-CS-Fixer + Biome pour le linting
- Lint-php recipe unifié
- Correction test failures + duplicate detection bug
### Dépendances & modernisation
### Dépendances & modernisation · 8
- Composer.json avec autoloader
- Parsedown → league/commonmark
- Client HTTP custom → Guzzle
- SMTP socket → PHPMailer
- Code coverage configuration (phpunit.xml)
### Logging
### Logging · 6
- **Monolog** : 4 canaux PSR-3 (app, admin, error, audit)
- Rotation 30 jours, format JSON préservé
- Remplace 4 systèmes de log distincts
- Remplace 4 systèmes de log distincts (AdminLogger, AppLogger, ErrorHandler, Audit)
- LOG_LEVEL par variable d'environnement
- Log viewer : JSON parsé en one-liners lisibles, fallback tail PHP
### CSS — refactor architecture
### CSS — refactor architecture · 10
- Split en couches nommées (reset, colors, typography, base, components, utilities)
- Un fichier par composant (links, focus, forms, tables, dialog, etc.)
- Un fichier par composant (links, focus, forms, tables, dialog, media, buttons, badges, toasts, pagination, header, search)
- Compatibilité backward (variables.css, common.css wrappers)
- Corrections vs refactoring initial : modern-normalize base, !important search, toast feedback
- Unnest header.css, suppression doublons status-badge/toast
### UI / UX
- SVG icons inline via helper PHP (icon()) — plus aucun <img> pour les icônes
- Build pipeline CSS/JS
- Dev-watch avec reconstruction live
- Scroll-position memory sur swaps HTMX (répertoire)
- Transition + swap fluide sur le répertoire
- Correctifs sécurité (open redirect, CSRF partage, gate session)
### Search & filtres · 6
- Recherche publique : un seul grand input, icône loupe positionnée
- Filtres finalité + format, boutons plus compacts, Réinitialiser neutre
- Filtres actifs dans l'index admin (htmx triggers input/change)
### Divers
- Recap admin : sections → fieldsets, fichiers en table
- FormBootstrap : DRY entre add/edit
- Colonne thesis_status (two-phase commit lifecycle)
### Admin · 12
- Contenus : Mots-clés + Langues fieldset, sticky thead, max-height scroll
- Export : bulk CSV + fichiers, DB export → Paramètres
- Dialogue import : bouton Terminé, succès permanent, padding
- Sortable columns Auteur/Accès
- Sticky thead sur index, langues, mots-clés tables
- Rename Liens étudiant·e → ajout nom + dialogue d'édition
- Recapitulatif admin : sections → fieldsets, pas de thumbnails
### Divers · 27
- Déploiement : split deploy-code/deploy-deps/deploy-migrate, lockfile checksum
- Export fichiers ZIP avec LINK.txt (URLs PeerTube)
- Correctifs : identifier year-prefix mismatch, author name casing, contact découplage v2
- CSV import : AP aliases, OUI/NON sanitization
- Rate limits relevés (30→300/min sur certains endpoints)
- Migration runner : .php migrations, idempotent (no such column)
- Backups SQLite cron, trigger-backup, test-restore
- Production fixes : client_max_body_size 256M, bars.svg 404, nginx rate limit 300r/m
- Merge SMTP fields → single fieldset "Emails"
- CSV import : AP aliases, boolean fix, jury roles
- Migration 033 deduplicate format_types, 025 fix lowercase collision
- PeerTube : embed audio player height, fix curl_close, fix upload (multipart POST)
- Standardisation : .btn, multi-auteur, sticky save/cancel
- Avant/après unload dialog fix, bookmark.md draggable
- Sécurité : pentest script PEP 723, CSP headers, session cookie params
---
## Juin 2026 (82 commits)
### Icônes SVG
### Icônes SVG · 8
- Migration complète <img> → SVG inline via icon() helper PHP
- 26 templates modifiés
- 12 icônes SVG corrigées (fill="#000000" → fill="currentColor")
- Icône recherche remplacée (Phosphor fill-based magnifying glass)
- 26 templates modifiés, 12 icônes corrigées (fill→currentColor)
- Icône recherche remplacée (Phosphor fill-based)
- Nettoyage modal : SVG icons, padding/margin, BBBDMSans
### Pages statiques & TOC
- Refonte À propos / Charte / Licence : layout partagé en grille
### Pages statiques & TOC · 7
- Refonte À propos / Charte / Licence : layout partagé en grille .page-content
- TOC sticky → details/summary responsive (collapsible sur mobile)
- Ancres de titres stables (CommonMark HeadingPermalinkExtension)
- Styles liens standardisés
- Styles liens standardisés, fix heading anchor links
- Apropos : contacts flexibles, sidebar éditables, grille contacts admin
- Content-page.css remplace apropos.css (partagé 3 pages)
### Répertoire — polissage UX
### Répertoire · 14
- Accordéon mobile pour les colonnes de filtre (≤640px)
- Toggle, chevron, badge compteur de filtres actifs
- Tri des colonnes : matched first, puis unmatched, puis alphabétique
- Tri des colonnes : matched first, puis unmatched, alphabetique
- Mots-clés : résultats viables en haut
- Suppression de la chip bar mobile
- Correction re-init accordéon après swap HTMX (bug DOM détaché)
- Scroll colonnes répertoire : min-height: 0, overflow-y: auto
- Scroll colonnes : min-height: 0, overflow-y: auto
- Scroll-position memory sur swaps HTMX
- Transition opacité fluide sur #repertoire-index
- CSS répertoire : colonnes proportionnelles, scrollbars discrètes, fontes maquette
- Fix word-break dans les en-têtes de colonnes
### Formulaire — accessibilité & robustesse
- aria-errormessage, aria-invalid, aria-describedby sur tous les champs
- Layout mobile responsive (champs empilés, 44×44px touch targets)
- Autosave brouillon formulaire partage (session persistence)
- Guard no-JS (filepond_mode désactivé par défaut)
### Formulaire · 22
- **Accessibilité** : aria-errormessage, aria-invalid, aria-describedby sur tout le formulaire
- Layout mobile responsive (600px) : champs empilés, touch targets 44×44px
- Autosave brouillon partage (fragment endpoint POST/GET, session persistence)
- Guard no-JS uploads (filepond_mode disabled par défaut, fallback serveur)
- Preserve fichiers temporaires FilePond après redirection validation
- FormBootstrap extraction
- Thesis status column (two-phase commit)
- FormAdmin CSS séparé
### Uploads & fichiers
- PHP upload limits → 8GB (vidéos)
- Nettoyage dialog : suppression doublons, hx-confirm sur delete
- Type hint adminOld corrigé (string → string|array)
### Durée TFE · 4
- Colonnes DB (duration_hours, duration_minutes, duration_seconds)
- Champs formulaire : h:m:s au lieu de minutes/sec/heures
- Affichage public : format XhYm
- Migration + contrôleurs + vues
### Build & performance
- Pipeline build CSS/JS (biome + rolldown + lightningcss)
- Dev-watch chokidar-cli
- Gzip nginx + extraction JS inline (730 lignes → 15 fichiers)
- Biome lint fixes (CSS duplicate properties, JS arrow functions)
### Contenus & CMS
- Auto-save avec OverType toolbar sur contenus-edit
- Liens sidebar dynamiques (site ERG, code source)
- Markdown cheatsheet : rendu réel dans la colonne d'exemple
- Page Charte ajoutée (publique + admin)
### TFE — métadonnées
- Durée : colonnes DB, champs formulaire, affichage XhYm
### TFE — corrections métadonnées · 8
- Finalité master affichée sur la page publique
- Identifiant régénéré si mismatch année
- Identifiant régénéré si mismatch année (préfixe 4 chiffres)
- Author name casing corrigé (COLLATE NOCASE, idHint lookup)
- Suppression vidéos PeerTube lors de la suppression d'un TFE
- CC2r + licence affichés sur tfe.php, formatage contact court
- Meta+synopsis en grille 2 colonnes, underline retiré, inclusive writing
### Sécurité
### Build & performance · 12
- **Pipeline build** : biome (lint/format) + rolldown (JS bundles) + lightningcss (CSS bundles/minify)
- Gzip activé dans nginx
- ~730 lignes de JS inline → 15 fichiers externes
- Dev-watch avec chokidar-cli (reconstruction ~200ms)
- dist/ pour les assets minifiés
- .gitignore vendor/ path, storage/tmp/filepond/
### Sécurité · 8
- Open redirect fix : rejet des URLs protocol-relative (//evil.com)
- CSRF sur retry-email POST
- Gate partage fragments sur session share_active
- CSRF sur retry-email POST, gate partage fragments sur share_active session
- Suppression App::verifyCsrf() mort
- PHP upload limits → 8GB pour vidéos (8192M)
- Biome lint fixes (duplicate CSS, arrow functions)
### Divers
### Cleanup & divers · 7
- Nettoyage dialog : suppression doublons, hx-confirm sur delete
- Correctif logs capturés, debug console.log retiré
- Type hint adminOld corrigé (string → string|array)
- Index SQLite pour requêtes langues/tags (contenus page)
- Correctif logs capturés
- Nettoyage .gitignore, vendor/
- Cleanup dialog
- TFE page : CC2r + licence, formatage contact court
- Recherche : filtres finalité + format, bouton Réinitialiser neutre
- TODO à jour, tasks sécurité complétées