Jobs: one row component with the four row states (web and Compose) #171

Closed
opened 2026-08-23 19:46:03 +00:00 by nalum · 0 comments
Owner

Part of the jobs flow redesign. The design handoff (design_handoff_jobs_flow, held outside the repo) is the source; the facts it depends on are repeated here so this issue stands alone.

Every field in the new job flow is a row that edits itself. Build the row once per surface before any screen uses it.

Row: min-height: 52px, a 1px separator below, the label in muted ink at a fixed 5.4rem column, the value at 1.05rem, then either a chevron or nothing. A chevron means the row opens a picker; no chevron means it edits in place — no exceptions, or the affordance stops predicting anything.

Four states, all the same height so nothing below moves when typing starts:

  1. Resting — value in normal ink.
  2. Editing in place — 12px radius fill, 2px accent inset ring, a tick at the right. Return or tapping away commits.
  3. Just committed — one flash, plus a snackbar <Field> changed to <value> with Undo. A flash, never a persistent badge, and one snackbar at a time.
  4. Will not commit — error inset ring, muted placeholder, a warning glyph. It traps the field, never the sheet: close and Escape still work and drop that row's change.

Undo restores the value and reopens the row.

An open row never accepts a live update; the rest of the sheet keeps refreshing. When a commit overwrites someone else's concurrent change, the snackbar says so.

The offline queue is part of this issue, not an afterthought. web/src/queue/ holds queued writes, so define: the flash fires on enqueue rather than on acknowledgement (the SyncChip is the honest signal for the rest), Undo against a pending write dequeues it instead of sending a compensating write, and a conflict discovered at flush lands as a notice on the sheet, because the snackbar is long gone.

ItemService.Update is partial-safe (internal/services/item/update.go:44-59), so a one-field commit needs no read-modify-write. Prefer SetDeadline, AssignUser and SetRepeat where they exist; Update refuses a complete flip.

Part of the jobs flow redesign. The design handoff (`design_handoff_jobs_flow`, held outside the repo) is the source; the facts it depends on are repeated here so this issue stands alone. Every field in the new job flow is a row that edits itself. Build the row once per surface before any screen uses it. Row: `min-height: 52px`, a 1px separator below, the label in muted ink at a fixed `5.4rem` column, the value at 1.05rem, then either a chevron or nothing. **A chevron means the row opens a picker; no chevron means it edits in place** — no exceptions, or the affordance stops predicting anything. Four states, all the same height so nothing below moves when typing starts: 1. Resting — value in normal ink. 2. Editing in place — 12px radius fill, 2px accent inset ring, a tick at the right. Return or tapping away commits. 3. Just committed — one flash, plus a snackbar `<Field> changed to <value>` with `Undo`. A flash, never a persistent badge, and one snackbar at a time. 4. Will not commit — error inset ring, muted placeholder, a warning glyph. It traps the field, never the sheet: close and Escape still work and drop that row's change. Undo restores the value **and** reopens the row. An open row never accepts a live update; the rest of the sheet keeps refreshing. When a commit overwrites someone else's concurrent change, the snackbar says so. The offline queue is part of this issue, not an afterthought. `web/src/queue/` holds queued writes, so define: the flash fires on enqueue rather than on acknowledgement (the SyncChip is the honest signal for the rest), Undo against a pending write dequeues it instead of sending a compensating write, and a conflict discovered at flush lands as a notice on the sheet, because the snackbar is long gone. `ItemService.Update` is partial-safe (`internal/services/item/update.go:44-59`), so a one-field commit needs no read-modify-write. Prefer `SetDeadline`, `AssignUser` and `SetRepeat` where they exist; `Update` refuses a `complete` flip.
nalum closed this issue 2026-08-26 18:33:57 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app#171
No description provided.