From d2683a02e0a175bef29cbfbd43ed2d3db5784e6a Mon Sep 17 00:00:00 2001 From: Alpinux Date: Wed, 6 May 2026 10:43:54 +0200 Subject: [PATCH] feat: stats corbeille dans le tableau de bord MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nouvelle stat box cliquable (→ /trash) affichant le nombre de fichiers, la taille totale et la date du plus ancien fichier en corbeille. Co-Authored-By: Claude Sonnet 4.6 --- app/app.py | 20 ++++++++++++++++++++ app/static/app.css | 5 +++++ app/templates/dashboard.html | 9 +++++++++ 3 files changed, 34 insertions(+) diff --git a/app/app.py b/app/app.py index 209b636..ad90ab2 100644 --- a/app/app.py +++ b/app/app.py @@ -279,6 +279,25 @@ def _trash_count() -> int: if f.is_file() and not f.name.endswith(".trashinfo")) +def _trash_stats() -> dict: + if not TRASH_ROOT.exists(): + return {"files": 0, "size": 0, "oldest": None} + files, size, oldest = 0, 0, None + for f in TRASH_ROOT.rglob("*"): + if not f.is_file() or f.name.endswith(".trashinfo"): + continue + files += 1 + size += f.stat().st_size + info = Path(str(f) + ".trashinfo") + try: + dt = datetime.fromisoformat(json.loads(info.read_text())["deleted_at"]) + if oldest is None or dt < oldest: + oldest = dt + except Exception: + pass + return {"files": files, "size": size, "oldest": oldest} + + def _folder_stats(path: Path) -> dict: files, size = 0, 0 for f in path.rglob("*"): @@ -399,6 +418,7 @@ def dashboard(): folders=folders, total_files=sum(v["files"] for v in folders.values()), total_size=sum(v["size"] for v in folders.values()), + trash=_trash_stats(), humansize=_humansize, ) diff --git a/app/static/app.css b/app/static/app.css index 8b6f078..1d328ad 100644 --- a/app/static/app.css +++ b/app/static/app.css @@ -51,6 +51,11 @@ main { max-width: 1100px; margin: 2rem auto; padding: 0 1.5rem 3rem; display: fl .stat-box { flex: 1; min-width: 160px; background: var(--blue-light); border-radius: 8px; padding: 1.2rem 1.5rem; } .stat-box .label { font-size: .78rem; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; margin-bottom: .4rem; } .stat-box .value { font-size: 1.9rem; font-weight: 700; color: var(--blue-dark); line-height: 1; } +.stat-box .stat-sub { font-size: .75rem; color: var(--muted); margin-top: .35rem; } +.stat-box--trash { background: #fef2f2; text-decoration: none; transition: box-shadow .15s; cursor: pointer; } +.stat-box--trash:hover { box-shadow: 0 4px 16px rgba(239,68,68,.18); text-decoration: none; } +.stat-box--trash .label { color: #b91c1c; } +.stat-box--trash .value { color: #991b1b; } /* ── Grille de dossiers ───────────────────────────────────────── */ .folder-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 1rem; } diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 2a8eba3..13b501d 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -16,6 +16,15 @@
Dossiers
{{ folders | length }}
+ +
Corbeille
+
{{ trash.files }}
+
{{ humansize(trash.size) }} + {% if trash.oldest %} + · depuis le {{ trash.oldest.strftime('%d/%m/%Y') }} + {% endif %} +
+