feat: dashboard maps the activity, follows a ticket's way and the proposals

Three more blocks on the project dashboard, also by REST, GraphQL and
MCP:
- Activity: what moved each day of the last 12 weeks, in a heatmap,
  with the busiest weekday and the longest lull.
- A ticket's way: for the tickets done in the last 90 days, where the
  time from created to done went, status by status (waiting included),
  and how much of it was work (flow efficiency).
- The public's proposals: received, waiting, under way, done and
  discarded, and the most voted still unanswered.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-16 09:29:38 +02:00
parent 9ccc3b5967
commit 1101b6e926
24 changed files with 1417 additions and 73 deletions

View File

@@ -2441,6 +2441,46 @@ export interface components {
/** @description Open tickets with no value */
none: number;
};
ActivityDayDto: {
/** @example 2026-10-15 */
day: string;
count: number;
};
JourneyStepDto: {
/** @description Status id of the project settings */
status: string;
/** @description Average days a closed ticket spent in it */
days: number;
/** @description Its part of the whole lead time, 0-100 */
share: number;
};
JourneyDto: {
/** @description Tickets done in the last 90 days */
samples: number;
leadDays: number | null;
/** @description Part of the lead time in an in-progress status, 0-100 */
flowEfficiency: number | null;
steps: components["schemas"]["JourneyStepDto"][];
};
WaitingProposalDto: {
id: string;
key: string;
title: string;
votes: number;
/** @description Days since it came in */
days: number;
};
ProposalsFunnelDto: {
received: number;
/** @description In the last 30 days */
receivedLately: number;
/** @description Open, not started, in no sprint nor release */
waiting: number;
underWay: number;
done: number;
discarded: number;
topWaiting: components["schemas"]["WaitingProposalDto"][];
};
ProjectInsightsDto: {
generatedAt: string;
sprint: components["schemas"]["SprintPulseDto"] | null;
@@ -2455,6 +2495,11 @@ export interface components {
quality: components["schemas"]["QualityDto"];
/** @description One per active list custom field */
fields: components["schemas"]["FieldBreakdownDto"][];
/** @description The last 12 weeks from a Monday, oldest first (84 days) */
heatmap: components["schemas"]["ActivityDayDto"][];
journey: components["schemas"]["JourneyDto"];
/** @description Null while the project has never had a proposal */
proposals: components["schemas"]["ProposalsFunnelDto"] | null;
};
ActivityDto: {
id: string;