feat: work-in-progress limits and swimlanes on the board
Each status can carry a WIP limit in the project settings; the board shows it next to the count, marks a column that goes over it and says so when a card is dropped there. The board can also be grouped in rows by person, epic, priority or type, remembered per browser. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,23 @@ describe('Project settings', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('keeps work-in-progress limits, from 1 to 999', () => {
|
||||
const project = newProject();
|
||||
const limited = defaultProjectSettings();
|
||||
limited.statuses[2].wipLimit = 3;
|
||||
project.updateSettings('owner', limited);
|
||||
expect(project.workflow.wipLimit(limited.statuses[2].id)).toBe(3);
|
||||
expect(project.workflow.wipLimit('TODO')).toBeNull();
|
||||
// Saving the same again is no change.
|
||||
const before = project.getUncommittedEvents().length;
|
||||
project.updateSettings('owner', structuredClone(limited));
|
||||
expect(project.getUncommittedEvents()).toHaveLength(before);
|
||||
|
||||
const zero = defaultProjectSettings();
|
||||
zero.statuses[2].wipLimit = 0;
|
||||
expect(() => project.updateSettings('owner', zero)).toThrow(/WIP/);
|
||||
});
|
||||
|
||||
it('rejects settings that would break the board', () => {
|
||||
const project = newProject();
|
||||
const noStart = defaultProjectSettings();
|
||||
|
||||
Reference in New Issue
Block a user