tree.spec.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  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', done => {
  191. vm = getTreeVm(':props="defaultProps" :current-node-key="1"');
  192. const firstNode = document.querySelector('.el-tree-node');
  193. firstNode.click();
  194. vm.$nextTick(() => {
  195. expect(firstNode.classList.contains('is-current')).to.true;
  196. done();
  197. });
  198. });
  199. it('defaultExpandAll', () => {
  200. vm = getTreeVm(':props="defaultProps" default-expand-all');
  201. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(ALL_NODE_COUNT);
  202. });
  203. it('defaultExpandedKeys', () => {
  204. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  205. created() {
  206. this.defaultExpandedKeys = [1, 3];
  207. }
  208. });
  209. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  210. });
  211. it('defaultExpandedKeys set', (done) => {
  212. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  213. created() {
  214. this.defaultExpandedKeys = [1, 3];
  215. }
  216. });
  217. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  218. vm.defaultExpandedKeys = [2];
  219. vm.data = JSON.parse(JSON.stringify(vm.data));
  220. setTimeout(() => {
  221. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(1);
  222. done();
  223. }, 50);
  224. });
  225. it('filter-node-method', (done) => {
  226. vm = getTreeVm(':props="defaultProps" :filter-node-method="filterNode"', {
  227. methods: {
  228. filterNode(value, data) {
  229. if (!value) return true;
  230. return data.label.indexOf(value) !== -1;
  231. }
  232. }
  233. });
  234. const tree = vm.$refs.tree;
  235. tree.filter('2-1');
  236. setTimeout(() => {
  237. expect(tree.$el.querySelectorAll('.el-tree-node.is-hidden').length).to.equal(3);
  238. done();
  239. }, 100);
  240. });
  241. it('autoExpandParent = true', () => {
  242. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id"', {
  243. created() {
  244. this.defaultExpandedKeys = [111];
  245. }
  246. });
  247. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(3);
  248. });
  249. it('autoExpandParent = false', (done) => {
  250. vm = getTreeVm(':props="defaultProps" :default-expanded-keys="defaultExpandedKeys" node-key="id" :auto-expand-parent="false"', {
  251. created() {
  252. this.defaultExpandedKeys = [11];
  253. }
  254. });
  255. expect(vm.$el.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(0);
  256. const firstNode = document.querySelector('.el-tree-node__content');
  257. firstNode.querySelector('.el-tree-node__expand-icon').click();
  258. setTimeout(() => {
  259. expect(document.querySelectorAll('.el-tree-node.is-expanded').length).to.equal(2);
  260. done();
  261. }, 100);
  262. });
  263. it('defaultCheckedKeys & check-strictly = false', () => {
  264. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id"', {
  265. created() {
  266. this.defaultCheckedKeys = [1];
  267. }
  268. });
  269. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(3);
  270. });
  271. it('defaultCheckedKeys & check-strictly', () => {
  272. vm = getTreeVm(':props="defaultProps" default-expand-all show-checkbox :default-checked-keys="defaultCheckedKeys" node-key="id" check-strictly', {
  273. created() {
  274. this.defaultCheckedKeys = [1];
  275. }
  276. });
  277. expect(vm.$el.querySelectorAll('.el-checkbox .is-checked').length).to.equal(1);
  278. });
  279. it('show checkbox', done => {
  280. vm = getTreeVm(':props="defaultProps" show-checkbox');
  281. const tree = vm.$children[0];
  282. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  283. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  284. expect(nodeCheckbox).to.be.exist;
  285. nodeCheckbox.click();
  286. setTimeout(() => {
  287. expect(tree.getCheckedNodes().length).to.equal(3);
  288. expect(tree.getCheckedNodes(true).length).to.equal(2);
  289. secondNode.querySelector('.el-tree-node__expand-icon').click();
  290. setTimeout(() => {
  291. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  292. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  293. leafCheckbox.click();
  294. setTimeout(() => {
  295. expect(tree.getCheckedNodes().length).to.equal(1);
  296. done();
  297. }, 10);
  298. }, 10);
  299. }, 10);
  300. });
  301. it('check', done => {
  302. vm = getTreeVm(':props="defaultProps" show-checkbox @check="handleCheck"', {
  303. methods: {
  304. handleCheck(data, args) {
  305. this.data = data;
  306. this.args = args;
  307. }
  308. }
  309. });
  310. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  311. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  312. expect(nodeCheckbox).to.be.exist;
  313. nodeCheckbox.click();
  314. setTimeout(() => {
  315. expect(vm.args.checkedNodes.length).to.equal(3);
  316. expect(vm.data.id).to.equal(2);
  317. done();
  318. }, 10);
  319. });
  320. it('setCheckedNodes', (done) => {
  321. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  322. const tree = vm.$children[0];
  323. const secondNode = document.querySelectorAll('.el-tree-node__content')[1];
  324. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  325. nodeCheckbox.click();
  326. setTimeout(() => {
  327. expect(tree.getCheckedNodes().length).to.equal(3);
  328. expect(tree.getCheckedNodes(true).length).to.equal(2);
  329. setTimeout(() => {
  330. tree.setCheckedNodes([]);
  331. expect(tree.getCheckedNodes().length).to.equal(0);
  332. done();
  333. }, 10);
  334. }, 10);
  335. });
  336. it('setCheckedKeys', () => {
  337. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  338. const tree = vm.$children[0];
  339. tree.setCheckedKeys([111]);
  340. expect(tree.getCheckedNodes().length).to.equal(3);
  341. expect(tree.getCheckedKeys().length).to.equal(3);
  342. tree.setCheckedKeys([1]);
  343. setTimeout(function() {
  344. expect(tree.getCheckedNodes().length).to.equal(3);
  345. expect(tree.getCheckedKeys().length).to.equal(3);
  346. }, 0);
  347. tree.setCheckedKeys([2]);
  348. setTimeout(function() {
  349. expect(tree.getCheckedNodes().length).to.equal(3);
  350. expect(tree.getCheckedKeys().length).to.equal(3);
  351. }, 0);
  352. tree.setCheckedKeys([21]);
  353. expect(tree.getCheckedNodes().length).to.equal(1);
  354. expect(tree.getCheckedKeys().length).to.equal(1);
  355. });
  356. it('setCheckedKeys with checkStrictly', () => {
  357. vm = getTreeVm(':props="defaultProps" checkStrictly show-checkbox node-key="id"');
  358. const tree = vm.$children[0];
  359. tree.setCheckedKeys([111]);
  360. expect(tree.getCheckedNodes().length).to.equal(1);
  361. expect(tree.getCheckedKeys().length).to.equal(1);
  362. tree.setCheckedKeys([1]);
  363. setTimeout(function() {
  364. expect(tree.getCheckedNodes().length).to.equal(1);
  365. expect(tree.getCheckedKeys().length).to.equal(1);
  366. }, 0);
  367. tree.setCheckedKeys([2]);
  368. setTimeout(function() {
  369. expect(tree.getCheckedNodes().length).to.equal(1);
  370. expect(tree.getCheckedKeys().length).to.equal(1);
  371. }, 0);
  372. tree.setCheckedKeys([21, 22]);
  373. expect(tree.getCheckedNodes().length).to.equal(2);
  374. expect(tree.getCheckedKeys().length).to.equal(2);
  375. });
  376. it('method setChecked', () => {
  377. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  378. const tree = vm.$children[0];
  379. tree.setChecked(111, true, true);
  380. expect(tree.getCheckedNodes().length).to.equal(3);
  381. expect(tree.getCheckedKeys().length).to.equal(3);
  382. tree.setChecked(vm.data[0], false, true);
  383. expect(tree.getCheckedNodes().length).to.equal(0);
  384. expect(tree.getCheckedKeys().length).to.equal(0);
  385. });
  386. it('setCheckedKeys with leafOnly=false', () => {
  387. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  388. const tree = vm.$children[0];
  389. tree.setCheckedKeys([1, 11, 111, 2], false);
  390. setTimeout(function() {
  391. expect(tree.getCheckedNodes().length).to.equal(6);
  392. expect(tree.getCheckedKeys().length).to.equal(6);
  393. }, 0);
  394. });
  395. it('setCheckedKeys with leafOnly=true', () => {
  396. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  397. const tree = vm.$children[0];
  398. tree.setCheckedKeys([2], true);
  399. setTimeout(function() {
  400. expect(tree.getCheckedNodes().length).to.equal(2);
  401. expect(tree.getCheckedKeys().length).to.equal(2);
  402. }, 0);
  403. });
  404. it('setCurrentKey', (done) => {
  405. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  406. const tree = vm.$children[0];
  407. tree.setCurrentKey(111);
  408. vm.$nextTick(() => {
  409. expect(tree.store.currentNode.data.id).to.equal(111);
  410. // cancel highlight
  411. tree.setCurrentKey(null);
  412. vm.$nextTick(() => {
  413. expect(tree.store.currentNode).to.equal(null);
  414. done();
  415. });
  416. });
  417. });
  418. it('setCurrentNode', (done) => {
  419. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  420. const tree = vm.$children[0];
  421. tree.setCurrentNode({
  422. id: 111,
  423. label: '三级 1-1'
  424. });
  425. vm.$nextTick(() => {
  426. expect(tree.store.currentNode.data.id).to.equal(111);
  427. done();
  428. });
  429. });
  430. it('getCurrentKey', (done) => {
  431. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  432. const tree = vm.$children[0];
  433. tree.setCurrentKey(111);
  434. vm.$nextTick(() => {
  435. expect(tree.getCurrentKey()).to.equal(111);
  436. done();
  437. });
  438. });
  439. it('getCurrentNode', (done) => {
  440. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id"');
  441. const tree = vm.$children[0];
  442. tree.setCurrentKey(111);
  443. vm.$nextTick(() => {
  444. expect(tree.getCurrentNode().id).to.equal(111);
  445. done();
  446. });
  447. });
  448. it('getNode', () => {
  449. vm = getTreeVm(':props="defaultProps" node-key="id"');
  450. const tree = vm.$children[0];
  451. const node = tree.getNode(111);
  452. expect(node.data.id).to.equal(111);
  453. });
  454. it('remove', (done) => {
  455. vm = getTreeVm(':props="defaultProps" node-key="id"');
  456. const tree = vm.$children[0];
  457. tree.remove(1);
  458. vm.$nextTick(() => {
  459. expect(vm.data[0].id).to.equal(2);
  460. expect(tree.getNode(1)).to.equal(null);
  461. done();
  462. });
  463. });
  464. it('append', () => {
  465. vm = getTreeVm(':props="defaultProps" node-key="id"');
  466. const tree = vm.$children[0];
  467. const nodeData = { id: 88, label: '88' };
  468. tree.append(nodeData, tree.getNode(1));
  469. expect(vm.data[0].children.length).to.equal(2);
  470. expect(tree.getNode(88).data).to.equal(nodeData);
  471. });
  472. it('insertBefore', () => {
  473. vm = getTreeVm(':props="defaultProps" node-key="id"');
  474. const tree = vm.$children[0];
  475. const nodeData = { id: 88, label: '88' };
  476. tree.insertBefore(nodeData, tree.getNode(11));
  477. expect(vm.data[0].children.length).to.equal(2);
  478. expect(vm.data[0].children[0]).to.equal(nodeData);
  479. expect(tree.getNode(88).data).to.equal(nodeData);
  480. });
  481. it('insertAfter', () => {
  482. vm = getTreeVm(':props="defaultProps" node-key="id"');
  483. const tree = vm.$children[0];
  484. const nodeData = { id: 88, label: '88' };
  485. tree.insertAfter(nodeData, tree.getNode(11));
  486. expect(vm.data[0].children.length).to.equal(2);
  487. expect(vm.data[0].children[1]).to.equal(nodeData);
  488. expect(tree.getNode(88).data).to.equal(nodeData);
  489. });
  490. it('set disabled checkbox', done => {
  491. vm = getDisableTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  492. const node = document.querySelectorAll('.el-tree-node__content')[2];
  493. const nodeCheckbox = node.querySelector('.el-checkbox input');
  494. vm.$nextTick(() => {
  495. expect(nodeCheckbox.disabled).to.equal(true);
  496. done();
  497. });
  498. });
  499. it('check strictly', (done) => {
  500. vm = getTreeVm(':props="defaultProps" show-checkbox check-strictly default-expand-all');
  501. const tree = vm.$children[0];
  502. const secondNode = document.querySelectorAll('.el-tree-node__content')[3];
  503. const nodeCheckbox = secondNode.querySelector('.el-checkbox');
  504. nodeCheckbox.click();
  505. expect(tree.getCheckedNodes().length).to.equal(1);
  506. expect(tree.getCheckedNodes(true).length).to.equal(0);
  507. const firstLeaf = secondNode.nextElementSibling.querySelector('.el-tree-node__content');
  508. const leafCheckbox = firstLeaf.querySelector('.el-checkbox');
  509. vm.$nextTick(() => {
  510. leafCheckbox.click();
  511. expect(tree.getCheckedNodes().length).to.equal(2);
  512. done();
  513. });
  514. });
  515. it('render content', () => {
  516. vm = getTreeVm(':props="defaultProps" :render-content="renderContent"', {
  517. methods: {
  518. renderContent(h, node) {
  519. return (
  520. <span class="custom-content">
  521. <el-button>{ node.node.label }</el-button>
  522. </span>
  523. );
  524. }
  525. }
  526. });
  527. const firstNode = document.querySelector('.el-tree-node__content');
  528. expect(firstNode.querySelector('.custom-content')).to.exist;
  529. const button = firstNode.querySelector('.custom-content .el-button');
  530. expect(button).to.exist;
  531. expect(button.textContent).to.equal('一级 1');
  532. });
  533. it('scoped slot', () => {
  534. vm = createVue({
  535. template: `
  536. <el-tree ref="tree" :data="data">
  537. <div slot-scope="scope" class="custom-tree-template">
  538. <span>{{ scope.node.label }}</span>
  539. <el-button></el-button>
  540. </div>
  541. </el-tree>
  542. `,
  543. data() {
  544. return {
  545. data: [{
  546. id: 1,
  547. label: '一级 1',
  548. children: [{
  549. id: 11,
  550. label: '二级 1-1',
  551. children: [{
  552. id: 111,
  553. label: '三级 1-1'
  554. }]
  555. }]
  556. }, {
  557. id: 2,
  558. label: '一级 2',
  559. children: [{
  560. id: 21,
  561. label: '二级 2-1'
  562. }, {
  563. id: 22,
  564. label: '二级 2-2'
  565. }]
  566. }, {
  567. id: 3,
  568. label: '一级 3',
  569. children: [{
  570. id: 31,
  571. label: '二级 3-1'
  572. }, {
  573. id: 32,
  574. label: '二级 3-2'
  575. }]
  576. }]
  577. };
  578. }
  579. }, true);
  580. const firstNode = document.querySelector('.custom-tree-template');
  581. expect(firstNode).to.exist;
  582. const span = firstNode.querySelector('span');
  583. const button = firstNode.querySelector('.el-button');
  584. expect(span).to.exist;
  585. expect(span.innerText).to.equal('一级 1');
  586. expect(button).to.exist;
  587. });
  588. it('load node', done => {
  589. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" show-checkbox', {
  590. methods: {
  591. loadNode(node, resolve) {
  592. if (node.level === 0) {
  593. return resolve([{ label: 'region1' }, { label: 'region2' }]);
  594. }
  595. if (node.level > 4) return resolve([]);
  596. setTimeout(() => {
  597. resolve([{
  598. label: 'zone' + this.count++
  599. }, {
  600. label: 'zone' + this.count++
  601. }]);
  602. }, 50);
  603. }
  604. }
  605. });
  606. const nodes = document.querySelectorAll('.el-tree-node__content');
  607. expect(nodes.length).to.equal(2);
  608. nodes[0].click();
  609. setTimeout(() => {
  610. expect(document.querySelectorAll('.el-tree-node__content').length).to.equal(4);
  611. done();
  612. }, 100);
  613. });
  614. it('lazy defaultChecked', done => {
  615. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  616. methods: {
  617. loadNode(node, resolve) {
  618. if (node.level === 0) {
  619. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  620. }
  621. if (node.level > 4) return resolve([]);
  622. setTimeout(() => {
  623. resolve([{
  624. label: 'zone' + this.count,
  625. id: this.count++
  626. }, {
  627. label: 'zone' + this.count,
  628. id: this.count++
  629. }]);
  630. }, 50);
  631. }
  632. }
  633. });
  634. const tree = vm.$children[0];
  635. const firstNode = document.querySelector('.el-tree-node__content');
  636. const initStatus = firstNode.querySelector('.is-indeterminate');
  637. expect(initStatus).to.equal(null);
  638. tree.store.setCheckedKeys([3]);
  639. firstNode.querySelector('.el-tree-node__expand-icon').click();
  640. setTimeout(() => {
  641. const clickStatus = firstNode.querySelector('.is-indeterminate');
  642. expect(clickStatus).to.not.equal(null);
  643. const child = document.querySelectorAll('.el-tree-node__content')[1];
  644. expect(child.querySelector('input').checked).to.equal(true);
  645. done();
  646. }, 300);
  647. });
  648. it('lazy expandOnChecked', done => {
  649. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox check-descendants', {
  650. methods: {
  651. loadNode(node, resolve) {
  652. if (node.level === 0) {
  653. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  654. }
  655. if (node.level > 2) return resolve([]);
  656. setTimeout(() => {
  657. resolve([{
  658. label: 'zone' + this.count,
  659. id: this.count++
  660. }, {
  661. label: 'zone' + this.count,
  662. id: this.count++
  663. }]);
  664. }, 10);
  665. }
  666. }
  667. });
  668. const tree = vm.$children[0];
  669. tree.store.setCheckedKeys([1]);
  670. setTimeout(() => {
  671. const checkedKeys = tree.getCheckedKeys();
  672. expect(checkedKeys.length).to.equal(7);
  673. done();
  674. }, 400);
  675. });
  676. it('lazy without expandOnChecked', done => {
  677. vm = getTreeVm(':props="defaultProps" node-key="id" lazy :load="loadNode" show-checkbox', {
  678. methods: {
  679. loadNode(node, resolve) {
  680. if (node.level === 0) {
  681. return resolve([{ label: 'region1', id: this.count++ }, { label: 'region2', id: this.count++ }]);
  682. }
  683. if (node.level > 4) return resolve([]);
  684. setTimeout(() => {
  685. resolve([{
  686. label: 'zone' + this.count,
  687. id: this.count++
  688. }, {
  689. label: 'zone' + this.count,
  690. id: this.count++
  691. }]);
  692. }, 50);
  693. }
  694. }
  695. });
  696. const tree = vm.$children[0];
  697. tree.store.setCheckedKeys([1]);
  698. setTimeout(() => {
  699. const nodes = document.querySelectorAll('.el-tree-node__content');
  700. expect(nodes[0].querySelector('input').checked).to.equal(true);
  701. expect(nodes.length).to.equal(2);
  702. done();
  703. }, 300);
  704. });
  705. it('accordion', done => {
  706. vm = getTreeVm(':props="defaultProps" accordion');
  707. const firstNode = vm.$el.querySelector('.el-tree-node__content');
  708. const secondNode = vm.$el.querySelector('.el-tree-node:nth-child(2) .el-tree-node__content');
  709. firstNode.click();
  710. setTimeout(() => {
  711. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.true;
  712. secondNode.click();
  713. setTimeout(() => {
  714. expect(vm.$el.querySelector('.el-tree-node').classList.contains('is-expanded')).to.false;
  715. done();
  716. }, DELAY);
  717. }, DELAY);
  718. });
  719. it('handleNodeOpen & handleNodeClose', (done) => {
  720. vm = getTreeVm(':props="defaultProps" lazy :load="loadNode" @node-expand="handleNodeOpen" @node-collapse="handleNodeClose"', {
  721. methods: {
  722. loadNode(node, resolve) {
  723. if (node.level === 0) {
  724. return resolve([{label: 'region1'}, {label: 'region2'}]);
  725. }
  726. if (node.level > 4) return resolve([]);
  727. setTimeout(() => {
  728. resolve([{
  729. label: 'zone' + this.count++
  730. }, {
  731. label: 'zone' + this.count++
  732. }]);
  733. }, 50);
  734. },
  735. handleNodeOpen(data, node, vm) {
  736. this.currentNode = data;
  737. this.nodeExpended = true;
  738. },
  739. handleNodeClose(data, node, vm) {
  740. this.currentNode = data;
  741. this.nodeExpended = false;
  742. }
  743. }
  744. });
  745. const firstNode = document.querySelector('.el-tree-node__content');
  746. expect(firstNode.nextElementSibling).to.not.exist;
  747. firstNode.click();
  748. setTimeout(() => {
  749. expect(vm.nodeExpended).to.equal(true);
  750. expect(vm.currentNode.label).to.equal('region1');
  751. firstNode.click();
  752. setTimeout(() => {
  753. expect(vm.nodeExpended).to.equal(false);
  754. expect(vm.currentNode.label).to.equal('region1');
  755. done();
  756. }, 100);
  757. }, 100);
  758. });
  759. it('updateKeyChildren', (done) => {
  760. vm = getTreeVm(':props="defaultProps" show-checkbox node-key="id" default-expand-all');
  761. const tree = vm.$children[0];
  762. tree.updateKeyChildren(1, [{
  763. id: 111,
  764. label: '三级 1-1'
  765. }]);
  766. const node = document.querySelectorAll('.el-tree-node__content')[2];
  767. const label = node.querySelector('.el-tree-node__label');
  768. vm.$nextTick(() => {
  769. expect(tree.store.nodesMap['11']).to.equal(undefined);
  770. expect(tree.store.nodesMap['1'].childNodes[0].data.id).to.equal(111);
  771. expect(label.textContent).to.equal('三级 1-1');
  772. done();
  773. });
  774. });
  775. });