feat: custom fields per project

Text, number, date or option-list fields defined in the project settings
(archived, never removed; their type is fixed once saved). Tickets hold
them, edited in the side panel, listed under the title and filtered by
option in the list view; also over GraphQL, REST (?field=ID:value) and MCP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 09:31:12 +02:00
parent 233c46e9fa
commit f7e850068b
44 changed files with 1909 additions and 96 deletions

View File

@@ -2424,6 +2424,21 @@
"type": "string"
}
},
{
"name": "field",
"required": false,
"in": "query",
"description": "Custom values the tickets must hold, as FIELD:value. Repeat the parameter for several",
"schema": {
"example": [
"BROWSER:Safari"
],
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "sort",
"required": false,
@@ -10460,6 +10475,54 @@
"archived"
]
},
"CustomFieldType": {
"type": "string",
"enum": [
"TEXT",
"NUMBER",
"DATE",
"SELECT"
],
"description": "DATE values are YYYY-MM-DD"
},
"CustomFieldDefinitionDto": {
"type": "object",
"properties": {
"id": {
"type": "string",
"example": "BROWSER"
},
"name": {
"type": "string",
"example": "Navegador"
},
"type": {
"description": "DATE values are YYYY-MM-DD",
"allOf": [
{
"$ref": "#/components/schemas/CustomFieldType"
}
]
},
"options": {
"description": "The choices of a SELECT field",
"type": "array",
"items": {
"type": "string"
}
},
"archived": {
"type": "boolean"
}
},
"required": [
"id",
"name",
"type",
"options",
"archived"
]
},
"ProjectSettingsDto": {
"type": "object",
"properties": {
@@ -10487,13 +10550,20 @@
"items": {
"$ref": "#/components/schemas/AreaOptionDto"
}
},
"customFields": {
"type": "array",
"items": {
"$ref": "#/components/schemas/CustomFieldDefinitionDto"
}
}
},
"required": [
"statuses",
"transitions",
"issueTypes",
"areas"
"areas",
"customFields"
]
},
"ProjectDto": {
@@ -10799,6 +10869,50 @@
"name"
]
},
"CustomFieldDefinitionBodyDto": {
"type": "object",
"properties": {
"id": {
"type": "string",
"example": "BROWSER"
},
"name": {
"type": "string",
"example": "Navegador",
"maxLength": 40
},
"type": {
"description": "Cannot change once the field exists. DATE: YYYY-MM-DD",
"allOf": [
{
"$ref": "#/components/schemas/CustomFieldType"
}
]
},
"options": {
"maxItems": 50,
"example": [
"Chrome",
"Safari",
"Firefox"
],
"description": "The choices of a SELECT field",
"type": "array",
"items": {
"type": "string"
}
},
"archived": {
"type": "boolean",
"default": false
}
},
"required": [
"id",
"name",
"type"
]
},
"ProjectSettingsBodyDto": {
"type": "object",
"properties": {
@@ -10826,6 +10940,13 @@
"items": {
"$ref": "#/components/schemas/AreaOptionBodyDto"
}
},
"customFields": {
"description": "Absent: unchanged. Fields cannot be removed: archive them.",
"type": "array",
"items": {
"$ref": "#/components/schemas/CustomFieldDefinitionBodyDto"
}
}
},
"required": [
@@ -11216,6 +11337,16 @@
"nullable": true,
"format": "date"
},
"customFields": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"example": {
"BROWSER": "Safari"
},
"description": "Custom field id → value (only those set)"
},
"links": {
"type": "array",
"items": {
@@ -11321,6 +11452,7 @@
"storyPoints",
"startDate",
"dueDate",
"customFields",
"links",
"attachments",
"watchers",
@@ -11823,6 +11955,17 @@
"nullable": true,
"format": "date"
},
"customFields": {
"type": "object",
"additionalProperties": {
"type": "string",
"nullable": true
},
"example": {
"BROWSER": "Safari"
},
"description": "Custom field id → value. Only the fields to change; null or '' clears one"
},
"type": {
"type": "string",
"example": "BUG",
@@ -11950,6 +12093,17 @@
"nullable": true,
"format": "date"
},
"customFields": {
"type": "object",
"additionalProperties": {
"type": "string",
"nullable": true
},
"example": {
"BROWSER": "Safari"
},
"description": "Custom field id → value. Only the fields to change; null or '' clears one"
},
"type": {
"type": "string",
"example": "FEATURE",