mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
refactoring: get rid of SidebarItem.props.subMenus in favour of props.children only (#2384)
Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
parent
7a35253710
commit
2c50e7aa1c
@ -26,7 +26,6 @@ interface SidebarItemProps {
|
|||||||
* this item should be shown as active
|
* this item should be shown as active
|
||||||
*/
|
*/
|
||||||
isActive?: boolean;
|
isActive?: boolean;
|
||||||
subMenus?: React.ReactNode | React.ComponentType<SidebarItemProps>[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@observer
|
@observer
|
||||||
@ -53,11 +52,9 @@ export class SidebarItem extends React.Component<SidebarItemProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@computed get isExpandable(): boolean {
|
@computed get isExpandable(): boolean {
|
||||||
if (this.compact) {
|
if (this.compact) return false; // not available in compact-mode currently
|
||||||
return false; // not available currently
|
|
||||||
}
|
|
||||||
|
|
||||||
return Boolean(this.props.subMenus || this.props.children);
|
return Boolean(this.props.children);
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleExpand = () => {
|
toggleExpand = () => {
|
||||||
@ -66,8 +63,22 @@ export class SidebarItem extends React.Component<SidebarItemProps> {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
renderSubMenu() {
|
||||||
|
const { isExpandable, expanded, isActive } = this;
|
||||||
|
|
||||||
|
if (!isExpandable || !expanded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ul className={cssNames("sub-menu", { active: isActive })}>
|
||||||
|
{this.props.children}
|
||||||
|
</ul>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { isHidden, icon, text, children, url, className, subMenus } = this.props;
|
const { isHidden, icon, text, url, className } = this.props;
|
||||||
|
|
||||||
if (isHidden) return null;
|
if (isHidden) return null;
|
||||||
|
|
||||||
@ -90,12 +101,7 @@ export class SidebarItem extends React.Component<SidebarItemProps> {
|
|||||||
material={expanded ? "keyboard_arrow_up" : "keyboard_arrow_down"}
|
material={expanded ? "keyboard_arrow_up" : "keyboard_arrow_down"}
|
||||||
/>}
|
/>}
|
||||||
</NavLink>
|
</NavLink>
|
||||||
{isExpandable && expanded && (
|
{this.renderSubMenu()}
|
||||||
<ul className={cssNames("sub-menu", { active: isActive })}>
|
|
||||||
{subMenus}
|
|
||||||
{children}
|
|
||||||
</ul>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,25 +51,20 @@ export class Sidebar extends React.Component<Props> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Object.entries(crdStore.groups).map(([group, crds]) => {
|
return Object.entries(crdStore.groups).map(([group, crds]) => {
|
||||||
const crdGroupSubMenu: React.ReactNode = crds.map((crd) => {
|
const id = `crd-group:${group}`;
|
||||||
|
const crdGroupsPageUrl = crdURL({ query: { groups: group } });
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<SidebarItem key={id} id={id} text={group} url={crdGroupsPageUrl}>
|
||||||
|
{crds.map((crd) => (
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
key={crd.getResourceApiBase()}
|
key={crd.getResourceApiBase()}
|
||||||
id={`crd-resource:${crd.getResourceApiBase()}`}
|
id={`crd-resource:${crd.getResourceApiBase()}`}
|
||||||
url={crd.getResourceUrl()}
|
url={crd.getResourceUrl()}
|
||||||
text={crd.getResourceTitle()}
|
text={crd.getResourceTitle()}
|
||||||
/>
|
/>
|
||||||
);
|
))}
|
||||||
});
|
</SidebarItem>
|
||||||
|
|
||||||
return (
|
|
||||||
<SidebarItem
|
|
||||||
key={group}
|
|
||||||
text={group}
|
|
||||||
id={`crd-group:${group}`}
|
|
||||||
url={crdURL({ query: { groups: group } })}
|
|
||||||
subMenus={crdGroupSubMenu}
|
|
||||||
/>
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -147,8 +142,9 @@ export class Sidebar extends React.Component<Props> {
|
|||||||
isActive={isActive}
|
isActive={isActive}
|
||||||
text={menuItem.title}
|
text={menuItem.title}
|
||||||
icon={<menuItem.components.Icon/>}
|
icon={<menuItem.components.Icon/>}
|
||||||
subMenus={this.renderTreeFromTabRoutes(tabRoutes)}
|
>
|
||||||
/>
|
{this.renderTreeFromTabRoutes(tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -175,88 +171,94 @@ export class Sidebar extends React.Component<Props> {
|
|||||||
<div className={cssNames("sidebar-nav flex column box grow-fixed", { compact })}>
|
<div className={cssNames("sidebar-nav flex column box grow-fixed", { compact })}>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="cluster"
|
id="cluster"
|
||||||
|
text="Cluster"
|
||||||
isActive={isActiveRoute(clusterRoute)}
|
isActive={isActiveRoute(clusterRoute)}
|
||||||
isHidden={!isAllowedResource("nodes")}
|
isHidden={!isAllowedResource("nodes")}
|
||||||
url={clusterURL()}
|
url={clusterURL()}
|
||||||
text="Cluster"
|
|
||||||
icon={<Icon svg="kube"/>}
|
icon={<Icon svg="kube"/>}
|
||||||
/>
|
/>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="nodes"
|
id="nodes"
|
||||||
|
text="Nodes"
|
||||||
isActive={isActiveRoute(nodesRoute)}
|
isActive={isActiveRoute(nodesRoute)}
|
||||||
isHidden={!isAllowedResource("nodes")}
|
isHidden={!isAllowedResource("nodes")}
|
||||||
url={nodesURL()}
|
url={nodesURL()}
|
||||||
text="Nodes"
|
|
||||||
icon={<Icon svg="nodes"/>}
|
icon={<Icon svg="nodes"/>}
|
||||||
/>
|
/>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="workloads"
|
id="workloads"
|
||||||
|
text="Workloads"
|
||||||
isActive={isActiveRoute(workloadsRoute)}
|
isActive={isActiveRoute(workloadsRoute)}
|
||||||
isHidden={Workloads.tabRoutes.length == 0}
|
isHidden={Workloads.tabRoutes.length == 0}
|
||||||
url={workloadsURL({ query })}
|
url={workloadsURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(Workloads.tabRoutes)}
|
|
||||||
text="Workloads"
|
|
||||||
icon={<Icon svg="workloads"/>}
|
icon={<Icon svg="workloads"/>}
|
||||||
/>
|
>
|
||||||
|
{this.renderTreeFromTabRoutes(Workloads.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="config"
|
id="config"
|
||||||
|
text="Configuration"
|
||||||
isActive={isActiveRoute(configRoute)}
|
isActive={isActiveRoute(configRoute)}
|
||||||
isHidden={Config.tabRoutes.length == 0}
|
isHidden={Config.tabRoutes.length == 0}
|
||||||
url={configURL({ query })}
|
url={configURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(Config.tabRoutes)}
|
|
||||||
text="Configuration"
|
|
||||||
icon={<Icon material="list"/>}
|
icon={<Icon material="list"/>}
|
||||||
/>
|
>
|
||||||
|
{this.renderTreeFromTabRoutes(Config.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="networks"
|
id="networks"
|
||||||
|
text="Network"
|
||||||
isActive={isActiveRoute(networkRoute)}
|
isActive={isActiveRoute(networkRoute)}
|
||||||
isHidden={Network.tabRoutes.length == 0}
|
isHidden={Network.tabRoutes.length == 0}
|
||||||
url={networkURL({ query })}
|
url={networkURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(Network.tabRoutes)}
|
|
||||||
text="Network"
|
|
||||||
icon={<Icon material="device_hub"/>}
|
icon={<Icon material="device_hub"/>}
|
||||||
/>
|
>
|
||||||
|
{this.renderTreeFromTabRoutes(Network.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="storage"
|
id="storage"
|
||||||
|
text="Storage"
|
||||||
isActive={isActiveRoute(storageRoute)}
|
isActive={isActiveRoute(storageRoute)}
|
||||||
isHidden={Storage.tabRoutes.length == 0}
|
isHidden={Storage.tabRoutes.length == 0}
|
||||||
url={storageURL({ query })}
|
url={storageURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(Storage.tabRoutes)}
|
|
||||||
icon={<Icon svg="storage"/>}
|
icon={<Icon svg="storage"/>}
|
||||||
text="Storage"
|
>
|
||||||
/>
|
{this.renderTreeFromTabRoutes(Storage.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="namespaces"
|
id="namespaces"
|
||||||
|
text="Namespaces"
|
||||||
isActive={isActiveRoute(namespacesRoute)}
|
isActive={isActiveRoute(namespacesRoute)}
|
||||||
isHidden={!isAllowedResource("namespaces")}
|
isHidden={!isAllowedResource("namespaces")}
|
||||||
url={namespacesURL()}
|
url={namespacesURL()}
|
||||||
icon={<Icon material="layers"/>}
|
icon={<Icon material="layers"/>}
|
||||||
text="Namespaces"
|
|
||||||
/>
|
/>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="events"
|
id="events"
|
||||||
|
text="Events"
|
||||||
isActive={isActiveRoute(eventRoute)}
|
isActive={isActiveRoute(eventRoute)}
|
||||||
isHidden={!isAllowedResource("events")}
|
isHidden={!isAllowedResource("events")}
|
||||||
url={eventsURL({ query })}
|
url={eventsURL({ query })}
|
||||||
icon={<Icon material="access_time"/>}
|
icon={<Icon material="access_time"/>}
|
||||||
text="Events"
|
|
||||||
/>
|
/>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="apps"
|
id="apps"
|
||||||
|
text="Apps" // helm charts
|
||||||
isActive={isActiveRoute(appsRoute)}
|
isActive={isActiveRoute(appsRoute)}
|
||||||
url={appsURL({ query })}
|
url={appsURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(Apps.tabRoutes)}
|
|
||||||
icon={<Icon material="apps"/>}
|
icon={<Icon material="apps"/>}
|
||||||
text="Apps"
|
>
|
||||||
/>
|
{this.renderTreeFromTabRoutes(Apps.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="users"
|
id="users"
|
||||||
|
text="Access Control"
|
||||||
isActive={isActiveRoute(usersManagementRoute)}
|
isActive={isActiveRoute(usersManagementRoute)}
|
||||||
url={usersManagementURL({ query })}
|
url={usersManagementURL({ query })}
|
||||||
subMenus={this.renderTreeFromTabRoutes(UserManagement.tabRoutes)}
|
|
||||||
icon={<Icon material="security"/>}
|
icon={<Icon material="security"/>}
|
||||||
text="Access Control"
|
>
|
||||||
/>
|
{this.renderTreeFromTabRoutes(UserManagement.tabRoutes)}
|
||||||
|
</SidebarItem>
|
||||||
<SidebarItem
|
<SidebarItem
|
||||||
id="custom-resources"
|
id="custom-resources"
|
||||||
text="Custom Resources"
|
text="Custom Resources"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user