treeMultiple.test.js 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  1. import { TreeSelect, Icon } from '../../index';
  2. import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';
  3. const treeChildren = [
  4. {
  5. label: '北京',
  6. value: 'Beijing',
  7. key: 'beijing',
  8. },
  9. {
  10. label: '上海',
  11. value: 'Shanghai',
  12. key: 'shanghai',
  13. },
  14. ];
  15. const treeChildrenWithFakeObj = [
  16. {
  17. label: '北京',
  18. value: 'Beijing',
  19. key: 'beijing',
  20. },
  21. {
  22. label: '鱼',
  23. value: 'Fish',
  24. key: 'fish',
  25. },
  26. ]
  27. const treeData = [
  28. {
  29. label: '亚洲',
  30. value: 'Yazhou',
  31. key: 'yazhou',
  32. children: [
  33. {
  34. label: '中国',
  35. value: 'Zhongguo',
  36. key: 'zhongguo',
  37. children: treeChildren,
  38. },
  39. {
  40. label: '日本',
  41. value: 'Riben',
  42. key: 'riben',
  43. children: [
  44. {
  45. label: '东京',
  46. value: 'Dongjing',
  47. key: 'dongjing'
  48. },
  49. {
  50. label: '大阪',
  51. value: 'Daban',
  52. key: 'daban'
  53. }
  54. ]
  55. },
  56. ],
  57. },
  58. {
  59. label: '北美洲',
  60. value: 'Beimeizhou',
  61. key: 'beimeizhou',
  62. children: [
  63. {
  64. label: '美国',
  65. value: 'Meiguo',
  66. key: 'meiguo'
  67. },
  68. {
  69. label: '加拿大',
  70. value: 'Jianada',
  71. key: 'jianada'
  72. }
  73. ]
  74. },
  75. ];
  76. const treeDataWithDisabled = [
  77. {
  78. label: '亚洲',
  79. value: 'Asia',
  80. key: '0',
  81. children: [
  82. {
  83. label: '中国',
  84. value: 'China',
  85. key: '0-0',
  86. disabled: true,
  87. children: [
  88. {
  89. label: '北京',
  90. value: 'Beijing',
  91. key: '0-0-0',
  92. },
  93. {
  94. label: '上海',
  95. value: 'Shanghai',
  96. key: '0-0-1',
  97. },
  98. ],
  99. },
  100. {
  101. label: '日本',
  102. value: 'Japan',
  103. key: '0-1',
  104. },
  105. ],
  106. },
  107. {
  108. label: '北美洲',
  109. value: 'North America',
  110. key: '1',
  111. }
  112. ];
  113. const treeChildrenWithoutValue = [
  114. {
  115. label: '北京',
  116. key: 'beijing',
  117. },
  118. {
  119. label: '上海',
  120. key: 'shanghai',
  121. },
  122. ];
  123. const treeDataWithoutValue = [
  124. {
  125. label: '亚洲',
  126. key: 'yazhou',
  127. children: [
  128. {
  129. label: '中国',
  130. key: 'zhongguo',
  131. children: treeChildrenWithoutValue,
  132. },
  133. {
  134. label: '日本',
  135. key: 'riben',
  136. children: [
  137. {
  138. label: '东京',
  139. key: 'dongjing'
  140. },
  141. {
  142. label: '大阪',
  143. key: 'daban'
  144. }
  145. ]
  146. },
  147. ],
  148. },
  149. {
  150. label: '北美洲',
  151. key: 'beimeizhou',
  152. children: [
  153. {
  154. label: '美国',
  155. key: 'meiguo'
  156. },
  157. {
  158. label: '加拿大',
  159. key: 'jianada'
  160. }
  161. ]
  162. },
  163. ];
  164. const specialTreeData = [
  165. {
  166. label1: '亚洲',
  167. value1: 'Yazhou',
  168. key1: 'yazhou',
  169. children1: [
  170. {
  171. label1: '中国',
  172. value1: 'Zhongguo',
  173. key1: 'zhongguo',
  174. disabled1: true,
  175. children1: [
  176. {
  177. label1: '北京',
  178. value1: 'Beijing',
  179. key1: 'beijing',
  180. },
  181. {
  182. label1: '上海',
  183. value1: 'Shanghai',
  184. key1: 'shanghai',
  185. },
  186. ],
  187. },
  188. {
  189. label1: '日本',
  190. value1: 'Riben',
  191. key1: 'riben',
  192. children1: [
  193. {
  194. label1: '东京',
  195. value1: 'Dongjing',
  196. key1: 'dongjing',
  197. },
  198. {
  199. label1: '大阪',
  200. value1: 'Daban',
  201. key1: 'daban',
  202. },
  203. ],
  204. },
  205. ],
  206. },
  207. {
  208. label1: '北美洲',
  209. value1: 'Beimeizhou',
  210. key1: 'beimeizhou',
  211. children1: [
  212. {
  213. label1: '美国',
  214. value1: 'Meiguo',
  215. key1: 'meiguo',
  216. },
  217. {
  218. label1: '加拿大',
  219. value1: 'Jianada',
  220. key1: 'jianada',
  221. },
  222. ],
  223. },
  224. ];
  225. const defaultKeyMaps = {
  226. value: 'value1',
  227. key: 'key1',
  228. label: 'label1',
  229. children: 'children1',
  230. disabled: 'disabled1'
  231. };
  232. let commonProps = {
  233. motion: false,
  234. motionExpand: false,
  235. mouseEnterDelay: 0,
  236. mouseLeaveDelay: 0,
  237. };
  238. function getTreeSelect(props) {
  239. props = { treeData: treeData, ...props }
  240. return mount(
  241. <TreeSelect
  242. multiple
  243. {...commonProps}
  244. defaultOpen={true}
  245. {...props}
  246. />,
  247. {
  248. attachTo: document.getElementById('container')
  249. }
  250. );
  251. }
  252. describe('TreeSelect', () => {
  253. beforeEach(() => {
  254. // Avoid `attachTo: document.body` Warning
  255. const div = document.createElement('div');
  256. div.setAttribute('id', 'container');
  257. document.body.appendChild(div);
  258. });
  259. afterEach(() => {
  260. const div = document.getElementById('container');
  261. if (div) {
  262. document.body.removeChild(div);
  263. }
  264. document.body.innerHTML = '';
  265. });
  266. it('defaultValue + leaf item checked', () => {
  267. // auto expand parent, if node exist means parent is open
  268. let treeSelect = getTreeSelect({
  269. defaultValue: 'Beijing'
  270. });
  271. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  272. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  273. expect(tagGroup.length).toEqual(1);
  274. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  275. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  276. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  277. treeSelect.unmount();
  278. // array case select both
  279. let treeSelect2 = getTreeSelect({
  280. defaultValue: ['Dongjing', 'Beijing']
  281. });
  282. let level3Nodes = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  283. tagGroup = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`);
  284. expect(tagGroup.length).toEqual(2);
  285. expect(tagGroup.at(0).instance().textContent).toEqual('东京');
  286. expect(tagGroup.at(1).instance().textContent).toEqual('北京');
  287. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  288. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  289. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  290. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  291. })
  292. it('defaultValue + leaf item checked => half checked parent', () => {
  293. let treeSelect = getTreeSelect({
  294. defaultValue: ['Dongjing', 'Beijing']
  295. });
  296. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  297. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  298. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  299. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  300. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  301. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  302. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  303. })
  304. it('defaultValue + leaf item checked => checked parent', () => {
  305. let treeSelect = getTreeSelect({
  306. defaultValue: ['Shanghai', 'Beijing']
  307. });
  308. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  309. expect(tagGroup.length).toEqual(1);
  310. expect(tagGroup.at(0).instance().textContent).toEqual('中国');
  311. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  312. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  313. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  314. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  315. })
  316. it('defaultValue + all leaf items checked => checked ancesters', () => {
  317. let treeSelect = getTreeSelect({
  318. defaultValue: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  319. });
  320. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  321. expect(tagGroup.length).toEqual(1);
  322. expect(tagGroup.at(0).instance().textContent).toEqual('亚洲');
  323. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  324. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  325. })
  326. it('defaultValue + parent checked => all descendants checked', () => {
  327. let treeSelect = getTreeSelect({
  328. defaultValue: ['Yazhou'],
  329. defaultExpandAll: true
  330. });
  331. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  332. expect(checkedNode.length).toEqual(7);
  333. })
  334. it('defaultValue + onChangeWithObject', () => {
  335. let treeSelect = getTreeSelect({
  336. defaultValue: treeChildren,
  337. defaultExpandAll: true,
  338. onChangeWithObject: true
  339. });
  340. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  341. expect(checkedNode.length).toEqual(3);
  342. })
  343. it('maxTagCount', () => {
  344. let treeSelect = getTreeSelect({
  345. defaultValue: ['Shanghai', 'Dongjing', 'Daban', 'Meiguo'],
  346. maxTagCount: 2,
  347. defaultExpandAll: true,
  348. });
  349. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  350. expect(tagGroup.length).toEqual(3);
  351. expect(tagGroup.at(2).instance().textContent).toEqual('+1');
  352. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  353. expect(checkedNode.length).toEqual(5);
  354. });
  355. it('removeTag', () => {
  356. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  357. let treeSelect = getTreeSelect({
  358. defaultValue: ['Shanghai', 'Dongjing'],
  359. defaultExpandAll: true,
  360. });
  361. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  362. let closeBtn = tagGroup.at(1).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  363. closeBtn.simulate('click', nativeEvent);
  364. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  365. expect(tagGroup.length).toEqual(1);
  366. expect(tagGroup.at(0).instance().textContent).toEqual('上海');
  367. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  368. expect(checkedNode.length).toEqual(1);
  369. });
  370. it('expandedKeys + autoExpandParent', () => {
  371. // auto expand parent is always true when mounted
  372. let treeSelect = getTreeSelect({
  373. expandedKeys: ['beimeizhou']
  374. });
  375. // yazhou beimeizhou
  376. let topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  377. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  378. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  379. treeSelect.setProps({ expandedKeys: ['riben'] });
  380. treeSelect.update();
  381. topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  382. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  383. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  384. // autoExpandParent
  385. treeSelect.setProps({ autoExpandParent: true });
  386. treeSelect.update();
  387. topNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  388. expect(topNode.at(0).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(false);
  389. expect(topNode.at(1).hasClass(`${BASE_CLASS_PREFIX}-tree-option-collapsed`)).toEqual(true);
  390. });
  391. it('select one leaf item / onSelect / onChange', () => {
  392. let spyOnSelect = sinon.spy(() => { });
  393. let spyOnChange = sinon.spy(() => { });
  394. let treeSelect = getTreeSelect({
  395. defaultExpandAll: true,
  396. onSelect: spyOnSelect,
  397. onChange: spyOnChange,
  398. });
  399. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  400. // check beijing
  401. nodeBeijing.simulate('click');
  402. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  403. expect(tagGroup.length).toEqual(1);
  404. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  405. // onSelect & onChange
  406. expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  407. expect(spyOnChange.calledWithMatch(['Beijing'])).toEqual(true);
  408. // classname
  409. nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  410. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  411. // uncheck
  412. nodeBeijing.simulate('click');
  413. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  414. expect(tagGroup.length).toEqual(0);
  415. // onSelect & onChange
  416. expect(spyOnSelect.calledWithMatch('beijing', false, { key: "beijing" })).toEqual(true);
  417. expect(spyOnChange.calledWithMatch([])).toEqual(true);
  418. // classname
  419. nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  420. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  421. expect(nodeBeijing.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  422. });
  423. it('select two different branches of leaf items / onSelect / onChange', () => {
  424. let spyOnSelect = sinon.spy(() => { });
  425. let spyOnChange = sinon.spy(() => { });
  426. let treeSelect = getTreeSelect({
  427. defaultExpandAll: true,
  428. onSelect: spyOnSelect,
  429. onChange: spyOnChange,
  430. });
  431. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  432. nodelevel3.at(0).simulate('click');
  433. nodelevel3.at(2).simulate('click');
  434. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  435. expect(tagGroup.length).toEqual(2);
  436. // onSelect & onChange
  437. expect(spyOnSelect.calledWithMatch('dongjing', true, { key: "dongjing" })).toEqual(true);
  438. expect(spyOnChange.calledWithMatch(['Beijing', 'Dongjing'])).toEqual(true);
  439. });
  440. it('select one branche of all leaf items / onSelect / onChange', () => {
  441. let spyOnSelect = sinon.spy(() => { });
  442. let spyOnChange = sinon.spy(() => { });
  443. let treeSelect = getTreeSelect({
  444. defaultExpandAll: true,
  445. onSelect: spyOnSelect,
  446. onChange: spyOnChange,
  447. });
  448. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  449. nodelevel3.at(0).simulate('click');
  450. nodelevel3.at(1).simulate('click');
  451. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  452. expect(tagGroup.length).toEqual(1);
  453. // onSelect & onChange
  454. expect(spyOnSelect.calledWithMatch('shanghai', true, { key: "shanghai" })).toEqual(true);
  455. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  456. // ui
  457. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  458. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  459. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  460. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  461. });
  462. it('select all leaf items / onSelect / onChange', () => {
  463. let spyOnSelect = sinon.spy(() => { });
  464. let spyOnChange = sinon.spy(() => { });
  465. let treeSelect = getTreeSelect({
  466. defaultExpandAll: true,
  467. onSelect: spyOnSelect,
  468. onChange: spyOnChange,
  469. });
  470. let nodelevel3 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  471. nodelevel3.at(0).simulate('click');
  472. nodelevel3.at(1).simulate('click');
  473. nodelevel3.at(2).simulate('click');
  474. nodelevel3.at(3).simulate('click');
  475. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  476. expect(tagGroup.length).toEqual(1);
  477. // onSelect & onChange
  478. expect(spyOnSelect.calledWithMatch('daban', true, { key: "daban" })).toEqual(true);
  479. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  480. // ui
  481. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).length).toEqual(7);
  482. });
  483. it('select a parent node / onSelect / onChange', () => {
  484. let spyOnSelect = sinon.spy(() => { });
  485. let spyOnChange = sinon.spy(() => { });
  486. let treeSelect = getTreeSelect({
  487. defaultExpandAll: true,
  488. onSelect: spyOnSelect,
  489. onChange: spyOnChange,
  490. });
  491. let nodelevel1 = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  492. nodelevel1.at(0).simulate('click');
  493. // onSelect & onChange
  494. expect(spyOnSelect.calledWithMatch('yazhou', true, { key: "yazhou" })).toEqual(true);
  495. expect(spyOnChange.calledWithMatch(['Yazhou'])).toEqual(true);
  496. // ui
  497. let checkedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`);
  498. expect(checkedNode.length).toEqual(7);
  499. });
  500. // it('onChange + valueInArray', () => {
  501. // let spyOnSelect = sinon.spy(() => { });
  502. // let spyOnChange = sinon.spy(() => { });
  503. // let treeSelect = getTreeSelect({
  504. // defaultExpandAll: true,
  505. // onSelect: spyOnSelect,
  506. // onChange: spyOnChange,
  507. // valueInArray: true,
  508. // });
  509. // let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  510. // // select beijing
  511. // nodeBeijing.simulate('click');
  512. // // onSelect & onChange
  513. // expect(spyOnSelect.calledOnce).toBe(true);
  514. // expect(spyOnChange.calledOnce).toBe(true);
  515. // expect(spyOnSelect.calledWithMatch('beijing', true, { key: "beijing" })).toEqual(true);
  516. // expect(spyOnChange.calledWithMatch(
  517. // [['Yazhou', 'Zhongguo', 'Beijing']],
  518. // [{ label: "北京", value: "Beijing", key: "beijing" }]
  519. // )).toEqual(true);
  520. // });
  521. it('onChange + leafOnly', () => {
  522. let spyOnSelect = sinon.spy(() => { });
  523. let spyOnChange = sinon.spy(() => { });
  524. let treeSelect = getTreeSelect({
  525. defaultExpandAll: true,
  526. onSelect: spyOnSelect,
  527. onChange: spyOnChange,
  528. leafOnly: true,
  529. });
  530. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  531. // select China
  532. nodeChina.simulate('click');
  533. // onSelect & onChange
  534. expect(spyOnSelect.calledOnce).toBe(true);
  535. expect(spyOnChange.calledOnce).toBe(true);
  536. expect(spyOnSelect.calledWithMatch('zhongguo', true, { key: "zhongguo" })).toEqual(true);
  537. expect(spyOnChange.calledWithMatch(
  538. ['Beijing', 'Shanghai'],
  539. )).toEqual(true);
  540. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  541. expect(tagGroup.length).toEqual(2);
  542. });
  543. it('controlled: leaf values show correct', () => {
  544. let treeSelect = getTreeSelect({
  545. value: 'Beijing'
  546. });
  547. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  548. expect(tagGroup.length).toEqual(1);
  549. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  550. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  551. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  552. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  553. treeSelect.unmount();
  554. let treeSelect2 = getTreeSelect({
  555. value: ['Dongjing', 'Beijing']
  556. });
  557. tagGroup = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`);
  558. expect(tagGroup.length).toEqual(2);
  559. expect(tagGroup.at(0).instance().textContent).toEqual('东京');
  560. expect(tagGroup.at(1).instance().textContent).toEqual('北京');
  561. let level3Nodes = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  562. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  563. expect(level3Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  564. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  565. expect(level3Nodes.at(2).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('东京');
  566. });
  567. it('controlled: leaf values checked => ancester half checked', () => {
  568. let treeSelect = getTreeSelect({
  569. value: ['Dongjing', 'Beijing']
  570. });
  571. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  572. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  573. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  574. expect(tagGroup.length).toEqual(2);
  575. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  576. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(false);
  577. expect(level1Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  578. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  579. expect(level2Nodes.at(1).find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).exists()).toEqual(true);
  580. });
  581. it('controlled: leaf values checked => parent checked + ancester half checked', () => {
  582. let treeSelect = getTreeSelect({
  583. value: ['Shanghai', 'Beijing']
  584. });
  585. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  586. expect(tagGroup.length).toEqual(1);
  587. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  588. let level2Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  589. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-indeterminate`).exists()).toEqual(true);
  590. expect(level2Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  591. });
  592. it('controlled: all leaf items checked => checked ancesters', () => {
  593. let treeSelect = getTreeSelect({
  594. value: ['Shanghai', 'Beijing', 'Dongjing', 'Daban']
  595. });
  596. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  597. expect(tagGroup.length).toEqual(1);
  598. let level1Nodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`);
  599. expect(level1Nodes.at(0).find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  600. });
  601. it('controlled: fire onChange and ui not update', () => {
  602. let spyOnChange = sinon.spy(() => { });
  603. let treeSelect = getTreeSelect({
  604. value: '',
  605. defaultExpandAll: true,
  606. onChange: spyOnChange,
  607. });
  608. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  609. let nodeBeijing = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  610. // select beijing
  611. nodeBeijing.simulate('click');
  612. // render tag
  613. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  614. expect(tagGroup.length).toEqual(0);
  615. // onChange
  616. expect(spyOnChange.calledOnce).toBe(true);
  617. expect(spyOnChange.calledWithMatch(["Beijing"])).toEqual(true);
  618. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(false);
  619. });
  620. it('disabled', () => {
  621. let treeSelect = getTreeSelect({
  622. defaultValue: ['Dongjing', 'Beijing'],
  623. disabled: true,
  624. });
  625. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tag-closable`).length).toEqual(0);
  626. });
  627. it('controlled: empty treeDate with value', () => {
  628. let treeSelect = getTreeSelect({
  629. value: [''],
  630. treeData: []
  631. });
  632. expect(treeSelect.state().selectedKeys.length).toEqual(0);
  633. });
  634. it('renderSelectedItem', () => {
  635. let spyOnSelect = sinon.spy(() => { });
  636. let spyOnChange = sinon.spy(() => { });
  637. let treeSelect = getTreeSelect({
  638. renderSelectedItem: (item, { index, onClose }) => ({ content: item.value, isRenderInTag: true }),
  639. defaultExpandAll: true,
  640. onSelect: spyOnSelect,
  641. onChange: spyOnChange,
  642. });
  643. const yaZhouKey = 'yazhou';
  644. const yaZhouValue = 'Yazhou';
  645. let nodeYaZhou = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  646. nodeYaZhou.simulate('click');
  647. // 判断回调
  648. expect(spyOnSelect.calledOnce).toBe(true);
  649. expect(spyOnChange.calledOnce).toBe(true);
  650. expect(spyOnSelect.getCall(0).args[0]).toEqual(yaZhouKey);
  651. expect(spyOnChange.getCall(0).args[0]).toEqual([yaZhouValue]);
  652. // 判断内容是否value
  653. const innerHTML = document.querySelector('.semi-tag .semi-tag-content').textContent;
  654. expect(innerHTML).toEqual(yaZhouValue);
  655. });
  656. it('disabledStrictly', () => {
  657. const treeSelect1 = mount(
  658. <TreeSelect
  659. style={{ width: 300 }}
  660. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  661. multiple
  662. defaultOpen
  663. defaultExpandAll
  664. disableStrictly
  665. leafOnly
  666. treeData={treeData}
  667. {...commonProps}
  668. />
  669. );
  670. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(0);
  671. const clickedNode1 = treeSelect1.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  672. clickedNode1.simulate('click', {})
  673. expect(treeSelect1.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(4);
  674. const treeSelect2 = mount(
  675. <TreeSelect
  676. style={{ width: 300 }}
  677. dropdownStyle={{ maxHeight: 400, overflow: 'auto' }}
  678. multiple
  679. defaultOpen
  680. defaultExpandAll
  681. disableStrictly
  682. treeData={treeDataWithDisabled}
  683. {...commonProps}
  684. />
  685. );
  686. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(0);
  687. const clickedNode2 = treeSelect2.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-1`).at(0);
  688. clickedNode2.simulate('click', {})
  689. expect(treeSelect2.find(`.${BASE_CLASS_PREFIX}-tag`).length).toEqual(1);
  690. });
  691. it('searchPosition is trigger', () => {
  692. const treeSelect = getTreeSelect({
  693. searchPosition: 'trigger',
  694. filterTreeNode: true,
  695. multiple: true,
  696. maxTagCount: 1,
  697. defaultValue: ['Zhongguo', 'Meiguo']
  698. });
  699. const selection = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tree-select-selection`);
  700. expect(selection.find(`.${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-tag`).length).toEqual(1);
  701. expect(selection.find(`.${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-tagInput-wrapper-n`).at(0).getDOMNode().textContent).toEqual('+1');
  702. const input = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-input`);
  703. const searchValue = '北';
  704. const event = { target: { value: searchValue } };
  705. input.simulate('change', event);
  706. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  707. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  708. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(0).instance().textContent).toEqual('北');
  709. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(1).instance().textContent).toEqual('北');
  710. });
  711. it('searchPosition is trigger + leafOnly', () => {
  712. const spyOnSelect = sinon.spy(() => { });
  713. const treeSelect = getTreeSelect({
  714. onSelect: spyOnSelect,
  715. searchPosition: 'trigger',
  716. filterTreeNode: true,
  717. multiple: true,
  718. defaultExpandAll: true,
  719. leafOnly: true,
  720. });
  721. // Check if leafOnly is working
  722. const nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  723. nodeChina.simulate('click');
  724. expect(spyOnSelect.calledOnce).toBe(true);
  725. expect(spyOnSelect.calledWithMatch('zhongguo', true, { key: "zhongguo" })).toEqual(true);
  726. const tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  727. expect(tagGroup.length).toEqual(2);
  728. // Check if searchPosition='trigger' is working
  729. const input = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select .${BASE_CLASS_PREFIX}-tagInput .${BASE_CLASS_PREFIX}-input`);
  730. const searchValue = '北';
  731. const event = { target: { value: searchValue } };
  732. input.simulate('change', event);
  733. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option`).length).toEqual(6);
  734. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).length).toEqual(2);
  735. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(0).instance().textContent).toEqual('北');
  736. expect(treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-highlight`).at(1).instance().textContent).toEqual('北');
  737. });
  738. it('unRelated', () => {
  739. const spyOnChange = sinon.spy(() => { });
  740. const tree = getTreeSelect({
  741. defaultExpandAll: true,
  742. onChange: spyOnChange,
  743. checkRelation: 'unRelated',
  744. });
  745. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  746. const selectedNode = nodelevel2.at(0);
  747. selectedNode.simulate('click');
  748. expect(spyOnChange.calledOnce).toBe(true);
  749. expect(spyOnChange.calledWithMatch(['Zhongguo'])).toEqual(true);
  750. // Note: selectedNode cannot be used directly here. selectedNode is the original node in the unselected state
  751. expect(
  752. tree
  753. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  754. .at(0)
  755. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  756. ).toEqual(true);
  757. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  758. expect(
  759. nodelevel3
  760. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  761. ).toEqual(true);
  762. expect(
  763. nodelevel3
  764. .at(1)
  765. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  766. ).toEqual(true);
  767. });
  768. it('unRelated + value', () => {
  769. const tree = getTreeSelect({
  770. defaultExpandAll: true,
  771. checkRelation: 'unRelated',
  772. value: 'Zhongguo'
  773. });
  774. expect(
  775. tree
  776. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  777. .at(0)
  778. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  779. ).toEqual(true);
  780. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  781. expect(
  782. nodelevel3
  783. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  784. ).toEqual(true);
  785. expect(
  786. nodelevel3
  787. .at(1)
  788. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  789. ).toEqual(true);
  790. });
  791. it('unRelated + defaultValue', () => {
  792. const tree = getTreeSelect({
  793. defaultExpandAll: true,
  794. checkRelation: 'unRelated',
  795. defaultValue: 'Zhongguo'
  796. });
  797. expect(
  798. tree
  799. .find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`)
  800. .at(0)
  801. .exists(`.${BASE_CLASS_PREFIX}-checkbox-checked`)
  802. ).toEqual(true);
  803. const nodelevel3 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  804. expect(
  805. nodelevel3
  806. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  807. ).toEqual(true);
  808. expect(
  809. nodelevel3
  810. .at(1)
  811. .exists(`.${BASE_CLASS_PREFIX}-checkbox-unChecked` )
  812. ).toEqual(true);
  813. });
  814. it('unRelated + onSelect', () => {
  815. const spyOnSelect = sinon.spy(() => { });
  816. const tree = getTreeSelect({
  817. defaultExpandAll: true,
  818. onSelect: spyOnSelect,
  819. checkRelation: 'unRelated',
  820. });
  821. const nodelevel2 = tree.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`);
  822. const selectedNode = nodelevel2.at(0);
  823. selectedNode.simulate('click');
  824. expect(spyOnSelect.calledOnce).toBe(true);
  825. // onSelect first args is key, not value
  826. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  827. });
  828. it('option not in treeData + treeData item with value', () => {
  829. const spyOnSelect = sinon.spy(() => { });
  830. const spyOnChange = sinon.spy(() => { });
  831. const treeSelect = getTreeSelect({
  832. defaultValue: ['Beijing', 'fish'],
  833. onSelect: spyOnSelect,
  834. onChange: spyOnChange,
  835. });
  836. // Nodes that do not exist in treeData also appear in the tag input box
  837. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  838. expect(tagGroup.length).toEqual(2);
  839. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  840. expect(tagGroup.at(1).instance().textContent).toEqual('fish');
  841. // Only one item is selected in the panel
  842. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  843. let selectedNode = selectedNodes.at(0);
  844. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  845. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  846. // Check for fish in onSelect and onChange
  847. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  848. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  849. closeBtn.simulate('click', nativeEvent);
  850. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  851. expect(tagGroup.length).toEqual(1);
  852. expect(tagGroup.at(0).instance().textContent).toEqual('fish');
  853. expect(spyOnChange.calledOnce).toBe(true);
  854. expect(spyOnChange.calledWithMatch(['fish'])).toEqual(true);
  855. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  856. // select China
  857. nodeChina.simulate('click');
  858. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  859. expect(spyOnChange.calledWithMatch(['fish', 'Zhongguo'])).toEqual(true);
  860. });
  861. it('option not in treeData + treeData item has value + onChangeWithObject', () => {
  862. const spyOnSelect = sinon.spy(() => { });
  863. const spyOnChange = sinon.spy(() => { });
  864. const treeSelect = getTreeSelect({
  865. defaultValue: treeChildrenWithFakeObj,
  866. onSelect: spyOnSelect,
  867. onChange: spyOnChange,
  868. defaultExpandAll: true,
  869. onChangeWithObject: true
  870. });
  871. // Nodes that do not exist in treeData also appear in the tag input box
  872. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  873. expect(tagGroup.length).toEqual(2);
  874. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  875. expect(tagGroup.at(1).instance().textContent).toEqual('鱼');
  876. // Only one item is selected in the panel
  877. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  878. let selectedNode = selectedNodes.at(0);
  879. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  880. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  881. // Check for fish in onSelect and onChange
  882. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  883. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  884. closeBtn.simulate('click', nativeEvent);
  885. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  886. expect(tagGroup.length).toEqual(1);
  887. expect(tagGroup.at(0).instance().textContent).toEqual('鱼');
  888. expect(spyOnChange.calledOnce).toBe(true);
  889. expect(spyOnChange.calledWithMatch([{ label: '鱼', value: 'Fish', key: 'fish' }])).toEqual(true);
  890. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  891. // select China
  892. nodeChina.simulate('click');
  893. expect(spyOnSelect.calledWithMatch('beijing')).toEqual(true);
  894. expect(spyOnChange.calledWithMatch([
  895. { label: '鱼', value: 'Fish', key: 'fish' },
  896. { label: '北京', value: 'Beijing', key: 'beijing' }
  897. ])).toEqual(true);
  898. });
  899. it('option not in treeData + treeData item without value ', () => {
  900. const spyOnSelect = sinon.spy(() => { });
  901. const spyOnChange = sinon.spy(() => { });
  902. const treeSelect = getTreeSelect({
  903. treeData: treeDataWithoutValue,
  904. defaultValue: ['beijing', 'fish'],
  905. onSelect: spyOnSelect,
  906. onChange: spyOnChange,
  907. });
  908. // Nodes that do not exist in treeData also appear in the tag input box
  909. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  910. expect(tagGroup.length).toEqual(2);
  911. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  912. expect(tagGroup.at(1).instance().textContent).toEqual('fish');
  913. // Only one item is selected in the panel
  914. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  915. let selectedNode = selectedNodes.at(0);
  916. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  917. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  918. // Check for fish in onSelect and onChange
  919. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  920. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  921. closeBtn.simulate('click', nativeEvent);
  922. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  923. expect(tagGroup.length).toEqual(1);
  924. expect(tagGroup.at(0).instance().textContent).toEqual('fish');
  925. expect(spyOnChange.calledOnce).toBe(true);
  926. expect(spyOnChange.calledWithMatch(['fish'])).toEqual(true);
  927. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  928. // select China
  929. nodeChina.simulate('click');
  930. expect(spyOnSelect.calledWithMatch('zhongguo')).toEqual(true);
  931. expect(spyOnChange.calledWithMatch(['fish', 'zhongguo'])).toEqual(true);
  932. });
  933. it('option not in treeData + treeData item without value + onChangeWithObject', () => {
  934. const spyOnSelect = sinon.spy(() => { });
  935. const spyOnChange = sinon.spy(() => { });
  936. const treeSelect = getTreeSelect({
  937. treeData: treeDataWithoutValue,
  938. defaultValue: [
  939. { label: '北京', key: 'beijing' },
  940. { label: '鱼', key: 'fish' }
  941. ],
  942. onSelect: spyOnSelect,
  943. onChange: spyOnChange,
  944. defaultExpandAll: true,
  945. onChangeWithObject: true
  946. });
  947. // Nodes that do not exist in treeData also appear in the tag input box
  948. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  949. expect(tagGroup.length).toEqual(2);
  950. expect(tagGroup.at(0).instance().textContent).toEqual('北京');
  951. expect(tagGroup.at(1).instance().textContent).toEqual('鱼');
  952. // Only one item is selected in the panel
  953. let selectedNodes = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`);
  954. let selectedNode = selectedNodes.at(0);
  955. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  956. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  957. // Check for fish in onSelect and onChange
  958. let closeBtn = tagGroup.at(0).find(`.${BASE_CLASS_PREFIX}-tag-close`);
  959. const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => { } } }
  960. closeBtn.simulate('click', nativeEvent);
  961. tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  962. expect(tagGroup.length).toEqual(1);
  963. expect(tagGroup.at(0).instance().textContent).toEqual('鱼');
  964. expect(spyOnChange.calledOnce).toBe(true);
  965. expect(spyOnChange.calledWithMatch([{ label: '鱼', key: 'fish' }])).toEqual(true);
  966. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  967. // select China
  968. nodeChina.simulate('click');
  969. expect(spyOnSelect.calledWithMatch('beijing')).toEqual(true);
  970. expect(spyOnChange.calledWithMatch([
  971. { label: '鱼', key: 'fish' },
  972. { label: '北京', key: 'beijing' }
  973. ])).toEqual(true);
  974. });
  975. it('keyMaps', () => {
  976. let spyOnChange = sinon.spy(() => { });
  977. let treeSelect = getTreeSelect({
  978. treeData: specialTreeData,
  979. defaultValue: 'Beijing',
  980. onChange: spyOnChange,
  981. defaultExpandAll: true,
  982. motion: false,
  983. keyMaps: defaultKeyMaps
  984. });
  985. let disabledNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`).at(0);
  986. expect(disabledNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('中国');
  987. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  988. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  989. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  990. let nodeShanghai = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(1);
  991. nodeShanghai.simulate('click');
  992. // onSelect & onChange
  993. expect(spyOnChange.calledOnce).toBe(true);
  994. expect(spyOnChange.calledWithMatch(["Zhongguo"])).toEqual(true);
  995. const nodeZhongguo = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  996. expect(nodeZhongguo.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  997. let selectContentNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).at(0);
  998. expect(selectContentNode.find(`.${BASE_CLASS_PREFIX}-tag-content`).instance().textContent).toEqual('中国');
  999. });
  1000. it('keyMaps + onChangeWithObject', () => {
  1001. let spyOnChange = sinon.spy(() => { });
  1002. let treeSelect = getTreeSelect({
  1003. treeData: specialTreeData,
  1004. defaultValue: {
  1005. label1: '北京',
  1006. value1: 'Beijing',
  1007. key1: 'beijing',
  1008. },
  1009. onChangeWithObject: true,
  1010. onChange: spyOnChange,
  1011. defaultExpandAll: true,
  1012. keyMaps: defaultKeyMaps
  1013. });
  1014. let disabledNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option-disabled`).at(0);
  1015. expect(disabledNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('中国');
  1016. let selectedNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(0);
  1017. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-checkbox-inner-checked`).exists()).toEqual(true);
  1018. expect(selectedNode.find(`.${BASE_CLASS_PREFIX}-tree-option-label-text`).instance().textContent).toEqual('北京');
  1019. let nodeShanghai = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-3`).at(1);
  1020. nodeShanghai.simulate('click');
  1021. // onSelect & onChange
  1022. expect(spyOnChange.calledOnce).toBe(true);
  1023. expect(spyOnChange.calledWithMatch([(specialTreeData[0].children1)[0]])).toEqual(true);
  1024. let selectContentNode = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-select-selection`).at(0);
  1025. expect(selectContentNode.find(`.${BASE_CLASS_PREFIX}-tag-content`).instance().textContent).toEqual('中国');
  1026. });
  1027. it('onChange + autoMergeValue', () => {
  1028. let spyOnSelect = sinon.spy(() => { });
  1029. let spyOnChange = sinon.spy(() => { });
  1030. let treeSelect = getTreeSelect({
  1031. defaultExpandAll: true,
  1032. onSelect: spyOnSelect,
  1033. onChange: spyOnChange,
  1034. autoMergeValue: false,
  1035. });
  1036. let nodeChina = treeSelect.find(`.${BASE_CLASS_PREFIX}-tree-option.${BASE_CLASS_PREFIX}-tree-option-level-2`).at(0);
  1037. // select China
  1038. nodeChina.simulate('click');
  1039. // onSelect & onChange
  1040. expect(spyOnSelect.calledOnce).toBe(true);
  1041. expect(spyOnChange.calledOnce).toBe(true);
  1042. expect(spyOnSelect.calledWithMatch('zhongguo', true, { key: "zhongguo" })).toEqual(true);
  1043. expect(spyOnChange.calledWithMatch(
  1044. ['Zhongguo', 'Beijing', 'Shanghai'],
  1045. )).toEqual(true);
  1046. let tagGroup = treeSelect.find(`.${BASE_CLASS_PREFIX}-tag`);
  1047. expect(tagGroup.length).toEqual(3);
  1048. });
  1049. })