From 8f98332cdda7493702580711bbb5bcb5ab242010 Mon Sep 17 00:00:00 2001 From: iamdoubz <> Date: Mon, 6 Jul 2026 14:19:14 -0500 Subject: [PATCH] feat(calendar): filter imported events by title and date MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Client-side filter over the already-loaded events list (T6.3, FR-CAL-2) — 1700+ events from a real mailbox is unwieldy to browse unfiltered. --- src/lib/views/Settings.svelte | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/lib/views/Settings.svelte b/src/lib/views/Settings.svelte index 3b71e3d..0246b03 100644 --- a/src/lib/views/Settings.svelte +++ b/src/lib/views/Settings.svelte @@ -173,6 +173,26 @@ // ---- Calendar / .pst import (T6.1/T6.2/T6.3, FR-CAL-1/2) ---- let pstPath = $state(""); let pstPassword = $state(""); + let eventTitleFilter = $state(""); + let eventDateFilter = $state(""); + + function eventLocalYmd(unixSecs: number | null): string { + if (!unixSecs) return ""; + const d = new Date(unixSecs * 1000); + return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`; + } + + let filteredEvents = $derived( + calendar.events.filter((ev) => { + if (eventDateFilter && eventLocalYmd(ev.starts_at) !== eventDateFilter) return false; + if ( + eventTitleFilter && + !(ev.subject ?? "").toLowerCase().includes(eventTitleFilter.toLowerCase()) + ) + return false; + return true; + }), + ); async function pickPstFile() { const path = await open({ filters: [{ name: "Outlook data file", extensions: ["pst"] }] }); @@ -708,8 +728,21 @@ {#if calendar.events.length === 0}

No events imported yet.

{:else} +
+ + +
+

+ {filteredEvents.length} of {calendar.events.length} events +