Files
xamxam/docs/LIVRAISONS_PAR_MOIS.md

404 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 <dialog> 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 <img> → 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