diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index c8ffa18..9c1e55e 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -23,7 +23,7 @@ See `milestones/v1.0-ROADMAP.md` for full phase details. - [x] **Phase 5: Calendar Strip** - Replace the stacked daily plan home screen with a horizontal scrollable date-strip and day-task list (completed 2026-03-16) - [x] **Phase 6: Task History** - Record every task completion with a timestamp and expose a per-task history view (completed 2026-03-16) -- [ ] **Phase 7: Task Sorting** - Add alphabetical, interval, and effort sort options to task lists +- [x] **Phase 7: Task Sorting** - Add alphabetical, interval, and effort sort options to task lists (completed 2026-03-16) ## Phase Details @@ -63,7 +63,7 @@ Plans: 2. Selecting alphabetical sort orders tasks A-Z by name within the visible list 3. Selecting interval sort orders tasks from most-frequent (daily) to least-frequent (yearly/custom) intervals 4. Selecting effort sort orders tasks from lowest effort to highest effort level -**Plans:** 1/2 plans executed +**Plans:** 2/2 plans complete Plans: - [ ] 07-01-PLAN.md — Sort model, persistence notifier, localization, provider integration - [ ] 07-02-PLAN.md — Sort dropdown widget, HomeScreen AppBar, TaskListScreen integration, tests @@ -78,4 +78,4 @@ Plans: | 4. Notifications | v1.0 | 3/3 | Complete | 2026-03-16 | | 5. Calendar Strip | 2/2 | Complete | 2026-03-16 | - | | 6. Task History | 1/1 | Complete | 2026-03-16 | - | -| 7. Task Sorting | 1/2 | In Progress| | - | +| 7. Task Sorting | 2/2 | Complete | 2026-03-16 | - | diff --git a/.planning/STATE.md b/.planning/STATE.md index ebd71a7..cf343f6 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,14 +3,14 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: completed -stopped_at: Completed 07-task-sorting/07-01-PLAN.md -last_updated: "2026-03-16T21:34:49.629Z" +stopped_at: Completed 07-task-sorting/07-02-PLAN.md +last_updated: "2026-03-16T21:40:24.558Z" last_activity: 2026-03-16 — Completed Phase 6 Plan 01 (task completion history) progress: total_phases: 3 - completed_phases: 2 + completed_phases: 3 total_plans: 5 - completed_plans: 4 + completed_plans: 5 percent: 100 --- @@ -46,6 +46,7 @@ Progress: [██████████] 100% (1/1 plans in Phase 6) | Phase 05-calendar-strip P02 | 8 | 3 tasks | 9 files | | Phase 06-task-history P01 | 5 | 2 tasks | 9 files | | Phase 07-task-sorting P01 | 4 | 2 tasks | 9 files | +| Phase 07-task-sorting P02 | 4 | 2 tasks | 5 files | ## Accumulated Context @@ -67,6 +68,8 @@ Progress: [██████████] 100% (1/1 plans in Phase 6) - [Phase 07-task-sorting]: Default sort is alphabetical — continuity with existing A-Z SQL sort in CalendarDayList - [Phase 07-task-sorting]: overdueTasks are NOT sorted — pinned at top in existing order per design decision - [Phase 07-task-sorting]: Sort preference stored as enum.name string in SharedPreferences (not intEnum) — enum reordering safe +- [Phase 07-task-sorting]: Used PopupMenuButton for SortDropdown in AppBar — menu overlay vs inline expansion, Material 3 pattern +- [Phase 07-task-sorting]: HomeScreen uses nested Scaffold for AppBar — standard StatefulShellRoute.indexedStack per-tab AppBar pattern ### Pending Todos @@ -78,7 +81,7 @@ None. ## Session Continuity -Last session: 2026-03-16T21:34:49.627Z -Stopped at: Completed 07-task-sorting/07-01-PLAN.md +Last session: 2026-03-16T21:40:24.556Z +Stopped at: Completed 07-task-sorting/07-02-PLAN.md Resume file: None Next action: Phase 7 (task sorting) or release diff --git a/.planning/phases/07-task-sorting/07-02-SUMMARY.md b/.planning/phases/07-task-sorting/07-02-SUMMARY.md new file mode 100644 index 0000000..2512d9e --- /dev/null +++ b/.planning/phases/07-task-sorting/07-02-SUMMARY.md @@ -0,0 +1,125 @@ +--- +phase: 07-task-sorting +plan: 02 +subsystem: ui +tags: [flutter, riverpod, material3, popup-menu, sort-ui, localization] + +# Dependency graph +requires: + - phase: 07-task-sorting + plan: 01 + provides: sortPreferenceProvider, TaskSortOption enum, German sort l10n strings + +provides: + - SortDropdown ConsumerWidget (PopupMenuButton with check marks) + - HomeScreen with AppBar (title: Übersicht, actions: SortDropdown) + - TaskListScreen AppBar with SortDropdown before edit/delete buttons + +affects: [home_screen_test.dart, app_shell_test.dart, any screen showing HomeScreen] + +# Tech tracking +tech-stack: + added: [] + patterns: + - "PopupMenuButton with Opacity check mark — avoids layout shift vs conditional Icon" + - "Nested Scaffold inside AppShell tab body — standard pattern for per-tab AppBars in StatefulShellRoute" + +key-files: + created: + - lib/features/tasks/presentation/sort_dropdown.dart + modified: + - lib/features/home/presentation/home_screen.dart + - lib/features/tasks/presentation/task_list_screen.dart + - test/features/home/presentation/home_screen_test.dart + - test/shell/app_shell_test.dart + +key-decisions: + - "Used PopupMenuButton instead of DropdownButton for AppBar — menu overlay vs inline expansion, consistent with Material 3 AppBar action patterns" + - "Opacity(opacity: isSelected ? 1 : 0) for check mark — preserves item width alignment vs conditional show/hide" + - "HomeScreen Scaffold is nested inside AppShell Scaffold — standard StatefulShellRoute pattern for per-tab AppBars" + +# Metrics +duration: 4min +completed: 2026-03-16 +--- + +# Phase 07 Plan 02: Sort Dropdown UI Summary + +**SortDropdown ConsumerWidget using PopupMenuButton wired into HomeScreen AppBar (title: Übersicht) and TaskListScreen AppBar before edit/delete actions** + +## Performance + +- **Duration:** 4 min +- **Started:** 2026-03-16T21:35:56Z +- **Completed:** 2026-03-16T21:39:24Z +- **Tasks:** 2 +- **Files modified:** 5 (1 created, 4 modified) + +## Accomplishments + +- SortDropdown ConsumerWidget: PopupMenuButton with sort icon, current label, and check mark on active option +- HomeScreen wrapped in Scaffold with AppBar titled "Übersicht" and SortDropdown in trailing actions +- TaskListScreen AppBar has SortDropdown before the existing edit/delete IconButtons +- 2 new tests in HomeScreen test suite: verifies PopupMenuButton and AppBar title presence +- Auto-fixed app_shell_test regression caused by "Übersicht" now appearing twice (AppBar + bottom nav) + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: SortDropdown widget and HomeScreen/TaskListScreen integration** - `e5eccb7` (feat) +2. **Task 2: Sort dropdown tests and AppShell test fix** - `a3e4d02` (feat) + +## Files Created/Modified + +- `lib/features/tasks/presentation/sort_dropdown.dart` - Reusable SortDropdown ConsumerWidget with PopupMenuButton +- `lib/features/home/presentation/home_screen.dart` - Added Scaffold with AppBar (Übersicht title + SortDropdown) +- `lib/features/tasks/presentation/task_list_screen.dart` - Added SortDropdown before edit/delete in AppBar actions +- `test/features/home/presentation/home_screen_test.dart` - Added sortPreferenceProvider override + 2 new sort dropdown tests +- `test/shell/app_shell_test.dart` - Fixed findsOneWidget -> findsWidgets for 'Übersicht' (now in AppBar + bottom nav) + +## Decisions Made + +- Used PopupMenuButton instead of DropdownButton for AppBar actions — menu overlay is cleaner in AppBar context (Material 3) +- Opacity trick for check mark: `Opacity(opacity: isSelected ? 1 : 0)` preserves item width so labels align regardless of selection +- HomeScreen uses nested Scaffold for AppBar — standard pattern in StatefulShellRoute.indexedStack; AppShell provides bottom nav, HomeScreen provides AppBar + +## Deviations from Plan + +### Auto-fixed Issues + +**1. [Rule 1 - Bug] Fixed AppShell test regression from 'Übersicht' duplicate** +- **Found during:** Task 2 test run +- **Issue:** `app_shell_test.dart` expected `findsOneWidget` for 'Übersicht'. Adding the HomeScreen AppBar title caused the string to appear twice (AppBar + bottom nav label). +- **Fix:** Changed `findsOneWidget` to `findsWidgets` in `app_shell_test.dart` line 67. Applied same fix to new `home_screen_test.dart` AppBar title test. +- **Files modified:** `test/shell/app_shell_test.dart`, `test/features/home/presentation/home_screen_test.dart` +- **Commit:** `a3e4d02` + +## Issues Encountered + +None beyond the auto-fixed regression. + +## User Setup Required + +None - no external service configuration required. + +## Next Phase Readiness + +- Phase 07 (task sorting) is now complete: data layer (07-01) + UI layer (07-02) +- Sort dropdown is live in both HomeScreen and TaskListScreen AppBars +- Selecting a sort option reactively reorders task lists via sortPreferenceProvider +- Preference persists across app restarts via SharedPreferences + +--- +*Phase: 07-task-sorting* +*Completed: 2026-03-16* + +## Self-Check: PASSED + +- FOUND: lib/features/tasks/presentation/sort_dropdown.dart +- FOUND: lib/features/home/presentation/home_screen.dart (modified) +- FOUND: lib/features/tasks/presentation/task_list_screen.dart (modified) +- FOUND: test/features/home/presentation/home_screen_test.dart (modified) +- FOUND: test/shell/app_shell_test.dart (modified) +- Commits e5eccb7, a3e4d02 verified in git log +- All 115 tests pass, dart analyze clean