Listengruppen — Auf-/Zuklappen in der Sidebar + eigene Dashboard-Seite pro Gruppe #197

Closed
opened 2026-09-27 10:42:36 +02:00 by lena · 1 comment
Collaborator

Story: Listengruppen — Auf-/Zuklappen in der Sidebar + eigene Dashboard-Seite pro Gruppe

As a Nutzer, der ein groesseres Vorhaben mit mehreren Listen organisiert (z. B. die Planung eines Events ueber zehn Unterlisten hinweg),
I want to meine bestehenden Gruppen-Ueberschriften in der Listenuebersicht auf-/zuklappen koennen und durch Klick auf eine Gruppe eine eigene Seite mit allen Unterlisten dieser Gruppe oeffnen,
so that ich zusammengehoerige Listen sowohl in der Alltagsuebersicht kompakt halten als auch bei Bedarf gebuendelt auf einen Blick sehen kann, statt sie einzeln in der Sidebar durchsuchen zu muessen.

Kontext (verifiziert im Code):

  • Gruppen-Ueberschriften (GroupHeadingDto/GroupHeadingEntity) existieren bereits seit #170 - rein pro Nutzer (keine geteilte/kollaborative Sichtbarkeit), anlegbar/umsortierbar ausschliesslich im Vollbild-Bearbeitungsmodus (ListOrderEditScreen.tsx, Button "+ Bearbeiten").
  • In der regulaeren Sidebar (TodoListMenu.tsx) wird eine Ueberschrift aktuell nur als rein informativer, nicht-interaktiver Trenner gerendert (entry.type === 'heading' -> ein einfaches <div> mit dem Namen, siehe Kommentar "renders as a plain, non-interactive divider label"). Kein Auf-/Zuklappen, kein Klick-Handler.
  • Ein etabliertes, bereits vorhandenes Auf-/Zuklapp-Muster existiert schon fuer den Archiv-Bereich derselben Sidebar (showArchived-Toggle mit ▸/▾-Icon vor "Archived (n)") - als Vorlage fuer das gleiche Interaktionsmuster bei Gruppen-Ueberschriften geeignet.
  • Nicht zu verwechseln mit #150 ("Listen zu Projekten gruppieren", geschlossen 2026-09-07): dort ging es um eine echte, geteilte Projekt-Entitaet mit Sharing-Semantik ueber mehrere Haushaltsmitglieder hinweg - das wurde damals bewusst nicht gebaut, zugunsten der leichtgewichtigeren, rein-persoenlichen Gruppen-Ueberschriften aus #170. Diese Story aendert daran nichts - Gruppen bleiben weiterhin rein pro Nutzer, nur die Interaktion in der Sidebar und eine neue Dashboard-Seite kommen hinzu.
  • Mit dem Menschen abgestimmt: die neue Gruppen-Seite zeigt die Unterlisten als Kacheln/Karten (Titel, Typ-Icon, Klick oeffnet die jeweilige Liste normal) - nicht die tatsaechlichen Listeninhalte aller Unterlisten zusammengefuehrt auf einer Seite (das waere durch die vier unterschiedlichen Listentypen/Darstellungen ein deutlich groesserer Umfang und wurde bewusst nicht gewaehlt).

Acceptance criteria:

  • Jede Gruppen-Ueberschrift in der regulaeren Listenuebersicht (Sidebar) bekommt ein Auf-/Zuklapp-Icon (gleiches Interaktionsmuster wie der bestehende Archiv-Toggle), das die zu dieser Gruppe gehoerenden Listen ein-/ausblendet, ohne deren Reihenfolge/Zuordnung zu aendern.
  • Der Klapp-Zustand jeder Gruppe bleibt zumindest fuer die laufende Sitzung erhalten (kein Zuruecksetzen bei jedem Rerender); ob er darueber hinaus dauerhaft (z. B. pro Nutzer serverseitig) gespeichert wird, ist eine Implementierungsentscheidung, keine harte Anforderung dieser Story.
  • Klick auf den Namen/Text einer Gruppen-Ueberschrift selbst (nicht auf das Auf-/Zuklapp-Icon) navigiert zu einer neuen, eigenen Seite fuer genau diese Gruppe.
  • Diese neue Gruppen-Seite zeigt jede zugehoerige Unterliste als eigene Kachel/Karte (mindestens Titel + Typ-Icon der Liste); Klick auf eine Kachel oeffnet die jeweilige Liste normal (bestehende Navigation je Listentyp).
  • Eine Gruppe ohne zugeordnete Listen zeigt auf ihrer Dashboard-Seite einen erkennbaren Leerzustand statt einer leeren Flaeche.
  • Gruppen-Ueberschriften bleiben weiterhin ausschliesslich im Vollbild-Bearbeitungsmodus anlegbar/umbenennbar/loeschbar (#170s bestehende Entscheidung) - diese Story aendert nichts an deren Verwaltung, nur an Darstellung/Interaktion in der Sidebar und der neuen Dashboard-Seite.
  • Der Zugriff auf die neue Gruppen-Seite ist weiterhin rein pro Nutzer (keine geteilte/kollaborative Sichtbarkeit ueber mehrere Haushaltsmitglieder hinweg) - konsistent mit #170s bestehendem Modell.

Out of scope for this story:

  • Eine echte, geteilte/kollaborative Projekt-Entitaet mit Sharing-Semantik ueber mehrere Nutzer hinweg (siehe #150s bewusste Entscheidung dagegen - gilt weiterhin).
  • Zusammengefuehrte Inhalte aller Unterlisten auf einer Seite (z. B. alle Todos aller Unterlisten gemeinsam) - die Dashboard-Seite verlinkt nur auf die einzelnen Listen, zeigt deren Inhalte nicht direkt an.
  • Gruppen-weite Kennzahlen/Fortschrittsbalken ueber alle Unterlisten hinweg (kann als eigene Folge-Story betrachtet werden, falls gewuenscht).
  • Verschachtelte Gruppen (Gruppe in Gruppe).

Open questions: (escalate to human if unanswered)

  • Keine offenen Fragen zum Kernumfang mehr - Kontext mit dem Menschen abgestimmt (2026-09-27): Dashboard-Kacheln statt zusammengefuehrter Inhalte.
## Story: Listengruppen — Auf-/Zuklappen in der Sidebar + eigene Dashboard-Seite pro Gruppe **As a** Nutzer, der ein groesseres Vorhaben mit mehreren Listen organisiert (z. B. die Planung eines Events ueber zehn Unterlisten hinweg), **I want to** meine bestehenden Gruppen-Ueberschriften in der Listenuebersicht auf-/zuklappen koennen und durch Klick auf eine Gruppe eine eigene Seite mit allen Unterlisten dieser Gruppe oeffnen, **so that** ich zusammengehoerige Listen sowohl in der Alltagsuebersicht kompakt halten als auch bei Bedarf gebuendelt auf einen Blick sehen kann, statt sie einzeln in der Sidebar durchsuchen zu muessen. **Kontext (verifiziert im Code):** - Gruppen-Ueberschriften (`GroupHeadingDto`/`GroupHeadingEntity`) existieren bereits seit #170 - rein pro Nutzer (keine geteilte/kollaborative Sichtbarkeit), anlegbar/umsortierbar ausschliesslich im Vollbild-Bearbeitungsmodus (`ListOrderEditScreen.tsx`, Button "+ Bearbeiten"). - In der regulaeren Sidebar (`TodoListMenu.tsx`) wird eine Ueberschrift aktuell nur als **rein informativer, nicht-interaktiver Trenner** gerendert (`entry.type === 'heading'` -> ein einfaches `<div>` mit dem Namen, siehe Kommentar "renders as a plain, non-interactive divider label"). Kein Auf-/Zuklappen, kein Klick-Handler. - Ein etabliertes, bereits vorhandenes Auf-/Zuklapp-Muster existiert schon fuer den Archiv-Bereich derselben Sidebar (`showArchived`-Toggle mit `▸`/`▾`-Icon vor "Archived (n)") - als Vorlage fuer das gleiche Interaktionsmuster bei Gruppen-Ueberschriften geeignet. - **Nicht zu verwechseln mit #150** ("Listen zu Projekten gruppieren", geschlossen 2026-09-07): dort ging es um eine echte, geteilte Projekt-Entitaet mit Sharing-Semantik ueber mehrere Haushaltsmitglieder hinweg - das wurde damals bewusst *nicht* gebaut, zugunsten der leichtgewichtigeren, rein-persoenlichen Gruppen-Ueberschriften aus #170. Diese Story aendert daran nichts - Gruppen bleiben weiterhin rein pro Nutzer, nur die Interaktion in der Sidebar und eine neue Dashboard-Seite kommen hinzu. - Mit dem Menschen abgestimmt: die neue Gruppen-Seite zeigt die Unterlisten als Kacheln/Karten (Titel, Typ-Icon, Klick oeffnet die jeweilige Liste normal) - **nicht** die tatsaechlichen Listeninhalte aller Unterlisten zusammengefuehrt auf einer Seite (das waere durch die vier unterschiedlichen Listentypen/Darstellungen ein deutlich groesserer Umfang und wurde bewusst nicht gewaehlt). **Acceptance criteria:** - [ ] Jede Gruppen-Ueberschrift in der regulaeren Listenuebersicht (Sidebar) bekommt ein Auf-/Zuklapp-Icon (gleiches Interaktionsmuster wie der bestehende Archiv-Toggle), das die zu dieser Gruppe gehoerenden Listen ein-/ausblendet, ohne deren Reihenfolge/Zuordnung zu aendern. - [ ] Der Klapp-Zustand jeder Gruppe bleibt zumindest fuer die laufende Sitzung erhalten (kein Zuruecksetzen bei jedem Rerender); ob er darueber hinaus dauerhaft (z. B. pro Nutzer serverseitig) gespeichert wird, ist eine Implementierungsentscheidung, keine harte Anforderung dieser Story. - [ ] Klick auf den Namen/Text einer Gruppen-Ueberschrift selbst (nicht auf das Auf-/Zuklapp-Icon) navigiert zu einer neuen, eigenen Seite fuer genau diese Gruppe. - [ ] Diese neue Gruppen-Seite zeigt jede zugehoerige Unterliste als eigene Kachel/Karte (mindestens Titel + Typ-Icon der Liste); Klick auf eine Kachel oeffnet die jeweilige Liste normal (bestehende Navigation je Listentyp). - [ ] Eine Gruppe ohne zugeordnete Listen zeigt auf ihrer Dashboard-Seite einen erkennbaren Leerzustand statt einer leeren Flaeche. - [ ] Gruppen-Ueberschriften bleiben weiterhin ausschliesslich im Vollbild-Bearbeitungsmodus anlegbar/umbenennbar/loeschbar (#170s bestehende Entscheidung) - diese Story aendert nichts an deren Verwaltung, nur an Darstellung/Interaktion in der Sidebar und der neuen Dashboard-Seite. - [ ] Der Zugriff auf die neue Gruppen-Seite ist weiterhin rein pro Nutzer (keine geteilte/kollaborative Sichtbarkeit ueber mehrere Haushaltsmitglieder hinweg) - konsistent mit #170s bestehendem Modell. **Out of scope for this story:** - Eine echte, geteilte/kollaborative Projekt-Entitaet mit Sharing-Semantik ueber mehrere Nutzer hinweg (siehe #150s bewusste Entscheidung dagegen - gilt weiterhin). - Zusammengefuehrte Inhalte aller Unterlisten auf einer Seite (z. B. alle Todos aller Unterlisten gemeinsam) - die Dashboard-Seite verlinkt nur auf die einzelnen Listen, zeigt deren Inhalte nicht direkt an. - Gruppen-weite Kennzahlen/Fortschrittsbalken ueber alle Unterlisten hinweg (kann als eigene Folge-Story betrachtet werden, falls gewuenscht). - Verschachtelte Gruppen (Gruppe in Gruppe). **Open questions:** (escalate to human if unanswered) - Keine offenen Fragen zum Kernumfang mehr - Kontext mit dem Menschen abgestimmt (2026-09-27): Dashboard-Kacheln statt zusammengefuehrter Inhalte.
lena self-assigned this 2026-09-27 11:56:07 +02:00
Author
Collaborator

Implemented and shipped in 56bd498c (feature) + 18643f40 (test-fixture fix for an unrelated stale-schema regression it uncovered).

Scope shipped:

  • A group heading in the sidebar is no longer a read-only divider - it now also collapses/expands its member lists and links to a new /group/:id dashboard page.
  • The dashboard page shows the group's member lists as clickable tiles (icon + color + title), matching the "dashboard with tiles" option chosen over a merged-content page.
  • No backend changes needed - group membership is purely positional (same derivation the sidebar itself already used), so the merged/ordered list-building logic was extracted into a shared useUnifiedListEntries hook (used by both TodoListMenu and GroupDashboardPage) instead of duplicating it.
  • Empty-group and group-not-found states both handled.

Deliberately out of scope (consistent with #170's own per-user-only groups, and the user's own choice of tiles over a merged view):

  • No shared/collaborative groups.
  • No merged-content view (tiles only, each still opens its own list).
  • No nested groups.
  • No cross-group progress bars/aggregates.

Tests: useUnifiedListEntries.test.ts (4 new), GroupDashboardPage.test.tsx (4 new), TodoListMenu.test.tsx updated (2 tests rewritten for the new link+collapse behavior instead of the old read-only-divider assumption). Full suite green. Backend unaffected (0 errors, no backend changes).

Live-verified in the local review container: created a group, dragged a list under it, confirmed the dashboard tile renders with the correct link, confirmed sidebar collapse/expand hides and restores the member list without affecting other lists, confirmed the not-found state after deleting the group.

Closing as done.

Implemented and shipped in 56bd498c (feature) + 18643f40 (test-fixture fix for an unrelated stale-schema regression it uncovered). Scope shipped: - A group heading in the sidebar is no longer a read-only divider - it now also collapses/expands its member lists and links to a new /group/:id dashboard page. - The dashboard page shows the group's member lists as clickable tiles (icon + color + title), matching the "dashboard with tiles" option chosen over a merged-content page. - No backend changes needed - group membership is purely positional (same derivation the sidebar itself already used), so the merged/ordered list-building logic was extracted into a shared useUnifiedListEntries hook (used by both TodoListMenu and GroupDashboardPage) instead of duplicating it. - Empty-group and group-not-found states both handled. Deliberately out of scope (consistent with #170's own per-user-only groups, and the user's own choice of tiles over a merged view): - No shared/collaborative groups. - No merged-content view (tiles only, each still opens its own list). - No nested groups. - No cross-group progress bars/aggregates. Tests: useUnifiedListEntries.test.ts (4 new), GroupDashboardPage.test.tsx (4 new), TodoListMenu.test.tsx updated (2 tests rewritten for the new link+collapse behavior instead of the old read-only-divider assumption). Full suite green. Backend unaffected (0 errors, no backend changes). Live-verified in the local review container: created a group, dragged a list under it, confirmed the dashboard tile renders with the correct link, confirmed sidebar collapse/expand hides and restores the member list without affecting other lists, confirmed the not-found state after deleting the group. Closing as done.
lena closed this issue 2026-09-27 12:38:23 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
robert/todo#197
No description provided.