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