feat: basic caldav support (#14372)

fix #13531 

#### PR Dependency Tree


* **PR #14372** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* CalDAV calendar integration: link and sync CalDAV-compatible calendars
(discovery, listing, event sync).
* New UI flow and dialog to link CalDAV accounts with provider
selection, credentials, and display name.

* **API / Config**
* Server exposes CalDAV provider presets in config and new GraphQL
mutation to link CalDAV accounts.
  * New calendar config section for CalDAV with validation and defaults.

* **Tests**
  * Comprehensive CalDAV integration test suite added.

* **Chores**
* Removed analytics tokens from build configuration and reduced Cloud
E2E test shards.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-02-05 03:04:21 +08:00
committed by GitHub
parent 403f16b404
commit a655b79166
34 changed files with 2995 additions and 217 deletions
@@ -1,27 +1,27 @@
{
"ar": 98,
"ca": 99,
"ar": 97,
"ca": 98,
"da": 4,
"de": 99,
"el-GR": 98,
"de": 98,
"el-GR": 97,
"en": 100,
"es-AR": 98,
"es-CL": 99,
"es": 98,
"fa": 98,
"fr": 99,
"es-AR": 97,
"es-CL": 98,
"es": 97,
"fa": 97,
"fr": 98,
"hi": 2,
"it-IT": 99,
"it-IT": 98,
"it": 1,
"ja": 98,
"ko": 99,
"ja": 97,
"ko": 98,
"nb-NO": 48,
"pl": 100,
"pt-BR": 98,
"ru": 99,
"sv-SE": 98,
"uk": 98,
"pl": 98,
"pt-BR": 97,
"ru": 98,
"sv-SE": 97,
"uk": 97,
"ur": 2,
"zh-Hans": 100,
"zh-Hant": 98
"zh-Hans": 99,
"zh-Hant": 97
}
+108
View File
@@ -8281,6 +8281,114 @@ export function useAFFiNEI18N(): {
* `All day`
*/
["com.affine.integration.calendar.all-day"](): string;
/**
* `Failed to load calendar accounts`
*/
["com.affine.integration.calendar.account.load-error"](): string;
/**
* `Failed to load calendar providers`
*/
["com.affine.integration.calendar.provider.load-error"](): string;
/**
* `Failed to start calendar authorization`
*/
["com.affine.integration.calendar.auth.start-error"](): string;
/**
* `Failed to unlink calendar account`
*/
["com.affine.integration.calendar.account.unlink-error"](): string;
/**
* `Unlink`
*/
["com.affine.integration.calendar.account.unlink"](): string;
/**
* `Link`
*/
["com.affine.integration.calendar.account.link"](): string;
/**
* `No calendar accounts linked yet.`
*/
["com.affine.integration.calendar.account.linked-empty"](): string;
/**
* `Authorization failed: {{error}}`
*/
["com.affine.integration.calendar.account.status.failed"](options: {
readonly error: string;
}): string;
/**
* `Authorization failed. Please reconnect your account.`
*/
["com.affine.integration.calendar.account.status.failed-reconnect"](): string;
/**
* `{{count}} calendar`
*/
["com.affine.integration.calendar.account.count"](options: {
readonly count: string;
}): string;
/**
* `Link CalDAV account`
*/
["com.affine.integration.calendar.caldav.link.title"](): string;
/**
* `Failed to link CalDAV account`
*/
["com.affine.integration.calendar.caldav.link.failed"](): string;
/**
* `Provider`
*/
["com.affine.integration.calendar.caldav.field.provider"](): string;
/**
* `Select provider`
*/
["com.affine.integration.calendar.caldav.field.provider.placeholder"](): string;
/**
* `Please select a provider.`
*/
["com.affine.integration.calendar.caldav.field.provider.error"](): string;
/**
* `Username`
*/
["com.affine.integration.calendar.caldav.field.username"](): string;
/**
* `email@example.com`
*/
["com.affine.integration.calendar.caldav.field.username.placeholder"](): string;
/**
* `Username is required.`
*/
["com.affine.integration.calendar.caldav.field.username.error"](): string;
/**
* `Password`
*/
["com.affine.integration.calendar.caldav.field.password"](): string;
/**
* `Password or app-specific password`
*/
["com.affine.integration.calendar.caldav.field.password.placeholder"](): string;
/**
* `Password is required.`
*/
["com.affine.integration.calendar.caldav.field.password.error"](): string;
/**
* `Display name (optional)`
*/
["com.affine.integration.calendar.caldav.field.displayName"](): string;
/**
* `My CalDAV`
*/
["com.affine.integration.calendar.caldav.field.displayName.placeholder"](): string;
/**
* `App-specific password required.`
*/
["com.affine.integration.calendar.caldav.hint.app-password"](): string;
/**
* `Learn more`
*/
["com.affine.integration.calendar.caldav.hint.learn-more"](): string;
/**
* `Provider setup guide`
*/
["com.affine.integration.calendar.caldav.hint.guide"](): string;
/**
* `New doc`
*/
@@ -2078,6 +2078,32 @@
"com.affine.integration.calendar.new-url-label": "Calendar URL",
"com.affine.integration.calendar.save-error": "An error occurred while saving the calendar settings",
"com.affine.integration.calendar.all-day": "All day",
"com.affine.integration.calendar.account.load-error": "Failed to load calendar accounts",
"com.affine.integration.calendar.provider.load-error": "Failed to load calendar providers",
"com.affine.integration.calendar.auth.start-error": "Failed to start calendar authorization",
"com.affine.integration.calendar.account.unlink-error": "Failed to unlink calendar account",
"com.affine.integration.calendar.account.unlink": "Unlink",
"com.affine.integration.calendar.account.link": "Link",
"com.affine.integration.calendar.account.linked-empty": "No calendar accounts linked yet.",
"com.affine.integration.calendar.account.status.failed": "Authorization failed: {{error}}",
"com.affine.integration.calendar.account.status.failed-reconnect": "Authorization failed. Please reconnect your account.",
"com.affine.integration.calendar.account.count": "{{count}} calendar",
"com.affine.integration.calendar.caldav.link.title": "Link CalDAV account",
"com.affine.integration.calendar.caldav.link.failed": "Failed to link CalDAV account",
"com.affine.integration.calendar.caldav.field.provider": "Provider",
"com.affine.integration.calendar.caldav.field.provider.placeholder": "Select provider",
"com.affine.integration.calendar.caldav.field.provider.error": "Please select a provider.",
"com.affine.integration.calendar.caldav.field.username": "Username",
"com.affine.integration.calendar.caldav.field.username.placeholder": "email@example.com",
"com.affine.integration.calendar.caldav.field.username.error": "Username is required.",
"com.affine.integration.calendar.caldav.field.password": "Password",
"com.affine.integration.calendar.caldav.field.password.placeholder": "Password or app-specific password",
"com.affine.integration.calendar.caldav.field.password.error": "Password is required.",
"com.affine.integration.calendar.caldav.field.displayName": "Display name (optional)",
"com.affine.integration.calendar.caldav.field.displayName.placeholder": "My CalDAV",
"com.affine.integration.calendar.caldav.hint.app-password": "App-specific password required.",
"com.affine.integration.calendar.caldav.hint.learn-more": "Learn more",
"com.affine.integration.calendar.caldav.hint.guide": "Provider setup guide",
"com.affine.integration.calendar.new-doc": "New doc",
"com.affine.integration.calendar.show-events": "Show calendar events",
"com.affine.integration.calendar.show-events-desc": "Enabling this setting allows you to connect your calendar events to your Journal in AFFiNE",