feat(management-navigation-single-company-ux): 收敛管理导航与单公司配置体验

这个提交包含在:
2026-08-03 12:43:00 +08:00
父节点 f4ddc18f12
当前提交 4b0184c64b
共修改 36 个文件,包含 1249 行新增和 178 行删除
+27 -3
查看文件
@@ -5,6 +5,7 @@ import type { NotificationItem } from "../../api/notifications";
import { fetchNotifications, markAllNotificationsRead, markNotificationRead } from "../../api/notifications";
import { useAuth } from "../../auth/AuthContext";
import { resolvePageMeta } from "../../features/navigation/schema";
import { resolveManagementBreadcrumbs } from "../../features/navigation/managementRoutes";
import { resolveNotificationTargetLink, formatNotificationRelativeTime } from "../../lib/notificationLinks";
import { resolveErrorMessage } from "../../lib/resolveErrorMessage";
import { isWecomWebView } from "../../lib/runtimeContext";
@@ -45,7 +46,7 @@ function BellIcon() {
}
export function Topbar() {
const { me, logout } = useAuth();
const { me, logout, permissions } = useAuth();
const location = useLocation();
const navigate = useNavigate();
const queryClient = useQueryClient();
@@ -53,7 +54,9 @@ export function Topbar() {
const [searchOpen, setSearchOpen] = useState(false);
const [notificationsOpen, setNotificationsOpen] = useState(false);
const wecomEntry = isWecomWebView();
const pageMeta = resolvePageMeta(location.pathname);
const pageMeta = resolvePageMeta(location.pathname, permissions);
const managementBreadcrumbs = resolveManagementBreadcrumbs(location.pathname, permissions);
const showManagementBreadcrumbs = managementBreadcrumbs.length > 1;
const unreadQuery = useQuery({
enabled: Boolean(me),
@@ -165,7 +168,28 @@ export function Topbar() {
<div className="min-w-0">
<div className="flex flex-wrap items-center gap-2">
<p className="truncate text-base font-semibold text-[var(--color-text-primary)] md:text-lg">{pageMeta.title}</p>
{showManagementBreadcrumbs ? (
<nav
aria-label="管理路径"
className="flex min-w-0 flex-wrap items-center gap-1 text-base font-semibold text-[var(--color-text-primary)] md:text-lg"
data-testid="topbar-management-breadcrumbs"
>
{managementBreadcrumbs.map((item, index) => (
<span key={item.key} className="flex min-w-0 items-center gap-1">
{index > 0 ? <span aria-hidden="true" className="text-zinc-400">/</span> : null}
{item.href ? (
<Link className="rounded-sm text-zinc-600 hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/30" to={item.href}>
{item.title}
</Link>
) : (
<span aria-current="page" className="truncate">{item.title}</span>
)}
</span>
))}
</nav>
) : (
<p className="truncate text-base font-semibold text-[var(--color-text-primary)] md:text-lg">{pageMeta.title}</p>
)}
<span className="hidden rounded-full bg-slate-100 px-2 py-0.5 text-xs font-medium text-[var(--color-text-secondary)] sm:inline-flex">
{pageMeta.group}
</span>