From 597b6816a7020a7a2f82d20045b472833c86e8d8 Mon Sep 17 00:00:00 2001 From: Sandro Date: Sat, 31 Oct 2026 09:36:50 +0100 Subject: [PATCH 1/2] 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) => ( + + ))} +
+
)} From 2303ccce6896b95f62b656cc22f28f388e2f2551 Mon Sep 17 00:00:00 2001 From: Sandro Date: Sat, 31 Oct 2026 09:38:54 +0100 Subject: [PATCH 2/2] fix(tasks): tapping anywhere on a task card opens it Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 1 + frontend/src/features/triage/TasksView.tsx | 29 +++++++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ec1ef2..cfcbe03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V ### 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. +- Aufgaben: Ein Tipp irgendwo auf die Aufgabe öffnet sie jetzt zuverlässig, nicht nur auf den Text. Bisher schluckten die Zeile mit Datum/Tags und in Kanban die Pfeil-Leiste jeden Tipp, und am Handy konnte ein etwas längerer Tipp als Ziehen gewertet werden (Ziehen gibt es nur noch mit Maus oder Stift). ## [0.15.0] - 2026-10-31 diff --git a/frontend/src/features/triage/TasksView.tsx b/frontend/src/features/triage/TasksView.tsx index a3fa495..7921f8c 100644 --- a/frontend/src/features/triage/TasksView.tsx +++ b/frontend/src/features/triage/TasksView.tsx @@ -37,6 +37,17 @@ import { CountBadge } from '../../components/CountBadge'; import { FormSheet } from '../../components/FormSheet'; import { useMobileActions } from '../../context/MobileActionContext'; +// Drag & drop needs a mouse or pen; on touch-only devices a draggable row can swallow a slightly +// longer tap, so the row would not open +const canDragTasks = + typeof window !== 'undefined' && !!window.matchMedia?.('(any-pointer: fine)').matches; + +// Rows inside a task card keep taps on their own controls; taps on empty space or plain labels +// (due date, webhook) reach the card and open the task +const stopOnControl = (e: React.MouseEvent) => { + if ((e.target as HTMLElement).closest('button, select, a, input')) e.stopPropagation(); +}; + interface TasksViewProps { currentUser?: User | null; onRefreshStats: () => void; @@ -1093,7 +1104,7 @@ export const TasksView: React.FC = ({ return (
handleTaskDragStart(e, task)} onDragEnd={() => { setDraggingTaskId(null); @@ -1143,13 +1154,7 @@ export const TasksView: React.FC = ({ {/* Clickable Title & Metadata */} -
{ - setDetailTaskId(task.id); - setShowDetailModal(true); - }} - className="min-w-0 flex-1 cursor-pointer space-y-1" - > +

= ({ {/* Interactive Badges Bar */}

e.stopPropagation()} + onClick={stopOnControl} > {(task.convertedType === 'document_block' || task.docId) && (