From 3d367ce633489a95e7b962c2da33fb902443d63b Mon Sep 17 00:00:00 2001 From: Sandro Date: Sat, 31 Oct 2026 11:16:46 +0100 Subject: [PATCH] feat(pwa): app icon shortcuts for Quick Dump, new task and shopping list open their input Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 8 ++++- README.md | 2 +- frontend/package-lock.json | 4 +-- frontend/package.json | 2 +- frontend/public/manifest.json | 43 ++++++++++++++++++++----- frontend/public/shortcut-list.png | Bin 0 -> 5673 bytes frontend/public/shortcut-quickdump.png | Bin 0 -> 6908 bytes frontend/public/shortcut-task.png | Bin 0 -> 4622 bytes frontend/src/App.tsx | 28 ++++++++++++++++ 9 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 frontend/public/shortcut-list.png create mode 100644 frontend/public/shortcut-quickdump.png create mode 100644 frontend/public/shortcut-task.png diff --git a/CHANGELOG.md b/CHANGELOG.md index f3f15d6..b41b573 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.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 ### 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. - 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.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 diff --git a/README.md b/README.md index b17cd37..b3401e6 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.19.0-16a34a?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/Version-v0.20.0-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 508c0ed..cee0a00 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "mindsift-frontend", - "version": "0.19.0", + "version": "0.20.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mindsift-frontend", - "version": "0.19.0", + "version": "0.20.0", "license": "Unlicense", "dependencies": { "@fontsource-variable/inter": "5.3.0", diff --git a/frontend/package.json b/frontend/package.json index 314e944..c49a278 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "mindsift-frontend", "private": true, - "version": "0.19.0", + "version": "0.20.0", "license": "Unlicense", "type": "module", "scripts": { diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json index 45f3b94..e07f867 100644 --- a/frontend/public/manifest.json +++ b/frontend/public/manifest.json @@ -65,16 +65,43 @@ }, "shortcuts": [ { - "name": "Gedanke sofort erfassen", - "short_name": "Capture", - "description": "Öffnet MindSift mit Fokus im Eingabefeld", - "url": "/?mode=capture" + "name": "Quick Dump", + "short_name": "Quick Dump", + "description": "Gedanken schnell in die Triage werfen", + "url": "/?shortcut=quickdump", + "icons": [ + { + "src": "/shortcut-quickdump.png", + "sizes": "192x192", + "type": "image/png" + } + ] }, { - "name": "Triage starten", - "short_name": "Triage", - "description": "Gedanken im Kartendeck aussortieren", - "url": "/?tab=triage" + "name": "Neue Aufgabe", + "short_name": "Aufgabe", + "description": "Direkt eine neue Aufgabe anlegen", + "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" + } + ] } ] } diff --git a/frontend/public/shortcut-list.png b/frontend/public/shortcut-list.png new file mode 100644 index 0000000000000000000000000000000000000000..b5fbb9f0f84f0a0ea438d6ff664c230e79f76c2e GIT binary patch literal 5673 zcmV+^7S`#BP)hmf#Reg5Rw2%AV6vi*anBISGMs@#*!@CT1k67-`hWq491anCCf(I zbKYl0V~t1B?tbU}eYf{!ILj8At&M zz@k($4k!S_z!9Jq*bnRiUIShP_QWs)C7cfiW1z-^f`eCYYdx!P&YZ13+_A17!QkPL z;Dr*veBe^xGT>t1T%c*x*p=up3=9Ihfi1u$;2C3NpNJ^{IAbv)bgyrz4goA#+lLXs zSwlh!6imDg%;mtf!0ORiKB>=M8H4=j>hKisQzJYcbEQK?FNTa-YWMA}(^CMQH}oOa zV0|G|Uqjld@YI1od6ecSX9K*zdXQZ_|S zve=Ttd3GW28Q^okdAf&J&cGSsHQ-L*ZX~t`Q=;$SYqZW;M*8-asT07Gb$x&!#v(|A z5!L`-0#>TwD`!CnF95fSnC}}SgU78mJ&A46X$he7%W2F|3)m7FF*I0Nh48h}eSVET zE9ES2jUF`c&ElYYF4k!AVje>S!|dNU|LhB(Yh5oUkwNlJh;=C==JUYKK!-jXqi=!d2RiyvnPPA8+t*4UlV9I@O5CV9&nW@Vg&de$lnXL#~=u1LRY5a z7C`40`-5*R800+QpMk5-rY}KJ#(@Ao4R#^&lEY#Uy4Sa!IRSL8?L(X)mh^EYdnxcO z0*98OOcyo-U-67=F8UT@8P`f+#agopvdd86ANHGXBf zb3X8|0`C?KUZ#(EYxYfC0Et)=6dC}TGkW0FJ-<>dTngM`koHpJZ0eiqCMJL-H}oOm z1Ej!wo#3`dQL2fL0N)TNDZk{?wYG130$94X4@4L$c>tdWzNlB7N)=*&>oI&GIU|bz zT{rYs7Qn8V24@WQaeozohgY3kO0|*#Zq6UAU1fm5XCEzp3)K0RLK=<8?F6CBic;-t zL|BI*1BUboSEFxR0i3nOiY1K59{?ZIaZ^IV$1toB@i8au=Ix2zUeEXOW8OmGCN!#3 z2@f^EpIPfI5FB0WddFS?7A!UZp9L<|F;hauMIwC0Ha3k0be?bq=vdc}4gR+Scz__2 zOHsncOCZ;R*(Ju%eS1r=0tkkLD*}9+phStHgpqfFxh_^Jy_sZhmagr?1>d(}cmVbI zD&c0ch+J!o=@rjmy&%vH4DSan(D6}1&iTfe)d)z!$Cf<78WO-YK&_6CLin9yAH_=C z=3-a@oXC9OeL6NuL|BcO`G~;=cS7b;f{Ja55(VZ1mw;fc^*n-Fom#F?i3&;Jz1Cu_ z?_4uMp;|?W5-WXYnyrC_1XY?9B}yzdu+S2ukTvOeC=sI(SZ;x(Xw1J7J?emEmY_3> zqC}BJmf%WAQKHB^OVE=`QKCqj1!n3vC=q3*)dR2+<%6&V;yMmWL`hh{({WHDil=?N zlt`ljP*eblq5@D96@a2di&$7bh)D1?UW^I86cs?#;{=*ghPf>s^);rV;pYlM&w%6b zphHB3paQ63jDai8PjLN}wJe+O5%(%vvvaWju+M!@O6A-gz(!n50=6b|5B1#2NZ7tB=IN~^* zag+X2opWN;)fim`Q~*`<#tj@g>iEes`AHk@xw9-Y>n&>kDuAlO_u;Q*(5mwR3}hVtbl)(KZ!fU2BgTw+`?fY{PGI@M7|YK+^+&C%F?7!H zcx<~GgbJVvMKF>Re!i{1FP|^`)?wCnux51)e>1_N9{jz=;MC0~s~w?I`W0?!8j z`tG;CcI+=Plr6u%>6{y*zE%&yDuA$kKm!L3J9>|mzb%@3j-{}0IY0#v zwpGBu&VwZeD;$J7+G8}<>Jp#=2;nxU@0jC2fBA!OYm;Sei`5lC1rWX!U??l3D;$LD zYYkmddmkcO!DHMk_v#a^RW8| z9S0Blnncu3nX_>TBa@3BbUC{>qV|%J?H~FYbzwN|>q@fsNYjMJ6lktl$t+m_TI?gXfJN z4pacu5gD59(X_8K#lZnbt{{2_AY_rD3gfyG-Ep8qp`>Sks*4QG=s|eW3}uBK2YmGd zRAXf5{(eVm)2a1e@?p~}1$qWtAdoDW3CwN z|EoP}Hj)B39vOOc$Z5^cF=(m_3Ivp6a3rX-QSB?Ejc7D4M~5A|5BU{qhMqe+S~WwR zz=Bqfmd5g?v9Hgk?^yL;5JYwb7|sdl3Rie_HHNM^(Mu0oGS{QNw$lFJXDBPW0)!zl zl(HFOLCw&p5Rbu+mW;yzmJWdfOa(AH<8_ZCGPJWj zMnkP3><59Sl%cb|{Qf^P62wu3Wks|RFKgC=g5Ci!s}8XAfp9p$Q~)QC?ipWX zXjp58PRIea-`C=}k&Fy&v&;x-Wava3V0%L108;^+7#TV=j>ypZ@OG0QuLEpnkI&$+ z=n4?V$k6U_M22?G^&;;88_r9poPv4=Aczc2k0Ua)D}<4u#~ol@b7K`Q3&N2BrUE#{ zHmJL͙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 P00000NkvXXu0mjfrwoI5 literal 0 HcmV?d00001 diff --git a/frontend/public/shortcut-quickdump.png b/frontend/public/shortcut-quickdump.png new file mode 100644 index 0000000000000000000000000000000000000000..61aeb08f36ca185c3ca3169862b22f71852c3d46 GIT binary patch literal 6908 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 literal 0 HcmV?d00001 diff --git a/frontend/public/shortcut-task.png b/frontend/public/shortcut-task.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8b76f65e3044e7a6f89f6f4139fd8aa206eb17 GIT binary patch literal 4622 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 literal 0 HcmV?d00001 diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index f6f356c..1a0f95a 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -245,6 +245,34 @@ export const App: React.FC = () => { }; 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(() => { + 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)[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(() => { closeMenu();