Files
xamxam/docs/LIVRAISONS_PAR_MOIS.md
T

13 KiB
Raw Blame History

Livraisons par mois — xamxam

Janvier 2026 (8 commits)

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 & 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)

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)

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
  • 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 — 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/

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)
  • 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)

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)

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