1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

More attempting fixes to remove material-ui

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2023-02-23 13:41:01 -05:00
parent e6ad46042b
commit 21e6dfd059
2 changed files with 136 additions and 66 deletions

View File

@ -6,18 +6,16 @@
import treeStyles from "./catalog-tree.module.scss"; import treeStyles from "./catalog-tree.module.scss";
import styles from "./catalog-menu.module.scss"; import styles from "./catalog-menu.module.scss";
import type { MouseEventHandler } from "react";
import React from "react"; import React from "react";
import { TreeItem, TreeView } from "@material-ui/lab";
import { Icon } from "../icon"; import { Icon } from "../icon";
import { StylesProvider } from "@material-ui/core";
import type { CatalogCategory } from "../../api/catalog-entity"; import type { CatalogCategory } from "../../api/catalog-entity";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { CatalogCategoryLabel } from "./catalog-category-label"; import { CatalogCategoryLabel } from "./catalog-category-label";
import type { IComputedValue } from "mobx"; import type { IComputedValue } from "mobx";
import { withInjectables } from "@ogre-tools/injectable-react"; import { withInjectables } from "@ogre-tools/injectable-react";
import filteredCategoriesInjectable from "../../../common/catalog/filtered-categories.injectable"; 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 { export interface CatalogMenuProps {
activeTab: string | undefined; activeTab: string | undefined;
@ -36,39 +34,6 @@ function getCategoryIcon(category: CatalogCategory) {
return null; return null;
} }
interface TreeItemEntryProps {
tabIndex?: number;
onClick?: MouseEventHandler;
icon?: React.ReactNode;
label?: React.ReactNode;
"data-testid"?: string;
}
const TreeItemEntry = (props: TreeItemEntryProps) => (
<li
className="MuiTreeItem-root"
role="treeitem"
tabIndex={props.tabIndex ?? -1}
data-testid={props["data-testid"]}
onClick={props.onClick}
>
<div
className="MuiTreeItem-content"
>
<div
className="MuiTreeItem-iconContainer"
>
{props.icon}
</div>
</div>
<div
className="MuiTypography-root MuiTreeItem-label MuiTypography-body1"
>
{props.label}
</div>
</li>
);
interface Dependencies { interface Dependencies {
filteredCategories: IComputedValue<CatalogCategory[]>; filteredCategories: IComputedValue<CatalogCategory[]>;
} }
@ -77,45 +42,41 @@ const NonInjectedCatalogMenu = observer(({
activeTab, activeTab,
filteredCategories, filteredCategories,
onItemClick, onItemClick,
}: CatalogMenuProps & Dependencies) => ( }: CatalogMenuProps & Dependencies) => {
// Overwrite Material UI styles with injectFirst https://material-ui.com/guides/interoperability/#controlling-priority-4 console.log(treeStyles);
<StylesProvider injectFirst>
return (
<div className="flex flex-col w-full"> <div className="flex flex-col w-full">
<div className={styles.catalog}>Catalog</div> <div className={styles.catalog}>Catalog</div>
<TreeView <TreeView>
defaultExpanded={["catalog"]} <TreeItem
defaultCollapseIcon={<Icon material="expand_more" />}
defaultExpandIcon={<Icon material="chevron_right" />}
selected={activeTab || "browse"}
>
<TreeItemEntry
label="Browse" label="Browse"
data-testid="*-tab" data-testid="*-tab"
onClick={() => onItemClick("*")} onClick={() => onItemClick("*")}
/> selected={activeTab === browseCatalogTab} />
<TreeItem <TreeGroup
classes={treeStyles} classes={treeStyles}
nodeId="catalog"
label={<div className={styles.parent}>Categories</div>} label={<div className={styles.parent}>Categories</div>}
className={cssNames(styles.bordered)}
> >
{ {filteredCategories.get()
filteredCategories.get() .map(category => (
.map(category => ( <TreeItem
<TreeItemEntry key={category.getId()}
key={category.getId()} label={(
icon={getCategoryIcon(category)} <>
label={<CatalogCategoryLabel category={category} />} {getCategoryIcon(category)}
data-testid={`${category.getId()}-tab`} <CatalogCategoryLabel category={category} />
onClick={() => onItemClick(category.getId())} </>
/> )}
)) selected={activeTab === category.getId()}
} data-testid={`${category.getId()}-tab`}
</TreeItem> onClick={() => onItemClick(category.getId())} />
))}
</TreeGroup>
</TreeView> </TreeView>
</div> </div>
</StylesProvider> );
)); });
export const CatalogMenu = withInjectables<Dependencies, CatalogMenuProps>(NonInjectedCatalogMenu, { export const CatalogMenu = withInjectables<Dependencies, CatalogMenuProps>(NonInjectedCatalogMenu, {
getProps: (di, props) => ({ getProps: (di, props) => ({

View File

@ -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 (
<ul
className={props.classes?.root}
role="tree"
>
{props.children}
</ul>
);
}
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 (
<li
className={cssNames(props.classes?.root, {
selected: props.selected ?? false,
})}
role="treeitem"
data-testid={props.testId}
onClick={props.onClick}
>
<div className={props.classes?.label}>
{props.label}
</div>
</li>
);
}
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 (
<li
className={props.classes?.root}
role="group"
data-testid={props.testId}
>
<div className={props.classes?.header} onClick={() => setExpanded(!expanded)}>
<div className={props.classes?.iconContainer}>
{
expanded
? props.collapseIcon ?? <Icon material="expand_more" />
: props.expandIcon ?? <Icon material="chevron_right" />
}
</div>
<div className={props.classes?.label}>
{props.label}
</div>
</div>
<div className={props.classes?.contents}>
{
expanded
? props.children
: null
}
</div>
</li>
);
}