tree.spec.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  1. import { createVue, destroyVM } 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. vm = getTreeVm(':props="defaultProps" show-checkbox @check="handleCheck"', {
  328. methods: {
  329. handleCheck(data, args) {
  330. this.data = data;
  331. this.args = args;
  332. }
  333. }
  334. });
  335. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  336. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  337. expect(nodeCheckbox).to.be.exist;
  338. nodeCheckbox.click();
  339. setTimeout(() => {
  340. expect(vm.args.checkedNodes.length).to.equal(3);
  341. expect(vm.data.id).to.equal(2);
  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', () => {
  362. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  363. const tree = vm.$children[0];
  364. tree.setCheckedKeys([111]);
  365. expect(tree.getCheckedNodes().length).to.equal(3);
  366. expect(tree.getCheckedKeys().length).to.equal(3);
  367. tree.setCheckedKeys([1]);
  368. setTimeout(function() {
  369. expect(tree.getCheckedNodes().length).to.equal(3);
  370. expect(tree.getCheckedKeys().length).to.equal(3);
  371. }, 0);
  372. tree.setCheckedKeys([2]);
  373. setTimeout(function() {
  374. expect(tree.getCheckedNodes().length).to.equal(3);
  375. expect(tree.getCheckedKeys().length).to.equal(3);
  376. }, 0);
  377. tree.setCheckedKeys([21]);
  378. expect(tree.getCheckedNodes().length).to.equal(1);
  379. expect(tree.getCheckedKeys().length).to.equal(1);
  380. });
  381. it('setCheckedKeys with checkStrictly', () => {
  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. setTimeout(function() {
  389. expect(tree.getCheckedNodes().length).to.equal(1);
  390. expect(tree.getCheckedKeys().length).to.equal(1);
  391. }, 0);
  392. tree.setCheckedKeys([2]);
  393. setTimeout(function() {
  394. expect(tree.getCheckedNodes().length).to.equal(1);
  395. expect(tree.getCheckedKeys().length).to.equal(1);
  396. }, 0);
  397. tree.setCheckedKeys([21, 22]);
  398. expect(tree.getCheckedNodes().length).to.equal(2);
  399. expect(tree.getCheckedKeys().length).to.equal(2);
  400. });
  401. it('method setChecked', () => {
  402. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  403. const tree = vm.$children[0];
  404. tree.setChecked(111, true, true);
  405. expect(tree.getCheckedNodes().length).to.equal(3);
  406. expect(tree.getCheckedKeys().length).to.equal(3);
  407. tree.setChecked(vm.data[0], false, true);
  408. expect(tree.getCheckedNodes().length).to.equal(0);
  409. expect(tree.getCheckedKeys().length).to.equal(0);
  410. });
  411. it('setCheckedKeys with leafOnly=false', () => {
  412. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  413. const tree = vm.$children[0];
  414. tree.setCheckedKeys([1, 11, 111, 2], false);
  415. setTimeout(function() {
  416. expect(tree.getCheckedNodes().length).to.equal(6);
  417. expect(tree.getCheckedKeys().length).to.equal(6);
  418. }, 0);
  419. });
  420. it('setCheckedKeys with leafOnly=true', () => {
  421. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  422. const tree = vm.$children[0];
  423. tree.setCheckedKeys([2], true);
  424. setTimeout(function() {
  425. expect(tree.getCheckedNodes().length).to.equal(2);
  426. expect(tree.getCheckedKeys().length).to.equal(2);
  427. }, 0);
  428. });
  429. it('setCurrentKey', (done) => {
  430. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  431. const tree = vm.$children[0];
  432. tree.setCurrentKey(111);
  433. vm.$nextTick(() => {
  434. expect(tree.store.currentNode.data.id).to.equal(111);
  435. // cancel highlight
  436. tree.setCurrentKey(null);
  437. vm.$nextTick(() => {
  438. expect(tree.store.currentNode).to.equal(null);
  439. done();
  440. });
  441. });
  442. });
  443. it('setCurrentNode', (done) => {
  444. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  445. const tree = vm.$children[0];
  446. tree.setCurrentNode({
  447. id: 111,
  448. label: '三级 1-1'
  449. });
  450. vm.$nextTick(() => {
  451. expect(tree.store.currentNode.data.id).to.equal(111);
  452. done();
  453. });
  454. });
  455. it('getCurrentKey', (done) => {
  456. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  457. const tree = vm.$children[0];
  458. tree.setCurrentKey(111);
  459. vm.$nextTick(() => {
  460. expect(tree.getCurrentKey()).to.equal(111);
  461. done();
  462. });
  463. });
  464. it('getCurrentNode', (done) => {
  465. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  466. const tree = vm.$children[0];
  467. tree.setCurrentKey(111);
  468. vm.$nextTick(() => {
  469. expect(tree.getCurrentNode().id).to.equal(111);
  470. done();
  471. });
  472. });
  473. it('getNode', () => {
  474. vm = getTreeVm(':props="defaultProps" node-key="id"');
  475. const tree = vm.$children[0];
  476. const node = tree.getNode(111);
  477. expect(node.data.id).to.equal(111);
  478. });
  479. it('remove', (done) => {
  480. vm = getTreeVm(':props="defaultProps" node-key="id"');
  481. const tree = vm.$children[0];
  482. tree.remove(1);
  483. vm.$nextTick(() => {
  484. expect(vm.data[0].id).to.equal(2);
  485. expect(tree.getNode(1)).to.equal(null);
  486. done();
  487. });
  488. });
  489. it('append', () => {
  490. vm = getTreeVm(':props="defaultProps" node-key="id"');
  491. const tree = vm.$children[0];
  492. const nodeData = { id: 88, label: '88' };
  493. tree.append(nodeData, tree.getNode(1));
  494. expect(vm.data[0].children.length).to.equal(2);
  495. expect(tree.getNode(88).data).to.equal(nodeData);
  496. });
  497. it('insertBefore', () => {
  498. vm = getTreeVm(':props="defaultProps" node-key="id"');
  499. const tree = vm.$children[0];
  500. const nodeData = { id: 88, label: '88' };
  501. tree.insertBefore(nodeData, tree.getNode(11));
  502. expect(vm.data[0].children.length).to.equal(2);
  503. expect(vm.data[0].children[0]).to.equal(nodeData);
  504. expect(tree.getNode(88).data).to.equal(nodeData);
  505. });
  506. it('insertAfter', () => {
  507. vm = getTreeVm(':props="defaultProps" node-key="id"');
  508. const tree = vm.$children[0];
  509. const nodeData = { id: 88, label: '88' };
  510. tree.insertAfter(nodeData, tree.getNode(11));
  511. expect(vm.data[0].children.length).to.equal(2);
  512. expect(vm.data[0].children[1]).to.equal(nodeData);
  513. expect(tree.getNode(88).data).to.equal(nodeData);
  514. });
  515. it('set disabled checkbox', done => {
  516. vm = getDisableTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  517. const node = document.querySelectorAll('.el-tree-node__content')[2];
  518. const nodeCheckbox = node.querySelector('.el-checkbox input');
  519. vm.$nextTick(() => {
  520. expect(nodeCheckbox.disabled).to.equal(true);
  521. done();
  522. });
  523. });
  524. it('check strictly', (done) => {
  525. vm = getTreeVm(':props="defaultProps" show-checkbox check-strictly default-expand-all');
  526. const tree = vm.$children[0];
  527. const secondNode = document.querySelectorAll('.el-tree-node__content')[3];
  528. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  529. nodeCheckbox.click();
  530. expect(tree.getCheckedNodes().length).to.equal(1);
  531. expect(tree.getCheckedNodes(true).length).to.equal(0);
  532. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  533. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  534. vm.$nextTick(() => {
  535. leafCheckbox.click();
  536. expect(tree.getCheckedNodes().length).to.equal(2);
  537. done();
  538. });
  539. });
  540. it('render content', () => {
  541. vm = getTreeVm(':props="defaultProps" :render-content="renderContent"', {
  542. methods: {
  543. renderContent(h, node) {
  544. return (
  545. <span class="custom-content">
  546. <el-button>{ node.node.label }</el-button>
  547. </span>
  548. );
  549. }
  550. }
  551. });
  552. const firstNode = document.querySelector('.el-tree-node__content');
  553. expect(firstNode.querySelector('.custom-content')).to.exist;
  554. const button = firstNode.querySelector('.custom-content .el-button');
  555. expect(button).to.exist;
  556. expect(button.textContent).to.equal('一级 1');
  557. });
  558. it('scoped slot', () => {
  559. vm = createVue({
  560. template: `
  561. <el-tree ref="tree" :data="data">
  562. <div slot-scope="scope" class="custom-tree-template">
  563. <span>{{ scope.node.label }}</span>
  564. <el-button></el-button>
  565. </div>
  566. </el-tree>
  567. `,
  568. data() {
  569. return {
  570. data: [{
  571. id: 1,
  572. label: '一级 1',
  573. children: [{
  574. id: 11,
  575. label: '二级 1-1',
  576. children: [{
  577. id: 111,
  578. label: '三级 1-1'
  579. }]
  580. }]
  581. }, {
  582. id: 2,
  583. label: '一级 2',
  584. children: [{
  585. id: 21,
  586. label: '二级 2-1'
  587. }, {
  588. id: 22,
  589. label: '二级 2-2'
  590. }]
  591. }, {
  592. id: 3,
  593. label: '一级 3',
  594. children: [{
  595. id: 31,
  596. label: '二级 3-1'
  597. }, {
  598. id: 32,
  599. label: '二级 3-2'
  600. }]
  601. }]
  602. };
  603. }
  604. }, true);
  605. const firstNode = document.querySelector('.custom-tree-template');
  606. expect(firstNode).to.exist;
  607. const span = firstNode.querySelector('span');
  608. const button = firstNode.querySelector('.el-button');
  609. expect(span).to.exist;
  610. expect(span.innerText).to.equal('一级 1');
  611. expect(button).to.exist;
  612. });
  613. it('load node', done => {
  614. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" show-checkbox', {
  615. methods: {
  616. loadNode(node, resolve) {
  617. if (node.level === 0) {
  618. return resolve([{ label: 'region1' }, { label: 'region2' }]);
  619. }
  620. if (node.level > 4) return resolve([]);
  621. setTimeout(() => {
  622. resolve([{
  623. label: 'zone' + this.count++
  624. }, {
  625. label: 'zone' + this.count++
  626. }]);
  627. }, 50);
  628. }
  629. }
  630. });
  631. const nodes = document.querySelectorAll('.el-tree-node__content');
  632. expect(nodes.length).to.equal(2);
  633. nodes[0].click();
  634. setTimeout(() => {
  635. expect(document.querySelectorAll('.el-tree-node__content').length).to.equal(4);
  636. done();
  637. }, 100);
  638. });
  639. it('lazy defaultChecked', done => {
  640. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  641. methods: {
  642. loadNode(node, resolve) {
  643. if (node.level === 0) {
  644. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  645. }
  646. if (node.level > 4) return resolve([]);
  647. setTimeout(() => {
  648. resolve([{
  649. label: 'zone' + this.count,
  650. id: this.count++
  651. }, {
  652. label: 'zone' + this.count,
  653. id: this.count++
  654. }]);
  655. }, 50);
  656. }
  657. }
  658. });
  659. const tree = vm.$children[0];
  660. const firstNode = document.querySelector('.el-tree-node__content');
  661. const initStatus = firstNode.querySelector('.is-indeterminate');
  662. expect(initStatus).to.equal(null);
  663. tree.store.setCheckedKeys([3]);
  664. firstNode.querySelector('.el-tree-node__expand-icon').click();
  665. setTimeout(() => {
  666. const clickStatus = firstNode.querySelector('.is-indeterminate');
  667. expect(clickStatus).to.not.equal(null);
  668. const child = document.querySelectorAll('.el-tree-node__content')[1];
  669. expect(child.querySelector('input').checked).to.equal(true);
  670. done();
  671. }, 300);
  672. });
  673. it('lazy expandOnChecked', done => {
  674. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox check-descendants', {
  675. methods: {
  676. loadNode(node, resolve) {
  677. if (node.level === 0) {
  678. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  679. }
  680. if (node.level > 2) return resolve([]);
  681. setTimeout(() => {
  682. resolve([{
  683. label: 'zone' + this.count,
  684. id: this.count++
  685. }, {
  686. label: 'zone' + this.count,
  687. id: this.count++
  688. }]);
  689. }, 10);
  690. }
  691. }
  692. });
  693. const tree = vm.$children[0];
  694. tree.store.setCheckedKeys([1]);
  695. setTimeout(() => {
  696. const checkedKeys = tree.getCheckedKeys();
  697. expect(checkedKeys.length).to.equal(7);
  698. done();
  699. }, 400);
  700. });
  701. it('lazy without expandOnChecked', done => {
  702. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  703. methods: {
  704. loadNode(node, resolve) {
  705. if (node.level === 0) {
  706. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  707. }
  708. if (node.level > 4) return resolve([]);
  709. setTimeout(() => {
  710. resolve([{
  711. label: 'zone' + this.count,
  712. id: this.count++
  713. }, {
  714. label: 'zone' + this.count,
  715. id: this.count++
  716. }]);
  717. }, 50);
  718. }
  719. }
  720. });
  721. const tree = vm.$children[0];
  722. tree.store.setCheckedKeys([1]);
  723. setTimeout(() => {
  724. const nodes = document.querySelectorAll('.el-tree-node__content');
  725. expect(nodes[0].querySelector('input').checked).to.equal(true);
  726. expect(nodes.length).to.equal(2);
  727. done();
  728. }, 300);
  729. });
  730. it('accordion', done => {
  731. vm = getTreeVm(':props="defaultProps" accordion');
  732. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  733. const secondNode = vm.$el.querySelector('.el-tree-node:nth-child(2) .el-tree-node__content');
  734. firstNode.click();
  735. setTimeout(() => {
  736. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  737. secondNode.click();
  738. setTimeout(() => {
  739. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  740. done();
  741. }, DELAY);
  742. }, DELAY);
  743. });
  744. it('handleNodeOpen & handleNodeClose', (done) => {
  745. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" @node-expand="handleNodeOpen" @node-collapse="handleNodeClose"', {
  746. methods: {
  747. loadNode(node, resolve) {
  748. if (node.level === 0) {
  749. return resolve([{label: 'region1'}, {label: 'region2'}]);
  750. }
  751. if (node.level > 4) return resolve([]);
  752. setTimeout(() => {
  753. resolve([{
  754. label: 'zone' + this.count++
  755. }, {
  756. label: 'zone' + this.count++
  757. }]);
  758. }, 50);
  759. },
  760. handleNodeOpen(data, node, vm) {
  761. this.currentNode = data;
  762. this.nodeExpended = true;
  763. },
  764. handleNodeClose(data, node, vm) {
  765. this.currentNode = data;
  766. this.nodeExpended = false;
  767. }
  768. }
  769. });
  770. const firstNode = document.querySelector('.el-tree-node__content');
  771. expect(firstNode.nextElementSibling).to.not.exist;
  772. firstNode.click();
  773. setTimeout(() => {
  774. expect(vm.nodeExpended).to.equal(true);
  775. expect(vm.currentNode.label).to.equal('region1');
  776. firstNode.click();
  777. setTimeout(() => {
  778. expect(vm.nodeExpended).to.equal(false);
  779. expect(vm.currentNode.label).to.equal('region1');
  780. done();
  781. }, 100);
  782. }, 100);
  783. });
  784. it('updateKeyChildren', (done) => {
  785. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  786. const tree = vm.$children[0];
  787. tree.updateKeyChildren(1, [{
  788. id: 111,
  789. label: '三级 1-1'
  790. }]);
  791. const node = document.querySelectorAll('.el-tree-node__content')[2];
  792. const label = node.querySelector('.el-tree-node__label');
  793. vm.$nextTick(() => {
  794. expect(tree.store.nodesMap['11']).to.equal(undefined);
  795. expect(tree.store.nodesMap['1'].childNodes[0].data.id).to.equal(111);
  796. expect(label.textContent).to.equal('三级 1-1');
  797. done();
  798. });
  799. });
  800. });