Einkaufsliste - Kaestchen "im Online-Warenkorb" direkt an jedem Produkt + Sammel-Loeschen oben in der Liste #216

Closed
opened 2026-09-28 08:51:18 +02:00 by lena · 3 comments
Collaborator

Story: Online-Warenkorb-Kaestchen direkt in der Einkaufsliste

As a Nutzer, der online einkauft,
I want to direkt in der normalen Einkaufslisten-Ansicht hinter jedem Produkt ein zweites Kaestchen "ist im Online-Warenkorb" abhaken koennen, ohne dass das Produkt dabei verschwindet,
so that ich beim Befuellen des Online-Warenkorbs den Ueberblick behalte, ohne in ein eigenes Panel wechseln zu muessen.

Kontext (verifiziert im Code):

  • IsInCart existiert bereits. In der normalen Ansicht zeigt ShoppingProductItem.tsx nur einen schreibgeschuetzten Punkt, umschalten geht nur im separaten ShoppingCartCheckPanel.
  • Das Panel hat bereits einen Button "alle im Warenkorb markierten entfernen" (#110).

Acceptance criteria:

  • Jedes aktive Produkt in der normalen Einkaufslisten-Ansicht hat hinter dem Namen ein zweites, klar unterscheidbares Kaestchen (anderes Symbol/Farbe als das normale Abhaken) fuer "im Online-Warenkorb".
  • Abhaken dieses Kaestchens setzt IsInCart, das Produkt bleibt sichtbar in der Liste (verschwindet NICHT wie beim normalen Abhaken); erneutes Klicken nimmt es wieder heraus.
  • Oben in der Einkaufsliste gibt es einen Button "Alle als im Online-Warenkorb markierten von der Liste entfernen" (mit Bestaetigungsdialog und Anzahl), sichtbar nur wenn mindestens ein Produkt markiert ist; er nutzt dieselbe Logik wie der bestehende Sammel-Button im Panel.
  • Aenderungen werden per Live-Sync an andere Mitglieder uebertragen.
  • Mobil gut treffbar (ausreichende Touch-Flaeche), aria-labels DE/EN.

Open questions:

  • Soll das separate Online-Warenkorb-Panel danach entfallen oder parallel bestehen bleiben?
## Story: Online-Warenkorb-Kaestchen direkt in der Einkaufsliste **As a** Nutzer, der online einkauft, **I want to** direkt in der normalen Einkaufslisten-Ansicht hinter jedem Produkt ein zweites Kaestchen "ist im Online-Warenkorb" abhaken koennen, ohne dass das Produkt dabei verschwindet, **so that** ich beim Befuellen des Online-Warenkorbs den Ueberblick behalte, ohne in ein eigenes Panel wechseln zu muessen. **Kontext (verifiziert im Code):** - `IsInCart` existiert bereits. In der normalen Ansicht zeigt `ShoppingProductItem.tsx` nur einen schreibgeschuetzten Punkt, umschalten geht nur im separaten `ShoppingCartCheckPanel`. - Das Panel hat bereits einen Button "alle im Warenkorb markierten entfernen" (#110). **Acceptance criteria:** - [ ] Jedes aktive Produkt in der normalen Einkaufslisten-Ansicht hat hinter dem Namen ein zweites, klar unterscheidbares Kaestchen (anderes Symbol/Farbe als das normale Abhaken) fuer "im Online-Warenkorb". - [ ] Abhaken dieses Kaestchens setzt `IsInCart`, das Produkt bleibt sichtbar in der Liste (verschwindet NICHT wie beim normalen Abhaken); erneutes Klicken nimmt es wieder heraus. - [ ] Oben in der Einkaufsliste gibt es einen Button "Alle als im Online-Warenkorb markierten von der Liste entfernen" (mit Bestaetigungsdialog und Anzahl), sichtbar nur wenn mindestens ein Produkt markiert ist; er nutzt dieselbe Logik wie der bestehende Sammel-Button im Panel. - [ ] Aenderungen werden per Live-Sync an andere Mitglieder uebertragen. - [ ] Mobil gut treffbar (ausreichende Touch-Flaeche), aria-labels DE/EN. **Open questions:** - Soll das separate Online-Warenkorb-Panel danach entfallen oder parallel bestehen bleiben?
lena self-assigned this 2026-09-28 22:18:30 +02:00
Author
Collaborator

Start: Claim durch den autonomen Loop (auf Wunsch des Menschen). PO-Entscheidung zur offenen Frage: Das separate Online-Warenkorb-Panel bleibt parallel bestehen (kein Entfernen in dieser Story - kleinster Umfang, niemand verliert einen gewohnten Weg; ein spaeteres Entfernen kann eigene Story werden). Plan: den schreibgeschuetzten Warenkorb-Punkt in der Produktzeile durch ein umschaltbares Warenkorb-Kaestchen ersetzen (bestehender Command fuer IsInCart), plus Sammel-Entfernen-Button oben in der Liste mit Bestaetigung und Anzahl, gleiche Logik wie im Panel.

Start: Claim durch den autonomen Loop (auf Wunsch des Menschen). PO-Entscheidung zur offenen Frage: Das separate Online-Warenkorb-Panel bleibt parallel bestehen (kein Entfernen in dieser Story - kleinster Umfang, niemand verliert einen gewohnten Weg; ein spaeteres Entfernen kann eigene Story werden). Plan: den schreibgeschuetzten Warenkorb-Punkt in der Produktzeile durch ein umschaltbares Warenkorb-Kaestchen ersetzen (bestehender Command fuer IsInCart), plus Sammel-Entfernen-Button oben in der Liste mit Bestaetigung und Anzahl, gleiche Logik wie im Panel.
Author
Collaborator

PO-Hinweis zum Kriterium "Aenderungen werden per Live-Sync an andere Mitglieder uebertragen": Im Code geprueft - fuer Produkte innerhalb einer Einkaufsliste gibt es bisher gar keinen Live-Sync (weder fuer Abhaken, Menge, Umbenennen noch fuer das bestehende Warenkorb-Panel). #98 (WebSocket-Live-Sync fuer Einkaufslisten) hat Produkt-/Kategorie-Live-Sync ausdruecklich als "deutlich groessere, separate Betrachtung" ausgeklammert; ShoppingListPage laedt die Produkte nur beim Oeffnen bzw. nach Offline-Sync.

Entscheidung: Diese Story liefert das Kaestchen und das Sammel-Entfernen mit genau demselben Sync-Verhalten wie alle anderen Produkt-Aenderungen heute (andere Mitglieder sehen die Aenderung nach dem Neuladen/Wiederoeffnen der Liste). Echter Produkt-Live-Sync fuer Einkaufslisten waere eine eigene, groessere Story - laut Loop-Regel lege ich keine neuen Issues an, das bleibt beim Menschen.

PO-Hinweis zum Kriterium "Aenderungen werden per Live-Sync an andere Mitglieder uebertragen": Im Code geprueft - fuer Produkte innerhalb einer Einkaufsliste gibt es bisher gar keinen Live-Sync (weder fuer Abhaken, Menge, Umbenennen noch fuer das bestehende Warenkorb-Panel). #98 (WebSocket-Live-Sync fuer Einkaufslisten) hat Produkt-/Kategorie-Live-Sync ausdruecklich als "deutlich groessere, separate Betrachtung" ausgeklammert; ShoppingListPage laedt die Produkte nur beim Oeffnen bzw. nach Offline-Sync. Entscheidung: Diese Story liefert das Kaestchen und das Sammel-Entfernen mit genau demselben Sync-Verhalten wie alle anderen Produkt-Aenderungen heute (andere Mitglieder sehen die Aenderung nach dem Neuladen/Wiederoeffnen der Liste). Echter Produkt-Live-Sync fuer Einkaufslisten waere eine eigene, groessere Story - laut Loop-Regel lege ich keine neuen Issues an, das bleibt beim Menschen.
Author
Collaborator

Erledigt (Commit 4542aa02 auf master, Team-Memory-Notiz 12131a4d).

Umfang

  • Jedes aktive Produkt in der normalen Einkaufslisten-Ansicht hat rechts (vor dem "..."-Menue) ein Warenkorb-Symbol als Umschalter - bewusst ein Einkaufswagen statt eines zweiten Kaestchens, damit es nicht mit dem Abhaken links verwechselt wird. Markiert: gefuellter Wagen in Akzentfarbe mit Hintergrund; nicht markiert: blasser, leerer Wagen. Tippen setzt/entfernt IsInCart, das Produkt bleibt in der Liste. Der bisherige schreibgeschuetzte Punkt entfaellt (der Umschalter zeigt den Zustand selbst).
  • Oben in der Listen-Kopfzeile erscheint "[Wagen] N entfernen", sobald mindestens ein Produkt markiert ist; Bestaetigungsdialog mit Anzahl, danach werden genau die markierten Produkte von der Liste genommen (wie Abhaken, inkl. "Zuletzt abgehakt"-Verlauf zum Wiederherstellen).
  • Touch-Flaeche 44x44 px (live gemessen), aria-labels/Titel DE+EN, aria-pressed fuer den Zustand. Im Auswahlmodus ist der Umschalter ausgeblendet.

Entscheidungen

  • Offene Frage: Das separate Online-Warenkorb-Panel bleibt parallel bestehen.
  • Der Bestaetigungsdialog ist jetzt eine gemeinsame Komponente (RemoveInCartItemsDialog), die Panel und Kopfzeilen-Button nutzen; beide rufen dieselbe handleRemoveInCartItems-Logik auf.
  • Live-Sync: nicht umgesetzt, siehe PO-Hinweis oben - Produkte in Einkaufslisten haben generell keinen Live-Sync; die Aenderungen erreichen andere Mitglieder wie alle anderen Produkt-Aenderungen beim Neuladen. Waere eine eigene, groessere Story.
  • Rein Frontend; der bestehende SetShoppingProductInCartCommand (mit Listen-Autorisierung) wird wiederverwendet, kein Backend-Change.

Tests

  • ShoppingProductItem: Umschalten setzt IsInCart ohne Abhaken, erneutes Tippen nimmt heraus, gedrueckter Zustand, ausgeblendet im Auswahlmodus.
  • ShoppingListPage: Kopfzeilen-Button unsichtbar ohne markierte Produkte; entfernt nach Bestaetigung genau die markierten, unmarkierte bleiben.
  • Frontend komplett gruen: 149 Dateien / 1479 Tests (inkl. des parallel gelandeten #215-Fixes), Build ok. Live im lokalen Review-Container bei 375px geprueft: Markieren bleibt nach Neuladen erhalten, Sammel-Entfernen mit Dialog funktioniert.
  • Security-Selbstreview: keine neuen Endpunkte/Eingaben; nutzt vorhandenen, autorisierten Command - keine Befunde.
Erledigt (Commit 4542aa02 auf master, Team-Memory-Notiz 12131a4d). **Umfang** - Jedes aktive Produkt in der normalen Einkaufslisten-Ansicht hat rechts (vor dem "..."-Menue) ein Warenkorb-Symbol als Umschalter - bewusst ein Einkaufswagen statt eines zweiten Kaestchens, damit es nicht mit dem Abhaken links verwechselt wird. Markiert: gefuellter Wagen in Akzentfarbe mit Hintergrund; nicht markiert: blasser, leerer Wagen. Tippen setzt/entfernt IsInCart, das Produkt bleibt in der Liste. Der bisherige schreibgeschuetzte Punkt entfaellt (der Umschalter zeigt den Zustand selbst). - Oben in der Listen-Kopfzeile erscheint "[Wagen] N entfernen", sobald mindestens ein Produkt markiert ist; Bestaetigungsdialog mit Anzahl, danach werden genau die markierten Produkte von der Liste genommen (wie Abhaken, inkl. "Zuletzt abgehakt"-Verlauf zum Wiederherstellen). - Touch-Flaeche 44x44 px (live gemessen), aria-labels/Titel DE+EN, aria-pressed fuer den Zustand. Im Auswahlmodus ist der Umschalter ausgeblendet. **Entscheidungen** - Offene Frage: Das separate Online-Warenkorb-Panel bleibt parallel bestehen. - Der Bestaetigungsdialog ist jetzt eine gemeinsame Komponente (RemoveInCartItemsDialog), die Panel und Kopfzeilen-Button nutzen; beide rufen dieselbe handleRemoveInCartItems-Logik auf. - Live-Sync: nicht umgesetzt, siehe PO-Hinweis oben - Produkte in Einkaufslisten haben generell keinen Live-Sync; die Aenderungen erreichen andere Mitglieder wie alle anderen Produkt-Aenderungen beim Neuladen. Waere eine eigene, groessere Story. - Rein Frontend; der bestehende SetShoppingProductInCartCommand (mit Listen-Autorisierung) wird wiederverwendet, kein Backend-Change. **Tests** - ShoppingProductItem: Umschalten setzt IsInCart ohne Abhaken, erneutes Tippen nimmt heraus, gedrueckter Zustand, ausgeblendet im Auswahlmodus. - ShoppingListPage: Kopfzeilen-Button unsichtbar ohne markierte Produkte; entfernt nach Bestaetigung genau die markierten, unmarkierte bleiben. - Frontend komplett gruen: 149 Dateien / 1479 Tests (inkl. des parallel gelandeten #215-Fixes), Build ok. Live im lokalen Review-Container bei 375px geprueft: Markieren bleibt nach Neuladen erhalten, Sammel-Entfernen mit Dialog funktioniert. - Security-Selbstreview: keine neuen Endpunkte/Eingaben; nutzt vorhandenen, autorisierten Command - keine Befunde.
lena 2026-09-28 22:37:43 +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#216
No description provided.