3 KiB
3 KiB
TT-007 — Entries Feature UI
Type: Story
Priority: High
Labels: ui, feature, entries
Depends on: TT-005
Blocks: —
Summary
Implement the Entries screen — a chronological list of all time entries with the ability to manually add, edit, and delete entries.
UI Specification
EntriesScreen layout
┌──────────────────────────────┐
│ AppBar: "Entries" [+ Add] │
│ [Date range filter chips] │
├──────────────────────────────┤
│ Monday, 2026-07-12 │
│ ┌─────────────────────────┐ │
│ │ 🟦 My Project 2h 30m│ │
│ │ 09:00 – 11:30 "Standup"│ │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ 🟩 Backend 1h 00m│ │
│ │ 13:00 – 14:00 │ │
│ └─────────────────────────┘ │
│ Total: 3h 30m │
│ │
│ Sunday, 2026-07-11 │
│ ... │
└──────────────────────────────┘
Widgets to build
| Widget | File | Description |
|---|---|---|
EntriesScreen |
entries_screen.dart |
Root screen with date-grouped list |
EntryListTile |
widgets/entry_list_tile.dart |
Single entry row with swipe-to-delete |
DayHeader |
widgets/day_header.dart |
Section header with date + daily total |
EntryFormSheet |
widgets/entry_form_sheet.dart |
BottomSheet for create/edit |
DateRangeFilter |
widgets/date_range_filter.dart |
Chip row: Today / This week / This month |
Entry Form Fields
- Project (required, dropdown/picker)
- Start date + time (DateTimePicker)
- End date + time (DateTimePicker)
- Note (optional, text field)
- Tags (optional, multi-select chip input)
- Duration is auto-computed from start/end
Acceptance Criteria
- Entries grouped by date, newest first
- Each group shows daily total duration
- Swipe-to-delete with undo
SnackBar - Tap entry → opens edit form pre-filled
- "+ Add" button → opens empty create form
- Form validates: end time must be after start time
- DateRangeFilter chips change the displayed entries reactively
- Widget test: empty state shows placeholder text
- Widget test: list renders entries from provider
Files to create / modify
lib/features/entries/presentation/entries_screen.dart(replace stub)lib/features/entries/presentation/widgets/entry_list_tile.dartlib/features/entries/presentation/widgets/day_header.dartlib/features/entries/presentation/widgets/entry_form_sheet.dartlib/features/entries/presentation/widgets/date_range_filter.darttest/features/entries/entries_screen_test.dart