import * as React from "react"; import { Nullable, Observable, IExplorerExtensibilityGroup } from "babylonjs"; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faPlus, faMinus, faBan, faExpandArrowsAlt, faCompress } from '@fortawesome/free-solid-svg-icons'; import { TreeItemSelectableComponent } from "./treeItemSelectableComponent"; import { Tools } from "../../tools"; interface ITreeItemExpandableHeaderComponentProps { isExpanded: boolean, label: string, onClick: () => void, onExpandAll: (expand: boolean) => void } class TreeItemExpandableHeaderComponent extends React.Component { constructor(props: ITreeItemExpandableHeaderComponentProps) { super(props); } expandAll() { this.props.onExpandAll(!this.props.isExpanded); } render() { const chevron = this.props.isExpanded ? : const expandAll = this.props.isExpanded ? : return (
this.props.onClick()}> {chevron} {this.props.label}
this.expandAll()} title={this.props.isExpanded ? "Collapse all" : "Expand all"}> {expandAll}
) } } interface ITreeItemRootHeaderComponentProps { label: string } class TreeItemRootHeaderComponent extends React.Component { constructor(props: ITreeItemRootHeaderComponentProps) { super(props); } render() { return (
{this.props.label}
) } } export interface ITreeItemComponentProps { items?: Nullable, label: string, offset: number, filter: Nullable, onSelectionChangedObservable?: Observable, entity?: any, selectedEntity: any, extensibilityGroups?: IExplorerExtensibilityGroup[] } export class TreeItemComponent extends React.Component { constructor(props: ITreeItemComponentProps) { super(props); this.state = { isExpanded: false, mustExpand: false }; } switchExpandedState(): void { this.setState({ isExpanded: !this.state.isExpanded, mustExpand: false }); } shouldComponentUpdate(nextProps: ITreeItemComponentProps, nextState: { isExpanded: boolean }) { if (!nextState.isExpanded && this.state.isExpanded) { return true; } const items = nextProps.items; if (items && items.length) { if (nextProps.selectedEntity) { for (var item of items) { if (Tools.LookForItem(item, nextProps.selectedEntity)) { nextState.isExpanded = true; return true; } } } } return true; } expandAll(expand: boolean) { this.setState({isExpanded: expand, mustExpand: expand}); } render() { const items = this.props.items; const marginStyle = { paddingLeft: (10 * (this.props.offset + 0.5)) + "px" } if (!items) { return (
{this.props.label}
) } if (!items.length) { return (
) } if (!this.state.isExpanded) { return (
this.switchExpandedState()} onExpandAll={expand => this.expandAll(expand)} />
) } const sortedItems = Tools.SortAndFilter(null, items); return (
this.switchExpandedState()} onExpandAll={expand => this.expandAll(expand)} />
{ sortedItems.map(item => { return ( ); }) }
); } }