暗色使用深海蓝灰,并保持足够的层级和对比度。 class 主题同样支持亮暗模式。 Account/Admin 页头增加模式切换按钮,选择会持久保存。 仍遵守 Keycloak 的 darkMode=false 配置,关闭时只允许亮色。 Account 统一为“页面上下文 → 身份业务区 → 操作区”结构。 Admin 统一为“领域上下文 → 业务内容 → 固定操作区”结构。 表格、表单、详情、向导、弹窗、空状态、安全设备及应用授权组件全部纳入统一设计系统。 移动端自动收起侧栏、双栏变单栏,并调整固定操作区。
103 lines
4.3 KiB
TypeScript
103 lines
4.3 KiB
TypeScript
/**
|
|
* This file has been claimed for ownership from @keycloakify/keycloak-admin-ui version 260700.0.2.
|
|
* To relinquish ownership and restore this file to its original content, run the following command:
|
|
*
|
|
* $ npx keycloakify own --path "admin/App.tsx" --revert
|
|
*/
|
|
|
|
/* eslint-disable */
|
|
|
|
// @ts-nocheck
|
|
|
|
import { SessionExpirationWarningOverlay } from "../shared/SessionExpirationWarningOverlay";
|
|
import {
|
|
ErrorBoundaryFallback,
|
|
ErrorBoundaryProvider,
|
|
KeycloakSpinner,
|
|
mainPageContentId
|
|
} from "../shared/keycloak-ui-shared";
|
|
import { Flex, FlexItem, Page } from "../shared/@patternfly/react-core";
|
|
import { PropsWithChildren, Suspense, useEffect } from "react";
|
|
import { Outlet } from "react-router-dom";
|
|
import { AdminClientProvider } from "./admin-client";
|
|
import { Header } from "./PageHeader";
|
|
import { PageNav } from "./PageNav";
|
|
import { PageBreadCrumbs } from "./components/bread-crumb/PageBreadCrumbs";
|
|
import { ErrorRenderer } from "./components/error/ErrorRenderer";
|
|
import { RecentRealmsProvider } from "./context/RecentRealms";
|
|
import { AccessContextProvider } from "./context/access/Access";
|
|
import { RealmContextProvider } from "./context/realm-context/RealmContext";
|
|
import { ServerInfoProvider } from "./context/server-info/ServerInfoProvider";
|
|
import { WhoAmIContextProvider } from "./context/whoami/WhoAmI";
|
|
import { SubGroups } from "./groups/SubGroupsContext";
|
|
import { AuthWall } from "./root/AuthWall";
|
|
import { Banners } from "./Banners";
|
|
|
|
export const AppContexts = ({ children }: PropsWithChildren) => (
|
|
<ErrorBoundaryProvider>
|
|
<ErrorBoundaryFallback fallback={ErrorRenderer}>
|
|
<ServerInfoProvider>
|
|
<RealmContextProvider>
|
|
<WhoAmIContextProvider>
|
|
<RecentRealmsProvider>
|
|
<AccessContextProvider>
|
|
<SubGroups>{children}</SubGroups>
|
|
</AccessContextProvider>
|
|
</RecentRealmsProvider>
|
|
</WhoAmIContextProvider>
|
|
</RealmContextProvider>
|
|
</ServerInfoProvider>
|
|
</ErrorBoundaryFallback>
|
|
</ErrorBoundaryProvider>
|
|
);
|
|
|
|
export const App = () => {
|
|
const hrefEndsWithHashSlash = location.href.endsWith("#/");
|
|
useEffect(() => {
|
|
if (!hrefEndsWithHashSlash) return;
|
|
history.replaceState(null, "", location.pathname);
|
|
}, [hrefEndsWithHashSlash, location.pathname]);
|
|
|
|
return (
|
|
<AdminClientProvider>
|
|
<AppContexts>
|
|
<Flex
|
|
direction={{ default: "column" }}
|
|
flexWrap={{ default: "nowrap" }}
|
|
spaceItems={{ default: "spaceItemsNone" }}
|
|
style={{ height: "100%" }}
|
|
>
|
|
<FlexItem>
|
|
<Banners />
|
|
</FlexItem>
|
|
<FlexItem grow={{ default: "grow" }} style={{ minHeight: 0 }}>
|
|
<Page
|
|
header={<Header />}
|
|
isManagedSidebar
|
|
sidebar={<PageNav />}
|
|
breadcrumb={<PageBreadCrumbs />}
|
|
mainContainerId={mainPageContentId}
|
|
>
|
|
<ErrorBoundaryFallback fallback={ErrorRenderer}>
|
|
<Suspense fallback={<KeycloakSpinner />}>
|
|
<AuthWall>
|
|
<div
|
|
className="admin-workspace-route"
|
|
data-workspace="realm-operations"
|
|
>
|
|
<div className="admin-workspace-route__content">
|
|
<Outlet />
|
|
</div>
|
|
</div>
|
|
</AuthWall>
|
|
</Suspense>
|
|
</ErrorBoundaryFallback>
|
|
</Page>
|
|
</FlexItem>
|
|
</Flex>
|
|
<SessionExpirationWarningOverlay warnUserSecondsBeforeAutoLogout={45} />
|
|
</AppContexts>
|
|
</AdminClientProvider>
|
|
);
|
|
};
|