chore: archive v1.0 phase directories to milestones/
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
---
|
||||
phase: 02-rooms-and-tasks
|
||||
plan: 04
|
||||
type: execute
|
||||
wave: 3
|
||||
depends_on: ["02-02", "02-03"]
|
||||
files_modified:
|
||||
- lib/features/templates/presentation/template_picker_sheet.dart
|
||||
- lib/features/rooms/presentation/room_form_screen.dart
|
||||
- lib/l10n/app_de.arb
|
||||
autonomous: true
|
||||
requirements:
|
||||
- TMPL-01
|
||||
- TMPL-02
|
||||
|
||||
must_haves:
|
||||
truths:
|
||||
- "After creating a room whose name matches a known room type, user is prompted to add tasks from templates"
|
||||
- "Template picker shows a checklist of German-language task templates with all unchecked by default"
|
||||
- "User can check desired templates and they are created as tasks in the room with correct frequencies and effort levels"
|
||||
- "If room name does not match any known type, no template prompt appears and room is created directly"
|
||||
- "All 14 room types from TMPL-02 are covered by the template system"
|
||||
artifacts:
|
||||
- path: "lib/features/templates/presentation/template_picker_sheet.dart"
|
||||
provides: "Bottom sheet with checklist of task templates for a detected room type"
|
||||
min_lines: 40
|
||||
key_links:
|
||||
- from: "lib/features/rooms/presentation/room_form_screen.dart"
|
||||
to: "lib/features/templates/data/task_templates.dart"
|
||||
via: "After room save, calls detectRoomType on room name"
|
||||
pattern: "detectRoomType"
|
||||
- from: "lib/features/rooms/presentation/room_form_screen.dart"
|
||||
to: "lib/features/templates/presentation/template_picker_sheet.dart"
|
||||
via: "Shows template picker bottom sheet if room type detected"
|
||||
pattern: "TemplatePicker|showModalBottomSheet"
|
||||
- from: "lib/features/templates/presentation/template_picker_sheet.dart"
|
||||
to: "lib/features/tasks/presentation/task_providers.dart"
|
||||
via: "Creates tasks from selected templates via taskActions.createTask"
|
||||
pattern: "createTask"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Wire the template selection flow into room creation: detect room type from name, show template picker bottom sheet, and create selected templates as tasks in the newly created room.
|
||||
|
||||
Purpose: Delivers TMPL-01 and TMPL-02 -- the template-driven task creation that makes the app immediately useful. Users create a room and get relevant German-language task suggestions.
|
||||
Output: Template picker bottom sheet, updated room form with template flow integration.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@/home/jlmak/.claude/get-shit-done/workflows/execute-plan.md
|
||||
@/home/jlmak/.claude/get-shit-done/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/STATE.md
|
||||
@.planning/phases/02-rooms-and-tasks/2-CONTEXT.md
|
||||
@.planning/phases/02-rooms-and-tasks/02-RESEARCH.md
|
||||
@.planning/phases/02-rooms-and-tasks/02-01-SUMMARY.md
|
||||
@.planning/phases/02-rooms-and-tasks/02-02-SUMMARY.md
|
||||
@.planning/phases/02-rooms-and-tasks/02-03-SUMMARY.md
|
||||
|
||||
<interfaces>
|
||||
<!-- From Plan 01 (template data) -->
|
||||
|
||||
From lib/features/templates/data/task_templates.dart:
|
||||
```dart
|
||||
class TaskTemplate {
|
||||
final String name;
|
||||
final String? description;
|
||||
final IntervalType intervalType;
|
||||
final int intervalDays;
|
||||
final EffortLevel effortLevel;
|
||||
const TaskTemplate({...});
|
||||
}
|
||||
|
||||
const Map<String, List<TaskTemplate>> roomTemplates = { ... };
|
||||
String? detectRoomType(String roomName);
|
||||
```
|
||||
|
||||
<!-- From Plan 02 (room form) -->
|
||||
|
||||
From lib/features/rooms/presentation/room_form_screen.dart:
|
||||
```dart
|
||||
// Full-screen form with name + icon fields
|
||||
// On save: calls roomActions.createRoom(name, iconName) which returns roomId
|
||||
// After save: context.pop() currently
|
||||
// MODIFY: after save for new rooms, check detectRoomType before popping
|
||||
```
|
||||
|
||||
<!-- From Plan 03 (task creation) -->
|
||||
|
||||
From lib/features/tasks/presentation/task_providers.dart:
|
||||
```dart
|
||||
@riverpod
|
||||
class TaskActions extends _$TaskActions {
|
||||
Future<int> createTask({
|
||||
required int roomId,
|
||||
required String name,
|
||||
String? description,
|
||||
required IntervalType intervalType,
|
||||
required int intervalDays,
|
||||
int? anchorDay,
|
||||
required EffortLevel effortLevel,
|
||||
required DateTime nextDueDate,
|
||||
}) async { ... }
|
||||
}
|
||||
```
|
||||
</interfaces>
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Create template picker bottom sheet</name>
|
||||
<files>
|
||||
lib/features/templates/presentation/template_picker_sheet.dart,
|
||||
lib/l10n/app_de.arb
|
||||
</files>
|
||||
<action>
|
||||
**lib/features/templates/presentation/template_picker_sheet.dart**: Create a `StatefulWidget` (not Consumer -- it receives data via constructor) that displays a checklist of task templates.
|
||||
|
||||
Constructor parameters:
|
||||
- `String roomType` -- the detected room type key
|
||||
- `List<TaskTemplate> templates` -- the template list for this room type
|
||||
- `void Function(List<TaskTemplate> selected) onConfirm` -- callback with selected templates
|
||||
|
||||
UI structure:
|
||||
- Title: "Aufgaben aus Vorlagen hinzufuegen?" (from ARB)
|
||||
- Subtitle hint: the detected room type display name (capitalize first letter)
|
||||
- `ListView` of `CheckboxListTile` widgets, one per template
|
||||
- Each tile shows: template name as title, frequency label as subtitle (e.g. "Woechentlich - Mittel")
|
||||
- **All unchecked by default** per user decision
|
||||
- Bottom action row: "Ueberspringen" (skip/cancel) button and "Hinzufuegen" (add) button
|
||||
- "Hinzufuegen" button only enabled when at least one template is checked
|
||||
- Use `showModalBottomSheet` with `isScrollControlled: true` and `DraggableScrollableSheet` for long lists
|
||||
- Track checked state with a `Set<int>` (template index)
|
||||
|
||||
**lib/l10n/app_de.arb**: Add template-related keys:
|
||||
- "templatePickerTitle": "Aufgaben aus Vorlagen hinzuf\u00fcgen?"
|
||||
- "templatePickerSkip": "\u00dcberspringen"
|
||||
- "templatePickerAdd": "Hinzuf\u00fcgen"
|
||||
- "templatePickerSelected": "{count} ausgew\u00e4hlt"
|
||||
</action>
|
||||
<verify>
|
||||
<automated>cd /home/jlmak/Projects/jlmak/HouseHoldKeaper && dart analyze lib/features/templates/presentation/ && flutter test</automated>
|
||||
</verify>
|
||||
<done>
|
||||
Template picker bottom sheet displays checklist of templates with frequency/effort info, all unchecked by default. Skip and add buttons. Localized German strings.
|
||||
</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Wire template flow into room creation</name>
|
||||
<files>
|
||||
lib/features/rooms/presentation/room_form_screen.dart
|
||||
</files>
|
||||
<action>
|
||||
Modify the room form screen's save flow for NEW rooms (not edit) to integrate the template selection:
|
||||
|
||||
1. After `roomActions.createRoom(name, iconName)` returns the new `roomId`:
|
||||
2. Call `detectRoomType(name)` to check if the room name matches a known type
|
||||
3. **If room type detected** (not null):
|
||||
- Look up `roomTemplates[roomType]` to get the template list
|
||||
- Show `TemplatePickerSheet` via `showModalBottomSheet`
|
||||
- If user selects templates and confirms:
|
||||
- For each selected `TaskTemplate`, call `taskActions.createTask()` with:
|
||||
- `roomId`: the newly created room ID
|
||||
- `name`: template.name
|
||||
- `description`: template.description
|
||||
- `intervalType`: template.intervalType
|
||||
- `intervalDays`: template.intervalDays
|
||||
- `anchorDay`: set based on interval type (for calendar-anchored: today's day-of-month)
|
||||
- `effortLevel`: template.effortLevel
|
||||
- `nextDueDate`: today (first due date = today for all template tasks)
|
||||
- After creating all tasks, navigate to the new room: `context.go('/rooms/$roomId')`
|
||||
- If user skips (taps "Ueberspringen"): navigate to `/rooms/$roomId` without creating tasks
|
||||
4. **If no room type detected** (null):
|
||||
- Navigate directly to `/rooms/$roomId` (no template prompt per user decision: "Users can create fully custom rooms with no template prompt if no room type matches")
|
||||
|
||||
Important per user decision: "The template prompt after room creation should feel like a helpful suggestion, not a required step -- easy to dismiss"
|
||||
|
||||
For EDIT mode: no template prompt (only on creation). The save flow for edit stays as-is (update room, pop).
|
||||
|
||||
Read `taskActionsProvider` via `ref.read(taskActionsProvider.notifier)` for the mutations (not watch -- this is in a callback).
|
||||
</action>
|
||||
<verify>
|
||||
<automated>cd /home/jlmak/Projects/jlmak/HouseHoldKeaper && dart analyze lib/features/rooms/presentation/ lib/features/templates/presentation/ && flutter test</automated>
|
||||
</verify>
|
||||
<done>
|
||||
Room creation flow: save room -> detect room type -> show template picker if match -> create selected templates as tasks -> navigate to room. Custom rooms skip templates. Edit mode unaffected. All existing tests pass.
|
||||
</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<verification>
|
||||
```bash
|
||||
cd /home/jlmak/Projects/jlmak/HouseHoldKeaper && dart analyze && flutter test
|
||||
```
|
||||
All code analyzes clean. All tests pass. Template selection flow is wired into room creation.
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- Creating a room with a recognized name (e.g. "Kueche") triggers template picker
|
||||
- Template picker shows relevant German task templates, all unchecked
|
||||
- Checking templates and confirming creates them as tasks in the room
|
||||
- Skipping creates the room without tasks
|
||||
- Unrecognized room names skip template prompt entirely
|
||||
- Edit mode does not show template prompt
|
||||
- All 14 room types accessible via detectRoomType
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.planning/phases/02-rooms-and-tasks/02-04-SUMMARY.md`
|
||||
</output>
|
||||
Reference in New Issue
Block a user