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:
@@ -171,6 +171,60 @@ export class FieldBreakdownReadModel {
|
||||
none!: number;
|
||||
}
|
||||
|
||||
/** How much happened on one day (every event of the activity feed). */
|
||||
export class ActivityDayReadModel {
|
||||
/** `YYYY-MM-DD`. */
|
||||
day!: string;
|
||||
count!: number;
|
||||
}
|
||||
|
||||
/** Where a closed ticket's time goes, from created to done. */
|
||||
export class JourneyStepReadModel {
|
||||
/** Status id of the project's settings. */
|
||||
status!: string;
|
||||
/** Average days a closed ticket spent in it. */
|
||||
days!: number;
|
||||
/** Its part of the whole lead time, 0–100. */
|
||||
share!: number;
|
||||
}
|
||||
|
||||
/** The whole way of the tickets closed lately (90 days). */
|
||||
export class JourneyReadModel {
|
||||
/** Tickets measured: closed as done in the last 90 days. */
|
||||
samples!: number;
|
||||
/** Average days from created to done. */
|
||||
leadDays!: number | null;
|
||||
/** Part of that time in an in-progress status (work, not waiting), 0–100. */
|
||||
flowEfficiency!: number | null;
|
||||
/** In board order, only the statuses they went through. */
|
||||
steps!: JourneyStepReadModel[];
|
||||
}
|
||||
|
||||
/** A proposal waiting for an answer, with its votes. */
|
||||
export class WaitingProposalReadModel {
|
||||
id!: string;
|
||||
key!: string;
|
||||
title!: string;
|
||||
votes!: number;
|
||||
/** Days since it came in. */
|
||||
days!: number;
|
||||
}
|
||||
|
||||
/** The public's proposals (tickets labelled «propuesta»), from in to out. */
|
||||
export class ProposalsFunnelReadModel {
|
||||
received!: number;
|
||||
/** In the last 30 days. */
|
||||
receivedLately!: number;
|
||||
/** Open, not started, in no sprint nor release. */
|
||||
waiting!: number;
|
||||
/** Open and taken up (started, or planned in a sprint or release). */
|
||||
underWay!: number;
|
||||
done!: number;
|
||||
discarded!: number;
|
||||
/** The most voted of those waiting, at most five. */
|
||||
topWaiting!: WaitingProposalReadModel[];
|
||||
}
|
||||
|
||||
/** What the project dashboard reads beyond the counts. */
|
||||
export class ProjectInsightsReadModel {
|
||||
generatedAt!: string;
|
||||
@@ -189,6 +243,11 @@ export class ProjectInsightsReadModel {
|
||||
quality!: QualityReadModel;
|
||||
/** One per active list (SELECT) custom field. */
|
||||
fields!: FieldBreakdownReadModel[];
|
||||
/** The last 12 weeks, oldest first, starting on a Monday (84 days). */
|
||||
heatmap!: ActivityDayReadModel[];
|
||||
journey!: JourneyReadModel;
|
||||
/** Null while the project has never had a proposal. */
|
||||
proposals!: ProposalsFunnelReadModel | null;
|
||||
}
|
||||
|
||||
/** One of my projects at a glance, for the portfolio. */
|
||||
|
||||
Reference in New Issue
Block a user