From 31eff96614647cc4e70ce1eef082b821cde1dbeb Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:22:52 +0200 Subject: [PATCH] feat: Enhance external rule handling in Sieve parser and store #201 --- components/settings/filter-settings.tsx | 202 ++++--- lib/__tests__/sieve-generator.test.ts | 9 +- lib/jmap/sieve-types.ts | 5 + lib/sieve/__tests__/external-rules.test.ts | 267 +++++++++ .../__tests__/fixtures/mixed-origins.sieve | 44 ++ lib/sieve/__tests__/parser.test.ts | 15 +- lib/sieve/generator.ts | 66 +- lib/sieve/parser.ts | 565 ++++++++++++++++-- locales/en/common.json | 4 +- stores/__tests__/filter-store.test.ts | 15 +- stores/filter-store.ts | 69 ++- 11 files changed, 1115 insertions(+), 146 deletions(-) create mode 100644 lib/sieve/__tests__/external-rules.test.ts create mode 100644 lib/sieve/__tests__/fixtures/mixed-origins.sieve diff --git a/components/settings/filter-settings.tsx b/components/settings/filter-settings.tsx index ed28bc97..a0dd780a 100644 --- a/components/settings/filter-settings.tsx +++ b/components/settings/filter-settings.tsx @@ -23,8 +23,13 @@ import { Filter, RotateCcw, PalmtreeIcon, + Lock, } from "lucide-react"; +function isReadonlyRule(r: FilterRule): boolean { + return r.origin === "external" || r.origin === "opaque"; +} + function RuleSummary({ rule }: { rule: FilterRule }) { const t = useTranslations("settings.filters"); @@ -429,90 +434,137 @@ export function FilterSettings() { {!isOpaque && rules.length > 0 && (
+ {rule.name} +
+ + {label} + +
+ {rule.rawBlock.trim()}
+
+ ) : null}
+ - {rule.name} -
- {expandedFilterView ? ( -+ {rule.name} +
+ {expandedFilterView ? ( +