import "./sidebar.scss"; import type { TabLayoutRoute } from "./tab-layout"; import React from "react"; import { observer } from "mobx-react"; import { NavLink } from "react-router-dom"; 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 { namespaceUrlParam } 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 { 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 { SidebarItem } from "./sidebar-item"; interface Props { className?: string; compact?: boolean; // compact-mode view: show only icons and expand on :hover toggle(): void; // compact-mode updater } @observer export class Sidebar extends React.Component { static displayName = "Sidebar"; async componentDidMount() { crdStore.reloadAll(); } renderCustomResources() { if (crdStore.isLoading) { return (
); } return Object.entries(crdStore.groups).map(([group, crds]) => { const id = `crd-group:${group}`; const crdGroupsPageUrl = crdURL({ query: { groups: group } }); return ( {crds.map((crd) => ( ))} ); }); } renderTreeFromTabRoutes(tabRoutes: TabLayoutRoute[] = []): React.ReactNode { if (!tabRoutes.length) { return null; } return tabRoutes.map(({ title, routePath, url = routePath, exact = true }) => { const subMenuItemId = `tab-route-item-${url}`; return ( ); }); } getTabLayoutRoutes(menu: ClusterPageMenuRegistration): TabLayoutRoute[] { const routes: TabLayoutRoute[] = []; if (!menu.id) { return routes; } clusterPageMenuRegistry.getSubItems(menu).forEach((subMenu) => { const subPage = clusterPageRegistry.getByPageTarget(subMenu.target); if (subPage) { const { extensionId, id: pageId } = subPage; routes.push({ routePath: subPage.url, url: getExtensionPageUrl({ extensionId, pageId, params: subMenu.target.params }), title: subMenu.title, component: subPage.components.Page, }); } }); return routes; } renderRegisteredMenus() { return clusterPageMenuRegistry.getRootItems().map((menuItem, index) => { const registeredPage = clusterPageRegistry.getByPageTarget(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.url); } else if (tabRoutes.length > 0) { pageUrl = tabRoutes[0].url; isActive = isActiveRoute(tabRoutes.map((tab) => tab.routePath)); } else { return; } return ( } > {this.renderTreeFromTabRoutes(tabRoutes)} ); }); } render() { const { toggle, compact, className } = this.props; const query = namespaceUrlParam.toObjectParam(); return (
Lens
} /> } /> } > {this.renderTreeFromTabRoutes(Workloads.tabRoutes)} } > {this.renderTreeFromTabRoutes(Config.tabRoutes)} } > {this.renderTreeFromTabRoutes(Network.tabRoutes)} } > {this.renderTreeFromTabRoutes(Storage.tabRoutes)} } /> } /> } > {this.renderTreeFromTabRoutes(Apps.tabRoutes)} } > {this.renderTreeFromTabRoutes(UserManagement.tabRoutes)} } > {this.renderTreeFromTabRoutes(CustomResources.tabRoutes)} {this.renderCustomResources()} {this.renderRegisteredMenus()}
); } }