treeSelect.stories.js 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  1. import React, { useState } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import { Icon, Button, Form, Popover, Tag } from '../../index';
  4. import TreeSelect from '../index';
  5. import { flattenDeep } from 'lodash-es';
  6. import CustomTrigger from './CustomTrigger';
  7. import { IconCreditCard } from '@douyinfe/semi-icons';
  8. const TreeNode = TreeSelect.TreeNode;
  9. const stories = storiesOf('TreeSelect', module);
  10. const treeData1 = [
  11. {
  12. label: 'Node1',
  13. value: '0-0',
  14. key: '0-0',
  15. children: [
  16. {
  17. label: 'Child Node1',
  18. value: '0-0-1',
  19. key: '0-0-1',
  20. },
  21. {
  22. label: 'Child Node2',
  23. value: '0-0-2',
  24. key: '0-0-2',
  25. },
  26. ],
  27. },
  28. {
  29. label: 'Node2',
  30. value: '0-1',
  31. key: '0-1',
  32. },
  33. ];
  34. const treeData2 = [
  35. {
  36. label: '亚洲',
  37. value: 'yazhou',
  38. key: 'yazhou',
  39. children: [
  40. {
  41. label: '中国',
  42. value: 'zhongguo',
  43. key: 'zhongguo',
  44. children: [
  45. {
  46. label: '北京',
  47. value: 'beijing',
  48. key: 'beijing',
  49. },
  50. {
  51. label: '上海',
  52. value: 'shanghai',
  53. key: 'shanghai',
  54. },
  55. ],
  56. },
  57. // {
  58. // label: '日本',
  59. // value: 'riben',
  60. // key: 'riben',
  61. // children: [
  62. // {
  63. // label: '东京',
  64. // value: 'dongjing',
  65. // key: 'dongjing'
  66. // },
  67. // {
  68. // label: '大阪',
  69. // value: 'daban',
  70. // key: 'daban'
  71. // }
  72. // ]
  73. // },
  74. ],
  75. },
  76. {
  77. label: '北美洲',
  78. value: 'beimeizhou',
  79. key: 'beimeizhou',
  80. children: [
  81. {
  82. label: '美国',
  83. value: 'meiguo',
  84. key: 'meiguo',
  85. },
  86. {
  87. label: '加拿大',
  88. value: 'jianada',
  89. key: 'jianada',
  90. },
  91. ],
  92. },
  93. ];
  94. const treeDataWithoutValue = [
  95. {
  96. label: '亚洲',
  97. key: 'yazhou',
  98. children: [
  99. {
  100. label: '中国',
  101. key: 'zhongguo',
  102. disabled: true,
  103. children: [{
  104. label: '北京',
  105. key: 'beijing',
  106. },
  107. {
  108. label: '上海',
  109. key: 'shanghai',
  110. }]
  111. },
  112. {
  113. label: '日本',
  114. key: 'riben',
  115. children: [
  116. {
  117. label: '东京',
  118. key: 'dongjing',
  119. },
  120. {
  121. label: '大阪',
  122. key: 'daban',
  123. },
  124. ],
  125. },
  126. ],
  127. },
  128. {
  129. label: '北美洲',
  130. key: 'beimeizhou',
  131. children: [
  132. {
  133. label: '美国',
  134. key: 'meiguo',
  135. },
  136. {
  137. label: '加拿大',
  138. key: 'jianada',
  139. },
  140. ],
  141. },
  142. ];
  143. // stories.addDecorator(withKnobs);;
  144. class SimpleTree extends React.Component {
  145. render() {
  146. return (
  147. <div>
  148. <TreeSelect
  149. style={{ width: 300 }}
  150. // value={this.state.value}
  151. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  152. treeData={treeData1}
  153. placeholder="Please select"
  154. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  155. onSelect={(e, bool) => console.log('select', e, bool)}
  156. onChange={(e, node) => console.log('change', e, node)}
  157. />
  158. <br />
  159. <br />
  160. <TreeSelect
  161. style={{ width: 300 }}
  162. // value={this.state.value}
  163. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  164. treeData={treeData2}
  165. placeholder="Please select"
  166. />
  167. </div>
  168. );
  169. }
  170. }
  171. // stories.add('tree select', () => <SimpleTree />);
  172. stories.add('tree select', () => {
  173. const treeData = [
  174. {
  175. label: '亚洲',
  176. value: 'Asia',
  177. key: '0',
  178. children: [
  179. {
  180. label: '中国',
  181. value: 'China',
  182. key: '0-0',
  183. children: [
  184. {
  185. label: '北京',
  186. value: 'Beijing',
  187. key: '0-0-0',
  188. },
  189. {
  190. label: '上海',
  191. value: 'Shanghai',
  192. key: '0-0-1',
  193. },
  194. ],
  195. },
  196. ],
  197. },
  198. {
  199. label: '北美洲',
  200. value: 'North America',
  201. key: '1',
  202. },
  203. ];
  204. return (
  205. <TreeSelect
  206. style={{ width: 300 }}
  207. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  208. treeData={treeData2}
  209. placeholder="请选择"
  210. />
  211. );
  212. });
  213. // stories.add('large tree', () => (
  214. // <div>
  215. // <TreeSelect
  216. // dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  217. // treeData={treeData}
  218. // multiple
  219. // // motion={false}
  220. // treeNodeFilterProp='value'
  221. // placeholder="Please select"
  222. // />
  223. // </div>
  224. // ));
  225. stories.add('searchable', () => (
  226. <div>
  227. <TreeSelect
  228. style={{ width: 300 }}
  229. // value={this.state.value}
  230. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  231. treeData={treeData2}
  232. filterTreeNode
  233. treeNodeFilterProp="value"
  234. placeholder="Please select"
  235. />
  236. <br />
  237. <br />
  238. <TreeSelect
  239. style={{ width: 300 }}
  240. // value={this.state.value}
  241. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  242. treeData={treeData2}
  243. filterTreeNode
  244. placeholder="Please select"
  245. />
  246. <br />
  247. <br />
  248. <TreeSelect
  249. style={{ width: 300 }}
  250. // value={this.state.value}
  251. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  252. treeData={treeData2}
  253. filterTreeNode
  254. searchAutoFocus
  255. placeholder="searchAutoFocus"
  256. />
  257. </div>
  258. ));
  259. stories.add('searchPosition', () => (
  260. <>
  261. <TreeSelect
  262. searchPosition="trigger"
  263. style={{ width: 300 }}
  264. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  265. treeData={treeData2}
  266. filterTreeNode
  267. placeholder="单选"
  268. />
  269. <br />
  270. <br />
  271. <TreeSelect
  272. searchPosition="trigger"
  273. style={{ width: 300 }}
  274. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  275. treeData={treeData2}
  276. multiple
  277. filterTreeNode
  278. maxTagCount={2}
  279. placeholder="多选"
  280. />
  281. <br />
  282. <br />
  283. <TreeSelect
  284. searchPosition="trigger"
  285. style={{ width: 300 }}
  286. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  287. treeData={treeData2}
  288. multiple
  289. filterTreeNode
  290. maxTagCount={2}
  291. placeholder="searchAutoFocus"
  292. searchAutoFocus
  293. />
  294. </>
  295. ));
  296. stories.add('prefix suffix insetLabel', () => (
  297. <div>
  298. <TreeSelect
  299. style={{ width: 300 }}
  300. // value={this.state.value}
  301. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  302. treeData={treeData2}
  303. filterTreeNode
  304. prefix={<IconCreditCard />}
  305. treeNodeFilterProp="value"
  306. placeholder="Please select"
  307. />
  308. <br />
  309. <br />
  310. <TreeSelect
  311. style={{ width: 300 }}
  312. // value={this.state.value}
  313. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  314. treeData={treeData2}
  315. filterTreeNode
  316. prefix={<span>1234</span>}
  317. treeNodeFilterProp="value"
  318. placeholder="Please select"
  319. />
  320. <br />
  321. <br />
  322. <TreeSelect
  323. style={{ width: 300 }}
  324. suffix="RMB"
  325. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  326. treeData={treeData2}
  327. placeholder="Please select"
  328. />
  329. <br />
  330. <br />
  331. <TreeSelect
  332. style={{ width: 300 }}
  333. insetLabel="blablabla"
  334. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  335. treeData={treeData2}
  336. placeholder="Please select"
  337. />
  338. <br />
  339. <br />
  340. <TreeSelect
  341. style={{ width: 300 }}
  342. insetLabel={<span>1234</span>}
  343. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  344. treeData={treeData2}
  345. placeholder="Please select"
  346. />
  347. </div>
  348. ));
  349. stories.add('validate status', () => (
  350. <div>
  351. <TreeSelect
  352. style={{ width: 300 }}
  353. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  354. treeData={treeData2}
  355. multiple
  356. validateStatus="warning"
  357. placeholder="Please select"
  358. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  359. onSelect={(e, bool) => console.log('select', e, bool)}
  360. onChange={e => console.log('change', e)}
  361. />
  362. <br />
  363. <br />
  364. <TreeSelect
  365. style={{ width: 300 }}
  366. validateStatus="error"
  367. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  368. treeData={treeData2}
  369. // multiple
  370. placeholder="Please select"
  371. />
  372. </div>
  373. ));
  374. stories.add('multiple', () => (
  375. <div>
  376. <TreeSelect
  377. style={{ width: 300 }}
  378. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  379. treeData={treeData2}
  380. multiple
  381. placeholder="Please select"
  382. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  383. onSelect={(e, bool) => console.log('select', e, bool)}
  384. onChange={e => console.log('change', e)}
  385. />
  386. <br />
  387. <br />
  388. <TreeSelect
  389. style={{ width: 300 }}
  390. // value={this.state.value}
  391. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  392. treeData={treeData2}
  393. multiple
  394. placeholder="Please select"
  395. />
  396. </div>
  397. ));
  398. stories.add('maxTagCount', () => (
  399. <div>
  400. <TreeSelect
  401. style={{ width: 300 }}
  402. // value={this.state.value}
  403. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  404. treeData={treeData2}
  405. multiple
  406. maxTagCount={2}
  407. placeholder="Please select"
  408. />
  409. {/* <br />
  410. <br />
  411. <TreeSelect
  412. style={{ width: 300 }}
  413. // value={this.state.value}
  414. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  415. treeData={treeData2}
  416. multiple
  417. placeholder="Please select"
  418. /> */}
  419. </div>
  420. ));
  421. stories.add('multiple searchable', () => (
  422. <div>
  423. <TreeSelect
  424. style={{ width: 300 }}
  425. // value={this.state.value}
  426. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  427. treeData={treeData2}
  428. multiple
  429. filterTreeNode
  430. treeNodeFilterProp="value"
  431. placeholder="Please select"
  432. />
  433. </div>
  434. ));
  435. stories.add('default values', () => (
  436. <div>
  437. <TreeSelect
  438. style={{ width: 300 }}
  439. defaultValue={'shanghai'}
  440. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  441. treeData={treeData2}
  442. // multiple
  443. filterTreeNode
  444. treeNodeFilterProp="value"
  445. />
  446. <br />
  447. <br />
  448. <TreeSelect
  449. style={{ width: 300 }}
  450. defaultValue={'shanghai'}
  451. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  452. treeData={treeData2}
  453. filterTreeNode
  454. multiple
  455. treeNodeFilterProp="value"
  456. />
  457. <br />
  458. <br />
  459. <TreeSelect
  460. style={{ width: 300 }}
  461. defaultValue={['shanghai', 'daban', 'dongjing']}
  462. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  463. treeData={treeData2}
  464. filterTreeNode
  465. multiple
  466. treeNodeFilterProp="value"
  467. />
  468. <br />
  469. <br />
  470. <TreeSelect
  471. style={{ width: 300 }}
  472. defaultValue={['meiguo', 'dongjing']}
  473. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  474. treeData={treeData2}
  475. filterTreeNode
  476. multiple
  477. treeNodeFilterProp="value"
  478. />
  479. </div>
  480. ));
  481. stories.add('disabled', () => (
  482. <div>
  483. <TreeSelect
  484. style={{ width: 300 }}
  485. defaultValue={'shanghai'}
  486. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  487. treeData={treeData2}
  488. multiple
  489. filterTreeNode
  490. disabled
  491. treeNodeFilterProp="value"
  492. placeholder="Please select"
  493. />
  494. <br />
  495. <br />
  496. <TreeSelect
  497. style={{ width: 300 }}
  498. defaultValue={'shanghai'}
  499. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  500. treeData={treeData2}
  501. filterTreeNode
  502. disabled
  503. treeNodeFilterProp="value"
  504. placeholder="Please select"
  505. />
  506. <br />
  507. <br />
  508. <TreeSelect
  509. style={{ width: 300 }}
  510. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  511. treeData={treeData2}
  512. multiple
  513. filterTreeNode
  514. disabled
  515. treeNodeFilterProp="value"
  516. placeholder="Please select"
  517. />
  518. </div>
  519. ));
  520. stories.add('optionLabelProp', () => (
  521. <>
  522. <TreeSelect
  523. style={{ width: 300 }}
  524. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  525. treeData={treeData2}
  526. multiple
  527. filterTreeNode
  528. treeNodeFilterProp="value"
  529. treeNodeLabelProp="value"
  530. placeholder="Please select"
  531. />
  532. </>
  533. ));
  534. stories.add('valueInArray', () => (
  535. <>
  536. <TreeSelect
  537. style={{ width: 300 }}
  538. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  539. treeData={treeData2}
  540. multiple
  541. filterTreeNode
  542. valueInArray
  543. onChange={(...args) => console.log(args)}
  544. treeNodeFilterProp="value"
  545. treeNodeLabelProp="value"
  546. placeholder="Please select"
  547. />
  548. </>
  549. ));
  550. stories.add('onBlur/onFocus', () => (
  551. <>
  552. <div>single</div>
  553. <TreeSelect
  554. style={{ width: 300 }}
  555. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  556. treeData={treeData2}
  557. onBlur={(...args) => console.log('blur', args)}
  558. onFocus={(...args) => console.log('focus', args)}
  559. placeholder="Please select"
  560. />
  561. <div>multiple</div>
  562. <TreeSelect
  563. style={{ width: 300 }}
  564. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  565. treeData={treeData2}
  566. multiple
  567. onBlur={(...args) => console.log('blur', args)}
  568. onFocus={(...args) => console.log('focus', args)}
  569. placeholder="Please select"
  570. />
  571. </>
  572. ));
  573. stories.add('leafOnly', () => (
  574. <div>
  575. <TreeSelect
  576. style={{ width: 300 }}
  577. // value={this.state.value}
  578. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  579. treeData={treeData2}
  580. multiple
  581. leafOnly
  582. placeholder="Please select"
  583. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  584. onSelect={(e, bool) => console.log('select', e, bool)}
  585. onChange={e => console.log('change', e)}
  586. />
  587. </div>
  588. ));
  589. class Demo extends React.Component {
  590. constructor() {
  591. super();
  592. this.state = {
  593. value: 'shanghai',
  594. };
  595. }
  596. onChange(value) {
  597. this.setState({ value });
  598. }
  599. render() {
  600. return (
  601. <TreeSelect
  602. style={{ width: 300 }}
  603. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  604. treeData={treeData2}
  605. value={this.state.value}
  606. placeholder="Please select"
  607. onChange={e => this.onChange(e)}
  608. />
  609. );
  610. }
  611. }
  612. stories.add('controlled Component single', () => <Demo />);
  613. class Demo2 extends React.Component {
  614. constructor() {
  615. super();
  616. this.state = {
  617. value: ['Shanghai'],
  618. };
  619. }
  620. onChange(value) {
  621. this.setState({ value });
  622. }
  623. render() {
  624. console.log(this.state.value);
  625. const treeData = [
  626. {
  627. label: '亚洲',
  628. value: 'Asia',
  629. key: '0',
  630. children: [
  631. {
  632. label: '中国',
  633. value: 'China',
  634. key: '0-0',
  635. children: [
  636. {
  637. label: '北京',
  638. value: 'Beijing',
  639. key: '0-0-0',
  640. },
  641. {
  642. label: '上海',
  643. value: 'Shanghai',
  644. key: '0-0-1',
  645. },
  646. ],
  647. },
  648. ],
  649. },
  650. {
  651. label: '北美洲',
  652. value: 'North America',
  653. key: '1',
  654. },
  655. ];
  656. return (
  657. <TreeSelect
  658. style={{ width: 300 }}
  659. multiple
  660. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  661. treeData={treeData}
  662. value={this.state.value}
  663. placeholder="Please select"
  664. onChange={e => this.onChange(e)}
  665. />
  666. );
  667. }
  668. }
  669. stories.add('controlled Component multiple', () => <Demo2 />);
  670. class Demo3 extends React.Component {
  671. constructor() {
  672. super();
  673. this.state = {
  674. value: ['Shanghai'],
  675. };
  676. }
  677. // 获取最底层值
  678. getDeepChildrensByNode = node => {
  679. return flattenDeep(
  680. node.map(item => {
  681. if (item.children) {
  682. return this.getDeepChildrensByNode(item.children);
  683. }
  684. return item.value;
  685. })
  686. );
  687. };
  688. onChange(value, node) {
  689. console.log('onchange', value);
  690. value = this.getDeepChildrensByNode(node);
  691. console.log('modifiled', value);
  692. this.setState({ value });
  693. }
  694. render() {
  695. const treeData = [
  696. {
  697. label: '亚洲',
  698. value: 'Asia',
  699. key: '0',
  700. children: [
  701. {
  702. label: '中国',
  703. value: 'China',
  704. key: '0-0',
  705. children: [
  706. {
  707. label: '北京',
  708. value: 'Beijing',
  709. key: '0-0-0',
  710. },
  711. {
  712. label: '上海',
  713. value: 'Shanghai',
  714. key: '0-0-1',
  715. },
  716. ],
  717. },
  718. ],
  719. },
  720. {
  721. label: '北美洲',
  722. value: 'North America',
  723. key: '1',
  724. },
  725. ];
  726. return (
  727. <TreeSelect
  728. style={{ width: 300 }}
  729. multiple
  730. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  731. treeData={treeData}
  732. value={this.state.value}
  733. placeholder="Please select"
  734. onChange={(e, node) => this.onChange(e, node)}
  735. />
  736. );
  737. }
  738. }
  739. stories.add('controlled Component multiple value modified', () => <Demo3 />);
  740. class ConvertDemo extends React.Component {
  741. constructor(props) {
  742. super(props);
  743. this.formApi = null;
  744. }
  745. handleChange = val => {
  746. let finalVal = val;
  747. let firstClassOption = ['Asia', 'North America'];
  748. // 在这里去做你的value替换逻辑
  749. console.log('originVal:' + val);
  750. if (val.length === 1) {
  751. // do nothing
  752. } else {
  753. if (val.every(item => firstClassOption.includes(item))) {
  754. finalVal = val[val.length - 1];
  755. }
  756. }
  757. console.log('finalVal:' + finalVal);
  758. return finalVal;
  759. };
  760. render() {
  761. const treeData = [
  762. {
  763. label: '亚洲',
  764. value: 'Asia',
  765. key: '0',
  766. children: [
  767. {
  768. label: '中国',
  769. value: 'China',
  770. key: '0-0',
  771. children: [
  772. {
  773. label: '北京',
  774. value: 'Beijing',
  775. key: '0-0-0',
  776. },
  777. {
  778. label: '上海',
  779. value: 'Shanghai',
  780. key: '0-0-1',
  781. },
  782. ],
  783. },
  784. ],
  785. },
  786. {
  787. label: '北美洲',
  788. value: 'North America',
  789. key: '1',
  790. },
  791. ];
  792. return (
  793. <Form getFormApi={this.getFormApi}>
  794. <Form.TreeSelect
  795. field="tree"
  796. label="节点(TreeSelect)"
  797. placeholder="请选择服务节点"
  798. treeData={treeData}
  799. convert={this.handleChange}
  800. filterTreeNode
  801. multiple
  802. ></Form.TreeSelect>
  803. </Form>
  804. );
  805. }
  806. }
  807. stories.add('convert demo', () => <ConvertDemo />);
  808. stories.add('treeselect defaultOpen in popover', () => (
  809. <Popover
  810. content={
  811. <TreeSelect
  812. style={{ width: 200 }}
  813. dropdownStyle={{ width: 200 }}
  814. treeData={treeData1}
  815. defaultOpen
  816. // value={this.state.value}
  817. // placeholder="Please select"
  818. // onChange={(e, node) => this.onChange(e, node)}
  819. />
  820. }
  821. >
  822. <Button style={{ marginLeft: 150 }}>悬停此处</Button>
  823. </Popover>
  824. ));
  825. stories.add(`custom trigger`, () => <CustomTrigger />);
  826. const AutoParentDemo = () => {
  827. const [expandedKeys, setExpandedKeys] = useState(['beimeizhou']);
  828. const [selectedKeys, setSelectedKeys] = useState(['beimeizhou']);
  829. const [autoExpandParent, setAutoExpandParent] = useState(true);
  830. const onExpand = expandedKeys => {
  831. console.log('onExpand', expandedKeys);
  832. // if not set autoExpandParent to false, if children expanded, parent can not collapse.
  833. // or, you can remove all expanded children keys.
  834. setExpandedKeys(expandedKeys);
  835. setAutoExpandParent(false);
  836. };
  837. const onSelect = (selectedKeys, info) => {
  838. console.log('onSelect:', info);
  839. setSelectedKeys(selectedKeys);
  840. };
  841. return (
  842. <div>
  843. <Button onClick={() => {
  844. setSelectedKeys(['beijing']);
  845. setExpandedKeys(['beijing']);
  846. setAutoExpandParent(true);
  847. }}>Update</Button>
  848. <TreeSelect
  849. onExpand={onExpand}
  850. expandedKeys={expandedKeys}
  851. autoExpandParent={autoExpandParent}
  852. onChange={onSelect}
  853. value={selectedKeys}
  854. treeData={treeData2}
  855. // multiple
  856. />
  857. </div>
  858. );
  859. };
  860. stories.add('autoExpandParent', () => (
  861. <>
  862. <AutoParentDemo />
  863. </>
  864. ));
  865. stories.add('tree without value props', () => (
  866. <TreeSelect
  867. treeData={treeDataWithoutValue}
  868. value="beijing"
  869. defaultExpandAll
  870. onChange={(...args) => console.log(args)}
  871. />
  872. ));
  873. stories.add('treeSelect renderSelectedItem', () => {
  874. const treeData = [
  875. {
  876. label: '亚洲',
  877. value: 'Asia',
  878. key: '0',
  879. children: [
  880. {
  881. label: '中国',
  882. value: 'China',
  883. key: '0-0',
  884. children: [
  885. {
  886. label: '北京',
  887. value: 'Beijing',
  888. key: '0-0-0',
  889. },
  890. {
  891. label: '上海',
  892. value: 'Shanghai',
  893. key: '0-0-1',
  894. },
  895. ],
  896. },
  897. ],
  898. },
  899. {
  900. label: '北美洲',
  901. value: 'North America',
  902. key: '1',
  903. },
  904. {
  905. label: '南美洲',
  906. value: 'South America',
  907. key: '2',
  908. },
  909. {
  910. label: '南极洲',
  911. value: 'Antarctica',
  912. key: '3',
  913. },
  914. ];
  915. return (
  916. <>
  917. <h4>单选</h4>
  918. <TreeSelect
  919. style={{ width: 300 }}
  920. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  921. treeData={treeData}
  922. placeholder="请选择"
  923. renderSelectedItem={item => `${item.value}-${item.label}`}
  924. />
  925. <h4>多选</h4>
  926. <TreeSelect
  927. style={{ width: 300 }}
  928. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  929. treeData={treeData}
  930. multiple
  931. placeholder="请选择"
  932. renderSelectedItem={(item, { index, onClose }) => ({ content: `${item.value}-${item.label}`, isRenderInTag: true })}
  933. />
  934. <h4>多选 + isRenderInTag=false</h4>
  935. <TreeSelect
  936. style={{ width: 300 }}
  937. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  938. treeData={treeData}
  939. multiple
  940. maxTagCount={2}
  941. placeholder="请选择"
  942. renderSelectedItem={(item, { index, onClose }) => ({ content: <Tag key={index} color="white">{item.value}</Tag>, isRenderInTag: false })}
  943. />
  944. </>
  945. )
  946. }
  947. );
  948. const DisableStrictlyDemo = () => {
  949. const [value, setValue] = useState(['Shanghai'])
  950. const treeData = [
  951. {
  952. label: '亚洲',
  953. value: 'Asia',
  954. key: '0',
  955. children: [
  956. {
  957. label: '中国',
  958. value: 'China',
  959. key: '0-0',
  960. disabled: true,
  961. children: [
  962. {
  963. label: '北京',
  964. value: 'Beijing',
  965. key: '0-0-0',
  966. },
  967. {
  968. label: '上海',
  969. value: 'Shanghai',
  970. key: '0-0-1',
  971. },
  972. ],
  973. },
  974. {
  975. label: '日本',
  976. value: 'Japan',
  977. key: '0-1',
  978. },
  979. ],
  980. },
  981. {
  982. label: '北美洲',
  983. value: 'North America',
  984. key: '1',
  985. }
  986. ]
  987. return (
  988. <div>
  989. <TreeSelect
  990. style={{ width: 300 }}
  991. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  992. treeData={treeData}
  993. disableStrictly
  994. multiple
  995. searchPosition="trigger"
  996. filterTreeNode
  997. value={value}
  998. onChange={value=>setValue(value)}
  999. />
  1000. </div>
  1001. )
  1002. }
  1003. stories.add('disabledStrictly', () => (
  1004. <>
  1005. <DisableStrictlyDemo />
  1006. </>
  1007. ));