From 4b6f9212b5124b41724c16548923e4f21ac30466 Mon Sep 17 00:00:00 2001 From: Pontoporeia Date: Mon, 29 Jun 2026 17:48:56 +0200 Subject: [PATCH] Docs: regrouper livraisons par familles fonctionnelles dans chaque mois --- docs/LIVRAISONS_PAR_MOIS.md | 418 ++++++++++++++++++++++++++---------- 1 file changed, 302 insertions(+), 116 deletions(-) diff --git a/docs/LIVRAISONS_PAR_MOIS.md b/docs/LIVRAISONS_PAR_MOIS.md index 1ae1c25..02a7f90 100644 --- a/docs/LIVRAISONS_PAR_MOIS.md +++ b/docs/LIVRAISONS_PAR_MOIS.md @@ -2,138 +2,324 @@ ## Janvier 2026 (8 commits) -- Site public affichant le contenu de la DB + fichiers -- Formulaire de soumission séparé → écriture en base -- Première version des contrôleurs TFE (création, édition) -- Structure initiale du projet : routing, templates, DB SQLite -- Schéma de base de données (theses, auteurs, formats, langues, etc.) +### Structure initiale +- Schéma SQLite : tables theses, auteurs, formats, langues, tags, fichiers +- Monorepo : organisation en dossiers (formulaire, templates, src, admin) +- Justfile, .gitignore, documentation (READMEs) +- Nginx config + déploiement fonctionnel +- Système de recherche sécurisé ## Février 2026 (29 commits) -- Formulaire admin + formulaire étudiant (partage) -- Soumissions étudiant via liens de partage (share links) -- Système de visibilité : Libre / Interne / Interdit -- Pages statiques éditables (À propos) → début du CMS -- Gestion des fichiers uploadés (stockage, affichage) -- Export CSV des TFE -- Import CSV des TFE -- Structure admin : index, navigation, table listant les TFE -- Base du système de licences (CC2r) +### 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) + +### 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 +- Navigation admin dynamique +- CSS admin : composants réutilisables + +### Sécurité +- Auth guard pour le panneau admin +- Correction des failles HIGH et LOW (TODO.SECURITY.md) ## Mars 2026 (74 commits) -- Édition / correction / suppression des entrées TFE dans l'admin -- Récapitulatif admin après soumission -- Affichage public des TFE (page tfe.php) -- Moteur de recherche dans le répertoire (par nom) -- Filtres par orientation, AP, année, langue, finalité -- Système d'authentification admin (login / mot de passe / session) -- Protection par mot de passe des fichiers « Interne » -- Données internes : points du jury, remarques, lien BAIU, exemplaires -- Colonnes du répertoire : années, orientations, AP, mots-clés, noms -- Rework CSS majeur (variables, typographie, thème clair/sombre) -- Intégration HTMX pour les interactions dynamiques -- Upload de fichiers avec queues JS (avant FilePond) -- Structure formulaire : champs conditionnels selon les formats -- PDF obligatoire / optionnel selon les formats -- Jury (promoteurices, lecteurices) dans le formulaire admin +### 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 +- 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) + +### 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 + +### Admin +- Pagination serveur (25/page) +- Tri des colonnes dans l'index +- Merge status + logs → system.php avec onglets fetch() +- Paramètres : 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 +- Mode étudiant simulé dans l'admin (?mode=student) + +### Email & SMTP +- 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 +- 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 ## Avril 2026 (207 commits) -- Refonte complète des uploads : FilePond remplace les queues custom -- Architecture d'upload asynchrone FilePond (process/revert/load/remove) -- Pool unique TFE acceptant tous les formats (vidéo, audio, etc.) -- Upload de masse avec barre de progression -- Intégration PeerTube pour vidéos / audio (upload API, embed) -- Système de brouillon automatique (autosave) pour le formulaire partage -- Fragments HTMX partagés admin / partage (formats, fichiers, licence) -- Extraction du JS inline en modules externes (admin-logs, clipboard, pill-search, etc.) -- Composant pill-search pour mots-clés et langues (autocomplete HTMX) -- Gestion des mots-clés et langues dans l'admin (rename, merge, delete) -- TOC sidebar dans les pages admin (IntersectionObserver) -- Tri des colonnes dans l'index admin (Auteur, Accès, etc.) -- Liens de partage : nom éditable, expiration, dialogue d'édition -- Obfuscation des emails en entités HTML (EmailObfuscator) -- Récapitulatif exhaustif (partage + admin) -- Champs conditionnels : website URL, annexes, PeerTube vs. upload direct -- Promoteurices multiples (interne + ULB) avec ajout/suppression dynamique -- Formulaire mobile responsive +### Uploads & fichiers +- **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 -- CC2r renommé (ex-CC4r), restructuration des licences -- Pages statiques : Charte, Licence, À propos avec TOC sticky -- Checkboxes admin en auto-save HTMX avec toasts de feedback -- Backups SQLite automatisés (horaire + quotidien, cron) -- Déploiement : recettes justfile, vérification permissions, migrations incrémentales -- Content-Security-Policy, HSTS, SameSite cookies -- Script de scan passif de sécu (pentest) -- Chiffrement du mot de passe SMTP (AES-256-GCM) -- Rate limiting sur les endpoints sensibles +- CC4r → CC2r renommé +- Identifiant TFE régénéré automatiquement au changement d'année +- Validation inline des fichiers (MIME, taille) via HTMX + +### Pages statiques CMS +- À 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 + +### 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 +- Architecture CSS en couches : reset → colors → typography → base → components +- Suppression de toutes les classes BEM au profit de 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 + +### Logs & monitoring +- Logging structuré pour les soumissions admin/partage +- AdminLogger : JSON-lines + +### Ops & déploiement +- 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 + +### 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) ## Mai 2026 (156 commits) -- FilePond : correction crash « can't access property main », tailles en bytes -- Fichiers temporaires FilePond survivent au rechargement de page -- Relink de fichiers orphelins (file browser + FilePond integration) -- Trash policy : suppression → tmp/_trash avec traçabilité +### 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) +- Guard no-JS : filepond_mode désactivé par défaut, fallback serveur +- Relink fichiers orphelins (file browser + intégration FilePond) +- Trash policy : suppression → tmp/_trash avec traçabilité DB - Storage prefix : theses/ → documents/ -- Recap admin : sections → fieldsets, fichiers en table -- Extraction de FormBootstrap pour DRY add/edit -- Système de colonnes thesis_status (two-phase commit lifecycle) -- Draft autosave avec persistence session (HTMX POST/GET fragments) -- Guard no-JS file uploads (filepond_mode désactivé par défaut) -- Accessibilité formulaire : aria-errormessage, aria-invalid, aria-describedby -- Cibles tactiles 44×44px minimum (WCAG 2.5.5) + +### Autosave & brouillons +- Brouillon automatique formulaire partage (HTMX POST/GET session) +- Auto-save admin checkboxes avec toasts de feedback - Nettoyage périodique des brouillons orphelins (cron) -- Durée TFE : colonnes DB, champs formulaire, affichage XhYm -- Déploiement : split deploy-code/deploy-deps/deploy-migrate -- Intégration Monolog : 4 canaux PSR-3 remplaçant 4 systèmes de log -- Tests PHPUnit : 228 tests, couverture 21,27% -- Remplacement Parsedown → league/commonmark -- Remplacement client HTTP custom → Guzzle -- Remplacement SMTP socket → PHPMailer -- Composer.json et autoloader -- Refactor architecture CSS : layers (reset → colors → typography → base → components) -- Composants CSS dédiés par fichier (links, focus, forms, tables, dialog, etc.) -- SVG icons inline via helper PHP (icon()) — plus de pour icônes -- Style global : liens regular, body light, hover violet, police BBB DM Sans -- Page TFE : layout auteur > titre > meta + synopsis 2-col > fichiers flex -- Répertoire : colonnes triées (match first), scrollbars discrètes, pas de chip bar mobile -- Accordéon mobile pour les filtres du répertoire -- Détails/summary TOC pour pages statiques (responsive) -- Contenus-edit : auto-save, toolbar OverType, liens sidebar dynamiques -- Gestion des contacts admin (grille 3 colonnes, suppression, réindexation) -- Corrections d'identifiants (year-prefix mismatch), migrations PHP -- Fix contact_interne / contact_visible (découplage complet) -- Author name casing (COLLATE NOCASE, idHint lookup) -- Finalité master affichée sur la page publique TFE -- Suppression vidéos PeerTube lors de la suppression d'un TFE -- Nettoyage logs, gitignore vendor/, icône de recherche -- Build pipeline : biome + rolldown + lightningcss (bundling/minification) -- Dev-watch avec chokidar-cli (reconstruction live) -- Gzip activé dans nginx + ~730 lignes de JS inline → 15 fichiers externes -- Scroll-position memory sur les swaps HTMX du répertoire -- Correctifs sécu (open redirect, CSRF partage, gate session, verifyCsrf) -- Biome lint fixes (duplicate CSS, arrow functions) +- Contenus-edit : auto-save avec debounce, toolbar OverType + +### 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 +- 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 + +### Dépendances & modernisation +- Composer.json avec autoloader +- Parsedown → league/commonmark +- Client HTTP custom → Guzzle +- SMTP socket → PHPMailer + +### Logging +- **Monolog** : 4 canaux PSR-3 (app, admin, error, audit) +- Rotation 30 jours, format JSON préservé +- Remplace 4 systèmes de log distincts +- LOG_LEVEL par variable d'environnement + +### CSS — refactor architecture +- Split en couches nommées (reset, colors, typography, base, components, utilities) +- Un fichier par composant (links, focus, forms, tables, dialog, etc.) +- Compatibilité backward (variables.css, common.css wrappers) + +### UI / UX +- SVG icons inline via helper PHP (icon()) — plus aucun 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) + +### Divers +- Recap admin : sections → fieldsets, fichiers en table +- FormBootstrap : DRY entre add/edit +- Colonne thesis_status (two-phase commit lifecycle) +- 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) ## Juin 2026 (82 commits) -- Migration icônes → SVG inline (26 templates, helper icon()) -- Cleanup dialog : suppression doublons, hx-confirm sur delete -- Refonte pages statiques (layout partagé, TOC sticky) -- PHP upload limits → 8GB pour vidéos -- Debug leftover crash HTMX FormData(fieldset) +### Icônes SVG +- Migration complète → 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) + +### Pages statiques & TOC +- Refonte À propos / Charte / Licence : layout partagé en grille +- TOC sticky → details/summary responsive (collapsible sur mobile) +- Ancres de titres stables (CommonMark HeadingPermalinkExtension) +- Styles liens standardisés + +### Répertoire — polissage UX +- 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 +- 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-position memory sur swaps HTMX + +### 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) +- Preserve fichiers temporaires FilePond après redirection validation + +### Uploads & fichiers +- PHP upload limits → 8GB (vidéos) +- Nettoyage dialog : suppression doublons, hx-confirm sur delete - Type hint adminOld corrigé (string → string|array) -- Index SQLite pour requêtes langues/tags -- Accordéon mobile répertoire : toggle, chevron, badge actif -- Remplacement sticky nav par details/summary TOC responsive -- Icône recherche corrigée -- Scroll colonnes répertoire + admin TOC duplication -- Filtres répertoire : tri matched-first, mot-clés en haut -- Suppression chip bar mobile -- Accordéon re-init après HTMX swap (bug DOM détaché) -- Gzip + extraction JS inline -- Build pipeline CSS/JS -- Dev-watch -- Transition scroll + swap fluide sur répertoire -- Correctifs sécu (csrf partage, open redirect, verifyCsrf) -- TODO et tasks de sécu complétés + +### 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 +- Finalité master affichée sur la page publique +- Identifiant régénéré si mismatch année +- Author name casing corrigé (COLLATE NOCASE, idHint lookup) +- Suppression vidéos PeerTube lors de la suppression d'un TFE + +### Sécurité +- Open redirect fix : rejet des URLs protocol-relative (//evil.com) +- CSRF sur retry-email POST +- Gate partage fragments sur session share_active +- Suppression App::verifyCsrf() mort + +### Divers +- 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