feat: dashboard weighs quality and splits work by a list field
The insights reading adds quality (open bugs per priority, bugs created and closed per week for 8 weeks, QA returns and passes per area over 90 days, bugs reported in the 14 days after each of the last three releases) and, for each list custom field, open tickets per option. The dashboard shows both; the field to split by can be picked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -928,6 +928,64 @@ export class BacklogHealthGql {
|
||||
@Field(() => Int) staleDays!: number;
|
||||
}
|
||||
|
||||
@ObjectType('PriorityCount')
|
||||
export class PriorityCountGql {
|
||||
@Field(() => IssuePriority) priority!: IssuePriority;
|
||||
@Field(() => Int) count!: number;
|
||||
}
|
||||
|
||||
@ObjectType('BugWeek', { description: 'Bugs created and closed in a week' })
|
||||
export class BugWeekGql {
|
||||
@Field({ description: 'Monday (UTC), YYYY-MM-DD' }) week!: string;
|
||||
@Field(() => Int) created!: number;
|
||||
@Field(() => Int) closed!: number;
|
||||
}
|
||||
|
||||
@ObjectType('QaByArea', { description: 'QA verdicts per area (90 days)' })
|
||||
export class QaByAreaGql {
|
||||
@Field(() => String, { nullable: true, description: 'Null: no area' })
|
||||
area!: string | null;
|
||||
@Field(() => Int) returned!: number;
|
||||
@Field(() => Int) passed!: number;
|
||||
}
|
||||
|
||||
@ObjectType('EscapedBugs', {
|
||||
description: 'Bugs reported in the 14 days after a release shipped',
|
||||
})
|
||||
export class EscapedBugsGql {
|
||||
@Field(() => ID) releaseId!: string;
|
||||
@Field() name!: string;
|
||||
@Field() releasedAt!: string;
|
||||
@Field(() => Int) bugs!: number;
|
||||
}
|
||||
|
||||
@ObjectType('Quality', {
|
||||
description: 'Bugs (types with the bug icon) and QA',
|
||||
})
|
||||
export class QualityGql {
|
||||
@Field(() => [PriorityCountGql]) openBugsByPriority!: PriorityCountGql[];
|
||||
@Field(() => [BugWeekGql], { description: 'Last 8 weeks, oldest first' })
|
||||
bugWeeks!: BugWeekGql[];
|
||||
@Field(() => [QaByAreaGql]) qaByArea!: QaByAreaGql[];
|
||||
@Field(() => [EscapedBugsGql]) escaped!: EscapedBugsGql[];
|
||||
}
|
||||
|
||||
@ObjectType('OptionCount')
|
||||
export class OptionCountGql {
|
||||
@Field() value!: string;
|
||||
@Field(() => Int) count!: number;
|
||||
}
|
||||
|
||||
@ObjectType('FieldBreakdown', {
|
||||
description: 'Open tickets per option of a list custom field',
|
||||
})
|
||||
export class FieldBreakdownGql {
|
||||
@Field() fieldId!: string;
|
||||
@Field(() => [OptionCountGql]) counts!: OptionCountGql[];
|
||||
@Field(() => Int, { description: 'Open tickets with no value' })
|
||||
none!: number;
|
||||
}
|
||||
|
||||
@ObjectType('ProjectInsights', {
|
||||
description:
|
||||
'The dashboard: sprint under way, risks, aging, bottlenecks, release forecasts, team load, backlog health and changes',
|
||||
@@ -947,4 +1005,9 @@ export class ProjectInsightsGql {
|
||||
changes!: ChangesSinceGql | null;
|
||||
@Field(() => [TeamLoadGql]) team!: TeamLoadGql[];
|
||||
@Field(() => BacklogHealthGql) backlog!: BacklogHealthGql;
|
||||
@Field(() => QualityGql) quality!: QualityGql;
|
||||
@Field(() => [FieldBreakdownGql], {
|
||||
description: 'One per active list custom field',
|
||||
})
|
||||
fields!: FieldBreakdownGql[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user