timetracker/.tasks/done/TT-010-settings-export-feature.md
2026-08-03 21:51:48 +02:00

98 lines
3.3 KiB
Markdown

# TT-010 — Settings & Export Feature
**Type:** Story
**Priority:** Medium
**Labels:** ui, feature, settings, export
**Depends on:** TT-005
**Blocks:**
---
## Summary
Implement the Settings screen covering language selection, theme override,
and the full data export flow (CSV + PDF + JSON) via the system share sheet.
## UI Specification
### SettingsScreen sections
```
┌──────────────────────────────┐
│ AppBar: "Settings" │
├──────────────────────────────┤
│ ▶ APPEARANCE │
│ Theme [System ▼] │
│ Language [English ▼] │
│ │
│ ▶ DATA │
│ Export data → │
│ Import / Restore → │
│ │
│ ▶ ABOUT │
│ Version 0.1.0 │
│ Licenses │
└──────────────────────────────┘
```
### Export Flow (ExportSheet)
Triggered from Settings → "Export data" or Reports → AppBar export button.
```
1. Select format: [CSV] [PDF] [JSON]
2. Select range: [Today] [This week] [This month] [Custom]
3. Filter project: [All projects ▼]
4. → Share button → share_plus share sheet
```
## Export Implementation
### CSV
- Columns: `id, project, start_time, end_time, duration_seconds, note, tags`
- Tags: pipe-separated
- Encoding: UTF-8 with BOM
- File name: `timetrack_export_2026-07-12.csv`
### PDF
- Header: App name, export date, period
- Summary table: Project | Total hours | %
- Entries table: Date | Project | Duration | Note
- File name: `timetrack_report_2026-07-12.pdf`
### JSON
- Full backup schema — see `.ai/features/export.md`
- File name: `timetrack_backup_2026-07-12.json`
## Settings Persistence
Store user preferences in `shared_preferences`:
| Key | Type | Default |
|-----|------|---------|
| `theme_mode` | String | `system` |
| `locale` | String | device locale |
Expose as Riverpod `@riverpod` providers:
- `themeModeProvider` — reads / writes `ThemeMode`
- `localeProvider` — reads / writes `Locale`
Wire into `app.dart` `MaterialApp.router`.
## Acceptance Criteria
- [ ] Theme dropdown: System / Light / Dark — changes app theme immediately
- [ ] Language dropdown: English / Deutsch — changes app locale immediately
- [ ] Export sheet: all 3 formats functional, share sheet opens
- [ ] Export produces non-empty files for each format
- [ ] CSV UTF-8 BOM present (verify with hex check in test)
- [ ] PDF renders without exception for non-empty date range
- [ ] JSON is valid and matches backup schema
- [ ] Preferences persist across app restart (shared_preferences)
- [ ] Widget test: theme selection updates `themeModeProvider`
## Files to create / modify
- `lib/features/settings/presentation/settings_screen.dart` (replace stub)
- `lib/features/settings/presentation/widgets/export_sheet.dart`
- `lib/features/settings/domain/settings_provider.dart`
- `lib/features/settings/data/export_service.dart`
- `test/features/settings/export_service_test.dart`
## Dependencies to add
```yaml
shared_preferences: ^2.3.3
```
Add to `pubspec.yaml`.