--- phase: 07-task-sorting plan: 01 subsystem: ui tags: [flutter, riverpod, shared_preferences, sorting, localization] # Dependency graph requires: - phase: 05-calendar-strip provides: calendarDayProvider and CalendarDayState used by sort integration - phase: 06-task-history provides: task domain model and CalendarTaskRow context provides: - TaskSortOption enum (alphabetical, interval, effort) - SortPreferenceNotifier with SharedPreferences persistence - sortPreferenceProvider (keepAlive Riverpod provider) - calendarDayProvider with in-memory sort of dayTasks - tasksInRoomProvider with in-memory sort via stream.map - German localization strings: sortAlphabetical, sortInterval, sortEffort, sortLabel affects: [07-02-sort-ui, any phase using calendarDayProvider or tasksInRoomProvider] # Tech tracking tech-stack: added: [] patterns: - "SortPreferenceNotifier: sync default return, async _loadPersisted() — same pattern as ThemeNotifier" - "In-memory sort helper functions (_sortTasks, _sortTasksRaw) applied after DB stream emit" - "overdueTasks intentionally unsorted — only dayTasks sorted" key-files: created: - lib/features/tasks/domain/task_sort_option.dart - lib/features/tasks/presentation/sort_preference_notifier.dart - lib/features/tasks/presentation/sort_preference_notifier.g.dart - test/features/tasks/presentation/sort_preference_notifier_test.dart modified: - lib/features/home/presentation/calendar_providers.dart - lib/features/tasks/presentation/task_providers.dart - lib/l10n/app_de.arb - lib/l10n/app_localizations.dart - lib/l10n/app_localizations_de.dart key-decisions: - "Default sort is alphabetical — continuity with existing A-Z SQL sort in CalendarDayList" - "overdueTasks are NOT sorted — they stay pinned at the top in existing order" - "Sort stored as string (enum.name) in SharedPreferences — not intEnum, so reordering enum is safe" - "SortPreferenceNotifier uses keepAlive: true — global preference should never be disposed" patterns-established: - "SortPreferenceNotifier pattern: sync default + async _loadPersisted() — matches ThemeNotifier" - "In-memory sort via stream.map in StreamProvider — DB SQL sort provides stable baseline, in-memory overrides" requirements-completed: [SORT-01, SORT-02, SORT-03] # Metrics duration: 4min completed: 2026-03-16 --- # Phase 07 Plan 01: Task Sort Domain and Provider Summary **TaskSortOption enum + SharedPreferences-backed SortPreferenceNotifier wired into calendarDayProvider and tasksInRoomProvider with in-memory alphabetical/interval/effort sorting** ## Performance - **Duration:** 4 min - **Started:** 2026-03-16T21:29:32Z - **Completed:** 2026-03-16T21:33:37Z - **Tasks:** 2 - **Files modified:** 9 ## Accomplishments - TaskSortOption enum (alphabetical, interval, effort) with SharedPreferences persistence via SortPreferenceNotifier - calendarDayProvider now watches sortPreferenceProvider and sorts dayTasks in-memory; overdueTasks intentionally unsorted - tasksInRoomProvider now watches sortPreferenceProvider and applies sort via stream.map - 7 new unit tests for SortPreferenceNotifier covering default, state update, persistence, and restart recovery - 4 German localization strings added (sortAlphabetical, sortInterval, sortEffort, sortLabel) ## Task Commits Each task was committed atomically: 1. **TDD RED: Failing sort preference tests** - `a9f2983` (test) 2. **Task 1: TaskSortOption enum, SortPreferenceNotifier, localization** - `13c7d62` (feat) 3. **Task 2: Sort integration into calendarDayProvider and tasksInRoomProvider** - `3697e4e` (feat) ## Files Created/Modified - `lib/features/tasks/domain/task_sort_option.dart` - TaskSortOption enum with alphabetical/interval/effort values - `lib/features/tasks/presentation/sort_preference_notifier.dart` - SortPreferenceNotifier with SharedPreferences persistence - `lib/features/tasks/presentation/sort_preference_notifier.g.dart` - Generated Riverpod provider code - `lib/features/home/presentation/calendar_providers.dart` - Added sortPreferenceProvider watch + _sortTasks helper - `lib/features/tasks/presentation/task_providers.dart` - Added sortPreferenceProvider watch + _sortTasksRaw helper + stream.map - `lib/l10n/app_de.arb` - Added sortAlphabetical, sortInterval, sortEffort, sortLabel strings - `lib/l10n/app_localizations.dart` - Regenerated with sort string getters - `lib/l10n/app_localizations_de.dart` - Regenerated with German sort string implementations - `test/features/tasks/presentation/sort_preference_notifier_test.dart` - 7 unit tests for sort preference ## Decisions Made - Default sort is alphabetical for continuity with existing SQL A-Z sort in CalendarDayList - overdueTasks section is explicitly NOT sorted — stays pinned at top in existing order - Sort preference stored as enum.name string in SharedPreferences (not intEnum) so enum reordering is always safe - SortPreferenceNotifier uses `keepAlive: true` — global app preference must not be disposed ## Deviations from Plan None - plan executed exactly as written. ## Issues Encountered None. ## User Setup Required None - no external service configuration required. ## Next Phase Readiness - sortPreferenceProvider is live and defaults to alphabetical - Both task list providers react to sort preference changes immediately - Ready for 07-02: sort UI (dropdown in AppBar) to write to sortPreferenceProvider --- *Phase: 07-task-sorting* *Completed: 2026-03-16* ## Self-Check: PASSED - FOUND: lib/features/tasks/domain/task_sort_option.dart - FOUND: lib/features/tasks/presentation/sort_preference_notifier.dart - FOUND: lib/features/tasks/presentation/sort_preference_notifier.g.dart - FOUND: test/features/tasks/presentation/sort_preference_notifier_test.dart - FOUND: .planning/phases/07-task-sorting/07-01-SUMMARY.md - Commits a9f2983, 13c7d62, 3697e4e all verified in git log