feat: a calendar to subscribe to, and the backlog's corners

- Each person can subscribe their dates in Google Calendar, Outlook or
  Apple Calendar: GET /api/calendar/{token}.ics (no session) brings
  their unfinished tickets with a due date (assigned or followed), the
  planned and running sprints and the planned releases of their
  projects, as all-day events linking to the web. The token is made,
  renewed or dropped under /me/calendar (and in GraphQL); in the web,
  from «Calendario» in «Mi trabajo».
- The backlog panel keeps the selected rows' background inside its
  rounded corners.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-14 22:48:33 +02:00
parent 993f80b4b9
commit f45069a327
38 changed files with 1417 additions and 54 deletions

View File

@@ -132,6 +132,45 @@ export interface paths {
patch?: never;
trace?: never;
};
"/api/calendar/{file}": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/**
* A calendar to subscribe to (`{token}.ics`, no session)
* @description Unfinished tickets with a due date (assigned or followed), planned and running sprints, and planned releases with a date, as all-day events.
*/
get: operations["CalendarController_ics"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/me/calendar": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** My calendar URL, if I made one */
get: operations["CalendarController_mine"];
put?: never;
/** A new secret calendar URL (the previous one stops working) */
post: operations["CalendarController_create"];
/** My calendar URL stops working */
delete: operations["CalendarController_revoke"];
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/api/projects": {
parameters: {
query?: never;
@@ -1537,6 +1576,11 @@ export interface components {
email: string;
isActive: boolean;
};
CalendarFeedDto: {
/** @description Secret of the calendar URL: GET /api/calendar/{token}.ics (iCalendar, no session) */
token: string;
createdAt: string;
};
UserRefDto: {
/** @description Pireon user id */
id: string;
@@ -3032,6 +3076,87 @@ export interface operations {
};
};
};
CalendarController_ics: {
parameters: {
query?: never;
header?: never;
path: {
file: string;
};
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CalendarController_mine: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CalendarFeedDto"];
};
};
/** @description I have none */
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
CalendarController_create: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CalendarFeedDto"];
};
};
};
};
CalendarController_revoke: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
204: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
ProjectsController_mine: {
parameters: {
query?: never;