import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { union, filter } from "lodash-es"; import { Brand, Card, CardBody, CardTitle, DescriptionList, DescriptionListDescription, DescriptionListGroup, DescriptionListTerm, EmptyState, EmptyStateBody, Grid, GridItem, Label, List, ListItem, ListVariant, PageSection, Tab, TabTitleText, Text, TextContent, Title, } from "@patternfly/react-core"; import { useRealm } from "../context/realm-context/RealmContext"; import { useServerInfo } from "../context/server-info/ServerInfoProvider"; import { toUpperCase } from "../util"; import { HelpItem } from "ui-shared"; import environment from "../environment"; import { KeycloakSpinner } from "../components/keycloak-spinner/KeycloakSpinner"; import useLocaleSort from "../utils/useLocaleSort"; import { RoutableTabs, useRoutableTab, } from "../components/routable-tabs/RoutableTabs"; import { DashboardTab, toDashboard } from "./routes/Dashboard"; import { ProviderInfo } from "./ProviderInfo"; import "./dashboard.css"; const EmptyDashboard = () => { const { t } = useTranslation("dashboard"); const { realm } = useRealm(); const brandImage = environment.logo ? environment.logo : "/icon.svg"; return ( {t("welcome")} {realm} {t("introduction")} ); }; const Dashboard = () => { const { t } = useTranslation("dashboard"); const { realm } = useRealm(); const serverInfo = useServerInfo(); const localeSort = useLocaleSort(); const isDeprecatedFeature = (feature: string) => disabledFeatures.includes(feature); const isExperimentalFeature = (feature: string) => serverInfo.profileInfo?.experimentalFeatures?.includes(feature); const isPreviewFeature = (feature: string) => serverInfo.profileInfo?.previewFeatures?.includes(feature); const isSupportedFeature = (feature: string) => !isExperimentalFeature(feature) && !isPreviewFeature(feature); const disabledFeatures = useMemo( () => localeSort( serverInfo.profileInfo?.disabledFeatures ?? [], (item) => item, ), [serverInfo.profileInfo], ); const enabledFeatures = useMemo( () => localeSort( filter( union( serverInfo.profileInfo?.experimentalFeatures, serverInfo.profileInfo?.previewFeatures, ), (feature) => { return !isDeprecatedFeature(feature); }, ), (item) => item, ), [serverInfo.profileInfo], ); const useTab = (tab: DashboardTab) => useRoutableTab( toDashboard({ realm, tab, }), ); const infoTab = useTab("info"); const providersTab = useTab("providers"); if (Object.keys(serverInfo).length === 0) { return ; } return ( <> {t("realmName", { name: realm })} {t("serverInfo")}} {...infoTab} > {t("serverInfo")} {t("version")} {serverInfo.systemInfo?.version} {t("product")} {toUpperCase(serverInfo.profileInfo?.name!)} {t("memory")} {t("totalMemory")} {serverInfo.memoryInfo?.totalFormated} {t("freeMemory")} {serverInfo.memoryInfo?.freeFormated} {t("usedMemory")} {serverInfo.memoryInfo?.usedFormated} {t("profile")} {t("enabledFeatures")}{" "} {enabledFeatures.map((feature) => ( {feature}{" "} {isExperimentalFeature(feature) ? ( ) : null} {isPreviewFeature(feature) ? ( ) : null} ))} {t("disabledFeatures")}{" "} {disabledFeatures.map((feature) => ( {feature}{" "} {isExperimentalFeature(feature) ? ( ) : null} {isPreviewFeature(feature) ? ( ) : null} {isSupportedFeature(feature) ? ( ) : null} ))} {t("providerInfo")}} {...providersTab} > ); }; export default function DashboardSection() { const { realm } = useRealm(); const isMasterRealm = realm === "master"; return ( <> {!isMasterRealm && } {isMasterRealm && } ); }