#53 résumé req/IPs par statut dans Erreurs 404
#54 titre onglet avec compteur non résolus
#2 Tout/Aucun dans resize (tailles + formats)
#7 backup filename affiché dans résultats resize
#8 flash message résumé après upload
#6 renommage inline sur preview_text + preview_other
#23 filtre + tri par nom/taille/date dans corbeille
#20 sélection multiple + batch restore/delete corbeille
#45 /sitemap.xml (assets publics)
#52 ignoreip fail2ban sync sur Ignorer/Retirer une IP
#1 cairosvg>=2.7 dans requirements.txt
#51 ignored_ips.json exclu du rsync --delete
#48 as_cache/ exclu du rsync --delete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La page /errors/ intègre désormais deux onglets (Erreurs 404 et Bannissements)
activés via hash URL (#errors / #banned). Le lien "Bannis" disparaît de la nav,
la route /errors/banned/ redirige vers /errors/#banned.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- /errors/banned/ : bannissements groupés par AS (nom, pays, nb entrées)
- Déblocage IP seule ou AS entier via POST /errors/unban
- Filtre dynamique par IP/CIDR/nom AS, mise à jour DOM sans rechargement
- Nav header + sudoers unbanip
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Onglet "Erreurs" dans la navigation
- Analyse des logs Apache des 7 derniers jours (.gz inclus)
- Tableau trié par nombre de requêtes avec badge statut (résolu/actif)
- Détail AJAX par chemin : IPs, compteurs, referers
- Vérification live au clic sur le point de statut
- Ignorer une IP (persisté dans ignored_ips.json, cache invalidé)
- Bannir une IP via fail2ban-client (global-blacklist)
- Section IPs ignorées avec suppression depuis la page
Closes#37#38#39#40#41
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
max-width:none + margin:auto sur flex child causait le rétrécissement
de main. Remplacé par width:100% + sélecteurs d'attribut html[data-cw].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Ajout de type="button" sur les boutons du sélecteur (évite le submit)
- Initialisation de --content-width dans <head> pour éviter le flash
- Séparation init CSS (head) / gestion active (body)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fichier VERSION (1.4.0) lu par l'app au démarrage
- CHANGELOG.md versionné (v1.0.0 → v1.4.0)
- Route /changelog avec parsing du markdown et rendu structuré
- Lien cliquable sur le numéro de version dans le footer
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute 4 boutons dans le header pour choisir la largeur du contenu :
- S : ~900 px M : ~1200 px L : ~1600 px ∞ : plein écran
La préférence est mémorisée en localStorage et appliquée instantanément
via la CSS custom property --content-width sur <main>.
Closes#33
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Footer sombre (même couleur que le header) avec logo, liens nav et
version git (commit court). Body en flex-column + main flex:1
garantit que le footer reste en bas même sur les pages courtes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Route /trash/preview/<path> : réutilise preview_image/text/other.html
avec from_trash=True (← Corbeille, pas de rename ni de resize)
- Nom de fichier cliquable dans la liste corbeille → aperçu
- Suppression du lien "Tableau de bord" du header (doublon avec le logo)
- Ferme #25
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Réduit le padding nav (wrap évité sur "Tableau de bord"), remplace
"Nom complet + bouton Déconnexion" par un avatar cercle + prénom +
icône ⎋ avec tooltip, libérant ~120px horizontaux.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Suppression déplace dans .trash/ (arborescence préservée + .trashinfo)
- /trash : liste, restauration (conflit overwrite/rename), suppression
définitive, vidage complet
- Purge automatique des fichiers > 30 jours à chaque visite /trash
- Badge rouge dans la nav avec le nombre de fichiers en corbeille
- Extraction du tableau de fichiers en partial _file_table.html
partagé entre browse et trash
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Ajoute la route POST /upload (admin uniquement) et la zone de dépôt
dans browse.html — glisser-déposer ou sélection multiple, destination
= dossier courant du navigateur.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>