ICS Export Architecture¶
This document details the architectural design and implementation of the ICS Export feature in Full Calendar Remastered. The feature provides functionality to serialize the in-memory event cache into a standard .ics (iCalendar RFC 5545) document.
Architectural Workflow¶
The pipeline for selecting, serializing, and writing calendar cache entries as .ics is outlined below:
[IcsExportModal] ──► Query Event Cache (retrieves active events)
│
▼
[Filter & Compile] ──► Filter by user-selected Calendars
│
▼
[formatter.ts: eventsToIcs] ──► Map each event to VEVENT/VTODO
│
├──► [Save to Vault] ──► Write to selected folder in vault (app.vault)
│
└──► [Direct Download] ──► Generate Blob & trigger browser download
Key Components¶
1. Multi-Event Formatter (src/providers/ics/formatter.ts)¶
We extend the existing iCal formatter (formatter.ts) by introducing and exporting eventsToIcs(events: OFCEvent[]): string:
- Instantiates a single top-level
ical.Component('vcalendar')envelope. - Loops through the compiled
OFCEventlist. - Calls the internal
createVEventComponent(for standard events) orcreateVTodoComponent(for tasks) to format each event. - Serializes the entire component tree into a single standard
.icsstring.
2. User Interface Modal (src/features/export/IcsExportModal.ts)¶
The IcsExportModal orchestrates the user interaction:
- Calendar Registry Integration: Retrieves all active calendars using
PluginState.getProviderRegistry().getAllSources(). - Toggle Settings: Renders toggle items for each calendar so users can selectively export subsets of calendars.
- Export Paths: Persists default export folder path configurations to the
icsExportPathplugin settings. - Advanced Filtration Controls:
- Export Period: Options for "Export All Events" (entire history) or "Specific Date Range" (with side-by-side date pickers).
- Daily Time Range Filter: Restricts exported timed events to a daily time window (with side-by-side time pickers).
- Include All-Day Events: Toggle to include or exclude all-day events/tasks.
- Exclude Weekends: Toggle to filter out weekend occurrences.
- Categories to Include: Checklist dynamically populated from unique categories present in the event store.
- Include Types & Task Completion: Dropdowns to filter by events, tasks, and task completion status.
- Save to Vault Pipeline: Resolves file paths, automatically creates target subfolders if they do not exist, checks for file existence, and writes to disk utilizing
app.vault. - Direct Download Pipeline: Uses standard HTML5 Blob ObjectURLs (
URL.createObjectURL) to trigger local browser download prompts, working seamlessly across desktop and mobile.
3. Settings Rendering (src/features/export/ui/renderExportSettings.ts)¶
Exposes settings for default export configuration:
- Placed in the "Integrations" section of the main settings panel (
SettingsTab.tsx). - Allows editing the default
icsExportPathvault directory folder.
Data Model and iCalendar Mapping¶
The mapping from the plugin's canonical OFCEvent model to standard iCalendar structures is handled as follows:
OFCEvent Property |
iCalendar Component | Property Type | Details |
|---|---|---|---|
title |
VEVENT/VTODO |
SUMMARY |
Cleaned title string |
description |
VEVENT/VTODO |
DESCRIPTION |
Markdown/text |
date/startTime/timezone |
VEVENT/VTODO |
DTSTART |
Formatted based on all-day and timezone settings |
endDate/endTime/timezone |
VEVENT/VTODO |
DTEND / DUE |
Formatted based on all-day and timezone settings |
completed (task) |
VTODO |
STATUS / COMPLETED |
Marks COMPLETED or NEEDS-ACTION |
alarms |
VEVENT/VTODO |
VALARM |
Nested alarm triggers |
rrule/recurring |
VEVENT/VTODO |
RRULE |
Recurrence rules |
skipDates |
VEVENT/VTODO |
EXDATE |
Exception dates |