diff --git a/packages/core/src/renderer/components/+catalog/catalog-menu.tsx b/packages/core/src/renderer/components/+catalog/catalog-menu.tsx
index 2af8246787..73121e3b1c 100644
--- a/packages/core/src/renderer/components/+catalog/catalog-menu.tsx
+++ b/packages/core/src/renderer/components/+catalog/catalog-menu.tsx
@@ -6,18 +6,16 @@
import treeStyles from "./catalog-tree.module.scss";
import styles from "./catalog-menu.module.scss";
-import type { MouseEventHandler } from "react";
import React from "react";
-import { TreeItem, TreeView } from "@material-ui/lab";
import { Icon } from "../icon";
-import { StylesProvider } from "@material-ui/core";
import type { CatalogCategory } from "../../api/catalog-entity";
import { observer } from "mobx-react";
import { CatalogCategoryLabel } from "./catalog-category-label";
import type { IComputedValue } from "mobx";
import { withInjectables } from "@ogre-tools/injectable-react";
import filteredCategoriesInjectable from "../../../common/catalog/filtered-categories.injectable";
-import { cssNames } from "../../utils";
+import { TreeGroup, TreeItem, TreeView } from "../tree-view/tree-view";
+import { browseCatalogTab } from "./catalog-browse-tab";
export interface CatalogMenuProps {
activeTab: string | undefined;
@@ -36,39 +34,6 @@ function getCategoryIcon(category: CatalogCategory) {
return null;
}
-interface TreeItemEntryProps {
- tabIndex?: number;
- onClick?: MouseEventHandler;
- icon?: React.ReactNode;
- label?: React.ReactNode;
- "data-testid"?: string;
-}
-
-const TreeItemEntry = (props: TreeItemEntryProps) => (
-
-
-
- {props.label}
-
-
-);
-
interface Dependencies {
filteredCategories: IComputedValue;
}
@@ -77,45 +42,41 @@ const NonInjectedCatalogMenu = observer(({
activeTab,
filteredCategories,
onItemClick,
-}: CatalogMenuProps & Dependencies) => (
- // Overwrite Material UI styles with injectFirst https://material-ui.com/guides/interoperability/#controlling-priority-4
-
+}: CatalogMenuProps & Dependencies) => {
+ console.log(treeStyles);
+
+ return (
Catalog
-
}
- defaultExpandIcon={
}
- selected={activeTab || "browse"}
- >
-
+ onItemClick("*")}
- />
-
+ Categories }
- className={cssNames(styles.bordered)}
>
- {
- filteredCategories.get()
- .map(category => (
- }
- data-testid={`${category.getId()}-tab`}
- onClick={() => onItemClick(category.getId())}
- />
- ))
- }
-
+ {filteredCategories.get()
+ .map(category => (
+
+ {getCategoryIcon(category)}
+
+ >
+ )}
+ selected={activeTab === category.getId()}
+ data-testid={`${category.getId()}-tab`}
+ onClick={() => onItemClick(category.getId())} />
+ ))}
+
-
-));
+ );
+});
export const CatalogMenu = withInjectables(NonInjectedCatalogMenu, {
getProps: (di, props) => ({
diff --git a/packages/core/src/renderer/components/tree-view/tree-view.tsx b/packages/core/src/renderer/components/tree-view/tree-view.tsx
new file mode 100644
index 0000000000..1063f50588
--- /dev/null
+++ b/packages/core/src/renderer/components/tree-view/tree-view.tsx
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) OpenLens Authors. All rights reserved.
+ * Licensed under MIT License. See LICENSE in root directory for more information.
+ */
+
+import type { MouseEventHandler } from "react";
+import React, { useState } from "react";
+import { cssNames } from "../../utils";
+import { Icon } from "../icon";
+
+export interface TreeViewClasses {
+ root?: string;
+}
+
+export interface TreeViewProps {
+ classes?: TreeViewClasses;
+ children: JSX.Element[] | JSX.Element;
+}
+
+export function TreeView(props: TreeViewProps) {
+ return (
+
+ );
+}
+
+export interface TreeItemClasses {
+ root?: string;
+ label?: string;
+}
+
+export interface TreeItemProps {
+ classes?: TreeItemClasses;
+ label: JSX.Element | string;
+ testId?: string;
+ selected?: boolean;
+ onClick?: MouseEventHandler;
+}
+
+export function TreeItem(props: TreeItemProps) {
+ return (
+
+
+ {props.label}
+
+
+ );
+}
+
+export interface TreeGroupClasses {
+ root?: string;
+ header?: string;
+ iconContainer?: string;
+ label?: string;
+ contents?: string;
+}
+
+export interface TreeGroupProps {
+ classes?: TreeGroupClasses;
+ children?: JSX.Element[] | JSX.Element;
+ defaultExpanded?: boolean;
+ label: JSX.Element | string;
+ testId?: string;
+ collapseIcon?: JSX.Element;
+ expandIcon?: JSX.Element;
+}
+
+export function TreeGroup(props: TreeGroupProps) {
+ const [expanded, setExpanded] = useState(props.defaultExpanded ?? true);
+
+ return (
+
+ setExpanded(!expanded)}>
+
+ {
+ expanded
+ ? props.collapseIcon ??
+ : props.expandIcon ??
+ }
+
+
+ {props.label}
+
+
+
+ {
+ expanded
+ ? props.children
+ : null
+ }
+
+
+ );
+}