- 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>
57 lines
1.9 KiB
TypeScript
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 } })),
|
|
}))
|