refactor(webui): clarify shared controls and status feedback
This commit is contained in:
@@ -16,12 +16,34 @@ import { renderToStaticMarkup } from "react-dom/server";
|
||||
import CredentialPanel from "../src/components/CredentialPanel";
|
||||
import PasswordField from "../src/components/PasswordField";
|
||||
import MessageDisplayPanel from "../src/components/MessageDisplayPanel";
|
||||
import MailServerSettingsPanel from "../src/components/mail/MailServerSettingsPanel";
|
||||
import MailServerSettingsPanel, { MailServerFolderLookupResultView, resolveMailServerSettingsActiveSection } from "../src/components/mail/MailServerSettingsPanel";
|
||||
import EmailAddressInput from "../src/components/email/EmailAddressInput";
|
||||
import { PlatformLanguageProvider } from "../src/i18n/LanguageContext";
|
||||
|
||||
function noop() {}
|
||||
|
||||
const allMailServerSections = ["smtp", "imap"] as const;
|
||||
assertEqual(
|
||||
resolveMailServerSettingsActiveSection("imap", "smtp", "smtp", allMailServerSections),
|
||||
"imap",
|
||||
"user-selected mail settings section is not reset to initialSection"
|
||||
);
|
||||
assertEqual(
|
||||
resolveMailServerSettingsActiveSection("smtp", "imap", "smtp", allMailServerSections),
|
||||
"imap",
|
||||
"changed initialSection is applied when parent intentionally changes it"
|
||||
);
|
||||
assertEqual(
|
||||
resolveMailServerSettingsActiveSection("imap", "smtp", "smtp", ["smtp"] as const),
|
||||
"smtp",
|
||||
"active mail settings section falls back when hidden by visibleSections"
|
||||
);
|
||||
assertEqual(
|
||||
resolveMailServerSettingsActiveSection("smtp", "imap", "imap", ["smtp"] as const),
|
||||
"smtp",
|
||||
"hidden initialSection falls back to the first visible section"
|
||||
);
|
||||
|
||||
const savedPassword = renderToStaticMarkup(
|
||||
<PasswordField value="" saved savedPlaceholder="Saved password configured" onValueChange={noop} />
|
||||
);
|
||||
@@ -75,20 +97,14 @@ const settingsPanel = renderToStaticMarkup(
|
||||
imapSavedPasswordPlaceholder="Saved IMAP password"
|
||||
onTestSmtp={noop}
|
||||
onTestImap={noop}
|
||||
onLookupFolders={noop}
|
||||
folderLookupResult={{
|
||||
ok: true,
|
||||
protocol: "imap",
|
||||
message: "Folders loaded",
|
||||
detected_sent_folder: "Sent",
|
||||
folders: [{ name: "INBOX", flags: [] }, { name: "Sent", flags: ["\\Sent"] }]
|
||||
}}
|
||||
onUseDetectedFolder={noop}
|
||||
/>
|
||||
);
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.test_smtp.e5697981"), "SMTP test action is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.server.cb0cb170"), "server heading is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.credentials.dd097a22"), "credentials heading is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.server.cb0cb170"), "server field is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.username.84c29015"), "username field is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.password.8be3c943"), "password field is rendered");
|
||||
assert(settingsPanel.includes("i18n:govoplan-core.timeout_seconds.0bfc6553"), "timeout field is rendered with SMTP server settings");
|
||||
assert(!settingsPanel.includes("i18n:govoplan-core.advanced.4d064726"), "advanced section tab is not rendered");
|
||||
assert(!settingsPanel.includes("Enable IMAP"), "legacy IMAP enable toggle is not rendered");
|
||||
assert(settingsPanel.includes('placeholder="Saved SMTP password"'), "SMTP saved credential placeholder is rendered");
|
||||
|
||||
@@ -102,77 +118,45 @@ const imapSettingsPanel = renderToStaticMarkup(
|
||||
imapPasswordSaved
|
||||
imapSavedPasswordPlaceholder="Saved IMAP password"
|
||||
onTestImap={noop}
|
||||
onLookupFolders={noop}
|
||||
folderLookupResult={{
|
||||
ok: true,
|
||||
protocol: "imap",
|
||||
message: "Folders loaded",
|
||||
detected_sent_folder: "Sent",
|
||||
folders: [{ name: "INBOX", flags: [] }, { name: "Sent", flags: ["\\Sent"] }]
|
||||
}}
|
||||
onUseDetectedFolder={noop}
|
||||
/>
|
||||
);
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.test_imap.ef1bd79c"), "IMAP test action is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.server.cb0cb170"), "IMAP server heading is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.credentials.dd097a22"), "IMAP credentials heading is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.server.cb0cb170"), "IMAP server field is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.username.84c29015"), "IMAP username field is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.password.8be3c943"), "IMAP password field is rendered");
|
||||
assert(imapSettingsPanel.includes("i18n:govoplan-core.timeout_seconds.0bfc6553"), "IMAP timeout field is rendered with IMAP server settings");
|
||||
assert(!imapSettingsPanel.includes("Enable IMAP"), "legacy IMAP enable toggle is not rendered in IMAP tab");
|
||||
assert(!imapSettingsPanel.includes("i18n:govoplan-core.folders.c603ab65"), "folder lookup action is not rendered in the IMAP tab");
|
||||
assert(imapSettingsPanel.includes('placeholder="Saved IMAP password"'), "IMAP saved credential placeholder is rendered");
|
||||
assert(!imapSettingsPanel.includes("Folders loaded"), "folder lookup result is not rendered in the IMAP tab");
|
||||
assert(!imapSettingsPanel.includes("Default sent folder"), "default sent folder field is not rendered");
|
||||
|
||||
const advancedSettingsPanel = renderToStaticMarkup(
|
||||
<MailServerSettingsPanel
|
||||
initialSection="advanced"
|
||||
smtp={{ host: "smtp.example.org", security: "starttls" }}
|
||||
imap={{ host: "imap.example.org", security: "tls", sent_folder: "Sent" }}
|
||||
onSmtpChange={noop}
|
||||
onImapChange={noop}
|
||||
onLookupFolders={noop}
|
||||
folderLookupResult={{
|
||||
const folderLookupError = renderToStaticMarkup(
|
||||
<MailServerFolderLookupResultView result={{ ok: false, protocol: "imap", message: "IMAP lookup timed out", folders: [] }} />
|
||||
);
|
||||
assert(folderLookupError.includes("compact-alert"), "folder lookup errors use the compact shared alert style");
|
||||
assert(folderLookupError.includes("warning"), "folder lookup errors are warnings, not page-level danger alerts");
|
||||
assert(folderLookupError.includes("IMAP lookup timed out"), "folder lookup error message is rendered");
|
||||
|
||||
const floatingFolderLookupError = renderToStaticMarkup(
|
||||
<MailServerFolderLookupResultView result={{ ok: false, protocol: "imap", message: "IMAP lookup timed out", folders: [] }} floatingFailures />
|
||||
);
|
||||
assert(floatingFolderLookupError.includes("alert-floating"), "folder lookup errors can be rendered in the floating alert stack");
|
||||
|
||||
const folderLookupSuccess = renderToStaticMarkup(
|
||||
<MailServerFolderLookupResultView
|
||||
result={{
|
||||
ok: true,
|
||||
protocol: "imap",
|
||||
message: "Folders loaded",
|
||||
detected_sent_folder: "Sent",
|
||||
folders: [{ name: "INBOX", flags: [] }, { name: "Sent", flags: ["\\Sent"] }]
|
||||
}}
|
||||
onUseDetectedFolder={noop}
|
||||
onUseDetected={noop}
|
||||
/>
|
||||
);
|
||||
assert(advancedSettingsPanel.includes("i18n:govoplan-core.append_target_folder.0aaacc0c"), "append target folder is the advanced IMAP folder field");
|
||||
assert(advancedSettingsPanel.includes("i18n:govoplan-core.folders.c603ab65"), "folder lookup action is rendered near append target folder");
|
||||
assert(advancedSettingsPanel.includes("Folders loaded"), "folder lookup result is rendered in Advanced");
|
||||
assert(advancedSettingsPanel.includes("i18n:govoplan-core.use_detected_folder.5ec4965c"), "detected folder action is rendered near append target folder");
|
||||
assert(advancedSettingsPanel.includes('value="Sent"'), "append target folder uses IMAP sent folder value without append override");
|
||||
|
||||
const disabledAppendFolderPanel = renderToStaticMarkup(
|
||||
<MailServerSettingsPanel
|
||||
initialSection="advanced"
|
||||
smtp={{ host: "smtp.example.org", security: "starttls" }}
|
||||
imap={{ host: "imap.example.org", security: "tls", sent_folder: "Sent" }}
|
||||
onSmtpChange={noop}
|
||||
onImapChange={noop}
|
||||
onLookupFolders={noop}
|
||||
folderLookupResult={{
|
||||
ok: true,
|
||||
protocol: "imap",
|
||||
message: "Folders loaded",
|
||||
detected_sent_folder: "Sent",
|
||||
folders: [{ name: "Sent", flags: ["\\Sent"] }]
|
||||
}}
|
||||
onUseDetectedFolder={noop}
|
||||
append={{
|
||||
enabled: true,
|
||||
folder: "Sent",
|
||||
folderDisabled: true,
|
||||
onEnabledChange: noop,
|
||||
onFolderChange: noop
|
||||
}}
|
||||
/>
|
||||
);
|
||||
assert(!disabledAppendFolderPanel.includes("i18n:govoplan-core.folders.c603ab65"), "folder lookup action is hidden when append target is disabled");
|
||||
assert(!disabledAppendFolderPanel.includes("i18n:govoplan-core.use_detected_folder.5ec4965c"), "detected folder action is hidden when append target is disabled");
|
||||
assert(folderLookupSuccess.includes("compact-alert"), "folder lookup success uses the compact shared alert style");
|
||||
assert(folderLookupSuccess.includes("Folders loaded"), "folder lookup success message is rendered");
|
||||
|
||||
const smtpServerOnlyPanel = renderToStaticMarkup(
|
||||
<MailServerSettingsPanel
|
||||
@@ -185,7 +169,7 @@ const smtpServerOnlyPanel = renderToStaticMarkup(
|
||||
/>
|
||||
);
|
||||
assert(smtpServerOnlyPanel.includes("i18n:govoplan-core.server.cb0cb170"), "focused server panel renders server fields");
|
||||
assert(!smtpServerOnlyPanel.includes("i18n:govoplan-core.credentials.dd097a22"), "focused server panel hides credential fields");
|
||||
assert(!smtpServerOnlyPanel.includes("i18n:govoplan-core.username.84c29015"), "focused server panel hides credential fields");
|
||||
assert(!smtpServerOnlyPanel.includes("i18n:govoplan-core.mail_server_settings_sections.40a163b7"), "single focused section hides section switcher");
|
||||
assert(!smtpServerOnlyPanel.includes("imap.example.org"), "focused SMTP server panel does not render IMAP fields");
|
||||
|
||||
@@ -202,7 +186,7 @@ const imapCredentialsOnlyPanel = renderToStaticMarkup(
|
||||
imapSavedPasswordPlaceholder="Saved IMAP password"
|
||||
/>
|
||||
);
|
||||
assert(imapCredentialsOnlyPanel.includes("i18n:govoplan-core.credentials.dd097a22"), "focused credentials panel renders credential fields");
|
||||
assert(imapCredentialsOnlyPanel.includes("i18n:govoplan-core.username.84c29015"), "focused credentials panel renders credential fields");
|
||||
assert(!imapCredentialsOnlyPanel.includes("i18n:govoplan-core.server.cb0cb170"), "focused credentials panel hides server fields");
|
||||
assert(imapCredentialsOnlyPanel.includes('placeholder="Saved IMAP password"'), "focused credentials panel preserves saved password UX");
|
||||
assert(!imapCredentialsOnlyPanel.includes("smtp.example.org"), "focused IMAP credentials panel does not render SMTP fields");
|
||||
|
||||
Reference in New Issue
Block a user