diff --git a/docs/LIVRAISONS_PAR_MOIS.md b/docs/LIVRAISONS_PAR_MOIS.md index 02a7f90..2fa33f8 100644 --- a/docs/LIVRAISONS_PAR_MOIS.md +++ b/docs/LIVRAISONS_PAR_MOIS.md @@ -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 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 0–4 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 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 → 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