diff --git a/.github/release-notes/v1.2.44.md b/.github/release-notes/v1.2.44.md
new file mode 100644
index 0000000..a218f15
--- /dev/null
+++ b/.github/release-notes/v1.2.44.md
@@ -0,0 +1,5 @@
+- 修复刷新后台仪表盘时,注册、自助申请邮箱等功能在设置读取完成前短暂显示为关闭的问题。
+- 为后台统计、系统状态、域名与列表页面、备份设置和个人中心补充统一加载状态,避免将未加载数据误显示为 0、未配置或暂无数据。
+- 优化受限权限账号的状态展示:无权读取的系统设置明确显示为不可查看,不再误判为关闭或未配置。
+
+**完整更新日志**:[v1.2.43...v1.2.44](https://github.com/zxyszx/NewSzxcn-Email/compare/v1.2.43...v1.2.44)
diff --git a/VERSION b/VERSION
index 7b6476a..8a30807 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.43
+1.2.44
diff --git a/apps/web/src/pages/admin.tsx b/apps/web/src/pages/admin.tsx
index 8a14121..0205d65 100644
--- a/apps/web/src/pages/admin.tsx
+++ b/apps/web/src/pages/admin.tsx
@@ -17,6 +17,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"
import { Separator } from "@/components/ui/separator"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Switch } from "@/components/ui/switch"
+import { Skeleton } from "@/components/ui/skeleton"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Textarea } from "@/components/ui/textarea"
import { ConfirmDialog } from "@/components/confirm-dialog"
@@ -86,11 +87,13 @@ export function AdminPage() {
const canMessagesView = hasPermission(user, "admin.messages.view")
const canSettingsView = hasPermission(user, "admin.settings.view")
const canTemplatesView = hasPermission(user, "admin.templates.view")
+ const canLoadDomains = canUsersView || canDomainsView || canDNSView || canMailboxesView || canAliasesView || canSettingsView || canTemplatesView
+ const canLoadMailboxes = canMailboxesView || canMessagesView || canSettingsView
const overview = useQuery({ queryKey: ["admin", "overview"], queryFn: api.adminOverview, enabled: !!user && canOverview })
const users = useQuery({ queryKey: ["admin", "users"], queryFn: api.users, enabled: !!user && (canUsersView || canMailboxesView) })
const permissionGroups = useQuery({ queryKey: ["admin", "permission-groups"], queryFn: api.permissionGroups, enabled: !!user && (canPermissionGroupsView || canUsersView) })
- const domains = useQuery({ queryKey: ["admin", "domains"], queryFn: api.domains, enabled: !!user && (canUsersView || canDomainsView || canDNSView || canMailboxesView || canAliasesView || canSettingsView || canTemplatesView) })
- const mailboxes = useQuery({ queryKey: ["admin", "mailboxes"], queryFn: api.mailboxes, enabled: !!user && (canMailboxesView || canMessagesView || canSettingsView) })
+ const domains = useQuery({ queryKey: ["admin", "domains"], queryFn: api.domains, enabled: !!user && canLoadDomains })
+ const mailboxes = useQuery({ queryKey: ["admin", "mailboxes"], queryFn: api.mailboxes, enabled: !!user && canLoadMailboxes })
const aliases = useQuery({ queryKey: ["admin", "aliases"], queryFn: api.aliases, enabled: !!user && canAliasesView })
const settings = useQuery({ queryKey: ["admin", "settings"], queryFn: api.systemSettings, enabled: !!user && canSettingsView })
const [params, setParams] = useSearchParams()
@@ -104,14 +107,18 @@ export function AdminPage() {
const visibleSections = sectionKeys.filter((key) => hasAnyPermission(user, sectionPermissions[key]) && (key !== "backups" || user?.role === "admin"))
const rawSection = params.get("section") as Section | null
const section: Section = rawSection && visibleSections.includes(rawSection) ? rawSection : visibleSections[0] || "overview"
- const sectionQuery = section === "overview" ? overview
- : section === "users" ? users
- : section === "permissionGroups" ? permissionGroups
- : section === "domains" ? domains
- : section === "mailboxes" ? mailboxes
- : section === "aliases" ? aliases
- : section === "settings" ? settings
- : null
+ const sectionQueries = section === "overview" ? [overview, ...(canLoadDomains ? [domains] : []), ...(canSettingsView ? [settings] : [])]
+ : section === "users" ? [users, permissionGroups, domains]
+ : section === "permissionGroups" ? [permissionGroups]
+ : section === "domains" ? [domains]
+ : section === "mailboxes" ? [mailboxes, users, domains]
+ : section === "aliases" ? [aliases, domains]
+ : section === "messages" || section === "sendAudit" ? [mailboxes]
+ : section === "settings" ? [domains, ...(canLoadMailboxes ? [mailboxes] : []), ...(canSettingsView ? [settings] : [])]
+ : []
+ const sectionLoading = sectionQueries.some((query) => query.isPending)
+ const sectionError = sectionQueries.find((query) => query.isError)
+ const sectionReady = !sectionLoading && !sectionError
async function refreshAdminPage() {
if (refreshing) return
@@ -130,17 +137,18 @@ export function AdminPage() {
}
}
- const overviewChecklist = setupChecklist(overview.data, domainItems, settings.data).filter((item) => visibleSections.includes(item.section))
+ const overviewChecklist = sectionReady && section === "overview" ? setupChecklist(overview.data, domainItems, settings.data).filter((item) => visibleSections.includes(item.section)) : undefined
const changeSection = (next: Section) => setParams(next === "overview" ? {} : { section: next })
return (