mirror of
https://codeberg.org/PostERG/xamxam.git
synced 2026-08-10 07:11:18 +02:00
404 lines
17 KiB
Markdown
404 lines
17 KiB
Markdown
# 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 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 <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
|