M4 Calendar: publish public .ics links, subscriptions, multi-calendar settings

Calendar (builtin plugin):
- Publish read-only public .ics feed per calendar via vault-sealed token
  (full-detail or free/busy-only); unauthenticated GET /public/{token},
  404 on bad/absent token. Migration calendar0004 adds publish_token,
  publish_busy, subscription_url + partial unique index.
- Subscribe to external iCal (.ics) URLs (SSRF-guarded) as read-only
  calendars; CSRF-guarded POST /subscriptions.
- Settings > Calendars: create/edit/delete, publish toggles with live
  shareable link + copy, Add-account stubs (Google/iCloud/CalDAV, deferred),
  Subscriptions section; default calendar + default reminders; auto-detected
  time zone; color-dropdown contrast fix; 3x-larger edit arrow.
- Left panel: shared Mail-parity sidebar template (.wm-side-*), calendar
  search panel, font/spacing tuning, per-section "+" create shortcut.

Frontend: CalendarOut publish fields, api publish/subscribe, settings keys.
Backend: settings default_calendar + reminder lists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U72FZiF1W1pb8XxyWBTREA
This commit is contained in:
2026-08-01 20:22:53 +02:00
co-authored by Claude Opus 4.8
parent 8c634f7967
commit e2bef3c41d
20 changed files with 1329 additions and 88 deletions
+28
View File
@@ -13,6 +13,7 @@ export const en = {
"common.edit": "Edit",
"common.close": "Close",
"common.clear": "Clear",
"common.copy": "Copy",
"common.back": "Back",
"common.next": "Next",
"common.signOut": "Sign out",
@@ -226,6 +227,33 @@ export const en = {
"settings.timeFormat": "Time format",
"settings.timeFormat24": "24-hour (14:30)",
"settings.timeFormat12": "12-hour (2:30 PM)",
"settings.calendars": "Calendars",
"settings.myCalendars": "My calendars",
"settings.calendarOptions": "Calendar options",
"settings.createCalendar": "Create calendar",
"settings.editCalendar": "Edit calendar",
"settings.export": "Export",
"settings.calendarDisplay": "Calendar display",
"settings.default": "Default",
"settings.defaultCalendar": "Default calendar",
"settings.firstCalendar": "First calendar",
"settings.defaultRemindersTimed": "Default reminders for timed events",
"settings.defaultRemindersAllday": "Default reminders for all-day events",
"settings.addReminder": "Add reminder",
"settings.name": "Name",
"settings.onlyYou": "Only you can see this calendar.",
"settings.publish": "Publish",
"settings.publishHint": "Share this calendar (read-only) with anyone.",
"settings.fullEventDetails": "Full event details",
"settings.freeBusy": "Free/busy information",
"settings.addAccountHint": "Connect an external calendar account.",
"settings.subscriptions": "Subscriptions",
"settings.subscriptionsHint": "Add a read-only calendar from an iCal (.ics) URL.",
"settings.subscribe": "Subscribe",
"settings.subscribeUrl": "iCal (.ics) URL",
"settings.subscribed": "Subscribed",
"settings.comingSoon": "Coming soon",
"settings.subscribeError": "Couldn't subscribe to that URL.",
"settings.integrations": "Integrations",
"settings.jitsi": "Jitsi Meet",
"settings.jitsiHint":