a73x

specs/004-dashboard-filtering/data-model.md

Ref:   Size: 1.7 KiB

# Data Model: Dashboard Filtering

## New Types

### StatusFilter (enum)

Replaces `show_all: bool` on `App`.

| Variant  | Meaning                            |
|----------|------------------------------------|
| `Open`   | Show only open items (default)     |
| `Closed` | Show only closed items             |
| `All`    | Show all items regardless of status|

**Cycling order**: Open → All → Closed → Open (via `a` key).

## Modified Types

### App (struct)

| Field           | Old Type       | New Type        | Notes                                    |
|-----------------|----------------|-----------------|------------------------------------------|
| `show_all`      | `bool`         | *removed*       | Replaced by `status_filter`              |
| `status_filter` | —              | `StatusFilter`  | New field, defaults to `StatusFilter::Open` |
| `search_query`  | —              | `String`        | New field, current search text           |
| `search_active` | —              | `bool`          | New field, whether search mode is active |

## Unchanged Types (read-only usage)

- `IssueStatus` — used to match against `StatusFilter`
- `PatchStatus` — used to match against `StatusFilter` (maps Open→Open, Closed/Merged→Closed)
- `IssueState.title` — matched against `search_query`
- `PatchState.title` — matched against `search_query`

## State Transitions

```
Normal Mode:
  '/' pressed → search_active = true, search_query = ""
  'a' pressed → status_filter cycles to next variant

Search Mode:
  Escape pressed → search_active = false, search_query = ""
  Backspace pressed → search_query.pop()
  Printable char pressed → search_query.push(char)
  (all other keys ignored while in search mode)
```