feat(PBI-115): cross-sprint eligibility + verplaats-knop in draft #59
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/sprint-draft-eligibility"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Fix voor de "Geen eligible stories voor deze sprint"-bug in de draft-flow: sprint-aanmaak respecteert nu cross-sprint eligibility, toont welke sprint blokkeert, en biedt een "Verplaats stories hierheen"-knop.
De PBI-79 cross-sprint-infrastructuur (
sprint-membership-summary+cross-sprint-blocksendpoints, store-fetchers, setters) was wel gebouwd (T-928/T-929) maar nooit in productie aangesloten — deze PR sluit die aan op de draft-flow.Server (
actions/sprints.ts, T-1253)createSprintWithSelectionActionaccepteert nu eenmove: string[]parameter; alleen IDs die inpartition.crossSprintzitten worden herkoppeld aan de nieuwe sprint (DONE-stories zijn nooit verplaatsbaar).conflicts.crossSprinti.p.v. een kale fout, zodat de UI kan tonen welke sprint de stories vasthoudt.BUILDINGis (die verliest de stories).Wiring (
components/backlog/sprint-draft-banner.tsx, T-1254)fetchCrossSprintBlocks(productId, null, pbiIds)vultcrossSprintBlocksvoor de gekozen PBI's.setCrossSprintBlocks({})voorkomt stale data in state B.UI (
components/backlog/sprint-definition-banner.tsx+pbi-list.tsx, T-1255)computeCountstelt geblokkeerde stories niet als geselecteerd; sub-regel toont "X stories zitten al in sprint Y" (of "in N andere sprints").move=[blockedStoryIds].partialals (een deel van) child-stories geblokkeerd is.Tests (T-1256)
computeCountscases (computeCountsgeëxtraheerd naarsprint-definition-banner.utils.tsvoor pure-function isolatie).Test plan
partial(—) i.p.v.full(✓)sprint_idconflicts.notEligible)crossSprintBlocksleeg in store (geen stale data voor state B)npm run verify: nieuwe + bestaande tests groen (lokaal 1259/1259 passing)Notes
docs/plans/sprint-draft-cross-sprint-eligibility.mdderiveScreenState()— aparte follow-up.ideaNotification-errors opmain(actions/ideas.ts,lib/idea-ready-cards.ts); niet uit deze PR, separate fix nodig.__tests__/actions/create-sprint-with-selection.test.ts — 3 nieuwe cases: - move=[id] herkoppelt een cross-sprint story aan de nieuwe sprint - DONE-story in move-lijst wordt NIET verplaatst (zit in notEligible, niet in crossSprint) - 0-eligible retourneert conflicts.crossSprint (regressie op de nieuwe return-shape uit T-1253) __tests__/components/backlog/sprint-definition-banner.test.ts — 5 cases voor computeCounts: telt zonder blokkades, trekt geblokkeerde stories af + verzamelt sprintNames, respecteert overrides.remove/.add, meerdere blokkerende sprints, en geblokkeerde overrides.add. __tests__/components/backlog/sprint-draft-banner.test.tsx — 3 cases voor de wiring: geen draft → niets gefetcht, draft → fetchCrossSprintBlocks met de juiste pbiIds (intent=all + overrides), unmount → setCrossSprintBlocks({}). components/backlog/sprint-definition-banner.utils.ts (nieuw) + components/backlog/sprint-definition-banner.tsx — computeCounts + formatBlockingSprints geëxtraheerd naar een puur utils-bestand zodat de test ze in isolatie kan importeren zonder de hele banner-import-chain (prisma, stores, actions) op te tuigen. Full suite: 144 files / 1259 tests passing (~12.7s). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>