tree.spec.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861
  1. import { createVue, destroyVM, waitImmediate } from '../util';
  2. const DELAY = 10;
  3. describe('Tree', () => {
  4. let vm;
  5. afterEach(() => {
  6. destroyVM(vm);
  7. });
  8. const getTreeVm = (props, options) => {
  9. return createVue(Object.assign({
  10. template: `
  11. <el-tree ref="tree" :data="data" ${ props }></el-tree>
  12. `,
  13. data() {
  14. return {
  15. defaultExpandedKeys: [],
  16. defaultCheckedKeys: [],
  17. clickedNode: null,
  18. count: 1,
  19. data: [{
  20. id: 1,
  21. label: '一级 1',
  22. children: [{
  23. id: 11,
  24. label: '二级 1-1',
  25. children: [{
  26. id: 111,
  27. label: '三级 1-1'
  28. }]
  29. }]
  30. }, {
  31. id: 2,
  32. label: '一级 2',
  33. children: [{
  34. id: 21,
  35. label: '二级 2-1'
  36. }, {
  37. id: 22,
  38. label: '二级 2-2'
  39. }]
  40. }, {
  41. id: 3,
  42. label: '一级 3',
  43. children: [{
  44. id: 31,
  45. label: '二级 3-1'
  46. }, {
  47. id: 32,
  48. label: '二级 3-2'
  49. }]
  50. }],
  51. defaultProps: {
  52. children: 'children',
  53. label: 'label'
  54. }
  55. };
  56. }
  57. }, options), true);
  58. };
  59. const getDisableTreeVm = (props, options) => {
  60. return createVue(Object.assign({
  61. template: `
  62. <el-tree ref="tree" :data="data" ${ props }></el-tree>
  63. `,
  64. data() {
  65. return {
  66. defaultExpandedKeys: [],
  67. defaultCheckedKeys: [],
  68. clickedNode: null,
  69. count: 1,
  70. data: [{
  71. id: 1,
  72. label: '一级 1',
  73. children: [{
  74. id: 11,
  75. label: '二级 1-1',
  76. children: [{
  77. id: 111,
  78. label: '三级 1-1',
  79. disabled: true
  80. }]
  81. }]
  82. }, {
  83. id: 2,
  84. label: '一级 2',
  85. children: [{
  86. id: 21,
  87. label: '二级 2-1'
  88. }, {
  89. id: 22,
  90. label: '二级 2-2'
  91. }]
  92. }, {
  93. id: 3,
  94. label: '一级 3',
  95. children: [{
  96. id: 31,
  97. label: '二级 3-1'
  98. }, {
  99. id: 32,
  100. label: '二级 3-2'
  101. }]
  102. }],
  103. defaultProps: {
  104. children: 'children',
  105. label: 'label',
  106. disabled: 'disabled'
  107. }
  108. };
  109. }
  110. }, options), true);
  111. };
  112. const ALL_NODE_COUNT = 9;
  113. it('create', () => {
  114. vm = getTreeVm(':props="defaultProps" default-expand-all');
  115. expect(document.querySelector('.el-tree')).to.exist;
  116. expect(document.querySelectorAll('.el-tree > .el-tree-node').length).to.equal(3);
  117. expect(document.querySelectorAll('.el-tree .el-tree-node').length).to.equal(ALL_NODE_COUNT);
  118. vm.data[1].children = [{ label: '二级 2-1' }];
  119. const tree = vm.$children[0];
  120. expect(tree.children).to.deep.equal(vm.data);
  121. });
  122. it('click node', done => {
  123. vm = getTreeVm(':props="defaultProps" @node-click="handleNodeClick"', {
  124. methods: {
  125. handleNodeClick(data) {
  126. this.clickedNode = data;
  127. }
  128. }
  129. });
  130. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  131. firstNode.click();
  132. expect(vm.clickedNode.label).to.equal('一级 1');
  133. setTimeout(() => {
  134. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  135. firstNode.click();
  136. setTimeout(() => {
  137. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  138. done();
  139. }, DELAY);
  140. }, DELAY);
  141. });
  142. it('current change', done => {
  143. vm = getTreeVm(':props="defaultProps" @current-change="handleCurrentChange"', {
  144. methods: {
  145. handleCurrentChange(data) {
  146. this.currentNode = data;
  147. }
  148. }
  149. });
  150. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  151. firstNode.click();
  152. expect(vm.currentNode.label).to.equal('一级 1');
  153. done();
  154. });
  155. it('emptyText', (done) => {
  156. vm = getTreeVm(':props="defaultProps"');
  157. vm.data = [];
  158. vm.$nextTick(() => {
  159. expect(vm.$el.querySelectorAll('.el-tree__empty-block').length).to.equal(1);
  160. done();
  161. });
  162. });
  163. it('highlight current', done => {
  164. vm = getTreeVm(':props="defaultProps" highlight-current');
  165. const firstNode = document.querySelector('.el-tree-node');
  166. firstNode.click();
  167. vm.$nextTick(() => {
  168. expect(firstNode.className.indexOf('is-current')).to.not.equal(-1);
  169. done();
  170. });
  171. });
  172. it('expandOnNodeClick', done => {
  173. vm = getTreeVm(':props="defaultProps" :expand-on-click-node="false"');
  174. const firstNode = document.querySelector('.el-tree-node');
  175. firstNode.click();
  176. vm.$nextTick(() => {
  177. expect(firstNode.className.indexOf('is-expanded')).to.equal(-1);
  178. done();
  179. });
  180. });
  181. it('checkOnNodeClick', done => {
  182. vm = getTreeVm(':props="defaultProps" show-checkbox check-on-click-node');
  183. const firstNode = document.querySelector('.el-tree-node');
  184. firstNode.click();
  185. vm.$nextTick(() => {
  186. expect(firstNode.querySelector('input').checked).to.true;
  187. done();
  188. });
  189. });
  190. it('current-node-key', () => {
  191. vm = getTreeVm(':props="defaultProps" default-expand-all highlight-current node-key="id" :current-node-key="11"');
  192. const currentNodeLabel = document.querySelector('.is-current .el-tree-node__label').textContent;
  193. expect(currentNodeLabel).to.be.equal('二级 1-1');
  194. });
  195. it('defaultExpandAll', () => {
  196. vm = getTreeVm(':props="defaultProps" default-expand-all');
  197. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(ALL_NODE_COUNT);
  198. });
  199. it('defaultExpandedKeys', () => {
  200. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  201. created() {
  202. this.defaultExpandedKeys = [1, 3];
  203. }
  204. });
  205. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  206. });
  207. it('defaultExpandedKeys set', (done) => {
  208. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  209. created() {
  210. this.defaultExpandedKeys = [1, 3];
  211. }
  212. });
  213. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  214. vm.defaultExpandedKeys = [2];
  215. vm.data = JSON.parse(JSON.stringify(vm.data));
  216. setTimeout(() => {
  217. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(1);
  218. done();
  219. }, 50);
  220. });
  221. it('filter-node-method', (done) => {
  222. vm = getTreeVm(':props="defaultProps" :filter-node-method="filterNode"', {
  223. methods: {
  224. filterNode(value, data) {
  225. if (!value) return true;
  226. return data.label.indexOf(value) !== -1;
  227. }
  228. }
  229. });
  230. const tree = vm.$refs.tree;
  231. tree.filter('2-1');
  232. setTimeout(() => {
  233. expect(tree.$el.querySelectorAll('.el-tree-node.is-hidden').length).to.equal(3);
  234. done();
  235. }, 100);
  236. });
  237. it('autoExpandParent = true', () => {
  238. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  239. created() {
  240. this.defaultExpandedKeys = [111];
  241. }
  242. });
  243. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(3);
  244. });
  245. it('autoExpandParent = false', (done) => {
  246. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id" :auto-expand-parent="false"', {
  247. created() {
  248. this.defaultExpandedKeys = [11];
  249. }
  250. });
  251. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(0);
  252. const firstNode = document.querySelector('.el-tree-node__content');
  253. firstNode.querySelector('.el-tree-node__expand-icon').click();
  254. setTimeout(() => {
  255. expect(document.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  256. done();
  257. }, 100);
  258. });
  259. it('defaultCheckedKeys & check-strictly = false', () => {
  260. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id"', {
  261. created() {
  262. this.defaultCheckedKeys = [1];
  263. }
  264. });
  265. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(3);
  266. });
  267. it('defaultCheckedKeys & check-strictly', () => {
  268. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id" check-strictly', {
  269. created() {
  270. this.defaultCheckedKeys = [1];
  271. }
  272. });
  273. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(1);
  274. });
  275. it('defaultCheckedKeys & lazy, checked children length as expected', () => {
  276. vm = getTreeVm(':load="loadNode" :props="defaultProps" :default-checked-keys="defaultCheckedKeys" node-key="id" :default-expanded-keys="[1]" lazy show-checkbox ', {
  277. created() {
  278. this.defaultCheckedKeys = [2, 3];
  279. },
  280. methods: {
  281. loadNode(node, resolve) {
  282. if (node.level === 0) {
  283. return resolve([{ label: 'head', id: 1} ]);
  284. }
  285. return resolve([
  286. {
  287. label: '#1',
  288. id: 2
  289. },
  290. {
  291. label: '#3',
  292. id: 3
  293. },
  294. {
  295. label: '$4',
  296. id: 5
  297. }
  298. ]);
  299. }
  300. }
  301. });
  302. expect(vm.$el.querySelectorAll('.el-checkbox.is-checked').length).to.equal(2);
  303. });
  304. it('show checkbox', done => {
  305. vm = getTreeVm(':props="defaultProps" show-checkbox');
  306. const tree = vm.$children[0];
  307. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  308. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  309. expect(nodeCheckbox).to.be.exist;
  310. nodeCheckbox.click();
  311. setTimeout(() => {
  312. expect(tree.getCheckedNodes().length).to.equal(3);
  313. expect(tree.getCheckedNodes(true).length).to.equal(2);
  314. secondNode.querySelector('.el-tree-node__expand-icon').click();
  315. setTimeout(() => {
  316. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  317. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  318. leafCheckbox.click();
  319. setTimeout(() => {
  320. expect(tree.getCheckedNodes().length).to.equal(1);
  321. done();
  322. }, 10);
  323. }, 10);
  324. }, 10);
  325. });
  326. it('check', done => {
  327. const spy = sinon.spy();
  328. vm = getTreeVm(':props="defaultProps" show-checkbox @check="handleCheck"', {
  329. methods: {
  330. handleCheck: spy
  331. }
  332. });
  333. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  334. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  335. expect(nodeCheckbox).to.be.exist;
  336. nodeCheckbox.click();
  337. setTimeout(() => {
  338. expect(spy.calledOnce).to.be.true;
  339. const [data, args] = spy.args[0];
  340. expect(data.id).to.equal(2);
  341. expect(args.checkedNodes.length).to.equal(3);
  342. done();
  343. }, 10);
  344. });
  345. it('setCheckedNodes', (done) => {
  346. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  347. const tree = vm.$children[0];
  348. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  349. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  350. nodeCheckbox.click();
  351. setTimeout(() => {
  352. expect(tree.getCheckedNodes().length).to.equal(3);
  353. expect(tree.getCheckedNodes(true).length).to.equal(2);
  354. setTimeout(() => {
  355. tree.setCheckedNodes([]);
  356. expect(tree.getCheckedNodes().length).to.equal(0);
  357. done();
  358. }, 10);
  359. }, 10);
  360. });
  361. it('setCheckedKeys', async() => {
  362. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  363. const tree = vm.$children[0];
  364. tree.setCheckedKeys([111]);
  365. await waitImmediate();
  366. expect(tree.getCheckedNodes().length).to.equal(3);
  367. expect(tree.getCheckedKeys().length).to.equal(3);
  368. tree.setCheckedKeys([1]);
  369. await waitImmediate();
  370. expect(tree.getCheckedNodes().length).to.equal(3);
  371. expect(tree.getCheckedKeys().length).to.equal(3);
  372. tree.setCheckedKeys([2]);
  373. await waitImmediate();
  374. expect(tree.getCheckedNodes().length).to.equal(3);
  375. expect(tree.getCheckedKeys().length).to.equal(3);
  376. tree.setCheckedKeys([21]);
  377. await waitImmediate();
  378. expect(tree.getCheckedNodes().length).to.equal(1);
  379. expect(tree.getCheckedKeys().length).to.equal(1);
  380. });
  381. it('setCheckedKeys with checkStrictly', async() => {
  382. vm = getTreeVm(':props="defaultProps" checkStrictly show-checkbox node-key="id"');
  383. const tree = vm.$children[0];
  384. tree.setCheckedKeys([111]);
  385. expect(tree.getCheckedNodes().length).to.equal(1);
  386. expect(tree.getCheckedKeys().length).to.equal(1);
  387. tree.setCheckedKeys([1]);
  388. await waitImmediate();
  389. expect(tree.getCheckedNodes().length).to.equal(1);
  390. expect(tree.getCheckedKeys().length).to.equal(1);
  391. tree.setCheckedKeys([2]);
  392. await waitImmediate();
  393. expect(tree.getCheckedNodes().length).to.equal(1);
  394. expect(tree.getCheckedKeys().length).to.equal(1);
  395. tree.setCheckedKeys([21, 22]);
  396. await waitImmediate();
  397. expect(tree.getCheckedNodes().length).to.equal(2);
  398. expect(tree.getCheckedKeys().length).to.equal(2);
  399. });
  400. it('method setChecked', () => {
  401. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  402. const tree = vm.$children[0];
  403. tree.setChecked(111, true, true);
  404. expect(tree.getCheckedNodes().length).to.equal(3);
  405. expect(tree.getCheckedKeys().length).to.equal(3);
  406. tree.setChecked(vm.data[0], false, true);
  407. expect(tree.getCheckedNodes().length).to.equal(0);
  408. expect(tree.getCheckedKeys().length).to.equal(0);
  409. });
  410. it('setCheckedKeys with leafOnly=false', async() => {
  411. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  412. const tree = vm.$children[0];
  413. tree.setCheckedKeys([1, 11, 111, 2], false);
  414. await waitImmediate();
  415. expect(tree.getCheckedNodes().length).to.equal(6);
  416. expect(tree.getCheckedKeys().length).to.equal(6);
  417. });
  418. it('setCheckedKeys with leafOnly=true', async() => {
  419. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  420. const tree = vm.$children[0];
  421. tree.setCheckedKeys([2], true);
  422. await waitImmediate();
  423. expect(tree.getCheckedNodes().length).to.equal(2);
  424. expect(tree.getCheckedKeys().length).to.equal(2);
  425. });
  426. it('setCurrentKey', (done) => {
  427. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  428. const tree = vm.$children[0];
  429. tree.setCurrentKey(111);
  430. vm.$nextTick(() => {
  431. expect(tree.store.currentNode.data.id).to.equal(111);
  432. // cancel highlight
  433. tree.setCurrentKey(null);
  434. vm.$nextTick(() => {
  435. expect(tree.store.currentNode).to.equal(null);
  436. done();
  437. });
  438. });
  439. });
  440. it('setCurrentNode', (done) => {
  441. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  442. const tree = vm.$children[0];
  443. tree.setCurrentNode({
  444. id: 111,
  445. label: '三级 1-1'
  446. });
  447. vm.$nextTick(() => {
  448. expect(tree.store.currentNode.data.id).to.equal(111);
  449. done();
  450. });
  451. });
  452. it('getCurrentKey', (done) => {
  453. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  454. const tree = vm.$children[0];
  455. tree.setCurrentKey(111);
  456. vm.$nextTick(() => {
  457. expect(tree.getCurrentKey()).to.equal(111);
  458. done();
  459. });
  460. });
  461. it('getCurrentNode', (done) => {
  462. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  463. const tree = vm.$children[0];
  464. tree.setCurrentKey(111);
  465. vm.$nextTick(() => {
  466. expect(tree.getCurrentNode().id).to.equal(111);
  467. done();
  468. });
  469. });
  470. it('getNode', () => {
  471. vm = getTreeVm(':props="defaultProps" node-key="id"');
  472. const tree = vm.$children[0];
  473. const node = tree.getNode(111);
  474. expect(node.data.id).to.equal(111);
  475. });
  476. it('remove', (done) => {
  477. vm = getTreeVm(':props="defaultProps" node-key="id"');
  478. const tree = vm.$children[0];
  479. tree.remove(1);
  480. vm.$nextTick(() => {
  481. expect(vm.data[0].id).to.equal(2);
  482. expect(tree.getNode(1)).to.equal(null);
  483. done();
  484. });
  485. });
  486. it('append', () => {
  487. vm = getTreeVm(':props="defaultProps" node-key="id"');
  488. const tree = vm.$children[0];
  489. const nodeData = { id: 88, label: '88' };
  490. tree.append(nodeData, tree.getNode(1));
  491. expect(vm.data[0].children.length).to.equal(2);
  492. expect(tree.getNode(88).data).to.equal(nodeData);
  493. });
  494. it('insertBefore', () => {
  495. vm = getTreeVm(':props="defaultProps" node-key="id"');
  496. const tree = vm.$children[0];
  497. const nodeData = { id: 88, label: '88' };
  498. tree.insertBefore(nodeData, tree.getNode(11));
  499. expect(vm.data[0].children.length).to.equal(2);
  500. expect(vm.data[0].children[0]).to.equal(nodeData);
  501. expect(tree.getNode(88).data).to.equal(nodeData);
  502. });
  503. it('insertAfter', () => {
  504. vm = getTreeVm(':props="defaultProps" node-key="id"');
  505. const tree = vm.$children[0];
  506. const nodeData = { id: 88, label: '88' };
  507. tree.insertAfter(nodeData, tree.getNode(11));
  508. expect(vm.data[0].children.length).to.equal(2);
  509. expect(vm.data[0].children[1]).to.equal(nodeData);
  510. expect(tree.getNode(88).data).to.equal(nodeData);
  511. });
  512. it('set disabled checkbox', done => {
  513. vm = getDisableTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  514. const node = document.querySelectorAll('.el-tree-node__content')[2];
  515. const nodeCheckbox = node.querySelector('.el-checkbox input');
  516. vm.$nextTick(() => {
  517. expect(nodeCheckbox.disabled).to.equal(true);
  518. done();
  519. });
  520. });
  521. it('check strictly', (done) => {
  522. vm = getTreeVm(':props="defaultProps" show-checkbox check-strictly default-expand-all');
  523. const tree = vm.$children[0];
  524. const secondNode = document.querySelectorAll('.el-tree-node__content')[3];
  525. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  526. nodeCheckbox.click();
  527. expect(tree.getCheckedNodes().length).to.equal(1);
  528. expect(tree.getCheckedNodes(true).length).to.equal(0);
  529. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  530. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  531. vm.$nextTick(() => {
  532. leafCheckbox.click();
  533. expect(tree.getCheckedNodes().length).to.equal(2);
  534. done();
  535. });
  536. });
  537. it('render content', () => {
  538. vm = getTreeVm(':props="defaultProps" :render-content="renderContent"', {
  539. methods: {
  540. renderContent(h, node) {
  541. return (
  542. <span class="custom-content">
  543. <el-button>{ node.node.label }</el-button>
  544. </span>
  545. );
  546. }
  547. }
  548. });
  549. const firstNode = document.querySelector('.el-tree-node__content');
  550. expect(firstNode.querySelector('.custom-content')).to.exist;
  551. const button = firstNode.querySelector('.custom-content .el-button');
  552. expect(button).to.exist;
  553. expect(button.querySelector('span').textContent).to.equal('一级 1');
  554. });
  555. it('scoped slot', () => {
  556. vm = createVue({
  557. template: `
  558. <el-tree ref="tree" :data="data">
  559. <div slot-scope="scope" class="custom-tree-template">
  560. <span>{{ scope.node.label }}</span>
  561. <el-button></el-button>
  562. </div>
  563. </el-tree>
  564. `,
  565. data() {
  566. return {
  567. data: [{
  568. id: 1,
  569. label: '一级 1',
  570. children: [{
  571. id: 11,
  572. label: '二级 1-1',
  573. children: [{
  574. id: 111,
  575. label: '三级 1-1'
  576. }]
  577. }]
  578. }, {
  579. id: 2,
  580. label: '一级 2',
  581. children: [{
  582. id: 21,
  583. label: '二级 2-1'
  584. }, {
  585. id: 22,
  586. label: '二级 2-2'
  587. }]
  588. }, {
  589. id: 3,
  590. label: '一级 3',
  591. children: [{
  592. id: 31,
  593. label: '二级 3-1'
  594. }, {
  595. id: 32,
  596. label: '二级 3-2'
  597. }]
  598. }]
  599. };
  600. }
  601. }, true);
  602. const firstNode = document.querySelector('.custom-tree-template');
  603. expect(firstNode).to.exist;
  604. const span = firstNode.querySelector('span');
  605. const button = firstNode.querySelector('.el-button');
  606. expect(span).to.exist;
  607. expect(span.innerText).to.equal('一级 1');
  608. expect(button).to.exist;
  609. });
  610. it('load node', done => {
  611. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" show-checkbox', {
  612. methods: {
  613. loadNode(node, resolve) {
  614. if (node.level === 0) {
  615. return resolve([{ label: 'region1' }, { label: 'region2' }]);
  616. }
  617. if (node.level > 4) return resolve([]);
  618. setTimeout(() => {
  619. resolve([{
  620. label: 'zone' + this.count++
  621. }, {
  622. label: 'zone' + this.count++
  623. }]);
  624. }, 50);
  625. }
  626. }
  627. });
  628. const nodes = document.querySelectorAll('.el-tree-node__content');
  629. expect(nodes.length).to.equal(2);
  630. nodes[0].click();
  631. setTimeout(() => {
  632. expect(document.querySelectorAll('.el-tree-node__content').length).to.equal(4);
  633. done();
  634. }, 100);
  635. });
  636. it('lazy defaultChecked', done => {
  637. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  638. methods: {
  639. loadNode(node, resolve) {
  640. if (node.level === 0) {
  641. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  642. }
  643. if (node.level > 4) return resolve([]);
  644. setTimeout(() => {
  645. resolve([{
  646. label: 'zone' + this.count,
  647. id: this.count++
  648. }, {
  649. label: 'zone' + this.count,
  650. id: this.count++
  651. }]);
  652. }, 50);
  653. }
  654. }
  655. });
  656. const tree = vm.$children[0];
  657. const firstNode = document.querySelector('.el-tree-node__content');
  658. const initStatus = firstNode.querySelector('.is-indeterminate');
  659. expect(initStatus).to.equal(null);
  660. tree.store.setCheckedKeys([3]);
  661. firstNode.querySelector('.el-tree-node__expand-icon').click();
  662. setTimeout(() => {
  663. const clickStatus = firstNode.querySelector('.is-indeterminate');
  664. expect(clickStatus).to.not.equal(null);
  665. const child = document.querySelectorAll('.el-tree-node__content')[1];
  666. expect(child.querySelector('input').checked).to.equal(true);
  667. done();
  668. }, 300);
  669. });
  670. it('lazy expandOnChecked', done => {
  671. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox check-descendants', {
  672. methods: {
  673. loadNode(node, resolve) {
  674. if (node.level === 0) {
  675. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  676. }
  677. if (node.level > 2) return resolve([]);
  678. setTimeout(() => {
  679. resolve([{
  680. label: 'zone' + this.count,
  681. id: this.count++
  682. }, {
  683. label: 'zone' + this.count,
  684. id: this.count++
  685. }]);
  686. }, 10);
  687. }
  688. }
  689. });
  690. const tree = vm.$children[0];
  691. tree.store.setCheckedKeys([1]);
  692. setTimeout(() => {
  693. const checkedKeys = tree.getCheckedKeys();
  694. expect(checkedKeys.length).to.equal(7);
  695. done();
  696. }, 400);
  697. });
  698. it('lazy without expandOnChecked', done => {
  699. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  700. methods: {
  701. loadNode(node, resolve) {
  702. if (node.level === 0) {
  703. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  704. }
  705. if (node.level > 4) return resolve([]);
  706. setTimeout(() => {
  707. resolve([{
  708. label: 'zone' + this.count,
  709. id: this.count++
  710. }, {
  711. label: 'zone' + this.count,
  712. id: this.count++
  713. }]);
  714. }, 50);
  715. }
  716. }
  717. });
  718. const tree = vm.$children[0];
  719. tree.store.setCheckedKeys([1]);
  720. setTimeout(() => {
  721. const nodes = document.querySelectorAll('.el-tree-node__content');
  722. expect(nodes[0].querySelector('input').checked).to.equal(true);
  723. expect(nodes.length).to.equal(2);
  724. done();
  725. }, 300);
  726. });
  727. it('accordion', done => {
  728. vm = getTreeVm(':props="defaultProps" accordion');
  729. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  730. const secondNode = vm.$el.querySelector('.el-tree-node:nth-child(2) .el-tree-node__content');
  731. firstNode.click();
  732. setTimeout(() => {
  733. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  734. secondNode.click();
  735. setTimeout(() => {
  736. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  737. done();
  738. }, DELAY);
  739. }, DELAY);
  740. });
  741. it('handleNodeOpen & handleNodeClose', (done) => {
  742. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" @node-expand="handleNodeOpen" @node-collapse="handleNodeClose"', {
  743. methods: {
  744. loadNode(node, resolve) {
  745. if (node.level === 0) {
  746. return resolve([{label: 'region1'}, {label: 'region2'}]);
  747. }
  748. if (node.level > 4) return resolve([]);
  749. setTimeout(() => {
  750. resolve([{
  751. label: 'zone' + this.count++
  752. }, {
  753. label: 'zone' + this.count++
  754. }]);
  755. }, 50);
  756. },
  757. handleNodeOpen(data, node, vm) {
  758. this.currentNode = data;
  759. this.nodeExpended = true;
  760. },
  761. handleNodeClose(data, node, vm) {
  762. this.currentNode = data;
  763. this.nodeExpended = false;
  764. }
  765. }
  766. });
  767. const firstNode = document.querySelector('.el-tree-node__content');
  768. expect(firstNode.nextElementSibling).to.not.exist;
  769. firstNode.click();
  770. setTimeout(() => {
  771. expect(vm.nodeExpended).to.equal(true);
  772. expect(vm.currentNode.label).to.equal('region1');
  773. firstNode.click();
  774. setTimeout(() => {
  775. expect(vm.nodeExpended).to.equal(false);
  776. expect(vm.currentNode.label).to.equal('region1');
  777. done();
  778. }, 100);
  779. }, 100);
  780. });
  781. it('updateKeyChildren', (done) => {
  782. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  783. const tree = vm.$children[0];
  784. tree.updateKeyChildren(1, [{
  785. id: 111,
  786. label: '三级 1-1'
  787. }]);
  788. const node = document.querySelectorAll('.el-tree-node__content')[2];
  789. const label = node.querySelector('.el-tree-node__label');
  790. vm.$nextTick(() => {
  791. expect(tree.store.nodesMap['11']).to.equal(undefined);
  792. expect(tree.store.nodesMap['1'].childNodes[0].data.id).to.equal(111);
  793. expect(label.textContent).to.equal('三级 1-1');
  794. done();
  795. });
  796. });
  797. });