feat(management-navigation-single-company-ux): 收敛管理导航与单公司配置体验
这个提交包含在:
@@ -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>
|
||||
|
||||
在新工单中引用
屏蔽一个用户