98 lines
3.3 KiB
Markdown
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`.
|