Aktueller Stand
This commit is contained in:
@@ -25,6 +25,7 @@ type Rule = {
|
||||
enabled: boolean;
|
||||
matchMode?: "ALL" | "ANY";
|
||||
stopOnMatch?: boolean;
|
||||
phase?: "PRE_UNSUBSCRIBE" | "POST_UNSUBSCRIBE";
|
||||
conditions: { type: string; value: string }[];
|
||||
actions: { type: string; target?: string | null }[];
|
||||
};
|
||||
@@ -221,6 +222,7 @@ export default function App() {
|
||||
const [ruleEnabled, setRuleEnabled] = useState(true);
|
||||
const [ruleMatchMode, setRuleMatchMode] = useState<"ALL" | "ANY">("ALL");
|
||||
const [ruleStopOnMatch, setRuleStopOnMatch] = useState(false);
|
||||
const [rulePhase, setRulePhase] = useState<"PRE_UNSUBSCRIBE" | "POST_UNSUBSCRIBE">("POST_UNSUBSCRIBE");
|
||||
const [conditions, setConditions] = useState([{ ...defaultCondition }]);
|
||||
const [actions, setActions] = useState([{ ...defaultAction }]);
|
||||
const [ruleModalOpen, setRuleModalOpen] = useState(false);
|
||||
@@ -1122,6 +1124,7 @@ export default function App() {
|
||||
setRuleEnabled(true);
|
||||
setRuleMatchMode("ALL");
|
||||
setRuleStopOnMatch(false);
|
||||
setRulePhase("POST_UNSUBSCRIBE");
|
||||
setConditions([{ ...defaultCondition }]);
|
||||
setActions([{ ...defaultAction }]);
|
||||
setRuleModalOpen(true);
|
||||
@@ -1133,6 +1136,7 @@ export default function App() {
|
||||
setRuleEnabled(rule.enabled);
|
||||
setRuleMatchMode((rule.matchMode as "ALL" | "ANY") ?? "ALL");
|
||||
setRuleStopOnMatch(Boolean(rule.stopOnMatch));
|
||||
setRulePhase(rule.phase ?? "POST_UNSUBSCRIBE");
|
||||
setConditions(rule.conditions.map((condition) => ({ ...condition })));
|
||||
setActions(rule.actions.map((action) => ({ ...action })));
|
||||
setRuleModalOpen(true);
|
||||
@@ -1155,6 +1159,7 @@ export default function App() {
|
||||
enabled: ruleEnabled,
|
||||
matchMode: ruleMatchMode,
|
||||
stopOnMatch: ruleStopOnMatch,
|
||||
phase: rulePhase,
|
||||
conditions,
|
||||
actions
|
||||
})
|
||||
@@ -1172,6 +1177,7 @@ export default function App() {
|
||||
enabled: ruleEnabled,
|
||||
matchMode: ruleMatchMode,
|
||||
stopOnMatch: ruleStopOnMatch,
|
||||
phase: rulePhase,
|
||||
conditions,
|
||||
actions
|
||||
})
|
||||
@@ -1728,12 +1734,34 @@ export default function App() {
|
||||
if (match) return t("jobEventGmailActionAppliedList", { actions: mapActionList(match[1]) });
|
||||
match = trimmed.match(/^Gmail action skipped: no label changes$/i);
|
||||
if (match) return t("jobEventGmailActionSkippedNoChanges");
|
||||
match = trimmed.match(/^Gmail batch: MODIFY (\d+)$/i);
|
||||
if (match) return t("jobEventGmailBatchModify", { count: match[1] });
|
||||
match = trimmed.match(/^Gmail batch: DELETE (\d+)$/i);
|
||||
if (match) return t("jobEventGmailBatchDelete", { count: match[1] });
|
||||
match = trimmed.match(/^Gmail action (.+) applied$/i);
|
||||
if (match) return t("jobEventGmailActionApplied", { action: mapActionToken(match[1]) });
|
||||
match = trimmed.match(/^Gmail action failed: (.+)$/i);
|
||||
if (match) return t("jobEventGmailActionFailedSimple", { error: match[1] });
|
||||
match = trimmed.match(/^Gmail action (.+) failed: (.+)$/i);
|
||||
if (match) return t("jobEventGmailActionFailed", { action: mapActionToken(match[1]), error: match[2] });
|
||||
match = trimmed.match(/^IMAP delete batch failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapDeleteBatchFailed", { error: match[1] });
|
||||
match = trimmed.match(/^IMAP mark-read batch failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapMarkReadBatchFailed", { error: match[1] });
|
||||
match = trimmed.match(/^IMAP mark-unread batch failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapMarkUnreadBatchFailed", { error: match[1] });
|
||||
match = trimmed.match(/^IMAP move batch failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapMoveBatchFailed", { error: match[1] });
|
||||
match = trimmed.match(/^IMAP batch: DELETE (\d+)$/i);
|
||||
if (match) return t("jobEventImapBatchDelete", { count: match[1] });
|
||||
match = trimmed.match(/^IMAP batch: MARK_READ (\d+)$/i);
|
||||
if (match) return t("jobEventImapBatchMarkRead", { count: match[1] });
|
||||
match = trimmed.match(/^IMAP batch: MARK_UNREAD (\d+)$/i);
|
||||
if (match) return t("jobEventImapBatchMarkUnread", { count: match[1] });
|
||||
match = trimmed.match(/^IMAP batch: MOVE (\d+) -> (.+)$/i);
|
||||
if (match) return t("jobEventImapBatchMove", { count: match[1], target: match[2] });
|
||||
match = trimmed.match(/^IMAP action failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapActionFailedSimple", { error: match[1] });
|
||||
match = trimmed.match(/^IMAP action (.+) failed: (.+)$/i);
|
||||
if (match) return t("jobEventImapActionFailed", { action: mapActionToken(match[1]), error: match[2] });
|
||||
match = trimmed.match(/^Job canceled by admin$/i);
|
||||
@@ -2285,6 +2313,9 @@ export default function App() {
|
||||
</div>
|
||||
<div className="rule-tail">
|
||||
<div className="rule-flags">
|
||||
<span className="rule-badge">
|
||||
{rule.phase === "PRE_UNSUBSCRIBE" ? t("rulePhasePreBadge") : t("rulePhasePostBadge")}
|
||||
</span>
|
||||
{rule.stopOnMatch && (
|
||||
<span className="rule-badge rule-badge-strong">{t("rulesStopOnMatchBadge")}</span>
|
||||
)}
|
||||
@@ -2567,6 +2598,17 @@ export default function App() {
|
||||
<option value="ANY">{t("rulesMatchAny")}</option>
|
||||
</select>
|
||||
</label>
|
||||
<label className="field-row">
|
||||
<span>{t("rulesPhase")}</span>
|
||||
<select
|
||||
value={rulePhase}
|
||||
onChange={(event) => setRulePhase(event.target.value as "PRE_UNSUBSCRIBE" | "POST_UNSUBSCRIBE")}
|
||||
>
|
||||
<option value="PRE_UNSUBSCRIBE">{t("rulesPhasePre")}</option>
|
||||
<option value="POST_UNSUBSCRIBE">{t("rulesPhasePost")}</option>
|
||||
</select>
|
||||
</label>
|
||||
<p className="hint-text">{t("rulesPhaseHint")}</p>
|
||||
<label className="toggle">
|
||||
<input
|
||||
type="checkbox"
|
||||
|
||||
@@ -135,7 +135,13 @@
|
||||
"rulesMatchAll": "Alle Bedingungen (UND)",
|
||||
"rulesMatchAny": "Mindestens eine (ODER)",
|
||||
"rulesMatchAnyLabel": "ODER",
|
||||
"rulesPhase": "Ausführungsphase",
|
||||
"rulesPhasePre": "Vor Abmelden",
|
||||
"rulesPhasePost": "Nach Abmelden",
|
||||
"rulesPhaseHint": "Vor-Regeln laufen vor dem Abmelden (Abmelde-Status noch nicht verfügbar). Nach-Regeln laufen danach.",
|
||||
"rulesStopOnMatch": "Nach Treffer stoppen (erste Regel gewinnt)",
|
||||
"rulePhasePreBadge": "Vor Abmelden",
|
||||
"rulePhasePostBadge": "Nach Abmelden",
|
||||
"rulesStopOnMatchBadge": "ERSTE",
|
||||
"rulesConditions": "Bedingungen",
|
||||
"rulesActions": "Aktionen",
|
||||
@@ -269,9 +275,20 @@
|
||||
"jobEventProcessedCount": "Verarbeitet {{current}}",
|
||||
"jobEventGmailActionAppliedList": "Gmail‑Aktion angewendet: {{actions}}",
|
||||
"jobEventGmailActionApplied": "Gmail‑Aktion angewendet: {{action}}",
|
||||
"jobEventGmailBatchModify": "Gmail‑Batch: MODIFY {{count}}",
|
||||
"jobEventGmailBatchDelete": "Gmail‑Batch: DELETE {{count}}",
|
||||
"jobEventGmailActionSkippedNoChanges": "Gmail‑Aktion übersprungen: keine Label‑Änderungen",
|
||||
"jobEventGmailActionFailedSimple": "Gmail‑Aktion fehlgeschlagen: {{error}}",
|
||||
"jobEventGmailActionFailed": "Gmail‑Aktion fehlgeschlagen ({{action}}): {{error}}",
|
||||
"jobEventImapDeleteBatchFailed": "IMAP‑Lösch‑Batch fehlgeschlagen: {{error}}",
|
||||
"jobEventImapMarkReadBatchFailed": "IMAP‑Lesen‑Batch fehlgeschlagen: {{error}}",
|
||||
"jobEventImapMarkUnreadBatchFailed": "IMAP‑Ungelesen‑Batch fehlgeschlagen: {{error}}",
|
||||
"jobEventImapMoveBatchFailed": "IMAP‑Verschieben‑Batch fehlgeschlagen: {{error}}",
|
||||
"jobEventImapBatchDelete": "IMAP‑Batch: DELETE {{count}}",
|
||||
"jobEventImapBatchMarkRead": "IMAP‑Batch: MARK_READ {{count}}",
|
||||
"jobEventImapBatchMarkUnread": "IMAP‑Batch: MARK_UNREAD {{count}}",
|
||||
"jobEventImapBatchMove": "IMAP‑Batch: MOVE {{count}} → {{target}}",
|
||||
"jobEventImapActionFailedSimple": "IMAP‑Aktion fehlgeschlagen: {{error}}",
|
||||
"jobEventImapActionFailed": "IMAP‑Aktion fehlgeschlagen ({{action}}): {{error}}",
|
||||
"jobEventDryRunAction": "Nur simulieren: {{action}}",
|
||||
"jobEventCanceledByAdmin": "Job vom Admin abgebrochen",
|
||||
|
||||
@@ -135,7 +135,13 @@
|
||||
"rulesMatchAll": "All conditions (AND)",
|
||||
"rulesMatchAny": "Any condition (OR)",
|
||||
"rulesMatchAnyLabel": "OR",
|
||||
"rulesPhase": "Execution phase",
|
||||
"rulesPhasePre": "Before unsubscribe",
|
||||
"rulesPhasePost": "After unsubscribe",
|
||||
"rulesPhaseHint": "Pre rules run before unsubscribe (unsubscribe status not available). Post rules run after unsubscribe.",
|
||||
"rulesStopOnMatch": "Stop after match (first match wins)",
|
||||
"rulePhasePreBadge": "Pre‑unsubscribe",
|
||||
"rulePhasePostBadge": "Post‑unsubscribe",
|
||||
"rulesStopOnMatchBadge": "FIRST",
|
||||
"rulesConditions": "Conditions",
|
||||
"rulesActions": "Actions",
|
||||
@@ -269,9 +275,20 @@
|
||||
"jobEventProcessedCount": "Processed {{current}}",
|
||||
"jobEventGmailActionAppliedList": "Gmail action applied: {{actions}}",
|
||||
"jobEventGmailActionApplied": "Gmail action applied: {{action}}",
|
||||
"jobEventGmailBatchModify": "Gmail batch: MODIFY {{count}}",
|
||||
"jobEventGmailBatchDelete": "Gmail batch: DELETE {{count}}",
|
||||
"jobEventGmailActionSkippedNoChanges": "Gmail action skipped: no label changes",
|
||||
"jobEventGmailActionFailedSimple": "Gmail action failed: {{error}}",
|
||||
"jobEventGmailActionFailed": "Gmail action failed ({{action}}): {{error}}",
|
||||
"jobEventImapDeleteBatchFailed": "IMAP delete batch failed: {{error}}",
|
||||
"jobEventImapMarkReadBatchFailed": "IMAP mark-read batch failed: {{error}}",
|
||||
"jobEventImapMarkUnreadBatchFailed": "IMAP mark-unread batch failed: {{error}}",
|
||||
"jobEventImapMoveBatchFailed": "IMAP move batch failed: {{error}}",
|
||||
"jobEventImapBatchDelete": "IMAP batch: DELETE {{count}}",
|
||||
"jobEventImapBatchMarkRead": "IMAP batch: MARK_READ {{count}}",
|
||||
"jobEventImapBatchMarkUnread": "IMAP batch: MARK_UNREAD {{count}}",
|
||||
"jobEventImapBatchMove": "IMAP batch: MOVE {{count}} → {{target}}",
|
||||
"jobEventImapActionFailedSimple": "IMAP action failed: {{error}}",
|
||||
"jobEventImapActionFailed": "IMAP action failed ({{action}}): {{error}}",
|
||||
"jobEventDryRunAction": "Simulate only: {{action}}",
|
||||
"jobEventCanceledByAdmin": "Job canceled by admin",
|
||||
|
||||
Reference in New Issue
Block a user