Explorar o código

SPEC.md: note sprint-view tabs + smart Close on present in §9 + §13

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chiappa hai 3 días
pai
achega
e0859f361f
Modificáronse 1 ficheiros con 34 adicións e 0 borrados
  1. 34 0
      SPEC.md

+ 34 - 0
SPEC.md

@@ -767,6 +767,39 @@ with a `BOOTSTRAP_ADMIN` audit row.
       JS-built assignment cells (admin "+ Add task" path). Pure
       CSS / Twig / vanilla JS — tests untouched at 108 / 281.
 
+- [x] **Sprint view tabs + smart Close on present** (`2813019`):
+      `/sprints/{id}` is now split into two tabs — "Arbeitstage and
+      capacity" (Arbeitstage matrix + capacity table + the snap/save
+      help line) and "Capacity and tasks" (capacity table + task list
+      + the 100 px popover-anchor spacer). The capacity table was
+      extracted into a `{% macro capacity_table(sprintWorkers,
+      capacity) %}` in `views/sprints/show.twig` and rendered twice via
+      `{{ _self.capacity_table(...) }}`. `sprint-planner.js`'s
+      `recomputeRow` and `applyServerCapacity` switched from `qs`
+      (first match) to `qsa` for the `[data-cap-ressourcen|after-
+      reserves|available]` lookups so both copies update in lockstep
+      on every edit, server response, and boot. A new `initTabs` IIFE
+      in the boot section persists the active tab in localStorage
+      under `sp:{sprintId}:tab` (`:beamer`-namespaced for parity with
+      the other keys, even though the present view has no tab nav).
+      Tab buttons use `data-tab-btn`/`data-tab-panel` plus Tailwind
+      3.4 `data-[active=true]:` variants for the underline + colour;
+      no JS-driven class toggling needed beyond flipping `data-active`
+      and the `hidden` class on the panels. Default tab is
+      "arbeitstage" — survives until first selection, persists
+      thereafter. The "Present" view's Close button is now smart: a
+      new `initSmartClose` IIFE intercepts the click — if
+      `window.history.length > 1` (the user navigated to the present
+      view within an existing tab), `history.back()`; otherwise
+      `window.close()` with a 100 ms fallback to navigate to
+      `/sprints/{id}` if the browser blocks `close()` (typed-URL or
+      bookmark-opened pages can't always self-close). The link's
+      `href` is preserved as the navigation fallback. Pure Twig +
+      vanilla JS over existing endpoints — no schema, route, or audit
+      changes; CSP unchanged. Tests at 108 / 281 (no PHP touched, no
+      new test surface — same pattern as Phases 10, 13, 14, 15, 16).
+      ACCEPTANCE.md not yet updated for the tab walkthrough.
+
 - [x] **Phase 19 — Twig 3 + Tailwind 3 + Alpine CSP + htmx + SortableJS,
       jQuery removed** (`75e96e2`). Stack-shift of the entire UI layer
       with zero changes to controllers, repositories, schema, capacity
@@ -891,6 +924,7 @@ before acting — nothing here is load-bearing once it grows stale.
 ## 13. Git history (as of this writing)
 
 ```
+2813019 Sprint view: tabs (Arbeitstage / Tasks) + smart Close on present
 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