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:
2026-10-08 15:09:21 +02:00
parent 6aec774c92
commit 09bd8c19a3
23 changed files with 563 additions and 74 deletions

View File

@@ -7754,6 +7754,11 @@
"archived": {
"type": "boolean",
"description": "No new tickets or transitions into it"
},
"wipLimit": {
"type": "number",
"nullable": true,
"description": "Work-in-progress limit (a warning, not a lock)"
}
},
"required": [
@@ -7762,7 +7767,8 @@
"category",
"color",
"requiresReason",
"archived"
"archived",
"wipLimit"
]
},
"StatusTransitionsDto": {
@@ -8067,6 +8073,13 @@
"archived": {
"type": "boolean",
"default": false
},
"wipLimit": {
"type": "number",
"nullable": true,
"minimum": 1,
"maximum": 999,
"description": "Work-in-progress limit (null: none)"
}
},
"required": [

View File

@@ -1009,6 +1009,11 @@ type WorkflowStatus {
"""Entering it needs a reason"""
requiresReason: Boolean!
"""
Work-in-progress limit: most tickets the column should hold (a warning, not a lock)
"""
wipLimit: Int
}
input WorkflowStatusInput {
@@ -1018,4 +1023,7 @@ input WorkflowStatusInput {
id: String!
name: String!
requiresReason: Boolean! = false
"""Work-in-progress limit (null: none)"""
wipLimit: Int
}

View File

@@ -1160,6 +1160,8 @@ export interface components {
requiresReason: boolean;
/** @description No new tickets or transitions into it */
archived: boolean;
/** @description Work-in-progress limit (a warning, not a lock) */
wipLimit: number | null;
};
StatusTransitionsDto: {
/** @example IN_QA */
@@ -1270,6 +1272,8 @@ export interface components {
requiresReason: boolean;
/** @default false */
archived: boolean;
/** @description Work-in-progress limit (null: none) */
wipLimit?: number | null;
};
StatusTransitionsBodyDto: {
/** @example IN_QA */