123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import TreeView from '@material-ui/lab/TreeView';
- import TreeItem from '@material-ui/lab/TreeItem';
- import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
- import ChevronRightIcon from '@material-ui/icons/ChevronRight';
- export type TreeNodeType = 'db' | 'collection' | 'partition' | 'segment';
- export interface CustomTreeItem {
- children?: CustomTreeItem[];
- id: string;
- name: string;
- type: TreeNodeType;
- expanded?: boolean;
- }
- interface CustomToolProps {
- data: CustomTreeItem;
- onNodeToggle?: (event: React.ChangeEvent<{}>, nodeIds: string[]) => void;
- multiSelect?: true;
- disableSelection?: boolean;
- defaultSelected?: string[];
- onNodeClick?: (node: CustomTreeItem) => void;
- }
- // get expanded nodes from data
- const getExpanded = (nodes: CustomTreeItem[]) => {
- const expanded: string[] = [];
- nodes.forEach(node => {
- if (node.expanded) {
- expanded.push(node.id);
- }
- if (node.children && node.children.length > 0) {
- expanded.push(...getExpanded(node.children));
- }
- });
- return expanded;
- };
- const CustomTree: React.FC<CustomToolProps> = ({
- data,
- onNodeToggle,
- multiSelect,
- disableSelection,
- defaultSelected = [],
- onNodeClick,
- }) => {
- // UI data
- const expanded = getExpanded([data]);
- // render children
- const renderTree = (nodes: CustomTreeItem[]) => {
- return nodes.map(node => {
- if (node.children && node.children.length > 0) {
- return (
- <TreeItem
- key={node.id}
- nodeId={node.id}
- label={node.name}
- onClick={event => {
- event.stopPropagation();
- if (onNodeClick) {
- onNodeClick(node);
- }
- }}
- >
- {renderTree(node.children)}
- </TreeItem>
- );
- }
- return (
- <TreeItem
- key={node.id}
- nodeId={node.id}
- label={node.name}
- onClick={event => {
- event.stopPropagation();
- if (onNodeClick) {
- onNodeClick(node);
- }
- }}
- />
- );
- });
- };
- return (
- <TreeView
- defaultCollapseIcon={<ExpandMoreIcon />}
- defaultExpandIcon={<ChevronRightIcon />}
- expanded={expanded}
- onNodeToggle={onNodeToggle}
- selected={defaultSelected}
- multiSelect={multiSelect}
- disableSelection={disableSelection}
- >
- {data && (
- <TreeItem
- key={data.id}
- nodeId={data.id}
- label={data.name}
- onClick={event => {
- event.stopPropagation();
- if (onNodeClick) {
- onNodeClick(data);
- }
- }}
- >
- {data.children && data.children.length > 0
- ? renderTree(data.children)
- : [<div key="stub" />]}
- </TreeItem>
- )}
- </TreeView>
- );
- };
- export default CustomTree;
|