Files
oikos/BACKLOG.md
T
Ulas 6fd209ba5e feat: meals drag & drop between slots and days (BL-03)
Pointer Events-based drag & drop (touch + mouse compatible):
- Ghost element follows pointer; drops on empty slots move the meal,
  drops on occupied slots swap both meals via concurrent PUT requests
- prefers-reduced-motion: no ghost animation, interaction still works
- Suppress-click guard prevents accidental edit modal after drag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 10:23:39 +02:00

126 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Backlog
Feature-Requests und geplante Erweiterungen. Einträge hier werden **nicht** implementiert bis sie explizit priorisiert und in einen Release-Branch überführt werden.
---
## Priorität: Hoch (SPEC-Lücken)
### BL-01 — Kalender: Wiederkehrende Events werden nicht expandiert
**Status:** Erledigt (v0.3.0)
**Aufwand:** M (35 Tage)
Das Datenmodell speichert `recurrence_rule` (iCal RRULE) für Kalender-Events. Der `recurrence.js`-Service mit `nextOccurrence()` existiert und wird in Tasks genutzt. Im Kalender-Route (`server/routes/calendar.js`) fehlt jedoch die Expansion: Beim Abruf der Events werden Wiederholungsinstanzen nicht generiert. Wiederkehrende Termine erscheinen daher nur einmal (beim Originaldatum).
**Akzeptanzkriterien:**
- GET `/api/v1/calendar` expandiert RRULE-Events im angefragten Zeitfenster
- Instanzen erben Farbe, Titel, Beschreibung des Original-Events
- In der UI sind Wiederholungs-Instanzen mit einem kleinen Repeat-Icon gekennzeichnet
- Einzelne Instanz kann bearbeitet werden (Ausnahme), Serie bleibt unberührt
---
### BL-02 — Budget: Monatsvergleich (aktuell vs. Vormonat)
**Status:** Erledigt (v0.3.0)
**Aufwand:** S (12 Tage)
SPEC: „Monatsvergleich (aktuell vs. Vormonat)". Derzeit zeigt die Budget-Seite nur den aktuellen Monat. Es fehlen API-Endpunkt und UI-Komponente für den Vergleich.
**Akzeptanzkriterien:**
- Monatsübersicht zeigt Einnahmen/Ausgaben des Vormonats als Vergleichswerte (Trend-Pfeile oder %-Differenz)
- Keine zusätzliche Seite — inline im bestehenden Budget-Header
- Server: GET `/api/v1/budget?month=YYYY-MM` gibt bereits Monatsdaten zurück; Vormonat kann mit einem zweiten Call oder als optionaler `compare`-Parameter geholt werden
---
### BL-03 — Essensplan: Drag & Drop zwischen Slots und Tagen
**Status:** Erledigt (v0.3.0)
**Aufwand:** M (24 Tage)
SPEC: „Drag & Drop zwischen Tagen/Slots". Die Wochenansicht zeigt Mahlzeit-Karten aber unterstützt kein Drag & Drop. Mahlzeiten können nur gelöscht und neu angelegt, nicht verschoben werden.
**Akzeptanzkriterien:**
- Mahlzeit-Karte ist draggable
- Drop auf leeren Slot verschiebt die Mahlzeit (PUT `/api/v1/meals/:id` mit neuem `date` + `meal_type`)
- Drop auf belegten Slot: Swap oder Ablehnung mit visuellem Feedback
- Touch-Support (pointer events, kein reines HTML5 Drag API)
- Reduced-motion: bei `prefers-reduced-motion` kein Animations-Feedback, Aktion trotzdem möglich
---
## Priorität: Mittel
### BL-04 — Kalender-Sync: Settings-UI vollständig verdrahten
**Status:** Offen
**Aufwand:** M (23 Tage)
Die Sync-Services `server/services/google-calendar.js` und `server/services/apple-calendar.js` sind implementiert (~300 Zeilen je). Das Settings-UI in `public/pages/settings.js` zeigt die Verbindungs-Buttons. Unklar ob der komplette OAuth-Flow (Redirect → Callback → Token-Speicherung → Auto-Sync-Intervall) end-to-end getestet und fehlerfrei ist.
**Akzeptanzkriterien:**
- Google-OAuth-Flow: Verbinden → Callback → Token gespeichert → Status in Settings zeigt „Verbunden"
- Apple CalDAV: Credentials-Formular → Verbindungstest → Fehleranzeige wenn Credentials falsch
- Auto-Sync alle 15 min (konfigurierbar) läuft als Hintergrund-Job
- Konfliktstrategie: externes Event gewinnt (wie in SPEC)
---
### BL-05 — Budget: Wiederkehrende Buchungen automatisch generieren
**Status:** Erledigt (v0.3.0)
**Aufwand:** S (12 Tage)
Das Budget-Formular hat eine „Wiederkehrend"-Checkbox und speichert `is_recurring = 1`. Es fehlt jedoch die automatische Generierung der Folgebuchungen. Derzeit muss der Nutzer jede Buchung manuell eintragen.
**Akzeptanzkriterien:**
- Beim Laden des Monats prüft der Server, ob fällige Wiederholungsbuchungen fehlen und legt sie automatisch an (analog zu Tasks)
- Oder: expliziter „Generieren"-Button im UI mit Vorschau
- Nutzer kann einzelne generierte Instanz löschen ohne die Serie zu löschen
---
### BL-06 — Shopping: Schnell-Add Autocomplete von lokalem Verlauf
**Status:** Erledigt (bereits vollständig implementiert)
**Aufwand:** XS
`shopping.js` ruft `/api/v1/shopping/suggestions?q=...` auf. Prüfen ob der API-Endpunkt auf Server-Seite existiert und korrekt auf die `shopping_items`-Historie zugreift. Falls ja, Status auf „Fertig" setzen.
---
## Priorität: Niedrig / Ideen
### BL-07 — Notizen: Volltextsuche / Filter
Derzeit keine Suchfunktion in der Pinnwand. Die Notizen liegen im State, eine Client-seitige Filterleiste wäre ohne API-Änderung machbar.
---
### BL-08 — Dashboard: Wetter-Widget Refresh
Wetter-Widget lädt beim Seitenaufruf und hat keinen manuellen Refresh-Button. Bei langem Tab-Offenbleiben können die Daten veralten. Ein 30-Minuten-Interval oder ein Refresh-Icon wäre sinnvoll (SPEC erwähnt „Refresh 30min" implizit).
---
### BL-09 — Kontakte: vCard-Import / -Export
Nicht im SPEC, aber naheliegend: `.vcf`-Export eines Kontakts, Import aus vCard für Erstbefüllung.
---
### BL-10 — PWA: Offline-Fallback für kritische Seiten
Der Service Worker cached aktuell den App-Shell. Bei Offline-Nutzung fehlt eine sinnvolle Fallback-Seite mit dem Hinweis auf fehlende Verbindung und einem „Wiederholen"-Button.
---
## Erledigte Features (Referenz)
| Feature | Version |
|---------|---------|
| UX Polish (Animationen, Bottom Sheet, FAB, Validierung, Stagger, Vibration) | v0.2.0 |
| Event-Listener-Leaks, CSS-Lücken, Modal-Tests | v0.2.1 |