table.spec.js 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. import { createVue, triggerEvent, destroyVM } from '../util';
  2. const DELAY = 10;
  3. const testDataArr = [];
  4. const toArray = function(obj) {
  5. return [].slice.call(obj);
  6. };
  7. const getTestData = function() {
  8. return [
  9. { name: 'Toy Story', release: '1995-11-22', director: 'John Lasseter', runtime: 80 },
  10. { name: 'A Bug\'s Life', release: '1998-11-25', director: 'John Lasseter', runtime: 95 },
  11. { name: 'Toy Story 2', release: '1999-11-24', director: 'John Lasseter', runtime: 92 },
  12. { name: 'Monsters, Inc.', release: '2001-11-2', director: 'Peter Docter', runtime: 92 },
  13. { name: 'Finding Nemo', release: '2003-5-30', director: 'Andrew Stanton', runtime: 100 }
  14. ];
  15. };
  16. getTestData().forEach(cur => {
  17. Object.keys(cur).forEach(prop => {
  18. testDataArr.push(cur[prop].toString());
  19. });
  20. });
  21. describe('Table', () => {
  22. describe('rendering data is correct', () => {
  23. const vm = createVue({
  24. template: `
  25. <el-table :data="testData">
  26. <el-table-column prop="name" label="片名" />
  27. <el-table-column prop="release" label="发行日期" />
  28. <el-table-column prop="director" label="导演" />
  29. <el-table-column prop="runtime" label="时长(分)" />
  30. </el-table>
  31. `,
  32. created() {
  33. this.testData = getTestData();
  34. }
  35. });
  36. it('head', done => {
  37. setTimeout(_ => {
  38. const ths = toArray(vm.$el.querySelectorAll('thead th'));
  39. expect(ths.map(node => node.textContent).filter(o => o))
  40. .to.eql(['片名', '发行日期', '导演', '时长(分)']);
  41. done();
  42. }, DELAY);
  43. });
  44. it('row length', () => {
  45. expect(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')).to.length(getTestData().length);
  46. });
  47. it('row data', () => {
  48. const cells = toArray(vm.$el.querySelectorAll('td .cell'))
  49. .map(node => node.textContent);
  50. expect(cells).to.eql(testDataArr);
  51. destroyVM(vm);
  52. });
  53. });
  54. describe('attributes', () => {
  55. const createTable = function(props, opts) {
  56. return createVue(Object.assign({
  57. template: `
  58. <el-table :data="testData" ${props}>
  59. <el-table-column prop="name" label="片名" />
  60. <el-table-column prop="release" label="发行日期" />
  61. <el-table-column prop="director" label="导演" />
  62. <el-table-column prop="runtime" label="时长(分)" />
  63. </el-table>
  64. `,
  65. created() {
  66. this.testData = getTestData();
  67. }
  68. }, opts));
  69. };
  70. it('height', done => {
  71. const vm = createTable('height="134"');
  72. setTimeout(_ => {
  73. expect(vm.$el.style.height).to.equal('134px');
  74. destroyVM(vm);
  75. done();
  76. }, DELAY);
  77. });
  78. it('stripe', done => {
  79. const vm = createTable('stripe');
  80. setTimeout(_ => {
  81. expect(vm.$el.classList.contains('el-table--striped')).to.true;
  82. destroyVM(vm);
  83. done();
  84. }, DELAY);
  85. });
  86. it('border', done => {
  87. const vm = createTable('border');
  88. setTimeout(_ => {
  89. expect(vm.$el.classList.contains('el-table--border')).to.true;
  90. destroyVM(vm);
  91. done();
  92. }, DELAY);
  93. });
  94. it('fit', done => {
  95. const vm = createTable(':fit="false"');
  96. setTimeout(_ => {
  97. expect(vm.$el.classList.contains('el-table--fit')).to.false;
  98. destroyVM(vm);
  99. done();
  100. }, DELAY);
  101. });
  102. it('tableRowClassName', done => {
  103. const vm = createTable(':row-class-name="tableRowClassName"', {
  104. methods: {
  105. tableRowClassName(row, index) {
  106. if (index === 1) {
  107. return 'info-row';
  108. } else if (index === 3) {
  109. return 'positive-row';
  110. }
  111. return '';
  112. }
  113. }
  114. });
  115. setTimeout(_ => {
  116. expect(vm.$el.querySelectorAll('.info-row')).to.length(1);
  117. expect(vm.$el.querySelectorAll('.positive-row')).to.length(1);
  118. destroyVM(vm);
  119. done();
  120. }, DELAY);
  121. });
  122. });
  123. describe('filter', () => {
  124. let vm;
  125. beforeEach(done => {
  126. vm = createVue({
  127. template: `
  128. <el-table ref="table" :data="testData">
  129. <el-table-column prop="name" label="片名" />
  130. <el-table-column prop="release" label="发行日期" />
  131. <el-table-column
  132. prop="director"
  133. :filters="[
  134. { text: 'John Lasseter', value: 'John Lasseter' },
  135. { text: 'Peter Docter', value: 'Peter Docter' },
  136. { text: 'Andrew Stanton', value: 'Andrew Stanton' }
  137. ]"
  138. :filter-method="filterMethod"
  139. label="导演" />
  140. <el-table-column prop="runtime" label="时长(分)" />
  141. </el-table>
  142. `,
  143. created() {
  144. this.testData = getTestData();
  145. },
  146. methods: {
  147. filterMethod(value, row) {
  148. return value === row.director;
  149. }
  150. }
  151. }, true);
  152. setTimeout(done, DELAY);
  153. });
  154. afterEach(() => destroyVM(vm));
  155. it('render', () => {
  156. expect(vm.$el.querySelector('.el-table__column-filter-trigger')).to.exist;
  157. });
  158. it('click dropdown', done => {
  159. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  160. triggerEvent(btn, 'click', true, false);
  161. setTimeout(_ => {
  162. const filter = document.body.querySelector('.el-table-filter');
  163. expect(filter).to.exist;
  164. document.body.removeChild(filter);
  165. done();
  166. }, 100);
  167. });
  168. it('click filter', done => {
  169. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  170. triggerEvent(btn, 'click', true, false);
  171. setTimeout(_ => {
  172. const filter = document.body.querySelector('.el-table-filter');
  173. // John Lasseter
  174. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  175. // confrim button
  176. setTimeout(_ => {
  177. triggerEvent(filter.querySelector('.el-table-filter__bottom button'), 'click', true, false);
  178. setTimeout(_ => {
  179. expect(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')).to.length(3);
  180. document.body.removeChild(filter);
  181. done();
  182. }, DELAY);
  183. }, 100);
  184. }, 100);
  185. });
  186. it('click reset', done => {
  187. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  188. triggerEvent(btn, 'click', true, false);
  189. setTimeout(_ => {
  190. const filter = document.body.querySelector('.el-table-filter');
  191. // John Lasseter
  192. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  193. setTimeout(_ => {
  194. // reset button
  195. triggerEvent(filter.querySelectorAll('.el-table-filter__bottom button')[1], 'click', true, false);
  196. setTimeout(_ => {
  197. expect(filter.querySelector('.el-table-filter__bottom button').classList.contains('is-disabled')).to.true;
  198. document.body.removeChild(filter);
  199. destroyVM(vm);
  200. done();
  201. }, DELAY);
  202. }, 100);
  203. }, 100);
  204. });
  205. });
  206. describe('events', () => {
  207. const createTable = function(prop = '', opts) {
  208. return createVue({
  209. template: `
  210. <el-table :data="testData" @${prop}="handleEvent">
  211. <el-table-column type="selection" />
  212. <el-table-column prop="name" />
  213. <el-table-column prop="release" />
  214. <el-table-column prop="director" />
  215. <el-table-column prop="runtime"/>
  216. </el-table>
  217. `,
  218. methods: {
  219. handleEvent(...args) {
  220. this.result = args;
  221. }
  222. },
  223. created() {
  224. this.testData = getTestData();
  225. },
  226. data() {
  227. return { result: '', testData: this.testData };
  228. }
  229. }, true);
  230. };
  231. it('select', done => {
  232. const vm = createTable('select');
  233. setTimeout(_ => {
  234. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  235. expect(vm.result).to.length(2);
  236. expect(vm.result[1]).to.have.property('name').to.equal(getTestData()[0].name);
  237. destroyVM(vm);
  238. done();
  239. }, DELAY);
  240. });
  241. it('select-all', done => {
  242. const vm = createTable('select-all');
  243. setTimeout(_ => {
  244. vm.$el.querySelector('.el-checkbox').click();
  245. setTimeout(_ => {
  246. expect(vm.result).to.length(1);
  247. expect(vm.result[0]).to.length(getTestData().length);
  248. destroyVM(vm);
  249. done();
  250. }, DELAY);
  251. }, DELAY);
  252. });
  253. it('selection-change', done => {
  254. const vm = createTable('selection-change');
  255. setTimeout(_ => {
  256. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  257. expect(vm.result).to.length(1);
  258. destroyVM(vm);
  259. done();
  260. }, DELAY);
  261. });
  262. it('cell-mouse-enter', done => {
  263. const vm = createTable('cell-mouse-enter');
  264. setTimeout(_ => {
  265. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  266. triggerEvent(cell.parentNode, 'mouseenter');
  267. expect(vm.result).to.length(4); // row, column, cell, event
  268. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  269. destroyVM(vm);
  270. done();
  271. }, DELAY);
  272. });
  273. it('cell-mouse-leave', done => {
  274. const vm = createTable('cell-mouse-leave');
  275. setTimeout(_ => {
  276. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[7]; // second row
  277. const cell2 = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  278. triggerEvent(cell2.parentNode, 'mouseenter');
  279. triggerEvent(cell.parentNode, 'mouseleave');
  280. expect(vm.result).to.length(4); // row, column, cell, event
  281. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  282. destroyVM(vm);
  283. done();
  284. }, DELAY);
  285. });
  286. it('cell-click', done => {
  287. const vm = createTable('cell-click');
  288. setTimeout(_ => {
  289. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  290. cell.parentNode.click();
  291. expect(vm.result).to.length(4); // row, column, cell, event
  292. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  293. destroyVM(vm);
  294. done();
  295. }, DELAY);
  296. });
  297. it('row-click', done => {
  298. const vm = createTable('row-click');
  299. setTimeout(_ => {
  300. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  301. triggerEvent(cell.parentNode.parentNode, 'click');
  302. expect(vm.result).to.length(2); // row, event
  303. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  304. destroyVM(vm);
  305. done();
  306. }, DELAY);
  307. });
  308. it('current-change', done => {
  309. const vm = createTable('current-change');
  310. setTimeout(_ => {
  311. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  312. triggerEvent(cell.parentNode.parentNode, 'click');
  313. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  314. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  315. expect(vm.result[1]).to.equal(null);
  316. // clear data => current-change should fire again.
  317. const oldRow = vm.result[0];
  318. vm.testData = [];
  319. setTimeout(() => {
  320. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  321. expect(vm.result[0]).to.equal(null);
  322. expect(vm.result[1]).to.equal(oldRow);
  323. destroyVM(vm);
  324. done();
  325. }, DELAY);
  326. }, DELAY);
  327. });
  328. });
  329. describe('column attributes', () => {
  330. const createTable = function(props1, props2, props3, props4, opts, tableProps) {
  331. return createVue(Object.assign({
  332. template: `
  333. <el-table :data="testData" ${tableProps || ''}>
  334. <el-table-column prop="name" ${props1 || ''} />
  335. <el-table-column prop="release" ${props2 || ''} />
  336. <el-table-column prop="director" ${props3 || ''} />
  337. <el-table-column prop="runtime" ${props4 || ''} />
  338. </el-table>
  339. `,
  340. created() {
  341. this.testData = getTestData();
  342. }
  343. }, opts));
  344. };
  345. it('label', done => {
  346. const vm = createTable('label="啊哈哈哈"', 'label="啊啦啦啦"');
  347. setTimeout(_ => {
  348. const ths = toArray(vm.$el.querySelectorAll('thead th'))
  349. .map(node => node.textContent).filter(o => o);
  350. expect(ths).to.eql(['啊哈哈哈', '啊啦啦啦']);
  351. destroyVM(vm);
  352. done();
  353. }, DELAY);
  354. });
  355. it('width', done => {
  356. const vm = createTable('width="123px"', ':width="102"', 'width="39"');
  357. setTimeout(_ => {
  358. const ths = toArray(vm.$el.querySelectorAll('.el-table__header-wrapper col'))
  359. .map(node => node.width).filter(o => o);
  360. expect(ths).to.include('123').include('102').include('39');
  361. destroyVM(vm);
  362. done();
  363. }, DELAY);
  364. });
  365. it('fixed', done => {
  366. const vm = createTable(
  367. 'fixed label="test1"',
  368. 'fixed="right" label="test2"',
  369. 'fixed="left" label="test3"');
  370. setTimeout(_ => {
  371. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed th:not(.is-hidden)'))
  372. .map(node => node.textContent))
  373. .to.eql(['test1', 'test3']);
  374. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed-right th:not(.is-hidden)'))
  375. .map(node => node.textContent))
  376. .to.eql(['test2']);
  377. expect(vm.$el.querySelector('.el-table__body-wrapper').style.height).to.equal('');
  378. destroyVM(vm);
  379. done();
  380. }, DELAY);
  381. });
  382. it('resizable', done => {
  383. const vm = createTable(
  384. 'resizable',
  385. ':resizable="false"',
  386. '',
  387. '',
  388. {},
  389. 'border');
  390. setTimeout(_ => {
  391. const firstCol = vm.$el.querySelector('thead th');
  392. triggerEvent(firstCol, 'mousemove');
  393. triggerEvent(firstCol, 'mousedown');
  394. destroyVM(vm);
  395. done();
  396. }, DELAY);
  397. });
  398. it('formatter', done => {
  399. const vm = createTable(
  400. ':formatter="renderCell"', '', '', '', {
  401. methods: {
  402. renderCell(row, column) {
  403. return `[${row.name}]`;
  404. }
  405. }
  406. });
  407. setTimeout(_ => {
  408. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  409. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  410. destroyVM(vm);
  411. done();
  412. }, DELAY);
  413. });
  414. it('show-overflow-tooltip', done => {
  415. const vm = createTable('show-overflow-tooltip');
  416. setTimeout(_ => {
  417. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  418. destroyVM(vm);
  419. done();
  420. }, DELAY);
  421. });
  422. it('show-tooltip-when-overflow', done => { // old version prop name
  423. const vm = createTable('show-tooltip-when-overflow');
  424. setTimeout(_ => {
  425. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  426. destroyVM(vm);
  427. done();
  428. }, DELAY);
  429. });
  430. it('inline-template', done => {
  431. const vm = createVue({
  432. template: `
  433. <el-table :data="testData">
  434. <el-table-column prop="name" inline-template>
  435. <span>[{{ row.name }}]</span>
  436. </el-table-column>
  437. <el-table-column prop="release"/>
  438. <el-table-column prop="director"/>
  439. <el-table-column prop="runtime"/>
  440. </el-table>
  441. `,
  442. created() {
  443. this.testData = getTestData();
  444. }
  445. });
  446. setTimeout(_ => {
  447. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  448. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  449. destroyVM(vm);
  450. done();
  451. }, DELAY);
  452. });
  453. it('render-header', done => {
  454. const vm = createVue({
  455. template: `
  456. <el-table :data="testData">
  457. <el-table-column prop="name" :render-header="renderHeader" label="name">
  458. </el-table-column>
  459. <el-table-column prop="release"/>
  460. <el-table-column prop="director"/>
  461. <el-table-column prop="runtime"/>
  462. </el-table>
  463. `,
  464. methods: {
  465. renderHeader(h, { column, $index }) {
  466. return '' + $index + ':' + column.label;
  467. }
  468. },
  469. created() {
  470. this.testData = getTestData();
  471. }
  472. });
  473. setTimeout(_ => {
  474. const headerCell = vm.$el.querySelector('.el-table__header-wrapper thead tr th:first-child .cell');
  475. expect(headerCell.textContent).to.equal('0:name');
  476. destroyVM(vm);
  477. done();
  478. }, DELAY);
  479. });
  480. it('align', done => {
  481. const vm = createTable('align="left"', 'align="right"', 'align="center"');
  482. setTimeout(_ => {
  483. var len = getTestData().length + 1;
  484. expect(vm.$el.querySelectorAll('.is-left')).to.length(len);
  485. expect(vm.$el.querySelectorAll('.is-right')).to.length(len);
  486. expect(vm.$el.querySelectorAll('.is-center')).to.length(len);
  487. destroyVM(vm);
  488. done();
  489. }, DELAY);
  490. });
  491. it('class-name', done => {
  492. const vm = createTable('class-name="column-1"', 'class-name="column-2 column-class-a"', 'class-name="column-class-a"');
  493. setTimeout(_ => {
  494. var len = getTestData().length + 1;
  495. expect(vm.$el.querySelectorAll('.column-1')).to.length(len);
  496. expect(vm.$el.querySelectorAll('.column-2')).to.length(len);
  497. expect(vm.$el.querySelectorAll('.column-class-a')).to.length(len * 2);
  498. destroyVM(vm);
  499. done();
  500. }, DELAY);
  501. });
  502. it('selectable', done => {
  503. const vm = createVue({
  504. template: `
  505. <el-table :data="testData" @selection-change="change">
  506. <el-table-column type="selection" :selectable="filterSelect" />
  507. <el-table-column prop="name" label="name" />
  508. <el-table-column prop="release" label="release" />
  509. <el-table-column prop="director" label="director" />
  510. <el-table-column prop="runtime" label="runtime" />
  511. </el-table>
  512. `,
  513. created() {
  514. this.testData = getTestData();
  515. },
  516. data() {
  517. return { selected: [] };
  518. },
  519. methods: {
  520. change(rows) {
  521. this.selected = rows;
  522. },
  523. filterSelect(row, index) {
  524. return index > 2;
  525. }
  526. }
  527. }, true);
  528. setTimeout(_ => {
  529. vm.$el.querySelector('.el-checkbox').click();
  530. setTimeout(_ => {
  531. expect(vm.selected).to.length(2);
  532. destroyVM(vm);
  533. done();
  534. }, DELAY);
  535. }, DELAY);
  536. });
  537. it('selectable === false & check selectAll status', done => {
  538. const vm = createVue({
  539. template: `
  540. <el-table :data="testData" @selection-change="change">
  541. <el-table-column type="selection" :selectable="filterSelect" />
  542. <el-table-column prop="name" label="name" />
  543. <el-table-column prop="release" label="release" />
  544. <el-table-column prop="director" label="director" />
  545. <el-table-column prop="runtime" label="runtime" />
  546. </el-table>
  547. `,
  548. created() {
  549. },
  550. data() {
  551. return { selected: [], testData: null };
  552. },
  553. methods: {
  554. change(rows) {
  555. this.selected = rows;
  556. },
  557. filterSelect(row, index) {
  558. return false;
  559. }
  560. }
  561. }, true);
  562. vm.testData = getTestData();
  563. setTimeout(_ => {
  564. expect(vm.$el.querySelector('.el-checkbox').__vue__.checked).to.be.false;
  565. setTimeout(_ => {
  566. expect(vm.selected).to.length(0);
  567. destroyVM(vm);
  568. done();
  569. }, DELAY);
  570. }, DELAY);
  571. });
  572. it('emit selection-change after row has been removed', done => {
  573. const vm = createVue({
  574. template: `
  575. <el-table :data="testData" @selection-change="change">
  576. <el-table-column type="selection" />
  577. <el-table-column prop="name" label="name" />
  578. <el-table-column prop="release" label="release" />
  579. <el-table-column prop="director" label="director" />
  580. <el-table-column prop="runtime" label="runtime" />
  581. </el-table>
  582. `,
  583. created() {
  584. this.testData = getTestData();
  585. },
  586. data() {
  587. return { selected: [], testData: null };
  588. },
  589. methods: {
  590. change(rows) {
  591. this.selected = rows;
  592. },
  593. filterSelect(row, index) {
  594. return index > 2;
  595. }
  596. }
  597. }, true);
  598. setTimeout(_ => {
  599. vm.$el.querySelector('.el-checkbox').click();
  600. setTimeout(_ => {
  601. expect(vm.selected).to.length(5);
  602. vm.testData.splice(0, 1);
  603. setTimeout(_ => {
  604. expect(vm.selected).to.length(4);
  605. destroyVM(vm);
  606. done();
  607. });
  608. }, DELAY);
  609. }, DELAY);
  610. });
  611. it('reserve-selection', done => {
  612. const getData = function(page = 0) {
  613. let id = 0;
  614. const rows = [];
  615. const row = () => {
  616. return {
  617. id: ++id + page * 10,
  618. date: new Date().getTime()
  619. };
  620. };
  621. let count = 10;
  622. while (--count) {
  623. rows.push(row());
  624. }
  625. return rows;
  626. };
  627. const vm = createVue({
  628. template: `
  629. <el-table ref="table" :row-key="rowKey" :data="testData" @selection-change="change">
  630. <el-table-column type="selection" reserve-selection />
  631. <el-table-column prop="id" label="id" />
  632. <el-table-column prop="date" label="date" />
  633. </el-table>
  634. `,
  635. created() {
  636. this.testData = getData();
  637. },
  638. data() {
  639. return { selected: [], testData: [] };
  640. },
  641. methods: {
  642. rowKey(row) {
  643. return row.id;
  644. },
  645. change(rows) {
  646. this.selected = rows;
  647. }
  648. }
  649. }, true);
  650. setTimeout(_ => {
  651. // click first
  652. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  653. setTimeout(_ => {
  654. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(1);
  655. // go to second page
  656. vm.testData = getData(1);
  657. setTimeout(_ => {
  658. // expect no checked
  659. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(0);
  660. // click first checkbox
  661. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  662. vm.$el.querySelectorAll('.el-checkbox')[2].click();
  663. setTimeout(_ => {
  664. // back first page
  665. vm.testData = getData();
  666. setTimeout(_ => {
  667. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(1);
  668. // clear
  669. vm.$refs.table.clearSelection();
  670. setTimeout(_ => {
  671. expect(vm.$el.querySelectorAll('.el-checkbox__inner.is-checked')).to.length(0);
  672. destroyVM(vm);
  673. done();
  674. }, DELAY);
  675. }, DELAY);
  676. }, DELAY);
  677. }, DELAY);
  678. }, DELAY);
  679. }, DELAY);
  680. });
  681. describe('type', () => {
  682. const createTable = function(type) {
  683. return createVue({
  684. template: `
  685. <el-table :data="testData" @selection-change="change">
  686. <el-table-column type="${type}" />
  687. <el-table-column prop="name" label="name" />
  688. <el-table-column prop="release" label="release" />
  689. <el-table-column prop="director" label="director" />
  690. <el-table-column prop="runtime" label="runtime" />
  691. </el-table>
  692. `,
  693. created() {
  694. this.testData = getTestData();
  695. },
  696. data() {
  697. return { selected: [] };
  698. },
  699. methods: {
  700. change(rows) {
  701. this.selected = rows;
  702. }
  703. }
  704. }, true);
  705. };
  706. describe('= selection', () => {
  707. const vm = createTable('selection');
  708. it('render', done => {
  709. setTimeout(_ => {
  710. expect(vm.$el.querySelectorAll('.el-checkbox')).to.length(getTestData().length + 1);
  711. done();
  712. }, DELAY);
  713. });
  714. it('select all', done => {
  715. vm.$el.querySelector('.el-checkbox').click();
  716. setTimeout(_ => {
  717. expect(vm.selected).to.length(getTestData().length);
  718. done();
  719. }, DELAY);
  720. });
  721. it('cancel all', done => {
  722. vm.$el.querySelector('.el-checkbox').click();
  723. setTimeout(_ => {
  724. expect(vm.selected).to.length(0);
  725. destroyVM(vm);
  726. done();
  727. }, DELAY);
  728. });
  729. it('select one', done => {
  730. const vm2 = createTable('selection');
  731. setTimeout(_ => {
  732. vm2.$el.querySelectorAll('.el-checkbox')[1].click();
  733. setTimeout(_ => {
  734. expect(vm2.selected).to.length(1);
  735. expect(vm2.selected[0].name).to.equal(getTestData()[0].name);
  736. destroyVM(vm2);
  737. done();
  738. }, DELAY);
  739. }, DELAY);
  740. });
  741. });
  742. describe('= index', () => {
  743. const vm = createTable('index');
  744. it('render', done => {
  745. setTimeout(_ => {
  746. expect(toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'))
  747. .map(node => node.textContent)).to.eql(['1', '2', '3', '4', '5']);
  748. destroyVM(vm);
  749. done();
  750. }, DELAY);
  751. });
  752. });
  753. });
  754. describe('sortable', () => {
  755. it('render', done => {
  756. const vm = createTable('', '', '', 'sortable');
  757. setTimeout(_ => {
  758. expect(vm.$el.querySelectorAll('.caret-wrapper')).to.length(1);
  759. destroyVM(vm);
  760. done();
  761. }, DELAY);
  762. });
  763. it('sortable method', done => {
  764. const vm = createTable(
  765. 'sortable :sort-method="sortMethod"', '', '', '', {
  766. methods: {
  767. sortMethod(a, b) {
  768. return a.runtime < b.runtime;
  769. }
  770. }
  771. });
  772. setTimeout(_ => {
  773. const elm = vm.$el.querySelector('.caret-wrapper');
  774. elm.click();
  775. setTimeout(_ => {
  776. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  777. expect(toArray(lastCells).map(node => node.textContent)).to.eql(['100', '95', '92', '92', '80']);
  778. destroyVM(vm);
  779. done();
  780. }, DELAY);
  781. }, DELAY);
  782. });
  783. it('sort-change', done => {
  784. let result;
  785. const vm = createTable('sortable="custom"', '', '', '', {
  786. methods: {
  787. sortChange(...args) {
  788. result = args;
  789. }
  790. }
  791. }, '@sort-change="sortChange"');
  792. setTimeout(_ => {
  793. const elm = vm.$el.querySelector('.caret-wrapper');
  794. elm.click();
  795. setTimeout(_ => {
  796. expect(result).to.exist;
  797. destroyVM(vm);
  798. done();
  799. }, DELAY);
  800. }, DELAY);
  801. });
  802. });
  803. describe('click sortable column', () => {
  804. const vm = createTable('', '', '', 'sortable');
  805. it('ascending', done => {
  806. const elm = vm.$el.querySelector('.caret-wrapper');
  807. elm.click();
  808. setTimeout(_ => {
  809. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  810. expect(toArray(lastCells).map(node => node.textContent))
  811. .to.eql(['80', '92', '92', '95', '100']);
  812. done();
  813. }, DELAY);
  814. });
  815. it('descending', done => {
  816. const elm = vm.$el.querySelector('.caret-wrapper');
  817. elm.click();
  818. setTimeout(_ => {
  819. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  820. expect(toArray(lastCells).map(node => node.textContent))
  821. .to.eql(['100', '95', '92', '92', '80']);
  822. destroyVM(vm);
  823. done();
  824. }, DELAY);
  825. });
  826. });
  827. });
  828. it('hover', done => {
  829. const vm = createVue({
  830. template: `
  831. <el-table :data="testData">
  832. <el-table-column prop="name" label="片名" />
  833. <el-table-column prop="release" label="发行日期" />
  834. <el-table-column prop="director" label="导演" />
  835. <el-table-column prop="runtime" label="时长(分)" />
  836. </el-table>
  837. `,
  838. created() {
  839. this.testData = getTestData();
  840. }
  841. }, true);
  842. setTimeout(_ => {
  843. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  844. triggerEvent(tr, 'mouseenter', true, false);
  845. setTimeout(_ => {
  846. expect(tr.classList.contains('hover-row')).to.true;
  847. triggerEvent(tr, 'mouseleave', true, false);
  848. setTimeout(_ => {
  849. expect(tr.classList.contains('hover-row')).to.false;
  850. destroyVM(vm);
  851. done();
  852. }, DELAY);
  853. }, DELAY);
  854. }, DELAY);
  855. });
  856. it('highlight-current-row', done => {
  857. const vm = createVue({
  858. template: `
  859. <el-table :data="testData" highlight-current-row>
  860. <el-table-column prop="name" label="片名" />
  861. <el-table-column prop="release" label="发行日期" />
  862. <el-table-column prop="director" label="导演" />
  863. <el-table-column prop="runtime" label="时长(分)" />
  864. </el-table>
  865. `,
  866. created() {
  867. this.testData = getTestData();
  868. }
  869. }, true);
  870. setTimeout(_ => {
  871. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  872. triggerEvent(tr, 'click', true, false);
  873. setTimeout(_ => {
  874. expect(tr.classList.contains('current-row')).to.be.true;
  875. const rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
  876. triggerEvent(rows[2], 'click', true, false);
  877. setTimeout(_ => {
  878. expect(tr.classList.contains('current-row')).to.be.false;
  879. expect(rows[2].classList.contains('current-row')).to.be.true;
  880. destroyVM(vm);
  881. done();
  882. }, DELAY);
  883. }, DELAY);
  884. }, DELAY);
  885. });
  886. });