diff --git a/CHANGELOG.md b/CHANGELOG.md index 4898450..64d0a77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V ## [Unreleased] +## [0.40.1] - 2026-11-01 + +### Fixed +- Notizen: Wer über eine Aufgabe (oder einen anderen Sprung auf eine bestimmte Stelle) in eine Notiz kam und dort in einem Punkt Enter drückte, landete wieder in der angesprungenen Zeile, die dabei markiert war. Weitertippen überschrieb so z. B. den Titel der verknüpften Aufgabe. Die Sprungstelle wird jetzt nur einmal beim Öffnen angesteuert. + ## [0.40.0] - 2026-11-01 ### Changed @@ -668,7 +673,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.40.0...dev +[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.40.1...dev +[0.40.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.40.0...v0.40.1 [0.40.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.39.0...v0.40.0 [0.39.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.38.1...v0.39.0 [0.38.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.38.0...v0.38.1 diff --git a/README.md b/README.md index 9591ab2..7c9ac85 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Self-Hosted](https://img.shields.io/badge/100%25-Self--Hosted-2563eb?style=flat-square)](#) [![Docker](https://img.shields.io/badge/Deployment-Single%20Container-2496ed?style=flat-square&logo=docker&logoColor=white)](#-schnellstart) [![SQLite](https://img.shields.io/badge/Daten-SQLite-003b57?style=flat-square&logo=sqlite&logoColor=white)](#-deine-daten-gehören-dir) -[![Version](https://img.shields.io/badge/Version-v0.40.0-16a34a?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/Version-v0.40.1-16a34a?style=flat-square)](CHANGELOG.md) **MindSift** ist eine selbst gehostete Schaltstelle für spontane Gedanken, Aufgaben mit Kanban-Board, hierarchische Outliner-Notizen, die mehrere Personen gleichzeitig bearbeiten können, und gemeinsame Listen. Alles läuft als ein einzelner Container mit eingebetteter SQLite-Datenbank, auf deinem eigenen Server. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0730d2a..2cfd793 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mindsift-frontend", - "version": "0.40.0", + "version": "0.40.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mindsift-frontend", - "version": "0.40.0", + "version": "0.40.1", "license": "Unlicense", "dependencies": { "@fontsource-variable/inter": "5.3.0", diff --git a/frontend/package.json b/frontend/package.json index 708cec2..87eaf90 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.40.0", + "version": "0.40.1", "license": "Unlicense", "type": "module", "scripts": { diff --git a/frontend/src/features/workspace/OutlinerTree.tsx b/frontend/src/features/workspace/OutlinerTree.tsx index 5c9ec98..4d7f8f3 100644 --- a/frontend/src/features/workspace/OutlinerTree.tsx +++ b/frontend/src/features/workspace/OutlinerTree.tsx @@ -181,8 +181,14 @@ export const OutlinerTree = forwardRef(({ } }, []); + // Jump target (e.g. from a task): focused once, as soon as its block is loaded. Running again on later + // block changes would pull the cursor back to it after every Enter in the note. + const focusedTargetRef = useRef(null); + const targetLoaded = !!initialFocusedBlockId && blocks.some((b) => b.id === initialFocusedBlockId); useEffect(() => { - if (initialFocusedBlockId) { + if (!initialFocusedBlockId) focusedTargetRef.current = null; + if (initialFocusedBlockId && targetLoaded && focusedTargetRef.current !== initialFocusedBlockId) { + focusedTargetRef.current = initialFocusedBlockId; setHighlightedBlockId(initialFocusedBlockId); focusBlockInput(initialFocusedBlockId, 'select'); const timer = setTimeout(() => { @@ -200,7 +206,7 @@ export const OutlinerTree = forwardRef(({ clearTimeout(fadeTimer); }; } - }, [initialFocusedBlockId, blocks.length, focusBlockInput]); + }, [initialFocusedBlockId, targetLoaded, focusBlockInput]); // Compute visibility based on collapsed ancestor blocks const visibleEntries = useMemo(() => {