feat(pwa): app icon shortcuts for Quick Dump, new task and shopping list open their input
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m31s
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m31s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c6a2cfb85c
commit
3d367ce633
9 files changed
+74
-13
No files matched your search
+7
-1
@@ -6,6 +6,11 @@ Das Format folgt [Keep a Changelog](https://keepachangelog.com/de/1.1.0/), die V
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.20.0] - 2026-10-31
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- App-Verknüpfungen (App-Icon gedrückt halten): Statt „Capture“ und „Triage“, die nur die Startseite öffneten, gibt es jetzt **Quick Dump**, **Neue Aufgabe** und **Einkaufsliste** mit eigenen Symbolen. Jede öffnet den passenden Bereich mit dem Eingabefeld (Quick-Dump-Fenster, „Neue Aufgabe“, neuer Listeneintrag). Alte Verknüpfungen führen weiter zum Quick Dump. Neue Verknüpfungen übernimmt Android, sobald es die App aktualisiert (oder nach Neuinstallation).
|
||||||
|
|
||||||
## [0.19.0] - 2026-10-31
|
## [0.19.0] - 2026-10-31
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@@ -440,7 +445,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.
|
- 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.
|
- 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.19.0...dev
|
[Unreleased]: https://git.dsit.me/sandrodach/MindSift/compare/v0.20.0...dev
|
||||||
|
[0.20.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.19.0...v0.20.0
|
||||||
[0.19.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.1...v0.19.0
|
[0.19.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.1...v0.19.0
|
||||||
[0.18.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.0...v0.18.1
|
[0.18.1]: https://git.dsit.me/sandrodach/MindSift/compare/v0.18.0...v0.18.1
|
||||||
[0.18.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.17.4...v0.18.0
|
[0.18.0]: https://git.dsit.me/sandrodach/MindSift/compare/v0.17.4...v0.18.0
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
[](#)
|
[](#)
|
||||||
[](#-schnellstart)
|
[](#-schnellstart)
|
||||||
[](#-deine-daten-gehören-dir)
|
[](#-deine-daten-gehören-dir)
|
||||||
[](CHANGELOG.md)
|
[](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.
|
**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.
|
||||||
|
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"version": "0.19.0",
|
"version": "0.20.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"version": "0.19.0",
|
"version": "0.20.0",
|
||||||
"license": "Unlicense",
|
"license": "Unlicense",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/inter": "5.3.0",
|
"@fontsource-variable/inter": "5.3.0",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "mindsift-frontend",
|
"name": "mindsift-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.19.0",
|
"version": "0.20.0",
|
||||||
"license": "Unlicense",
|
"license": "Unlicense",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -65,16 +65,43 @@
|
|||||||
},
|
},
|
||||||
"shortcuts": [
|
"shortcuts": [
|
||||||
{
|
{
|
||||||
"name": "Gedanke sofort erfassen",
|
"name": "Quick Dump",
|
||||||
"short_name": "Capture",
|
"short_name": "Quick Dump",
|
||||||
"description": "Öffnet MindSift mit Fokus im Eingabefeld",
|
"description": "Gedanken schnell in die Triage werfen",
|
||||||
"url": "/?mode=capture"
|
"url": "/?shortcut=quickdump",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/shortcut-quickdump.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Triage starten",
|
"name": "Neue Aufgabe",
|
||||||
"short_name": "Triage",
|
"short_name": "Aufgabe",
|
||||||
"description": "Gedanken im Kartendeck aussortieren",
|
"description": "Direkt eine neue Aufgabe anlegen",
|
||||||
"url": "/?tab=triage"
|
"url": "/?shortcut=task",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/shortcut-task.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Einkaufsliste",
|
||||||
|
"short_name": "Einkaufsliste",
|
||||||
|
"description": "Einen Eintrag zur Einkaufsliste hinzufügen",
|
||||||
|
"url": "/?shortcut=list",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/shortcut-list.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
@@ -245,6 +245,34 @@ export const App: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const { isMenuOpen, setIsMenuOpen, closeMenu, setGroups, primaryAction, setPrimaryAction } = useMobileActions();
|
const { isMenuOpen, setIsMenuOpen, closeMenu, setGroups, primaryAction, setPrimaryAction } = useMobileActions();
|
||||||
|
const primaryActionRef = useRef(primaryAction);
|
||||||
|
primaryActionRef.current = primaryAction;
|
||||||
|
|
||||||
|
// App icon shortcuts (manifest "shortcuts", long-press on the icon): open the tab and its input right away.
|
||||||
|
// ?shortcut=quickdump|task|list; the old links (?mode=capture, ?tab=triage) still lead to the Quick Dump.
|
||||||
|
const [pendingShortcut, setPendingShortcut] = useState<ActiveTab | null>(() => {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
const target = params.get('shortcut') || (params.get('mode') === 'capture' || params.get('tab') === 'triage' ? 'quickdump' : '');
|
||||||
|
return ({ quickdump: 'triage', task: 'tasks', list: 'lists' } as Record<string, ActiveTab>)[target] || null;
|
||||||
|
});
|
||||||
|
useEffect(() => {
|
||||||
|
if (!pendingShortcut || !user) return;
|
||||||
|
if (activeTab !== pendingShortcut) {
|
||||||
|
setActiveTab(pendingShortcut);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const target = pendingShortcut;
|
||||||
|
setPendingShortcut(null);
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
['shortcut', 'mode', 'tab'].forEach((k) => url.searchParams.delete(k));
|
||||||
|
window.history.replaceState({}, '', url.pathname + url.search + url.hash);
|
||||||
|
// The view registers its "+" action once it is mounted, so wait a moment (no cleanup: resetting
|
||||||
|
// pendingShortcut above re-runs this effect and must not cancel the timer)
|
||||||
|
window.setTimeout(() => {
|
||||||
|
if (target === 'triage') handleTriggerAddButton();
|
||||||
|
else if (window.innerWidth < 640 || target === 'lists') primaryActionRef.current?.();
|
||||||
|
}, 400);
|
||||||
|
}, [pendingShortcut, user?.id, activeTab]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
closeMenu();
|
closeMenu();
|
||||||
|
|||||||
Reference in new issue
Block a user