treeSelect.stories.js 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409
  1. import React, { useState } from 'react';
  2. import { Icon, Button, Form, Popover, Tag } from '../../index';
  3. import TreeSelect from '../index';
  4. import { flattenDeep } from 'lodash';
  5. import CustomTrigger from './CustomTrigger';
  6. import { IconCreditCard } from '@douyinfe/semi-icons';
  7. const TreeNode = TreeSelect.TreeNode;
  8. export default {
  9. title: 'TreeSelect',
  10. parameters: {
  11. chromatic: { disableSnapshot: true },
  12. },
  13. }
  14. const treeData1 = [
  15. {
  16. label: 'Node1',
  17. value: '0-0',
  18. key: '0-0',
  19. children: [
  20. {
  21. label: 'Child Node1',
  22. value: '0-0-1',
  23. key: '0-0-1',
  24. },
  25. {
  26. label: 'Child Node2',
  27. value: '0-0-2',
  28. key: '0-0-2',
  29. },
  30. ],
  31. },
  32. {
  33. label: 'Node2',
  34. value: '0-1',
  35. key: '0-1',
  36. },
  37. ];
  38. const treeData2 = [
  39. {
  40. label: '亚洲',
  41. value: 'yazhou',
  42. key: 'yazhou',
  43. children: [
  44. {
  45. label: '中国',
  46. value: 'zhongguo',
  47. key: 'zhongguo',
  48. children: [
  49. {
  50. label: '北京',
  51. value: 'beijing',
  52. key: 'beijing',
  53. },
  54. {
  55. label: '上海',
  56. value: 'shanghai',
  57. key: 'shanghai',
  58. },
  59. ],
  60. },
  61. // {
  62. // label: '日本',
  63. // value: 'riben',
  64. // key: 'riben',
  65. // children: [
  66. // {
  67. // label: '东京',
  68. // value: 'dongjing',
  69. // key: 'dongjing'
  70. // },
  71. // {
  72. // label: '大阪',
  73. // value: 'daban',
  74. // key: 'daban'
  75. // }
  76. // ]
  77. // },
  78. ],
  79. },
  80. {
  81. label: '北美洲',
  82. value: 'beimeizhou',
  83. key: 'beimeizhou',
  84. children: [
  85. {
  86. label: '美国',
  87. value: 'meiguo',
  88. key: 'meiguo',
  89. },
  90. {
  91. label: '加拿大',
  92. value: 'jianada',
  93. key: 'jianada',
  94. },
  95. ],
  96. },
  97. ];
  98. const treeDataWithoutValue = [
  99. {
  100. label: '亚洲',
  101. key: 'yazhou',
  102. children: [
  103. {
  104. label: '中国',
  105. key: 'zhongguo',
  106. disabled: true,
  107. children: [
  108. {
  109. label: '北京',
  110. key: 'beijing',
  111. },
  112. {
  113. label: '上海',
  114. key: 'shanghai',
  115. },
  116. ],
  117. },
  118. {
  119. label: '日本',
  120. key: 'riben',
  121. children: [
  122. {
  123. label: '东京',
  124. key: 'dongjing',
  125. },
  126. {
  127. label: '大阪',
  128. key: 'daban',
  129. },
  130. ],
  131. },
  132. ],
  133. },
  134. {
  135. label: '北美洲',
  136. key: 'beimeizhou',
  137. children: [
  138. {
  139. label: '美国',
  140. key: 'meiguo',
  141. },
  142. {
  143. label: '加拿大',
  144. key: 'jianada',
  145. },
  146. ],
  147. },
  148. ];
  149. class SimpleTree extends React.Component {
  150. render() {
  151. return (
  152. <div>
  153. <TreeSelect
  154. style={{ width: 300 }}
  155. // value={this.state.value}
  156. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  157. treeData={treeData1}
  158. placeholder="Please select"
  159. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  160. onSelect={(e, bool) => console.log('select', e, bool)}
  161. onChange={(e, node) => console.log('change', e, node)}
  162. />
  163. <br />
  164. <br />
  165. <TreeSelect
  166. style={{ width: 300 }}
  167. // value={this.state.value}
  168. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  169. treeData={treeData2}
  170. placeholder="Please select"
  171. />
  172. </div>
  173. );
  174. }
  175. }
  176. export const _TreeSelect = () => {
  177. const treeData = [
  178. {
  179. label: '亚洲',
  180. value: 'Asia',
  181. key: '0',
  182. children: [
  183. {
  184. label: '中国',
  185. value: 'China',
  186. key: '0-0',
  187. children: [
  188. {
  189. label: '北京',
  190. value: 'Beijing',
  191. key: '0-0-0',
  192. },
  193. {
  194. label: '上海',
  195. value: 'Shanghai',
  196. key: '0-0-1',
  197. },
  198. ],
  199. },
  200. ],
  201. },
  202. {
  203. label: '北美洲',
  204. value: 'North America',
  205. key: '1',
  206. },
  207. ];
  208. return (
  209. <TreeSelect
  210. style={{ width: 300 }}
  211. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  212. treeData={treeData2}
  213. placeholder="请选择"
  214. />
  215. );
  216. };
  217. _TreeSelect.story = {
  218. name: 'tree select',
  219. };
  220. export const Searchable = () => (
  221. <div>
  222. <TreeSelect
  223. style={{ width: 300 }}
  224. // value={this.state.value}
  225. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  226. treeData={treeData2}
  227. filterTreeNode
  228. treeNodeFilterProp="value"
  229. placeholder="Please select"
  230. />
  231. <br />
  232. <br />
  233. <TreeSelect
  234. style={{ width: 300 }}
  235. // value={this.state.value}
  236. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  237. treeData={treeData2}
  238. filterTreeNode
  239. placeholder="Please select"
  240. />
  241. <br />
  242. <br />
  243. <TreeSelect
  244. style={{ width: 300 }}
  245. // value={this.state.value}
  246. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  247. treeData={treeData2}
  248. filterTreeNode
  249. searchAutoFocus
  250. placeholder="searchAutoFocus"
  251. />
  252. </div>
  253. );
  254. Searchable.story = {
  255. name: 'searchable',
  256. };
  257. export const SearchPosition = () => (
  258. <>
  259. <TreeSelect
  260. searchPosition="trigger"
  261. style={{ width: 300 }}
  262. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  263. treeData={treeData2}
  264. filterTreeNode
  265. placeholder="单选"
  266. />
  267. <br />
  268. <br />
  269. <TreeSelect
  270. searchPosition="trigger"
  271. style={{ width: 300 }}
  272. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  273. treeData={treeData2}
  274. multiple
  275. filterTreeNode
  276. maxTagCount={2}
  277. placeholder="多选"
  278. />
  279. <br />
  280. <br />
  281. <TreeSelect
  282. searchPosition="trigger"
  283. style={{ width: 300 }}
  284. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  285. treeData={treeData2}
  286. multiple
  287. filterTreeNode
  288. maxTagCount={2}
  289. placeholder="searchAutoFocus"
  290. searchAutoFocus
  291. />
  292. <br />
  293. <br />
  294. <TreeSelect
  295. searchPosition="trigger"
  296. style={{ width: 300 }}
  297. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  298. treeData={treeData2}
  299. multiple
  300. filterTreeNode
  301. maxTagCount={1}
  302. placeholder="maxTagCount=1"
  303. />
  304. </>
  305. );
  306. SearchPosition.story = {
  307. name: 'searchPosition',
  308. };
  309. export const PrefixSuffixInsetLabel = () => (
  310. <div>
  311. <TreeSelect
  312. style={{ width: 300 }}
  313. // value={this.state.value}
  314. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  315. treeData={treeData2}
  316. filterTreeNode
  317. prefix={<IconCreditCard />}
  318. treeNodeFilterProp="value"
  319. placeholder="Please select"
  320. />
  321. <br />
  322. <br />
  323. <TreeSelect
  324. style={{ width: 300 }}
  325. // value={this.state.value}
  326. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  327. treeData={treeData2}
  328. filterTreeNode
  329. prefix={<span>1234</span>}
  330. treeNodeFilterProp="value"
  331. placeholder="Please select"
  332. />
  333. <br />
  334. <br />
  335. <TreeSelect
  336. style={{ width: 300 }}
  337. suffix="RMB"
  338. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  339. treeData={treeData2}
  340. placeholder="Please select"
  341. />
  342. <br />
  343. <br />
  344. <TreeSelect
  345. style={{ width: 300 }}
  346. insetLabel="blablabla"
  347. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  348. treeData={treeData2}
  349. placeholder="Please select"
  350. />
  351. <br />
  352. <br />
  353. <TreeSelect
  354. style={{ width: 300 }}
  355. insetLabel={<span>1234</span>}
  356. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  357. treeData={treeData2}
  358. placeholder="Please select"
  359. />
  360. </div>
  361. );
  362. PrefixSuffixInsetLabel.story = {
  363. name: 'prefix suffix insetLabel',
  364. };
  365. PrefixSuffixInsetLabel.parameters = {
  366. chromatic: { disableSnapshot: false },
  367. }
  368. export const ValidateStatus = () => (
  369. <div>
  370. <TreeSelect
  371. style={{ width: 300 }}
  372. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  373. treeData={treeData2}
  374. multiple
  375. validateStatus="warning"
  376. placeholder="Please select"
  377. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  378. onSelect={(e, bool) => console.log('select', e, bool)}
  379. onChange={e => console.log('change', e)}
  380. />
  381. <br />
  382. <br />
  383. <TreeSelect
  384. style={{ width: 300 }}
  385. validateStatus="error"
  386. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  387. treeData={treeData2}
  388. // multiple
  389. placeholder="Please select"
  390. />
  391. </div>
  392. );
  393. ValidateStatus.story = {
  394. name: 'validate status',
  395. };
  396. ValidateStatus.parameters = {
  397. chromatic: { disableSnapshot: false },
  398. }
  399. export const Multiple = () => (
  400. <div>
  401. <TreeSelect
  402. style={{ width: 300 }}
  403. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  404. treeData={treeData2}
  405. multiple
  406. placeholder="Please select"
  407. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  408. onSelect={(e, bool) => console.log('select', e, bool)}
  409. onChange={e => console.log('change', e)}
  410. />
  411. <br />
  412. <br />
  413. <TreeSelect
  414. style={{ width: 300 }}
  415. // value={this.state.value}
  416. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  417. treeData={treeData2}
  418. multiple
  419. placeholder="Please select"
  420. />
  421. </div>
  422. );
  423. Multiple.story = {
  424. name: 'multiple',
  425. };
  426. export const MaxTagCount = () => (
  427. <div>
  428. <TreeSelect
  429. style={{ width: 300 }}
  430. // value={this.state.value}
  431. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  432. treeData={treeData2}
  433. multiple
  434. maxTagCount={2}
  435. placeholder="Please select"
  436. />
  437. {/* <br />
  438. <br />
  439. <TreeSelect
  440. style={{ width: 300 }}
  441. // value={this.state.value}
  442. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  443. treeData={treeData2}
  444. multiple
  445. placeholder="Please select"
  446. /> */}
  447. </div>
  448. );
  449. MaxTagCount.story = {
  450. name: 'maxTagCount',
  451. };
  452. export const MultipleSearchable = () => (
  453. <div>
  454. <TreeSelect
  455. style={{ width: 300 }}
  456. // value={this.state.value}
  457. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  458. treeData={treeData2}
  459. multiple
  460. filterTreeNode
  461. treeNodeFilterProp="value"
  462. placeholder="Please select"
  463. />
  464. </div>
  465. );
  466. MultipleSearchable.story = {
  467. name: 'multiple searchable',
  468. };
  469. export const DefaultValues = () => (
  470. <div>
  471. <TreeSelect
  472. style={{ width: 300 }}
  473. defaultValue={'shanghai'}
  474. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  475. treeData={treeData2}
  476. // multiple
  477. filterTreeNode
  478. treeNodeFilterProp="value"
  479. />
  480. <br />
  481. <br />
  482. <TreeSelect
  483. style={{ width: 300 }}
  484. defaultValue={'shanghai'}
  485. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  486. treeData={treeData2}
  487. filterTreeNode
  488. multiple
  489. treeNodeFilterProp="value"
  490. />
  491. <br />
  492. <br />
  493. <TreeSelect
  494. style={{ width: 300 }}
  495. defaultValue={['shanghai', 'daban', 'dongjing']}
  496. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  497. treeData={treeData2}
  498. filterTreeNode
  499. multiple
  500. treeNodeFilterProp="value"
  501. />
  502. <br />
  503. <br />
  504. <TreeSelect
  505. style={{ width: 300 }}
  506. defaultValue={['meiguo', 'dongjing']}
  507. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  508. treeData={treeData2}
  509. filterTreeNode
  510. multiple
  511. treeNodeFilterProp="value"
  512. />
  513. </div>
  514. );
  515. DefaultValues.story = {
  516. name: 'default values',
  517. };
  518. export const Disabled = () => (
  519. <div>
  520. <TreeSelect
  521. style={{ width: 300 }}
  522. defaultValue={'shanghai'}
  523. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  524. treeData={treeData2}
  525. multiple
  526. filterTreeNode
  527. disabled
  528. treeNodeFilterProp="value"
  529. placeholder="Please select"
  530. />
  531. <br />
  532. <br />
  533. <TreeSelect
  534. style={{ width: 300 }}
  535. defaultValue={'shanghai'}
  536. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  537. treeData={treeData2}
  538. filterTreeNode
  539. disabled
  540. treeNodeFilterProp="value"
  541. placeholder="Please select"
  542. />
  543. <br />
  544. <br />
  545. <TreeSelect
  546. style={{ width: 300 }}
  547. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  548. treeData={treeData2}
  549. multiple
  550. filterTreeNode
  551. disabled
  552. treeNodeFilterProp="value"
  553. placeholder="Please select"
  554. />
  555. </div>
  556. );
  557. Disabled.story = {
  558. name: 'disabled',
  559. };
  560. Disabled.parameters = {
  561. chromatic: { disableSnapshot: false },
  562. }
  563. export const OptionLabelProp = () => (
  564. <>
  565. <TreeSelect
  566. style={{ width: 300 }}
  567. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  568. treeData={treeData2}
  569. multiple
  570. filterTreeNode
  571. treeNodeFilterProp="value"
  572. treeNodeLabelProp="value"
  573. placeholder="Please select"
  574. />
  575. </>
  576. );
  577. OptionLabelProp.story = {
  578. name: 'optionLabelProp',
  579. };
  580. export const ValueInArray = () => (
  581. <>
  582. <TreeSelect
  583. style={{ width: 300 }}
  584. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  585. treeData={treeData2}
  586. multiple
  587. filterTreeNode
  588. valueInArray
  589. onChange={(...args) => console.log(args)}
  590. treeNodeFilterProp="value"
  591. treeNodeLabelProp="value"
  592. placeholder="Please select"
  593. />
  594. </>
  595. );
  596. ValueInArray.story = {
  597. name: 'valueInArray',
  598. };
  599. export const OnBlurOnFocus = () => (
  600. <>
  601. <div>single</div>
  602. <TreeSelect
  603. style={{ width: 300 }}
  604. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  605. treeData={treeData2}
  606. onBlur={(...args) => console.log('blur', args)}
  607. onFocus={(...args) => console.log('focus', args)}
  608. placeholder="Please select"
  609. />
  610. <div>multiple</div>
  611. <TreeSelect
  612. style={{ width: 300 }}
  613. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  614. treeData={treeData2}
  615. multiple
  616. onBlur={(...args) => console.log('blur', args)}
  617. onFocus={(...args) => console.log('focus', args)}
  618. placeholder="Please select"
  619. />
  620. </>
  621. );
  622. OnBlurOnFocus.story = {
  623. name: 'onBlur/onFocus',
  624. };
  625. export const LeafOnly = () => (
  626. <div>
  627. <TreeSelect
  628. style={{ width: 300 }}
  629. // value={this.state.value}
  630. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  631. treeData={treeData2}
  632. multiple
  633. leafOnly
  634. placeholder="Please select"
  635. onExpand={(e, { expanded, node }) => console.log('expand', e, expanded, node)}
  636. onSelect={(e, bool) => console.log('select', e, bool)}
  637. onChange={e => console.log('change', e)}
  638. />
  639. </div>
  640. );
  641. LeafOnly.story = {
  642. name: 'leafOnly',
  643. };
  644. class Demo extends React.Component {
  645. constructor() {
  646. super();
  647. this.state = {
  648. value: 'shanghai',
  649. };
  650. }
  651. onChange(value) {
  652. this.setState({ value });
  653. }
  654. render() {
  655. return (
  656. <TreeSelect
  657. style={{ width: 300 }}
  658. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  659. treeData={treeData2}
  660. value={this.state.value}
  661. placeholder="Please select"
  662. onChange={e => this.onChange(e)}
  663. />
  664. );
  665. }
  666. }
  667. export const ControlledComponentSingle = () => <Demo />;
  668. ControlledComponentSingle.story = {
  669. name: 'controlled Component single',
  670. };
  671. class Demo2 extends React.Component {
  672. constructor() {
  673. super();
  674. this.state = {
  675. value: ['Shanghai'],
  676. };
  677. }
  678. onChange(value) {
  679. this.setState({ value });
  680. }
  681. render() {
  682. console.log(this.state.value);
  683. const treeData = [
  684. {
  685. label: '亚洲',
  686. value: 'Asia',
  687. key: '0',
  688. children: [
  689. {
  690. label: '中国',
  691. value: 'China',
  692. key: '0-0',
  693. children: [
  694. {
  695. label: '北京',
  696. value: 'Beijing',
  697. key: '0-0-0',
  698. },
  699. {
  700. label: '上海',
  701. value: 'Shanghai',
  702. key: '0-0-1',
  703. },
  704. ],
  705. },
  706. ],
  707. },
  708. {
  709. label: '北美洲',
  710. value: 'North America',
  711. key: '1',
  712. },
  713. ];
  714. return (
  715. <TreeSelect
  716. style={{ width: 300 }}
  717. multiple
  718. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  719. treeData={treeData}
  720. value={this.state.value}
  721. placeholder="Please select"
  722. onChange={e => this.onChange(e)}
  723. />
  724. );
  725. }
  726. }
  727. export const ControlledComponentMultiple = () => <Demo2 />;
  728. ControlledComponentMultiple.story = {
  729. name: 'controlled Component multiple',
  730. };
  731. class Demo3 extends React.Component {
  732. constructor() {
  733. super();
  734. this.state = {
  735. value: ['Shanghai'],
  736. };
  737. }
  738. // 获取最底层值
  739. getDeepChildrensByNode = node => {
  740. return flattenDeep(
  741. node.map(item => {
  742. if (item.children) {
  743. return this.getDeepChildrensByNode(item.children);
  744. }
  745. return item.value;
  746. })
  747. );
  748. };
  749. onChange(value, node) {
  750. console.log('onchange', value);
  751. value = this.getDeepChildrensByNode(node);
  752. console.log('modifiled', value);
  753. this.setState({ value });
  754. }
  755. render() {
  756. const treeData = [
  757. {
  758. label: '亚洲',
  759. value: 'Asia',
  760. key: '0',
  761. children: [
  762. {
  763. label: '中国',
  764. value: 'China',
  765. key: '0-0',
  766. children: [
  767. {
  768. label: '北京',
  769. value: 'Beijing',
  770. key: '0-0-0',
  771. },
  772. {
  773. label: '上海',
  774. value: 'Shanghai',
  775. key: '0-0-1',
  776. },
  777. ],
  778. },
  779. ],
  780. },
  781. {
  782. label: '北美洲',
  783. value: 'North America',
  784. key: '1',
  785. },
  786. ];
  787. return (
  788. <TreeSelect
  789. style={{ width: 300 }}
  790. multiple
  791. dropdownStyle={{ maxHeight: 200, overflow: 'auto' }}
  792. treeData={treeData}
  793. value={this.state.value}
  794. placeholder="Please select"
  795. onChange={(e, node) => this.onChange(e, node)}
  796. />
  797. );
  798. }
  799. }
  800. export const ControlledComponentMultipleValueModified = () => <Demo3 />;
  801. ControlledComponentMultipleValueModified.story = {
  802. name: 'controlled Component multiple value modified',
  803. };
  804. class ConvertDemo extends React.Component {
  805. constructor(props) {
  806. super(props);
  807. this.formApi = null;
  808. }
  809. handleChange = val => {
  810. let finalVal = val;
  811. let firstClassOption = ['Asia', 'North America'];
  812. // 在这里去做你的value替换逻辑
  813. console.log('originVal:' + val);
  814. if (val.length === 1) {
  815. // do nothing
  816. } else {
  817. if (val.every(item => firstClassOption.includes(item))) {
  818. finalVal = val[val.length - 1];
  819. }
  820. }
  821. console.log('finalVal:' + finalVal);
  822. return finalVal;
  823. };
  824. render() {
  825. const treeData = [
  826. {
  827. label: '亚洲',
  828. value: 'Asia',
  829. key: '0',
  830. children: [
  831. {
  832. label: '中国',
  833. value: 'China',
  834. key: '0-0',
  835. children: [
  836. {
  837. label: '北京',
  838. value: 'Beijing',
  839. key: '0-0-0',
  840. },
  841. {
  842. label: '上海',
  843. value: 'Shanghai',
  844. key: '0-0-1',
  845. },
  846. ],
  847. },
  848. ],
  849. },
  850. {
  851. label: '北美洲',
  852. value: 'North America',
  853. key: '1',
  854. },
  855. ];
  856. return (
  857. <Form getFormApi={this.getFormApi}>
  858. <Form.TreeSelect
  859. field="tree"
  860. label="节点(TreeSelect)"
  861. placeholder="请选择服务节点"
  862. treeData={treeData}
  863. convert={this.handleChange}
  864. filterTreeNode
  865. multiple
  866. ></Form.TreeSelect>
  867. </Form>
  868. );
  869. }
  870. }
  871. export const _ConvertDemo = () => <ConvertDemo />;
  872. _ConvertDemo.story = {
  873. name: 'convert demo',
  874. };
  875. export const TreeselectDefaultOpenInPopover = () => (
  876. <Popover
  877. content={
  878. <TreeSelect
  879. style={{ width: 200 }}
  880. dropdownStyle={{ width: 200 }}
  881. treeData={treeData1}
  882. defaultOpen
  883. // value={this.state.value}
  884. // placeholder="Please select"
  885. // onChange={(e, node) => this.onChange(e, node)}
  886. />
  887. }
  888. >
  889. <Button style={{ marginLeft: 150 }}>悬停此处</Button>
  890. </Popover>
  891. );
  892. TreeselectDefaultOpenInPopover.story = {
  893. name: 'treeselect defaultOpen in popover',
  894. };
  895. export const CustomTriggerDemo = () => <CustomTrigger />;
  896. CustomTriggerDemo.story = { name: 'custom trigger' };
  897. const AutoParentDemo = () => {
  898. const [expandedKeys, setExpandedKeys] = useState(['beimeizhou']);
  899. const [selectedKeys, setSelectedKeys] = useState(['beimeizhou']);
  900. const [autoExpandParent, setAutoExpandParent] = useState(true);
  901. const onExpand = expandedKeys => {
  902. console.log('onExpand', expandedKeys);
  903. // if not set autoExpandParent to false, if children expanded, parent can not collapse.
  904. // or, you can remove all expanded children keys.
  905. setExpandedKeys(expandedKeys);
  906. setAutoExpandParent(false);
  907. };
  908. const onSelect = (selectedKeys, info) => {
  909. console.log('onSelect:', info);
  910. setSelectedKeys(selectedKeys);
  911. };
  912. return (
  913. <div>
  914. <Button
  915. onClick={() => {
  916. setSelectedKeys(['beijing']);
  917. setExpandedKeys(['beijing']);
  918. setAutoExpandParent(true);
  919. }}
  920. >
  921. Update
  922. </Button>
  923. <TreeSelect
  924. onExpand={onExpand}
  925. expandedKeys={expandedKeys}
  926. autoExpandParent={autoExpandParent}
  927. onChange={onSelect}
  928. value={selectedKeys}
  929. treeData={treeData2}
  930. // multiple
  931. />
  932. </div>
  933. );
  934. };
  935. export const AutoExpandParent = () => (
  936. <>
  937. <AutoParentDemo />
  938. </>
  939. );
  940. AutoExpandParent.story = {
  941. name: 'autoExpandParent',
  942. };
  943. export const TreeWithoutValueProps = () => (
  944. <TreeSelect
  945. treeData={treeDataWithoutValue}
  946. value="beijing"
  947. defaultExpandAll
  948. onChange={(...args) => console.log(args)}
  949. />
  950. );
  951. TreeWithoutValueProps.story = {
  952. name: 'tree without value props',
  953. };
  954. export const TreeSelectRenderSelectedItem = () => {
  955. const treeData = [
  956. {
  957. label: '亚洲',
  958. value: 'Asia',
  959. key: '0',
  960. children: [
  961. {
  962. label: '中国',
  963. value: 'China',
  964. key: '0-0',
  965. children: [
  966. {
  967. label: '北京',
  968. value: 'Beijing',
  969. key: '0-0-0',
  970. },
  971. {
  972. label: '上海',
  973. value: 'Shanghai',
  974. key: '0-0-1',
  975. },
  976. ],
  977. },
  978. ],
  979. },
  980. {
  981. label: '北美洲',
  982. value: 'North America',
  983. key: '1',
  984. },
  985. {
  986. label: '南美洲',
  987. value: 'South America',
  988. key: '2',
  989. },
  990. {
  991. label: '南极洲',
  992. value: 'Antarctica',
  993. key: '3',
  994. },
  995. ];
  996. return (
  997. <>
  998. <h4>单选</h4>
  999. <TreeSelect
  1000. style={{ width: 300 }}
  1001. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  1002. treeData={treeData}
  1003. placeholder="请选择"
  1004. renderSelectedItem={item => `${item.value}-${item.label}`}
  1005. />
  1006. <h4>多选</h4>
  1007. <TreeSelect
  1008. style={{ width: 300 }}
  1009. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  1010. treeData={treeData}
  1011. multiple
  1012. placeholder="请选择"
  1013. renderSelectedItem={(item, { index, onClose }) => ({
  1014. content: `${item.value}-${item.label}`,
  1015. isRenderInTag: true,
  1016. })}
  1017. />
  1018. <h4>多选 + isRenderInTag=false</h4>
  1019. <TreeSelect
  1020. style={{ width: 300 }}
  1021. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  1022. treeData={treeData}
  1023. multiple
  1024. maxTagCount={2}
  1025. placeholder="请选择"
  1026. renderSelectedItem={(item, { index, onClose }) => ({
  1027. content: (
  1028. <Tag key={index} color="white">
  1029. {item.value}
  1030. </Tag>
  1031. ),
  1032. isRenderInTag: false,
  1033. })}
  1034. />
  1035. </>
  1036. );
  1037. };
  1038. TreeSelectRenderSelectedItem.story = {
  1039. name: 'treeSelect renderSelectedItem',
  1040. };
  1041. const DisableStrictlyDemo = () => {
  1042. const [value, setValue] = useState(['Shanghai']);
  1043. const treeData = [
  1044. {
  1045. label: '亚洲',
  1046. value: 'Asia',
  1047. key: '0',
  1048. children: [
  1049. {
  1050. label: '中国',
  1051. value: 'China',
  1052. key: '0-0',
  1053. disabled: true,
  1054. children: [
  1055. {
  1056. label: '北京',
  1057. value: 'Beijing',
  1058. key: '0-0-0',
  1059. },
  1060. {
  1061. label: '上海',
  1062. value: 'Shanghai',
  1063. key: '0-0-1',
  1064. },
  1065. ],
  1066. },
  1067. {
  1068. label: '日本',
  1069. value: 'Japan',
  1070. key: '0-1',
  1071. },
  1072. ],
  1073. },
  1074. {
  1075. label: '北美洲',
  1076. value: 'North America',
  1077. key: '1',
  1078. },
  1079. ];
  1080. return (
  1081. <div>
  1082. <TreeSelect
  1083. style={{ width: 300 }}
  1084. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  1085. treeData={treeData}
  1086. disableStrictly
  1087. multiple
  1088. searchPosition="trigger"
  1089. filterTreeNode
  1090. value={value}
  1091. onChange={value => setValue(value)}
  1092. />
  1093. </div>
  1094. );
  1095. };
  1096. export const DisabledStrictly = () => (
  1097. <>
  1098. <DisableStrictlyDemo />
  1099. </>
  1100. );
  1101. DisabledStrictly.story = {
  1102. name: 'disabledStrictly',
  1103. };
  1104. export const CheckRelationDemo = () => {
  1105. const treeData = [
  1106. {
  1107. label: 'Asia',
  1108. value: 'Asia',
  1109. key: '0',
  1110. children: [
  1111. {
  1112. label: 'China',
  1113. value: 'China',
  1114. key: '0-0',
  1115. children: [
  1116. {
  1117. label: 'Beijing',
  1118. value: 'Beijing',
  1119. key: '0-0-0',
  1120. },
  1121. {
  1122. label: 'Shanghai',
  1123. value: 'Shanghai',
  1124. key: '0-0-1',
  1125. },
  1126. {
  1127. label: 'Chengdu',
  1128. value: 'Chengdu',
  1129. key: '0-0-2',
  1130. },
  1131. ],
  1132. },
  1133. {
  1134. label: 'Japan',
  1135. value: 'Japan',
  1136. key: '0-1',
  1137. children: [
  1138. {
  1139. label: 'Osaka',
  1140. value: 'Osaka',
  1141. key: '0-1-0'
  1142. }
  1143. ]
  1144. },
  1145. ],
  1146. },
  1147. {
  1148. label: 'North America',
  1149. value: 'North America',
  1150. key: '1',
  1151. children: [
  1152. {
  1153. label: 'United States',
  1154. value: 'United States',
  1155. key: '1-0'
  1156. },
  1157. {
  1158. label: 'Canada',
  1159. value: 'Canada',
  1160. key: '1-1'
  1161. }
  1162. ]
  1163. }
  1164. ];
  1165. const [value, setValue] = useState('China');
  1166. const [value2, setValue2] = useState();
  1167. const [value3, setValue3] = useState();
  1168. const style = {
  1169. width: 300,
  1170. };
  1171. const dropdownStyle = {
  1172. maxHeight: 400,
  1173. overflow: 'auto'
  1174. };
  1175. const handleChange = value => {
  1176. console.log(value);
  1177. setValue(value);
  1178. };
  1179. const handleChange2 = value => {
  1180. console.log(value);
  1181. setValue2(value);
  1182. };
  1183. const handleChange3 = value => {
  1184. console.log(value);
  1185. setValue3(value);
  1186. };
  1187. return (
  1188. <>
  1189. <div>checkRelation='unRelated'</div>
  1190. <TreeSelect
  1191. dropdownStyle={dropdownStyle}
  1192. treeData={treeData}
  1193. multiple
  1194. checkRelation='unRelated'
  1195. defaultExpandAll
  1196. style={style}
  1197. />
  1198. <br /><br />
  1199. <div>checkRelation='unRelated' + maxTagCount=2</div>
  1200. <TreeSelect
  1201. dropdownStyle={dropdownStyle}
  1202. treeData={treeData}
  1203. multiple
  1204. maxTagCount={2}
  1205. checkRelation='unRelated'
  1206. defaultExpandAll
  1207. style={style}
  1208. />
  1209. <br /><br />
  1210. <div>checkRelation='unRelated' + maxTagCount=2 + 开启搜索</div>
  1211. <TreeSelect
  1212. dropdownStyle={dropdownStyle}
  1213. treeData={treeData}
  1214. multiple
  1215. maxTagCount={2}
  1216. filterTreeNode
  1217. checkRelation='unRelated'
  1218. defaultExpandAll
  1219. style={style}
  1220. />
  1221. <br /><br />
  1222. <div>checkRelation='unRelated' + maxTagCount=2 + 开启搜索 + searchBox in trigger</div>
  1223. <TreeSelect
  1224. dropdownStyle={dropdownStyle}
  1225. treeData={treeData}
  1226. multiple
  1227. maxTagCount={2}
  1228. filterTreeNode
  1229. checkRelation='unRelated'
  1230. searchPosition='trigger'
  1231. defaultExpandAll
  1232. style={style}
  1233. />
  1234. <br /><br />
  1235. <div>checkRelation='unRelated' + 中国节点为 disabled</div>
  1236. <TreeSelect
  1237. dropdownStyle={dropdownStyle}
  1238. treeData={treeDataWithoutValue}
  1239. multiple
  1240. checkRelation='unRelated'
  1241. defaultExpandAll
  1242. style={style}
  1243. />
  1244. <br /><br />
  1245. <div>checkRelation='unRelated' + 中国节点为 disabled + 严格禁用</div>
  1246. <TreeSelect
  1247. dropdownStyle={dropdownStyle}
  1248. treeData={treeDataWithoutValue}
  1249. multiple
  1250. checkRelation='unRelated'
  1251. defaultExpandAll
  1252. disableStrictly
  1253. style={style}
  1254. />
  1255. <br /><br />
  1256. <div>checkRelation='unRelated' + defaultValue 为 China</div>
  1257. <TreeSelect
  1258. dropdownStyle={dropdownStyle}
  1259. treeData={treeData}
  1260. multiple
  1261. checkRelation='unRelated'
  1262. defaultExpandAll
  1263. style={style}
  1264. defaultValue='China'
  1265. />
  1266. <br /><br />
  1267. <div>checkRelation='unRelated' + defaultValue 为 China + 开启搜索</div>
  1268. <TreeSelect
  1269. dropdownStyle={dropdownStyle}
  1270. treeData={treeData}
  1271. multiple
  1272. filterTreeNode
  1273. checkRelation='unRelated'
  1274. defaultExpandAll
  1275. style={style}
  1276. defaultValue='China'
  1277. />
  1278. <br /><br />
  1279. <div>checkRelation='unRelated' + defaultValue 为 China + 开启搜索 + searchBox in trigger + showClear</div>
  1280. <TreeSelect
  1281. dropdownStyle={dropdownStyle}
  1282. treeData={treeData}
  1283. multiple
  1284. filterTreeNode
  1285. showClear
  1286. checkRelation='unRelated'
  1287. defaultExpandAll
  1288. style={style}
  1289. searchPosition='trigger'
  1290. defaultValue='China'
  1291. />
  1292. <br /><br />
  1293. <div>checkRelation='unRelated' + 受控 + value 初始为 China</div>
  1294. <TreeSelect
  1295. dropdownStyle={dropdownStyle}
  1296. treeData={treeData}
  1297. multiple
  1298. checkRelation='unRelated'
  1299. defaultExpandAll
  1300. style={style}
  1301. value={value}
  1302. onChange={handleChange}
  1303. />
  1304. <br /><br />
  1305. <div>checkRelation='unRelated' + 受控 + onChangeWithObject</div>
  1306. <TreeSelect
  1307. dropdownStyle={dropdownStyle}
  1308. treeData={treeData}
  1309. multiple
  1310. checkRelation='unRelated'
  1311. defaultExpandAll
  1312. style={style}
  1313. value={value2}
  1314. onChangeWithObject
  1315. onChange={handleChange2}
  1316. />
  1317. <br /><br />
  1318. <div>checkRelation='unRelated' + 受控 + leafOnly,此时 leafOnly 失效</div>
  1319. <TreeSelect
  1320. dropdownStyle={dropdownStyle}
  1321. leafOnly
  1322. treeData={treeData}
  1323. multiple
  1324. checkRelation='unRelated'
  1325. defaultExpandAll
  1326. style={style}
  1327. value={value3}
  1328. onChange={handleChange3}
  1329. />
  1330. <br /><br />
  1331. <div>checkRelation='unRelated' + onSelect </div>
  1332. <TreeSelect
  1333. dropdownStyle={dropdownStyle}
  1334. treeData={treeData}
  1335. multiple
  1336. checkRelation='unRelated'
  1337. defaultExpandAll
  1338. style={style}
  1339. onSelect={(value,status,node)=>console.log('select', value, status, node)}
  1340. />
  1341. </>
  1342. );
  1343. };