From 658c1e6d5d3ab5f0fc5861a81f909dfdc8b266de Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Mon, 20 Jul 2026 20:06:42 +0200 Subject: [PATCH] refactor(mail): focus profile editor on protocols --- .../features/mail/MailProfileManagement.tsx | 35 ++----------------- .../features/mail/mailProfileEditorModel.ts | 4 +-- webui/tests/mail-profile-editor-model.test.ts | 2 +- 3 files changed, 5 insertions(+), 36 deletions(-) diff --git a/webui/src/features/mail/MailProfileManagement.tsx b/webui/src/features/mail/MailProfileManagement.tsx index 82de6fb..e0be3e4 100644 --- a/webui/src/features/mail/MailProfileManagement.tsx +++ b/webui/src/features/mail/MailProfileManagement.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState, type ReactNode } from "react"; -import { ConnectionTree, FieldLabel, LoadingFrame, MailServerSettingsPanel, PolicyLockedHint, PolicyPathHelp, PolicyRow, PolicySourcePath, PolicyTable, ToggleSwitch, hasMailImapSettings, mailImapSettingsPayload, mailServerSecurityOptions, mailSmtpSettingsPayload, mailTextOrNull, mailTransportCredentialsPayload, mergeDeltaRows, normalizeMailServerSecurity, normalizePolicySourcePathItems, useDeltaWatermarks, type ConnectionTreeColumn, type MailServerConnectionTestResult, type MailServerCredentialSettings, type MailServerFolderLookupResult, type MailServerImapSettings, type MailServerSmtpSettings, type NormalizedPolicySourcePathItem, type PolicySourcePathItem } from "@govoplan/core-webui"; +import { ConnectionTree, FieldLabel, LoadingFrame, MailServerSettingsPanel, PolicyLockedHint, PolicyPathHelp, PolicyRow, PolicySourcePath, PolicyTable, ToggleSwitch, hasMailImapSettings, mailImapSettingsPayload, mailServerSecurityOptions, mailSmtpSettingsPayload, mailTextOrNull, mailTransportCredentialsPayload, mergeDeltaRows, normalizeMailServerSecurity, normalizePolicySourcePathItems, useDeltaWatermarks, type ConnectionTreeColumn, type MailServerConnectionTestResult, type MailServerCredentialSettings, type MailServerImapSettings, type MailServerSmtpSettings, type NormalizedPolicySourcePathItem, type PolicySourcePathItem } from "@govoplan/core-webui"; import { Pencil, Plus, Trash2 } from "lucide-react"; import type { ApiSettings } from "../../types"; import { @@ -7,8 +7,6 @@ import { deactivateMailServerProfile, fetchMailSettingsDelta, getMailProfilePolicy, - listImapFolders, - listMailProfileImapFolders, mailProfilePatternKeys, mailProfilePolicyLimitKeys, updateMailProfilePolicy, @@ -804,8 +802,7 @@ function ProfileForm({ }: {settings: ApiSettings;draft: ProfileDraft;setDraft: (draft: ProfileDraft) => void;editing: EditingProfile;busy: boolean;canWrite: boolean;canManageCredentials: boolean;effectivePolicy?: MailProfilePolicy | null;editTarget: MailProfileEditTarget;}) { const [smtpTestResult, setSmtpTestResult] = useState(null); const [imapTestResult, setImapTestResult] = useState(null); - const [folderResult, setFolderResult] = useState(null); - const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | "folders" | null>(null); + const [mailActionState, setMailActionState] = useState<"smtp" | "imap" | null>(null); const disabled = busy || !canWrite; const credentialDisabled = disabled || !canManageCredentials; @@ -826,7 +823,6 @@ function ProfileForm({ useEffect(() => { setSmtpTestResult(null); setImapTestResult(null); - setFolderResult(null); setMailActionState(null); }, [editing, editTarget]); @@ -851,8 +847,6 @@ function ProfileForm({ }); } - - function patchSmtpCredentials(patch: Partial) { setDraft({ ...draft, @@ -898,27 +892,6 @@ function ProfileForm({ } } - async function runFolderLookup() { - if (!draftHasImap) return; - setMailActionState("folders"); - setFolderResult(null); - try { - setFolderResult(useSavedImapTest && existingProfile ? - await listMailProfileImapFolders(settings, existingProfile.id) : - await listImapFolders(settings, rawImapPayload(draft, false))); - } catch (err) { - setFolderResult({ ok: false, message: errorMessage(err), folders: [] }); - } finally { - setMailActionState(null); - } - } - - function useDetectedSentFolder() { - const folder = folderResult?.detected_sent_folder; - if (!folder || disabled || !draftHasImap) return; - setDraft({ ...draft, imapSentFolder: folder }); - } - return (
{showProfileFields && @@ -963,12 +936,8 @@ function ProfileForm({ busyAction={mailActionState} onTestSmtp={() => void runSmtpTest()} onTestImap={() => void runImapTest()} - onLookupFolders={() => void runFolderLookup()} smtpTestResult={smtpTestResult} imapTestResult={imapTestResult} - folderLookupResult={folderResult} - onUseDetectedFolder={useDetectedSentFolder} - useDetectedFolderDisabled={disabled || !draftHasImap} initialSection={initialSection} visibleSections={visibleSections} mode={settingsPanelMode} /> diff --git a/webui/src/features/mail/mailProfileEditorModel.ts b/webui/src/features/mail/mailProfileEditorModel.ts index 218796c..e6480f8 100644 --- a/webui/src/features/mail/mailProfileEditorModel.ts +++ b/webui/src/features/mail/mailProfileEditorModel.ts @@ -1,5 +1,5 @@ export type MailProfileProtocol = "smtp" | "imap"; -export type MailProfileEditSection = MailProfileProtocol | "advanced"; +export type MailProfileEditSection = MailProfileProtocol; export type MailProfilePanelMode = "all" | "server" | "credentials"; export type MailProfileEditTarget = @@ -47,7 +47,7 @@ export function mailProfileEditTargetPanelMode(target: MailProfileEditTarget): M export function mailProfileEditTargetVisibleSections(target: MailProfileEditTarget): MailProfileEditSection[] { if (target.kind === "server" || target.kind === "credentials") return [target.protocol]; - if (target.kind === "create") return ["smtp", "imap", "advanced"]; + if (target.kind === "create") return ["smtp", "imap"]; return []; } diff --git a/webui/tests/mail-profile-editor-model.test.ts b/webui/tests/mail-profile-editor-model.test.ts index a241aa6..0c80970 100644 --- a/webui/tests/mail-profile-editor-model.test.ts +++ b/webui/tests/mail-profile-editor-model.test.ts @@ -40,9 +40,9 @@ assertEqual(mailProfileEditTargetInitialSection({ kind: "server", protocol: "ima assertEqual(mailProfileEditTargetPanelMode({ kind: "server", protocol: "smtp" }), "server"); assertEqual(mailProfileEditTargetPanelMode({ kind: "credentials", protocol: "imap" }), "credentials"); assertEqual(mailProfileEditTargetPanelMode({ kind: "profile" }), null); +assertDeepEqual(mailProfileEditTargetVisibleSections({ kind: "create" }), ["smtp", "imap"]); assertDeepEqual(mailProfileEditTargetVisibleSections({ kind: "credentials", protocol: "imap" }), ["imap"]); assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "profile" }), true); assertEqual(mailProfileEditTargetShowsProfileFields({ kind: "server", protocol: "smtp" }), false); assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "profile" }), false); assertEqual(mailProfileEditTargetShowsSettingsPanel({ kind: "create" }), true); -