소스 검색

SPEC.md: note cell popover, filter close polish, in §9 + §13

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chiappa 3 일 전
부모
커밋
e7cc5cde9f
1개의 변경된 파일50개의 추가작업 그리고 0개의 파일을 삭제
  1. 50 0
      SPEC.md

+ 50 - 0
SPEC.md

@@ -698,6 +698,52 @@ with a `BOOTSTRAP_ADMIN` audit row.
       four cases, days writes preserving status,
       `InvalidArgumentException` guard, `statusGridForSprint`).
 
+- [x] **Cell popover replaces per-cell status select** (`10ea4b8`):
+      the Phase 18 chevron `<select data-assign-status>` next to each
+      task-day input is gone. Clicking a day input (admin) or the new
+      `[data-assign-readonly]` span (non-admin) now opens a single
+      body-attached `.cell-popover` panel anchored 8 px right of the
+      cell (flips left if it would overflow the viewport). Left
+      column: a `<input type="range" min="0" step="0.5">` whose `max`
+      comes from a new admin-configurable setting
+      `assignment_slider_max` (1..100, default 10); dragging mirrors
+      into `input.value` and dispatches `change`, so the existing
+      400 ms debounced days-save pipeline + row total + capacity
+      recompute fire unchanged. The slider is hidden on the non-admin
+      path (no input to mirror). Right column: four status pills with
+      coloured bullets (slate / yellow / green / red, matching the
+      Status filter dropdown) — picking one is terminal: set
+      `data-status` + `.assign-status-*` on the cell, queue the
+      existing `PATCH /tasks/{id}/assignments/status` save, refresh
+      filters, close. Other close triggers: outside pointerdown
+      (capture phase, 50 ms grace after open so the opening click
+      isn't misread), Escape, scroll / resize, and a 250 ms
+      mouseleave grace. New `AppSettingsRepository::getInt`;
+      `SettingsController::KEYS` shape changed from `key=>label` to
+      `key=>[type, label]` so int + bool keys can coexist. Server
+      clamps the int to `[1, 100]`; the per-cell day input itself
+      stays unbounded (typing > max still works). The legacy
+      `.assign-status-select` CSS block was deleted; the new
+      `.cell-popover*` + `.bullet-*` block lives in the same `@layer
+      components` section in `assets/css/input.css`. Strict CSP
+      unchanged — no inline handlers, no new external hosts, the
+      popover element is JS-built and appended once. Tests: 109 / ?
+      (+1 for getInt round-trip + numeric-string guard); the prior
+      108 tests pass without modification. ACCEPTANCE.md gains a
+      note pointing at the popover for the manual cell-edit flow.
+
+- [x] **Filter dropdown close polish** (`9b72c41`, `1864835`): the
+      Owners / Status / Columns dropdowns no longer get cropped
+      when the task table holds a single row (`overflow-hidden` was
+      on the section; replaced with `rounded-t-lg` on the toolbar
+      div + `rounded-b-lg` on the table wrapper so the rounded
+      corners survive). Each dropdown closes on `mouseleave` of its
+      `data-*-root` element with a 250 ms grace timer that
+      `mouseenter` cancels — the previous naive listener fired
+      while the cursor was in transit across the `mt-1` gap and
+      shut the panel before the user could reach it. Owner / Status
+      Clear now also closes the dropdown.
+
 - [x] **Task table polish** (`f204611`): three small UX bugs in the
       shared task list partial fixed in one commit. (a) Sortable
       headers (Task / Owner / Prio / Tot) gained `whitespace-nowrap`;
@@ -845,6 +891,10 @@ before acting — nothing here is load-bearing once it grows stale.
 ## 13. Git history (as of this writing)
 
 ```
+10ea4b8 Cell popover: replace per-cell status select with slider + status pills
+1864835 Fix: filter dropdown close — grace timer for transit gap + close on Clear
+9b72c41 Fix: filter dropdowns no longer cropped + close on mouse-leave
+53891b2 SPEC.md: note task-table polish hotfix in §9 + §13
 f204611 Fix: task table header alignment + status dropdown visibility + per-input tint
 55f9726 Merge branch 'phase-19-stack-shift'
 64d2782 Track composer.lock — fixes stale-cache Docker builds after Phase 19