feat: a roadmap of epics over time

Tickets get a start date next to their due date, both editable on the
ticket page. The Hoja de ruta tab lays the epics out over the months as
bars filled with their progress, with sprints and releases as landmarks
and a line for today.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 15:13:58 +02:00
parent 09bd8c19a3
commit 45a3dc1e16
28 changed files with 698 additions and 10 deletions

View File

@@ -40,6 +40,8 @@ export type CreateIssueInput = {
priority?: IssuePriority | null | undefined;
projectId: string;
releaseId?: string | null | undefined;
/** When work should start (roadmap), YYYY-MM-DD */
startDate?: string | null | undefined;
storyPoints?: number | null | undefined;
title: string;
/** A ticket type id */
@@ -212,6 +214,8 @@ export type UpdateIssueInput = {
issueId: string;
labels?: Array<string> | null | undefined;
priority?: IssuePriority | null | undefined;
/** When work should start (roadmap), YYYY-MM-DD */
startDate?: string | null | undefined;
storyPoints?: number | null | undefined;
title?: string | null | undefined;
type?: string | null | undefined;
@@ -293,6 +297,8 @@ export type IssueSummaryFieldsFragment = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -302,7 +308,6 @@ export type IssueSummaryFieldsFragment = {
export type IssueFieldsFragment = {
description: string | null;
figmaUrl: string | null;
dueDate: string | null;
createdAt: string;
allowedTransitions: Array<string>;
id: string;
@@ -320,6 +325,8 @@ export type IssueFieldsFragment = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
reporter: { id: string; name: string };
links: Array<{
type: IssueLinkType;
@@ -414,6 +421,8 @@ export type BoardQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -431,7 +440,6 @@ export type IssueQuery = {
issue: {
description: string | null;
figmaUrl: string | null;
dueDate: string | null;
createdAt: string;
allowedTransitions: Array<string>;
id: string;
@@ -449,6 +457,8 @@ export type IssueQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
reporter: { id: string; name: string };
links: Array<{
type: IssueLinkType;
@@ -496,6 +506,8 @@ export type SearchIssuesQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -649,6 +661,8 @@ export type MyIssuesQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -679,6 +693,8 @@ export type IssueChildrenQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -709,6 +725,8 @@ export type EpicsQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -781,6 +799,8 @@ export type BacklogQuery = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -1410,6 +1430,8 @@ export type IssueChangedSubscription = {
version: number;
rank: string;
storyPoints: number | null;
startDate: string | null;
dueDate: string | null;
assignee: { id: string; name: string } | null;
release: { id: string; name: string } | null;
sprint: { id: string; name: string } | null;
@@ -1804,6 +1826,8 @@ export const IssueSummaryFieldsFragmentDoc = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -1843,7 +1867,6 @@ export const IssueFieldsFragmentDoc = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'description' } },
{ kind: 'Field', name: { kind: 'Name', value: 'figmaUrl' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },
{
kind: 'Field',
@@ -2018,6 +2041,8 @@ export const IssueFieldsFragmentDoc = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -2680,6 +2705,8 @@ export const BoardDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -2824,6 +2851,8 @@ export const IssueDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -2843,7 +2872,6 @@ export const IssueDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'description' } },
{ kind: 'Field', name: { kind: 'Name', value: 'figmaUrl' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'createdAt' } },
{
kind: 'Field',
@@ -3086,6 +3114,8 @@ export const SearchIssuesDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -4314,6 +4344,8 @@ export const MyIssuesDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -4472,6 +4504,8 @@ export const IssueChildrenDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -4648,6 +4682,8 @@ export const EpicsDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -5128,6 +5164,8 @@ export const BacklogDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},
@@ -8788,6 +8826,8 @@ export const IssueChangedDocument = {
},
{ kind: 'Field', name: { kind: 'Name', value: 'rank' } },
{ kind: 'Field', name: { kind: 'Name', value: 'storyPoints' } },
{ kind: 'Field', name: { kind: 'Name', value: 'startDate' } },
{ kind: 'Field', name: { kind: 'Name', value: 'dueDate' } },
],
},
},