import React, { Component } from 'react'; import InputRadio from './InputRadio'; import SelectTreeBreadcrumb from './SelectTreeBreadcrumb'; import cloneDeep from 'lodash.clonedeep'; import Icon from '../Icon'; import Button, { ButtonEnums } from '../Button'; import { LabelInfo } from '../Labelling/LabellingFlow'; interface PropType { autoFocus: boolean; searchEnabled: boolean; selectTreeFirstTitle: string; items: Array; onSelected: Function; exclusive: boolean; closePopup: Function; label: string; columns: number; } interface StateProps { searchTerm: string | null; currentNode: any; value: string | null; focusedIndex: number; } export class SelectTree extends Component { state: StateProps; static defaultProps = { searchEnabled: true, autoFocus: true, selectTreeFirstTitle: 'First Level itens', items: [], }; constructor(props) { super(props); this.state = { searchTerm: this.props.items.length > 0 ? null : this.props.label, currentNode: null, value: null, focuseIndex: 0, }; } render() { const treeItems = this.getTreeItems(); return (
{this.headerItem()} {this.props.items.length > 0 && (
{this.state.currentNode && ( )}
{treeItems}
)}
); } isLeafSelected = item => item && !Array.isArray(item.items); filterItems() { const filteredItems = []; const rawItems = cloneDeep(this.props.items); rawItems.forEach(item => { if (Array.isArray(item.items)) { item.items.forEach(item => { const label = item.label.toLowerCase(); const searchTerm = this.state.searchTerm.toLowerCase(); if (label.indexOf(searchTerm) !== -1) { filteredItems.push(item); } }); } else { const label = item.label.toLowerCase(); const searchTerm = this.state.searchTerm.toLowerCase(); if (label.indexOf(searchTerm) !== -1) { filteredItems.push(item); } } }); return filteredItems; } getTreeItems() { const storageKey = 'SelectTree'; let treeItems: Array; if (this.state.searchTerm) { const filterItems = this.filterItems(); if ( this.props.exclusive === false && filterItems.find(item => item.label === this.state.searchTerm) === undefined ) { treeItems = [ { label: this.state.searchTerm, value: this.state.searchTerm }, ...filterItems, ]; } else { treeItems = filterItems; } } else if (this.state.currentNode) { treeItems = cloneDeep(this.state.currentNode.items); } else { treeItems = cloneDeep(this.props.items); } return treeItems.map((item, index) => { const itemKey = index; return ( ); }); } handleKeyDown = event => { const { key } = event; const { focusedIndex } = this.state; const treeItems = this.getTreeItems(); if (key === 'ArrowUp') { this.setState(prevState => ({ focusedIndex: prevState.focusedIndex > 0 ? prevState.focusedIndex - 1 : treeItems.length - 1, })); } else if (key === 'ArrowDown') { this.setState(prevState => ({ focusedIndex: prevState.focusedIndex < treeItems.length - 1 ? prevState.focusedIndex + 1 : 0, })); } else if (key === 'Enter') { const selectedItem = this.state.searchTerm ? { label: this.state.searchTerm, value: this.state.searchTerm } : treeItems[focusedIndex].props.itemData; this.onSelected(event, selectedItem); } }; onSubmitHandler = evt => { this.props.onSelected(evt, { label: this.state.searchTerm, value: this.state.searchTerm, }); }; headerItem = () => { const inputLeftPadding = this.props.items.length > 0 ? 'pl-8' : 'pl-4'; const title = this.props.selectTreeFirstTitle; return (
{title}
this.props.closePopup()} fill="#a3a3a3" />
{this.props.searchEnabled && (
{this.props.items.length > 0 && (
)} 0 ? 'Search labels' : 'Enter label'} autoFocus={this.props.autoFocus} onChange={this.searchLocations} value={this.state.searchTerm ? this.state.searchTerm : ''} onKeyDown={this.handleKeyDown} />
)} {this.props.items.length === 0 && (
)}
); }; searchLocations = evt => { this.setState({ currentNode: null, searchTerm: evt.currentTarget.value, }); }; onSelected = (event, item) => { if (this.isLeafSelected(item)) { this.setState({ searchTerm: null, currentNode: null, value: null, }); } else { this.setState({ currentNode: item, }); } return this.props.onSelected(event, item); }; onBreadcrumbSelected = () => { this.setState({ currentNode: null, }); }; }