import React, { useState } from 'react';
import { Icon, Button, Form, Popover, Tag, Typography, CheckboxGroup } from '../../index';
import TreeSelect from '../index';
import { flattenDeep } from 'lodash';
import CustomTrigger from './CustomTrigger';
import { IconCreditCard } from '@douyinfe/semi-icons';
const TreeNode = TreeSelect.TreeNode;
const { Title } = Typography;
export default {
title: 'TreeSelect',
parameters: {
chromatic: { disableSnapshot: true },
},
}
const treeData1 = [
{
label: 'Node1',
value: '0-0',
key: '0-0',
children: [
{
label: 'Child Node1',
value: '0-0-1',
key: '0-0-1',
},
{
label: 'Child Node2',
value: '0-0-2',
key: '0-0-2',
},
],
},
{
label: 'Node2',
value: '0-1',
key: '0-1',
},
];
const treeData2 = [
{
label: '亚洲',
value: 'yazhou',
key: 'yazhou',
children: [
{
label: '中国',
value: 'zhongguo',
key: 'zhongguo',
children: [
{
label: '北京',
value: 'beijing',
key: 'beijing',
},
{
label: '上海',
value: 'shanghai',
key: 'shanghai',
},
],
},
// {
// label: '日本',
// value: 'riben',
// key: 'riben',
// children: [
// {
// label: '东京',
// value: 'dongjing',
// key: 'dongjing'
// },
// {
// label: '大阪',
// value: 'daban',
// key: 'daban'
// }
// ]
// },
],
},
{
label: '北美洲',
value: 'beimeizhou',
key: 'beimeizhou',
children: [
{
label: '美国',
value: 'meiguo',
key: 'meiguo',
},
{
label: '加拿大',
value: 'jianada',
key: 'jianada',
},
],
},
];
const treeDataWithoutValue = [
{
label: '亚洲',
key: 'yazhou',
children: [
{
label: '中国',
key: 'zhongguo',
disabled: true,
children: [
{
label: '北京',
key: 'beijing',
},
{
label: '上海',
key: 'shanghai',
},
],
},
{
label: '日本',
key: 'riben',
children: [
{
label: '东京',
key: 'dongjing',
},
{
label: '大阪',
key: 'daban',
},
],
},
],
},
{
label: '北美洲',
key: 'beimeizhou',
children: [
{
label: '美国',
key: 'meiguo',
},
{
label: '加拿大',
key: 'jianada',
},
],
},
];
export const TreeSelectWrapper = () => (
);
TreeSelectWrapper.story = {
name: 'treeSelect wrapper',
};
class SimpleTree extends React.Component {
render() {
return (
console.log('expand', e, expanded, node)}
onSelect={(e, bool) => console.log('select', e, bool)}
onChange={(e, node) => console.log('change', e, node)}
/>
);
}
}
export const _TreeSelect = () => {
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
];
return (
);
};
_TreeSelect.story = {
name: 'tree select',
};
export const Searchable = () => (
);
Searchable.story = {
name: 'searchable',
};
export const SearchPosition = () => (
<>
>
);
SearchPosition.story = {
name: 'searchPosition',
};
export const PrefixSuffixInsetLabel = () => (
}
treeNodeFilterProp="value"
placeholder="Please select"
/>
1234}
treeNodeFilterProp="value"
placeholder="Please select"
/>
1234}
dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
treeData={treeData2}
placeholder="Please select"
/>
);
PrefixSuffixInsetLabel.story = {
name: 'prefix suffix insetLabel',
};
PrefixSuffixInsetLabel.parameters = {
chromatic: { disableSnapshot: false },
}
export const ValidateStatus = () => (
console.log('expand', e, expanded, node)}
onSelect={(e, bool) => console.log('select', e, bool)}
onChange={e => console.log('change', e)}
/>
);
ValidateStatus.story = {
name: 'validate status',
};
ValidateStatus.parameters = {
chromatic: { disableSnapshot: false },
}
export const Multiple = () => (
console.log('expand', e, expanded, node)}
onSelect={(e, bool) => console.log('select', e, bool)}
onChange={e => console.log('change', e)}
/>
);
Multiple.story = {
name: 'multiple',
};
export const MaxTagCount = () => (
{/*
*/}
);
MaxTagCount.story = {
name: 'maxTagCount',
};
export const MultipleSearchable = () => (
);
MultipleSearchable.story = {
name: 'multiple searchable',
};
export const DefaultValues = () => (
);
DefaultValues.story = {
name: 'default values',
};
export const Disabled = () => (
);
Disabled.story = {
name: 'disabled',
};
Disabled.parameters = {
chromatic: { disableSnapshot: false },
}
export const OptionLabelProp = () => (
<>
>
);
OptionLabelProp.story = {
name: 'optionLabelProp',
};
export const ValueInArray = () => (
<>
console.log(args)}
treeNodeFilterProp="value"
treeNodeLabelProp="value"
placeholder="Please select"
/>
>
);
ValueInArray.story = {
name: 'valueInArray',
};
export const OnBlurOnFocus = () => (
<>
single
console.log('blur', args)}
onFocus={(...args) => console.log('focus', args)}
placeholder="Please select"
/>
multiple
console.log('blur', args)}
onFocus={(...args) => console.log('focus', args)}
placeholder="Please select"
/>
>
);
OnBlurOnFocus.story = {
name: 'onBlur/onFocus',
};
export const LeafOnly = () => (
console.log('expand', e, expanded, node)}
onSelect={(e, bool) => console.log('select', e, bool)}
onChange={e => console.log('change', e)}
/>
);
LeafOnly.story = {
name: 'leafOnly',
};
class Demo extends React.Component {
constructor() {
super();
this.state = {
value: 'shanghai',
};
}
onChange(value) {
this.setState({ value });
}
render() {
return (
this.onChange(e)}
/>
);
}
}
export const ControlledComponentSingle = () => ;
ControlledComponentSingle.story = {
name: 'controlled Component single',
};
class Demo2 extends React.Component {
constructor() {
super();
this.state = {
value: ['Shanghai'],
};
}
onChange(value) {
this.setState({ value });
}
render() {
console.log(this.state.value);
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
];
return (
this.onChange(e)}
/>
);
}
}
export const ControlledComponentMultiple = () => ;
ControlledComponentMultiple.story = {
name: 'controlled Component multiple',
};
class Demo3 extends React.Component {
constructor() {
super();
this.state = {
value: ['Shanghai'],
};
}
// 获取最底层值
getDeepChildrensByNode = node => {
return flattenDeep(
node.map(item => {
if (item.children) {
return this.getDeepChildrensByNode(item.children);
}
return item.value;
})
);
};
onChange(value, node) {
console.log('onchange', value);
value = this.getDeepChildrensByNode(node);
console.log('modifiled', value);
this.setState({ value });
}
render() {
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
];
return (
this.onChange(e, node)}
/>
);
}
}
export const ControlledComponentMultipleValueModified = () => ;
ControlledComponentMultipleValueModified.story = {
name: 'controlled Component multiple value modified',
};
class ConvertDemo extends React.Component {
constructor(props) {
super(props);
this.formApi = null;
}
handleChange = val => {
let finalVal = val;
let firstClassOption = ['Asia', 'North America'];
// 在这里去做你的value替换逻辑
console.log('originVal:' + val);
if (val.length === 1) {
// do nothing
} else {
if (val.every(item => firstClassOption.includes(item))) {
finalVal = val[val.length - 1];
}
}
console.log('finalVal:' + finalVal);
return finalVal;
};
render() {
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
];
return (
);
}
}
export const _ConvertDemo = () => ;
_ConvertDemo.story = {
name: 'convert demo',
};
export const TreeselectDefaultOpenInPopover = () => (
this.onChange(e, node)}
/>
}
>
);
TreeselectDefaultOpenInPopover.story = {
name: 'treeselect defaultOpen in popover',
};
export const CustomTriggerDemo = () => ;
CustomTriggerDemo.story = { name: 'custom trigger' };
const AutoParentDemo = () => {
const [expandedKeys, setExpandedKeys] = useState(['beimeizhou']);
const [selectedKeys, setSelectedKeys] = useState(['beimeizhou']);
const [autoExpandParent, setAutoExpandParent] = useState(true);
const onExpand = expandedKeys => {
console.log('onExpand', expandedKeys);
// if not set autoExpandParent to false, if children expanded, parent can not collapse.
// or, you can remove all expanded children keys.
setExpandedKeys(expandedKeys);
setAutoExpandParent(false);
};
const onSelect = (selectedKeys, info) => {
console.log('onSelect:', info);
setSelectedKeys(selectedKeys);
};
return (
);
};
export const AutoExpandParent = () => (
<>
>
);
AutoExpandParent.story = {
name: 'autoExpandParent',
};
export const TreeWithoutValueProps = () => (
console.log(args)}
/>
);
TreeWithoutValueProps.story = {
name: 'tree without value props',
};
export const TreeSelectRenderSelectedItem = () => {
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
{
label: '南美洲',
value: 'South America',
key: '2',
},
{
label: '南极洲',
value: 'Antarctica',
key: '3',
},
];
return (
<>
单选
`${item.value}-${item.label}`}
/>
多选
({
content: `${item.value}-${item.label}`,
isRenderInTag: true,
})}
/>
多选 + isRenderInTag=false
({
content: (
{item.value}
),
isRenderInTag: false,
})}
/>
>
);
};
TreeSelectRenderSelectedItem.story = {
name: 'treeSelect renderSelectedItem',
};
const DisableStrictlyDemo = () => {
const [value, setValue] = useState(['Shanghai']);
const treeData = [
{
label: '亚洲',
value: 'Asia',
key: '0',
children: [
{
label: '中国',
value: 'China',
key: '0-0',
disabled: true,
children: [
{
label: '北京',
value: 'Beijing',
key: '0-0-0',
},
{
label: '上海',
value: 'Shanghai',
key: '0-0-1',
},
],
},
{
label: '日本',
value: 'Japan',
key: '0-1',
},
],
},
{
label: '北美洲',
value: 'North America',
key: '1',
},
];
return (
setValue(value)}
/>
);
};
export const DisabledStrictly = () => (
<>
>
);
DisabledStrictly.story = {
name: 'disabledStrictly',
};
export const CheckRelationDemo = () => {
const treeData = [
{
label: 'Asia',
value: 'Asia',
key: '0',
children: [
{
label: 'China',
value: 'China',
key: '0-0',
children: [
{
label: 'Beijing',
value: 'Beijing',
key: '0-0-0',
},
{
label: 'Shanghai',
value: 'Shanghai',
key: '0-0-1',
},
{
label: 'Chengdu',
value: 'Chengdu',
key: '0-0-2',
},
],
},
{
label: 'Japan',
value: 'Japan',
key: '0-1',
children: [
{
label: 'Osaka',
value: 'Osaka',
key: '0-1-0'
}
]
},
],
},
{
label: 'North America',
value: 'North America',
key: '1',
children: [
{
label: 'United States',
value: 'United States',
key: '1-0'
},
{
label: 'Canada',
value: 'Canada',
key: '1-1'
}
]
}
];
const [value, setValue] = useState('China');
const [value2, setValue2] = useState();
const [value3, setValue3] = useState();
const style = {
width: 300,
};
const dropdownStyle = {
maxHeight: 400,
overflow: 'auto'
};
const handleChange = value => {
console.log(value);
setValue(value);
};
const handleChange2 = value => {
console.log(value);
setValue2(value);
};
const handleChange3 = value => {
console.log(value);
setValue3(value);
};
return (
<>
checkRelation='unRelated'
checkRelation='unRelated' + maxTagCount=2
checkRelation='unRelated' + maxTagCount=2 + 开启搜索
checkRelation='unRelated' + maxTagCount=2 + 开启搜索 + searchBox in trigger
checkRelation='unRelated' + 中国节点为 disabled
checkRelation='unRelated' + 中国节点为 disabled + 严格禁用
checkRelation='unRelated' + defaultValue 为 China
checkRelation='unRelated' + defaultValue 为 China + 开启搜索
多选 + checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear
单选 + checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear
checkRelation='unRelated' + 受控 + value 初始为 China
checkRelation='unRelated' + 受控 + onChangeWithObject
checkRelation='unRelated' + 受控 + leafOnly,此时 leafOnly 失效
checkRelation='unRelated' + onSelect
console.log('select', value, status, node)}
/>
>
);
};
export const SearchableAndExpandedKeys = () => {
const [expandedKeys1, setExpandedKeys1] = useState([]);
const [expandedKeys2, setExpandedKeys2] = useState([]);
const [expandedKeys3, setExpandedKeys3] = useState([]);
return (
<>
expandedKeys 受控
{
console.log('onExpand value: ', v);
setExpandedKeys1(v);
}}
/>
expandedKeys 受控 + 开启搜索
{
console.log('onExpand value: ', v);
setExpandedKeys2(v);
}}
/>
expandedKeys 受控 + 开启搜索 + 搜索时更新 expandedKeys
{
console.log('onExpand value: ', v);
setExpandedKeys3(v)
}}
onSearch={(input, filterExpandedKeys) => {
console.log('onExpand filterExpandedKeys: ', filterExpandedKeys);
setExpandedKeys3(filterExpandedKeys);
}}
/>
>
)
}
export const loadData = () => {
const initialData = [
{
label: 'Expand to load',
value: '0',
key: '0',
},
{
label: 'Expand to load',
value: '1',
key: '1',
},
{
label: 'Leaf Node',
value: '2',
key: '2',
isLeaf: true,
},
];
const [treeData, setTreeData] = useState(initialData);
const [loadedKeys, setLoadedKeys] = useState(['2']);
function updateTreeData(list, key, children) {
return list.map(node => {
if (node.key === key) {
return { ...node, children };
}
if (node.children) {
return { ...node, children: updateTreeData(node.children, key, children) };
}
return node;
});
}
function onLoadData({ key, children }) {
return new Promise(resolve => {
if (children) {
resolve();
return;
}
setTimeout(() => {
setTreeData(origin =>
updateTreeData(origin, key, [
{
label: 'Child Node',
key: `${key}-0`,
},
{
label: 'Child Node',
key: `${key}-1`,
},
]),
);
resolve();
}, 1000);
});
}
return (
);
}
export const loadDataAndLoadedkeys = () => {
const initialData = [
{
label: 'Expand to load',
value: '0',
key: '0',
},
{
label: 'Expand to load',
value: '1',
key: '1',
},
{
label: 'Leaf Node',
value: '2',
key: '2',
isLeaf: true,
},
];
const [treeData, setTreeData] = useState(initialData);
const [loadedKeys, setLoadedKeys] = useState(['2']);
function updateTreeData(list, key, children) {
return list.map(node => {
if (node.key === key) {
return { ...node, children };
}
if (node.children) {
return { ...node, children: updateTreeData(node.children, key, children) };
}
return node;
});
}
function updateLoadedKeys(key) {
if(!loadedKeys.includes(key)){
setLoadedKeys([...loadedKeys, key]);
console.log('[...loadedKeys, key]', [...loadedKeys, key]);
}
}
function onLoadData({ key, children }) {
return new Promise(resolve => {
if (children) {
resolve();
return;
}
setTimeout(() => {
setTreeData(origin =>
updateTreeData(origin, key, [
{
label: 'Child Node',
key: `${key}-0`,
},
{
label: 'Child Node',
key: `${key}-1`,
},
]),
);
// updateLoadedKeys(key);
resolve();
}, 1000);
});
}
return (
);
}