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.icon} -
    -
    -
    - {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 + } +
    +
  • + ); +}