export interface AgendaCalendar { id: string display_name: string color: string path: string } export interface AgendaEventAttendee { email: string name?: string /** PARTSTAT : NEEDS-ACTION | ACCEPTED | DECLINED | TENTATIVE */ status?: string role?: string } /** Événement tel que renvoyé par l'API (`/calendar/{id}/events`). */ export interface AgendaApiEvent { uid: string summary: string description: string location: string /** ICS : `YYYYMMDD` (journée entière) ou `YYYYMMDDTHHMMSSZ` (UTC). */ start: string end: string all_day: boolean path?: string etag?: string organizer?: string attendees?: AgendaEventAttendee[] meet_url?: string color?: string rrule?: string exdates?: string[] raw_ics?: string } export interface AgendaEventsResponse { events: AgendaApiEvent[] } export interface AgendaCalendarsResponse { calendars: AgendaCalendar[] } /** Occurrence affichable (événement simple ou instance d'une récurrence). */ export interface AgendaEvent { /** Clé unique d'occurrence : `path@startMs`. */ key: string calendarId: string path: string etag: string uid: string title: string description: string location: string meetUrl: string organizer: string attendees: AgendaEventAttendee[] start: Date end: Date allDay: boolean /** Couleur résolue : événement sinon agenda. */ color: string rrule: string recurring: boolean /** Données API du master, pour l'édition aller-retour. */ master: AgendaApiEvent } export interface AgendaEventDraft { title: string start: Date end: Date allDay: boolean calendarId: string description?: string location?: string attendees?: AgendaEventAttendee[] rrule?: string color?: string /** Visio demandée à la création (UltiMeet génère le lien à l'enregistrement). */ includeVideo?: boolean }