Files
xamxam/docs/LIVRAISONS_PAR_MOIS.md
T

17 KiB
Raw Blame History

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