{alias.enabled ? "启用" : "停用"}
@@ -393,7 +644,7 @@ function AliasesSection({ aliases, domains }: { aliases: Alias[]; domains: Domai
{alias.destination}
{domains.find((d) => d.id === alias.domainId)?.name || alias.domainId}
{alias.enabled ? "启用" : "停用"}
-
update.mutate({ id: alias.id, payload: { source: alias.source, destination: alias.destination, enabled: !alias.enabled } })} onDelete={() => setPendingConfirm({ title: "删除别名?", description: `${alias.source} 将不再转发到 ${alias.destination}。`, confirmText: "删除别名", onConfirm: () => remove.mutate(alias.id) })} />
+
update.mutate({ id: alias.id, payload: { source: alias.source, destination: alias.destination, enabled: !alias.enabled } }) : undefined} onDelete={canDelete ? () => setPendingConfirm({ title: "删除别名?", description: `${alias.source} 将不再转发到 ${alias.destination}。`, confirmText: "删除别名", onConfirm: () => remove.mutate(alias.id) }) : undefined} />
))}
@@ -534,9 +785,17 @@ function AdminMessagesSection({ mailboxes }: { mailboxes: MailboxType[] }) {
}
function SystemSettingsSection({ settings, domains }: { settings?: SystemSettings; domains: Domain[] }) {
+ const me = useMe()
+ const user = me.data?.user
const qc = useQueryClient()
const { toast } = useToast()
- const templates = useQuery({ queryKey: ["admin", "mail-templates"], queryFn: api.mailTemplates })
+ const canSettingsView = hasPermission(user, "admin.settings.view")
+ const canUpdateSettings = hasPermission(user, "admin.settings.update")
+ const canTestSMTP = hasPermission(user, "admin.settings.test_smtp")
+ const canViewTemplates = hasPermission(user, "admin.templates.view")
+ const canUpdateTemplates = hasPermission(user, "admin.templates.update")
+ const canResetTemplates = hasPermission(user, "admin.templates.reset")
+ const templates = useQuery({ queryKey: ["admin", "mail-templates"], queryFn: api.mailTemplates, enabled: canViewTemplates })
const [settingsTab, setSettingsTab] = React.useState<"base" | "smtp" | "storage" | "mail" | "templates" | "security" | "about">("base")
const [smtpRequireTls, setSmtpRequireTls] = React.useState(false)
const [allowInsecureHttp, setAllowInsecureHttp] = React.useState(true)
@@ -617,16 +876,22 @@ function SystemSettingsSection({ settings, domains }: { settings?: SystemSetting
settings.reservedMailboxPrefixes,
].join("|") : "loading"
const tabs: { key: typeof settingsTab; label: string }[] = [
- { key: "base", label: "基础" },
- { key: "smtp", label: "SMTP" },
- { key: "storage", label: "存储" },
- { key: "mail", label: "邮件" },
- { key: "templates", label: "模板" },
- { key: "security", label: "安全" },
+ ...(canSettingsView ? [
+ { key: "base" as const, label: "基础" },
+ { key: "smtp" as const, label: "SMTP" },
+ { key: "storage" as const, label: "存储" },
+ { key: "mail" as const, label: "邮件" },
+ ] : []),
+ ...(canViewTemplates ? [{ key: "templates" as const, label: "模板" }] : []),
+ ...(canSettingsView ? [{ key: "security" as const, label: "安全" }] : []),
{ key: "about", label: "关于" },
]
+ React.useEffect(() => {
+ if (tabs.some((tab) => tab.key === settingsTab)) return
+ setSettingsTab(tabs[0]?.key || "about")
+ }, [settingsTab, tabs])
return (
-
-