Scrum4Me/stores/sprint-store.ts
janpeter visser d92e548f88 feat: ST-301-ST-312 M3 Sprint Backlog en Sprint Planning
- useSprintStore met sprintStoryOrder/taskOrder (ST-301)
- Sprint aanmaken modal met Sprint Goal validatie (ST-302)
- Sprint Backlog pagina SplitPane layout met Sprint Goal header (ST-303)
- Stories toevoegen aan Sprint via knop in rechterpaneel (ST-304)
- Sprint Backlog volgorde aanpassen via dnd-kit (ST-305)
- Story uit Sprint verwijderen met status terug naar OPEN (ST-306)
- Sprint Planning pagina SplitPane met story selectie (ST-307)
- Taken aanmaken inline in rechterpaneel (ST-308)
- Taak drag-and-drop verticaal met optimistische update (ST-309)
- Taakstatus toggle TO_DO/IN_PROGRESS/DONE met voortgangsindicator (ST-310)
- Taak inline bewerken en verwijderen (ST-311)
- Sprint afronden dialoog met per-story Done/Terug keuze (ST-312)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-24 11:51:27 +02:00

57 lines
1.9 KiB
TypeScript

import { create } from 'zustand'
interface SprintStore {
// sprintId → storyId[]
sprintStoryOrder: Record<string, string[]>
// storyId → taskId[]
taskOrder: Record<string, string[]>
initSprint: (sprintId: string, storyIds: string[]) => void
addStoryToSprint: (sprintId: string, storyId: string) => void
removeStoryFromSprint: (sprintId: string, storyId: string) => void
reorderSprintStories: (sprintId: string, storyIds: string[]) => void
rollbackSprint: (sprintId: string, storyIds: string[]) => void
initTasks: (storyId: string, taskIds: string[]) => void
reorderTasks: (storyId: string, taskIds: string[]) => void
rollbackTasks: (storyId: string, taskIds: string[]) => void
}
export const useSprintStore = create<SprintStore>((set) => ({
sprintStoryOrder: {},
taskOrder: {},
initSprint: (sprintId, storyIds) =>
set((s) => ({ sprintStoryOrder: { ...s.sprintStoryOrder, [sprintId]: storyIds } })),
addStoryToSprint: (sprintId, storyId) =>
set((s) => ({
sprintStoryOrder: {
...s.sprintStoryOrder,
[sprintId]: [...(s.sprintStoryOrder[sprintId] ?? []), storyId],
},
})),
removeStoryFromSprint: (sprintId, storyId) =>
set((s) => ({
sprintStoryOrder: {
...s.sprintStoryOrder,
[sprintId]: (s.sprintStoryOrder[sprintId] ?? []).filter((id) => id !== storyId),
},
})),
reorderSprintStories: (sprintId, storyIds) =>
set((s) => ({ sprintStoryOrder: { ...s.sprintStoryOrder, [sprintId]: storyIds } })),
rollbackSprint: (sprintId, storyIds) =>
set((s) => ({ sprintStoryOrder: { ...s.sprintStoryOrder, [sprintId]: storyIds } })),
initTasks: (storyId, taskIds) =>
set((s) => ({ taskOrder: { ...s.taskOrder, [storyId]: taskIds } })),
reorderTasks: (storyId, taskIds) =>
set((s) => ({ taskOrder: { ...s.taskOrder, [storyId]: taskIds } })),
rollbackTasks: (storyId, taskIds) =>
set((s) => ({ taskOrder: { ...s.taskOrder, [storyId]: taskIds } })),
}))