From 99d26a9508a22878f523f5e34ac7017a90995d6a Mon Sep 17 00:00:00 2001 From: Michalis Efstratiadis Date: Mon, 2 Feb 2026 14:43:49 +0200 Subject: [PATCH] add URL validation guardrail for incorrect calendar URLs - detect incorrect Google Calendar URL formats (public link, embed, app link) - show helpful error message with "How do I get the correct URL?" button - add help modal with instructions for Google, Outlook, and iCloud calendars - update README with detailed Google Calendar setup instructions - fixes #57 --- README.md | 23 ++++- screenshots/gcal-ical-url.png | Bin 0 -> 79758 bytes src/settings/SettingsTab.ts | 171 +++++++++++++++++++++++++++++++++- styles.css | 120 ++++++++++++++++++++++++ 4 files changed, 309 insertions(+), 5 deletions(-) create mode 100644 screenshots/gcal-ical-url.png diff --git a/README.md b/README.md index da7a711..810c619 100644 --- a/README.md +++ b/README.md @@ -45,10 +45,31 @@ MemoChron supports both remote calendar URLs and local ICS files. 1. Go to Settings > MemoChron 2. Click "Add Calendar" -3. Enter your public iCalendar (ICS) URL (e.g., `https://calendar.google.com/calendar/ical/...`) +3. Enter your public iCalendar (ICS) URL 4. Give your calendar a name and optional tags 5. Enable/disable calendars as needed +##### Getting the Correct URL from Google Calendar + +**Important**: You need the iCal feed URL, not the public calendar link. The public link opens a webpage but doesn't provide the calendar data that MemoChron needs. + +To get the correct URL from Google Calendar: + +1. Open [Google Calendar](https://calendar.google.com) in your browser +2. Click the gear icon (⚙️) → **Settings** +3. In the left sidebar, click on the calendar you want to add +4. Scroll down to **Integrate calendar** +5. Copy the **Secret address in iCal format** (recommended) or **Public address in iCal format** + +![Google Calendar iCal URL](screenshots/gcal-ical-url.png) + +**Correct URL format**: `https://calendar.google.com/calendar/ical/.../basic.ics` + +**Incorrect URL formats** (these won't work): +- `https://calendar.google.com/calendar/u/0?cid=...` (public link - opens a webpage) +- `https://calendar.google.com/calendar/embed?src=...` (embed link - for websites) +- `https://calendar.google.com/calendar/r/...` (calendar app link) + #### Local ICS Files You can also use ICS files stored in your Obsidian vault or local file system: diff --git a/screenshots/gcal-ical-url.png b/screenshots/gcal-ical-url.png new file mode 100644 index 0000000000000000000000000000000000000000..16052b66bf0c145496f8fac9b2d1a7c40ddff79f GIT binary patch literal 79758 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 z

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

rE=* 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 OkL?*p%PNTfmHz`>6P3{b literal 0 HcmV?d00001 diff --git a/src/settings/SettingsTab.ts b/src/settings/SettingsTab.ts index 8cdb073..dcacc8d 100644 --- a/src/settings/SettingsTab.ts +++ b/src/settings/SettingsTab.ts @@ -296,11 +296,27 @@ export class SettingsTab extends PluginSettingTab { if (!validation.valid) { errorEl = urlSetting.descEl.createDiv({ cls: "memochron-error-message", - text: validation.error, }); errorEl.style.color = "var(--text-error, #c92424)"; errorEl.style.fontSize = "0.9em"; errorEl.style.marginTop = "0.5em"; + + errorEl.createSpan({ text: validation.error }); + + // If it's a wrong URL type, show a help button + if (validation.isWrongUrlType) { + errorEl.createEl("br"); + const helpBtn = errorEl.createEl("button", { + text: "How do I get the correct URL?", + cls: "memochron-help-btn", + }); + helpBtn.style.marginTop = "0.5em"; + helpBtn.style.fontSize = "0.85em"; + this.plugin.registerDomEvent(helpBtn, "click", (e) => { + e.preventDefault(); + new CalendarUrlHelpModal(this.app, this.plugin).open(); + }); + } } else { // Save valid URL this.plugin.settings.calendarUrls[index].url = value; @@ -1206,17 +1222,75 @@ export class SettingsTab extends PluginSettingTab { .filter((tag) => tag.length > 0); } - private validateCalendarUrl(url: string): { valid: boolean; error?: string } { + private validateCalendarUrl(url: string): { valid: boolean; error?: string; warning?: string; isWrongUrlType?: boolean } { if (!url || url.trim() === "") { return { valid: false, error: "URL or file path is required" }; } - const trimmedUrl = url.trim(); + const trimmedUrl = url.trim().toLowerCase(); // Check for HTTP/HTTPS URLs if (trimmedUrl.startsWith("http://") || trimmedUrl.startsWith("https://")) { try { - new URL(trimmedUrl); + const parsedUrl = new URL(url.trim()); + + // Detect incorrect Google Calendar URL formats + if (parsedUrl.hostname.includes("calendar.google.com")) { + // Check for common wrong URL patterns + + // Public link format: calendar.google.com/calendar/u/0?cid=... + if (parsedUrl.searchParams.has("cid") || + parsedUrl.pathname.match(/\/calendar\/u\/\d+$/)) { + return { + valid: false, + error: "This is a Google Calendar public link, not an iCal feed URL.", + isWrongUrlType: true + }; + } + + // Embed format: calendar.google.com/calendar/embed?src=... + if (parsedUrl.pathname.includes("/embed")) { + return { + valid: false, + error: "This is a Google Calendar embed link, not an iCal feed URL.", + isWrongUrlType: true + }; + } + + // Calendar app link: calendar.google.com/calendar/r/... + if (parsedUrl.pathname.includes("/calendar/r")) { + return { + valid: false, + error: "This is a Google Calendar app link, not an iCal feed URL.", + isWrongUrlType: true + }; + } + + // Valid Google Calendar ICS URL should contain /ical/ and end with .ics + if (!parsedUrl.pathname.includes("/ical/") || !parsedUrl.pathname.endsWith(".ics")) { + return { + valid: false, + error: "This doesn't appear to be a valid Google Calendar iCal URL.", + isWrongUrlType: true + }; + } + } + + // Detect incorrect Outlook/Office365 URL formats + if (parsedUrl.hostname.includes("outlook.live.com") || + parsedUrl.hostname.includes("outlook.office365.com") || + parsedUrl.hostname.includes("outlook.office.com")) { + // Check if it's a calendar sharing link, not an ICS feed + if (parsedUrl.pathname.includes("/calendar/published/") && + !parsedUrl.pathname.endsWith(".ics")) { + return { + valid: false, + error: "This appears to be an Outlook sharing link. Please use the ICS subscription URL instead.", + isWrongUrlType: true + }; + } + } + return { valid: true }; } catch { return { valid: false, error: "Invalid URL format" }; @@ -1713,3 +1787,92 @@ class CalendarNotesSettingsModal extends Modal { contentEl.empty(); } } + +// Help modal for calendar URL setup +class CalendarUrlHelpModal extends Modal { + constructor(app: App, private plugin: MemoChron) { + super(app); + } + + onOpen() { + const { contentEl } = this; + contentEl.empty(); + contentEl.addClass("memochron-help-modal"); + + contentEl.createEl("h2", { text: "How to Get the Correct Calendar URL" }); + + // Google Calendar section + const gcalSection = contentEl.createDiv({ cls: "memochron-help-section" }); + gcalSection.createEl("h3", { text: "Google Calendar" }); + + const gcalSteps = gcalSection.createEl("ol"); + gcalSteps.createEl("li", { text: "Open Google Calendar in your browser" }); + gcalSteps.createEl("li", { text: "Click the gear icon (⚙️) → Settings" }); + gcalSteps.createEl("li", { text: "In the left sidebar, click on the calendar you want to add" }); + gcalSteps.createEl("li", { text: "Scroll down to \"Integrate calendar\"" }); + gcalSteps.createEl("li").innerHTML = "Copy the Secret address in iCal format"; + + const gcalNote = gcalSection.createDiv({ cls: "memochron-help-note" }); + gcalNote.createEl("strong", { text: "Correct URL looks like: " }); + gcalNote.createEl("code", { text: "https://calendar.google.com/calendar/ical/.../basic.ics" }); + + gcalSection.createEl("hr"); + + // Outlook section + const outlookSection = contentEl.createDiv({ cls: "memochron-help-section" }); + outlookSection.createEl("h3", { text: "Outlook / Microsoft 365" }); + + const outlookSteps = outlookSection.createEl("ol"); + outlookSteps.createEl("li", { text: "Open Outlook calendar on the web (outlook.office.com)" }); + outlookSteps.createEl("li", { text: "Click the gear icon → View all Outlook settings" }); + outlookSteps.createEl("li", { text: "Go to Calendar → Shared calendars" }); + outlookSteps.createEl("li", { text: "Under \"Publish a calendar\", select your calendar and permissions" }); + outlookSteps.createEl("li").innerHTML = "Copy the ICS link (not the HTML link)"; + + outlookSection.createEl("hr"); + + // iCloud section + const icloudSection = contentEl.createDiv({ cls: "memochron-help-section" }); + icloudSection.createEl("h3", { text: "Apple iCloud Calendar" }); + + const icloudSteps = icloudSection.createEl("ol"); + icloudSteps.createEl("li", { text: "Open the Calendar app on your Mac" }); + icloudSteps.createEl("li", { text: "Right-click on the calendar → Share Calendar" }); + icloudSteps.createEl("li", { text: "Check \"Public Calendar\" to make it shareable" }); + icloudSteps.createEl("li", { text: "Click \"Copy Link\" to get the subscription URL" }); + + contentEl.createEl("hr"); + + // Common mistakes + const mistakesSection = contentEl.createDiv({ cls: "memochron-help-section" }); + mistakesSection.createEl("h3", { text: "Common Mistakes" }); + + const mistakesList = mistakesSection.createEl("ul"); + mistakesList.createEl("li").innerHTML = "Using the public link - This opens a webpage, not calendar data"; + mistakesList.createEl("li").innerHTML = "Using the embed link - This is for embedding in websites"; + mistakesList.createEl("li").innerHTML = "Missing the .ics extension - The URL should end with .ics"; + + // Documentation link + const docLink = contentEl.createDiv({ cls: "memochron-help-doc-link" }); + docLink.style.marginTop = "1em"; + const link = docLink.createEl("a", { + text: "View full documentation on GitHub", + href: "https://github.com/formax68/memoChron#remote-calendars", + }); + link.setAttr("target", "_blank"); + + // Close button + const buttonContainer = contentEl.createDiv({ cls: "memochron-help-buttons" }); + buttonContainer.style.marginTop = "1.5em"; + buttonContainer.style.textAlign = "right"; + + new ButtonComponent(buttonContainer) + .setButtonText("Close") + .onClick(() => this.close()); + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} diff --git a/styles.css b/styles.css index cfe3c3f..3d589ae 100644 --- a/styles.css +++ b/styles.css @@ -1135,4 +1135,124 @@ .memochron-controls.calendar-hidden .memochron-nav { justify-content: flex-start; /* Align left when alone */ +} + +/* Inline color picker styles */ +.memochron-inline-color-picker { + display: flex; + gap: var(--size-4-1); + align-items: center; + flex-wrap: wrap; +} + +.memochron-inline-color-swatch { + width: 24px; + height: 24px; + border-radius: var(--radius-s); + cursor: pointer; + border: 2px solid var(--background-modifier-border); + transition: transform 0.15s ease, border-color 0.15s ease; +} + +.memochron-inline-color-swatch:hover { + transform: scale(1.1); + border-color: var(--interactive-accent); +} + +.memochron-inline-color-swatch.selected { + border-color: var(--text-normal); + box-shadow: 0 0 0 2px var(--background-primary), 0 0 0 4px var(--text-normal); +} + +.memochron-inline-color-custom-label { + cursor: pointer; +} + +.memochron-inline-color-custom-label.selected svg circle { + stroke: var(--text-normal); + stroke-width: 3; +} + +/* Help button styling */ +.memochron-help-btn { + background: var(--interactive-accent); + color: var(--text-on-accent); + border: none; + border-radius: var(--radius-s); + padding: var(--size-4-1) var(--size-4-2); + cursor: pointer; + transition: background-color 0.15s ease; +} + +.memochron-help-btn:hover { + background: var(--interactive-accent-hover); +} + +/* Help modal styling */ +.memochron-help-modal { + max-width: 600px; +} + +.memochron-help-modal h2 { + margin-bottom: var(--size-4-4); + border-bottom: 1px solid var(--background-modifier-border); + padding-bottom: var(--size-4-2); +} + +.memochron-help-modal h3 { + margin-top: var(--size-4-4); + margin-bottom: var(--size-4-2); + color: var(--text-normal); + font-size: 1.1em; +} + +.memochron-help-section { + margin-bottom: var(--size-4-2); +} + +.memochron-help-section ol, +.memochron-help-section ul { + margin-left: var(--size-4-4); + margin-bottom: var(--size-4-2); +} + +.memochron-help-section li { + margin-bottom: var(--size-4-1); + line-height: 1.5; +} + +.memochron-help-note { + background: var(--background-secondary); + padding: var(--size-4-2) var(--size-4-3); + border-radius: var(--radius-s); + margin-top: var(--size-4-2); +} + +.memochron-help-note code { + background: var(--background-modifier-hover); + padding: var(--size-4-1) var(--size-4-2); + border-radius: var(--radius-s); + font-size: 0.85em; + display: inline-block; + margin-top: var(--size-4-1); + word-break: break-all; +} + +.memochron-help-doc-link { + text-align: center; +} + +.memochron-help-doc-link a { + color: var(--interactive-accent); +} + +.memochron-help-doc-link a:hover { + text-decoration: underline; +} + +/* Error message styling */ +.memochron-error-message { + color: var(--text-error); + font-size: 0.9em; + margin-top: var(--size-4-2); } \ No newline at end of file