# Livraisons par mois — xamxam ## Janvier 2026 (8 commits) ### 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, READMEs - Nginx config + déploiement fonctionnel --- ## Février 2026 (29 commits) ### 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 ### Admin & gestion des données · 7 - Export / import CSV des TFE - Index admin : liste, pagination, stats - Navigation admin dynamique - CSS admin : composants réutilisables, styles standardisés ### 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) ### 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 ### 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 ### 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 admin : maintenance + compte - Dialogue d'import CSV inline ### 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 · 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 ### 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 ### 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) ### 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 - 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 ### 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 : remplacement EasyMDE → OverType (333→118KB) - Aide formulaire : blocs d'aide éditables en admin ### CSS & design · 21 - Architecture CSS en couches : reset → colors → typography → base → components - 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 ### 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 ### 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) - 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 ### 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 & 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 - 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 ### 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) - 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 ### 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 · 8 - Composer.json avec autoloader - Parsedown → league/commonmark - Client HTTP custom → Guzzle - SMTP socket → PHPMailer - Code coverage configuration (phpunit.xml) ### 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 (AdminLogger, AppLogger, ErrorHandler, Audit) - LOG_LEVEL par variable d'environnement - Log viewer : JSON parsé en one-liners lisibles, fallback tail PHP ### CSS — refactor architecture · 10 - Split en couches nommées (reset, colors, typography, base, components, utilities) - 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 ### 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) ### 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 - 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 · 8 - Migration complète → SVG inline via icon() helper PHP - 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 · 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, fix heading anchor links - Apropos : contacts flexibles, sidebar éditables, grille contacts admin - Content-page.css remplace apropos.css (partagé 3 pages) ### 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, 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 : 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 · 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é ### 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 ### TFE — corrections métadonnées · 8 - Finalité master affichée sur la page publique - 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 ### 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 share_active session - Suppression App::verifyCsrf() mort - PHP upload limits → 8GB pour vidéos (8192M) - Biome lint fixes (duplicate CSS, arrow functions) ### 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) - TODO à jour, tasks sécurité complétées