From 597b6816a7020a7a2f82d20045b472833c86e8d8 Mon Sep 17 00:00:00 2001 From: Sandro Date: Sat, 31 Oct 2026 09:36:50 +0100 Subject: [PATCH] fix(triage): queue folds closed again with animation; deck follows changes from other devices Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 9 ++- frontend/package-lock.json | 4 +- frontend/package.json | 2 +- frontend/src/App.tsx | 20 ++++- frontend/src/features/triage/TriageDeck.tsx | 81 ++++++++++++--------- 5 files changed, 77 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f5fa0b..5ec1ef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V ## [Unreleased] +## [0.15.1] - 2026-10-31 + +### Fixed +- Triage am Handy: Die Warteschlange lässt sich wieder zuklappen („Warteschlange ausblenden“) und fährt beim Auf- und Zuklappen weich auf bzw. zu. +- Triage auf dem Desktop: Notizen, die auf einem anderen Gerät einsortiert oder gelöscht wurden, verschwinden jetzt sofort auch hier (bisher wurde nur der Aufgaben-Tab aktualisiert). Kommt der Tab wieder in den Vordergrund, lädt er außerdem neu, falls Änderungen im Hintergrund verpasst wurden. + ## [0.15.0] - 2026-10-31 ### Changed @@ -358,7 +364,8 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V - Geteilte Listen (Einkaufs-, Pack- und Checklisten) mit `#Kategorie`-Gruppierung, Mengenangaben und Echtzeit-Abhaken. - Benutzer-, Gruppen- und Admin-Verwaltung (Ersteinrichtungs-Assistent, Einladungscodes, Profilbilder, persönliche API-Keys & Webhook-Ingest `/api/v1/webhooks/ingest`, JSON-Datenexport) sowie CSS-Theme-Engine mit 4 Themes (`Dark`, `Light`, `High Contrast`, `Soft`) und PWA-Unterstützung. -[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.15.0...dev +[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.15.1...dev +[0.15.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.15.0...v0.15.1 [0.15.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.14.3...v0.15.0 [0.14.3]: https://git.dsit.me/sandrodach/MindSift/compare/v0.14.2...v0.14.3 [0.14.2]: https://git.dsit.me/sandrodach/MindSift/compare/v0.14.1...v0.14.2 diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d7d4581..03f3632 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mindsift-frontend", - "version": "0.15.0", + "version": "0.15.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mindsift-frontend", - "version": "0.15.0", + "version": "0.15.1", "license": "Unlicense", "dependencies": { "@fontsource-variable/inter": "5.3.0", diff --git a/frontend/package.json b/frontend/package.json index 3977dc4..3df452e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.15.0", + "version": "0.15.1", "license": "Unlicense", "type": "module", "scripts": { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 0e1a8e3..0aa65d3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -628,8 +628,20 @@ export const App: React.FC = () => { }, 5000); }, []); - // Refresh stats on task/doc/list real-time events (counters in the navigation) + // Refresh stats on task/doc/list real-time events (counters in the navigation). Task events also + // reload the triage deck: a note sorted on another device must leave this deck too. useEffect(() => { + let deckTimer: number | undefined; + const reloadDeck = () => { + window.clearTimeout(deckTimer); + deckTimer = window.setTimeout(() => { + api.getTriageDeck().then((res) => setDeck(Array.isArray(res) ? res : [])).catch(() => {}); + }, 300); + }; + // Events missed while the tab slept (desktop in the background, connection dropped) + const onVisible = () => { + if (document.visibilityState === 'visible' && getToken()) refreshAll(); + }; const handleWs = (e: any) => { const msg = e.detail; if (!msg) return; @@ -644,13 +656,17 @@ export const App: React.FC = () => { api.getMe().then((res) => { setStats(res.stats); }).catch(() => {}); + if (msg.event.startsWith('TASK_')) reloadDeck(); } }; window.addEventListener('mindsift:ws', handleWs); + document.addEventListener('visibilitychange', onVisible); return () => { + window.clearTimeout(deckTimer); window.removeEventListener('mindsift:ws', handleWs); + document.removeEventListener('visibilitychange', onVisible); }; - }, []); + }, [refreshAll]); // Close profile dropdown on outside click useEffect(() => { diff --git a/frontend/src/features/triage/TriageDeck.tsx b/frontend/src/features/triage/TriageDeck.tsx index 2e4337d..09361ea 100644 --- a/frontend/src/features/triage/TriageDeck.tsx +++ b/frontend/src/features/triage/TriageDeck.tsx @@ -916,41 +916,56 @@ export const TriageDeck: React.FC = ({ {cards.length > 1 && (
{/* Phones: the queue stays folded so the card and its buttons fit on the screen */} - {!showQueueMobile && ( - - )} -
- - - Warteschlange ({cards.length - 1}) +
+ + + {/* Folds open/closed on phones; always open from sm upwards */} +
+
+
+ + + Warteschlange ({cards.length - 1}) + + + Tippen = Vorholen · 👈 Wegwerfen · 👉 Aufgabe + +
-
- {cards.slice(1).map((item) => ( - - ))} +
+ {cards.slice(1).map((item) => ( + + ))} +
+
)}