import "./sidebar.scss"; import React from "react"; import type { TabLayoutRoute } from "./tab-layout"; import { observer } from "mobx-react"; import { NavLink } from "react-router-dom"; import { Trans } from "@lingui/macro"; import { cssNames } from "../../utils"; import { Icon } from "../icon"; import { workloadsRoute, workloadsURL } from "../+workloads/workloads.route"; import { namespacesRoute, namespacesURL } from "../+namespaces/namespaces.route"; import { nodesRoute, nodesURL } from "../+nodes/nodes.route"; import { usersManagementRoute, usersManagementURL } from "../+user-management/user-management.route"; import { networkRoute, networkURL } from "../+network/network.route"; import { storageRoute, storageURL } from "../+storage/storage.route"; import { clusterRoute, clusterURL } from "../+cluster"; import { Config, configRoute, configURL } from "../+config"; import { eventRoute, eventsURL } from "../+events"; import { Apps, appsRoute, appsURL } from "../+apps"; import { namespaceStore } from "../+namespaces/namespace.store"; import { Workloads } from "../+workloads"; import { UserManagement } from "../+user-management"; import { Storage } from "../+storage"; import { Network } from "../+network"; import { crdStore } from "../+custom-resources/crd.store"; import { CrdList, crdResourcesRoute, crdRoute, crdURL } from "../+custom-resources"; import { CustomResources } from "../+custom-resources/custom-resources"; import { isActiveRoute } from "../../navigation"; import { isAllowedResource } from "../../../common/rbac"; import { Spinner } from "../spinner"; import { ClusterPageMenuRegistration, clusterPageMenuRegistry, clusterPageRegistry, getExtensionPageUrl } from "../../../extensions/registries"; import { SidebarNavItem } from "./sidebar-nav-item"; import { SidebarContext } from "./sidebar-context"; interface Props { className?: string; isPinned: boolean; toggle(): void; } @observer export class Sidebar extends React.Component { async componentDidMount() { if (!crdStore.isLoaded && isAllowedResource("customresourcedefinitions")) { crdStore.loadAll(); } } renderCustomResources() { if (crdStore.isLoading) { return ; } return Object.entries(crdStore.groups).map(([group, crds]) => { const submenus: TabLayoutRoute[] = crds.map((crd) => { return { title: crd.getResourceKind(), component: CrdList, url: crd.getResourceUrl(), routePath: String(crdResourcesRoute.path), }; }); return ( ); }); } getTabLayoutRoutes(menu: ClusterPageMenuRegistration): TabLayoutRoute[] { if (!menu.id) { return []; } const routes: TabLayoutRoute[] = []; clusterPageMenuRegistry.getSubItems(menu).forEach((subItem) => { const subPage = clusterPageRegistry.getByPageMenuTarget(subItem.target); if (subPage) { routes.push({ routePath: subPage.routePath, url: getExtensionPageUrl({ extensionId: subPage.extensionId, pageId: subPage.id, params: subItem.target.params }), title: subItem.title, component: subPage.components.Page, exact: subPage.exact }); } }); return routes; } renderRegisteredMenus() { return clusterPageMenuRegistry.getRootItems().map((menuItem, index) => { const registeredPage = clusterPageRegistry.getByPageMenuTarget(menuItem.target); const tabRoutes = this.getTabLayoutRoutes(menuItem); const id = `registered-item-${index}`; let pageUrl: string; let isActive = false; if (registeredPage) { const { extensionId, id: pageId } = registeredPage; pageUrl = getExtensionPageUrl({ extensionId, pageId, params: menuItem.target.params }); isActive = isActiveRoute(registeredPage.routePath); } else if (tabRoutes.length > 0) { pageUrl = tabRoutes[0].url; isActive = isActiveRoute(tabRoutes.map((tab) => tab.routePath)); } else { return; } return ( } isActive={isActive} subMenus={tabRoutes} /> ); }); } render() { const { toggle, isPinned, className } = this.props; const query = namespaceStore.getContextParams(); return (
Lens
Compact view} material={isPinned ? "keyboard_arrow_left" : "keyboard_arrow_right"} onClick={toggle} focusable={false} />
Cluster} icon={} /> Nodes} icon={} /> Workloads} icon={} /> Configuration} icon={} /> Network} icon={} /> } text={Storage} /> } text={Namespaces} /> } text={Events} /> } text={Apps} /> } text={Access Control} /> } text={Custom Resources} > {this.renderCustomResources()} {this.renderRegisteredMenus()}
); } }