feat: definition of done per project

A project can ask that tickets reach a DONE status only with their
checklist ticked (settings.checklistBeforeDone, off by default; absent
when saving means unchanged). Members get a 422 telling how many steps are
left; owners and admins may still close it. Settings has the switch and
the ticket's checklist says when the project asks for it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 14:39:24 +02:00
parent 5b0396bc10
commit e598f76e1c
25 changed files with 285 additions and 4 deletions

View File

@@ -273,6 +273,8 @@ export type ProjectRole = 'ADMIN' | 'MEMBER' | 'OWNER' | 'VIEWER';
/** The whole configuration (replaces the previous one). Statuses go in board order. */
export type ProjectSettingsInput = {
areas: Array<AreaOptionInput>;
/** Definition of done: DONE only with the checklist ticked. Absent: unchanged */
checklistBeforeDone?: boolean | null | undefined;
/** Absent: unchanged. Fields cannot be removed: archive them. */
customFields?: Array<CustomFieldDefinitionInput> | null | undefined;
issueTypes: Array<IssueTypeOptionInput>;
@@ -530,6 +532,7 @@ export type ProjectFieldsFragment = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -1524,6 +1527,7 @@ export type MyProjectsQuery = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -1574,6 +1578,7 @@ export type ProjectQuery = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -1734,6 +1739,7 @@ export type PublicProjectsQuery = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -2409,6 +2415,7 @@ export type ProjectChangedSubscription = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -2462,6 +2469,7 @@ export type MyProjectsChangedSubscription = {
owner: { id: string; name: string };
members: Array<{ role: ProjectRole; user: { id: string; name: string } }>;
settings: {
checklistBeforeDone: boolean;
statuses: Array<{
id: string;
name: string;
@@ -2874,6 +2882,10 @@ export const ProjectFieldsFragmentDoc = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},
@@ -9615,6 +9627,10 @@ export const MyProjectsDocument = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},
@@ -9858,6 +9874,10 @@ export const ProjectDocument = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},
@@ -10952,6 +10972,10 @@ export const PublicProjectsDocument = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},
@@ -14334,6 +14358,10 @@ export const ProjectChangedDocument = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},
@@ -14564,6 +14592,10 @@ export const MyProjectsChangedDocument = {
],
},
},
{
kind: 'Field',
name: { kind: 'Name', value: 'checklistBeforeDone' },
},
],
},
},