/* eslint react/no-multi-comp:0, no-console:0, no-alert: 0 */ import BaseMixin from '../../_util/BaseMixin' import '../assets/index.less' import '../../vc-dialog/assets/index.less' import Dialog from '../../vc-dialog' import TreeSelect, { TreeNode, SHOW_PARENT } from '../src/index' import { gData } from './util' import './demo.less' function isLeaf (value) { if (!value) { return false } let queues = [...gData] while (queues.length) { // BFS const item = queues.shift() if (item.value === value) { if (!item.children) { return true } return false } if (item.children) { queues = queues.concat(item.children) } } return false } function findPath (value, data) { const sel = [] function loop (selected, children) { for (let i = 0; i < children.length; i++) { const item = children[i] if (selected === item.value) { sel.push(item) return } if (item.children) { loop(selected, item.children, item) if (sel.length) { sel.push(item) return } } } } loop(value, data) return sel } export default { mixins: [BaseMixin], data: () => ({ tsOpen: false, visible: false, searchValue: '0-0-0-label', value: '0-0-0-value1', // value: ['0-0-0-0-value', '0-0-0-1-value', '0-0-0-2-value'], lv: { value: '0-0-0-value', label: 'spe label' }, multipleValue: [], simpleSearchValue: 'test111', simpleTreeData: [ { key: 1, pId: 0, label: 'test1', value: 'test1' }, { key: 121, pId: 0, label: 'test2', value: 'test2' }, { key: 11, pId: 1, label: 'test11', value: 'test11' }, { key: 12, pId: 1, label: 'test12', value: 'test12' }, { key: 111, pId: 11, label: 'test111', value: 'test111' }, ], treeDataSimpleMode: { id: 'key', rootPId: 0, }, }), methods: { onClick () { this.setState({ visible: true, }) }, onClose () { this.setState({ visible: false, }) }, onSearch (value) { console.log('Do Search:', value, arguments) this.setState({ searchValue: value }) }, onChange (value, ...rest) { console.log('onChange', value, ...rest) this.setState({ value }) }, onChangeChildren (...args) { console.log('onChangeChildren', ...args) const value = args[0] const pre = value ? this.value : undefined this.setState({ value: isLeaf(value) ? value : pre }) }, onChangeLV (value) { console.log('labelInValue', arguments) if (!value) { this.setState({ lv: undefined }) return } const path = findPath(value.value, gData).map(i => i.label).reverse().join(' > ') this.setState({ lv: { value: value.value, label: path }}) }, onMultipleChange (value) { console.log('onMultipleChange', arguments) this.setState({ multipleValue: value }) }, onSelect () { // use onChange instead console.log(arguments) }, onDropdownVisibleChange (visible, info) { console.log(visible, this.value, info) if (Array.isArray(this.value) && this.value.length > 1 && this.value.length < 3) { window.alert('please select more than two item or less than one item.') return false } return true }, filterTreeNode (input, child) { return String(child.data.props.title).indexOf(input) === 0 }, }, render () { return (

tree-select in dialog

{this.visible ?
triggerNode.parentNode} style={{ width: '300px' }} transitionName='rc-tree-select-dropdown-slide-up' choiceTransitionName='rc-tree-select-selection__choice-zoom' dropdownStyle={{ maxHeight: '200px', overflow: 'auto', zIndex: 1500 }} placeholder={请下拉选择} searchPlaceholder='please search' showSearch allowClear treeLine value={this.value} treeData={gData} treeNodeFilterProp='label' filterTreeNode={false} onSearch={this.onSearch} onChange={this.onChange} onSelect={this.onSelect} __propsSymbol__={Symbol()} />
: null}

single select

请下拉选择} searchPlaceholder='please search' showSearch allowClear treeLine searchValue={this.searchValue} value={this.value} treeData={gData} treeNodeFilterProp='label' filterTreeNode={false} onSearch={this.onSearch} open={this.tsOpen} onChange={(value, ...args) => { console.log('onChange', value, ...args) if (value === '0-0-0-0-value') { this.setState({ tsOpen: true }) } else { this.setState({ tsOpen: false }) } this.setState({ value }) } } dropdownVisibleChange={(v, info) => { console.log('single onDropdownVisibleChange', v, info) // document clicked if (info.documentClickClose && this.value === '0-0-0-0-value') { return false } this.setState({ tsOpen: v, }) return true } } onSelect={this.onSelect} __propsSymbol__={Symbol()} />

single select (just select children)

请下拉选择} searchPlaceholder='please search' showSearch allowClear treeLine value={this.value} treeData={gData} treeNodeFilterProp='label' filterTreeNode={false} onChange={this.onChangeChildren} __propsSymbol__={Symbol()} />

multiple select

请下拉选择} searchPlaceholder='please search' multiple value={this.multipleValue} treeData={gData} treeNodeFilterProp='title' onChange={this.onMultipleChange} onSelect={this.onSelect} allowClear __propsSymbol__={Symbol()} />

check select

请下拉选择} searchPlaceholder='please search' treeLine maxTagTextLength={10} value={this.value} autoClearSearchValue treeData={gData} treeNodeFilterProp='title' treeCheckable showCheckedStrategy={SHOW_PARENT} onChange={this.onChange} onSelect={this.onSelect} maxTagCount={2} maxTagPlaceholder={(valueList) => { console.log('Max Tag Rest Value:', valueList) return `${valueList.length} rest...` }} __propsSymbol__={Symbol()} />

labelInValue & show path

请下拉选择} searchPlaceholder='please search' showSearch allowClear treeLine value={this.lv} labelInValue treeData={gData} treeNodeFilterProp='label' filterTreeNode={false} onChange={this.onChangeLV} __propsSymbol__={Symbol()} />

use treeDataSimpleMode

请下拉选择} searchPlaceholder='please search' treeLine maxTagTextLength={10} searchValue={this.simpleSearchValue} onSearch={(simpleSearchValue) => { this.setState({ simpleSearchValue }) }} value={this.value} treeData={this.simpleTreeData} treeNodeFilterProp='title' treeDataSimpleMode={this.treeDataSimpleMode} treeCheckable showCheckedStrategy={SHOW_PARENT} onChange={this.onChange} onSelect={this.onSelect} __propsSymbol__={Symbol()} />

Testing in extreme conditions (Boundary conditions test)

console.log(val, ...args)} __propsSymbol__={Symbol()} />

use TreeNode Component (not recommend)

console.log(val, ...args)} __propsSymbol__={Symbol()} > sss} key='random3' />
) }, }