|
@@ -82,7 +82,14 @@ REVIEW_01.
|
|
|
|
|
|
|
|
### R02-N02 — `buildTaskRow()` mirrors the Twig partial by hand
|
|
### R02-N02 — `buildTaskRow()` mirrors the Twig partial by hand
|
|
|
- **Severity**: HIGH (already the source of two phase-bound hotfixes).
|
|
- **Severity**: HIGH (already the source of two phase-bound hotfixes).
|
|
|
-- **Status**: open.
|
|
|
|
|
|
|
+- **Status**: fixed-in-d5a09ff. Row markup extracted to
|
|
|
|
|
+ `views/sprints/_task_row.twig`; `_task_list.twig` includes it once per
|
|
|
|
|
+ task and once more inside a hidden `<template
|
|
|
|
|
+ data-task-row-template>` (admin-only). `buildTaskRow` now clones the
|
|
|
|
|
+ template and only populates the per-task fields — ~150 lines of
|
|
|
|
|
+ hand-rolled DOM gone, along with the `ownerChoices()` /
|
|
|
|
|
+ `sprintWorkerHeaders()` helpers that only fed it. TwigViewTest pins
|
|
|
|
|
+ the template's presence (admin path) and absence (read-only path).
|
|
|
- **Where**: `public/assets/js/sprint-planner.js` ~lines 361–510 —
|
|
- **Where**: `public/assets/js/sprint-planner.js` ~lines 361–510 —
|
|
|
`buildTaskRow(task, ...)`.
|
|
`buildTaskRow(task, ...)`.
|
|
|
- Twig source of truth: `views/sprints/_task_list.twig` lines 200–283.
|
|
- Twig source of truth: `views/sprints/_task_list.twig` lines 200–283.
|