table.spec.js 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510
  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('maxHeight', done => {
  79. const vm = createTable('max-height="134"');
  80. setTimeout(_ => {
  81. expect(vm.$el.style.maxHeight).to.equal('134px');
  82. destroyVM(vm);
  83. done();
  84. }, DELAY);
  85. });
  86. it('stripe', done => {
  87. const vm = createTable('stripe');
  88. setTimeout(_ => {
  89. expect(vm.$el.classList.contains('el-table--striped')).to.true;
  90. destroyVM(vm);
  91. done();
  92. }, DELAY);
  93. });
  94. it('border', done => {
  95. const vm = createTable('border');
  96. setTimeout(_ => {
  97. expect(vm.$el.classList.contains('el-table--border')).to.true;
  98. destroyVM(vm);
  99. done();
  100. }, DELAY);
  101. });
  102. it('fit', done => {
  103. const vm = createTable(':fit="false"');
  104. setTimeout(_ => {
  105. expect(vm.$el.classList.contains('el-table--fit')).to.false;
  106. destroyVM(vm);
  107. done();
  108. }, DELAY);
  109. });
  110. it('show-header', done => {
  111. const vm = createTable(':show-header="false"');
  112. setTimeout(_ => {
  113. expect(vm.$el.querySelectorAll('.el-table__header-wrapper').length).to.equal(0);
  114. destroyVM(vm);
  115. done();
  116. }, DELAY);
  117. });
  118. it('tableRowClassName', done => {
  119. const vm = createTable(':row-class-name="tableRowClassName"', {
  120. methods: {
  121. tableRowClassName(row, index) {
  122. if (index === 1) {
  123. return 'info-row';
  124. } else if (index === 3) {
  125. return 'positive-row';
  126. }
  127. return '';
  128. }
  129. }
  130. });
  131. setTimeout(_ => {
  132. expect(vm.$el.querySelectorAll('.info-row')).to.length(1);
  133. expect(vm.$el.querySelectorAll('.positive-row')).to.length(1);
  134. destroyVM(vm);
  135. done();
  136. }, DELAY);
  137. });
  138. it('tableRowStyle[Object]', done => {
  139. const vm = createTable(':row-style="{ height: \'60px\' }"', {});
  140. setTimeout(_ => {
  141. expect(vm.$el.querySelector('.el-table__body tr').style.height).to.equal('60px');
  142. destroyVM(vm);
  143. done();
  144. }, DELAY);
  145. });
  146. it('tableRowStyle[Function]', done => {
  147. const vm = createTable(':row-style="tableRowStyle"', {
  148. methods: {
  149. tableRowStyle(row, index) {
  150. if (index === 1) {
  151. return { height: '60px' };
  152. }
  153. return null;
  154. }
  155. }
  156. });
  157. setTimeout(_ => {
  158. expect(vm.$el.querySelector('.el-table__body tr:nth-child(1)').style.height).to.equal('');
  159. expect(vm.$el.querySelector('.el-table__body tr:nth-child(2)').style.height).to.equal('60px');
  160. destroyVM(vm);
  161. done();
  162. }, DELAY);
  163. });
  164. });
  165. describe('filter', () => {
  166. let vm;
  167. beforeEach(done => {
  168. vm = createVue({
  169. template: `
  170. <el-table ref="table" :data="testData" @filter-change="handleFilterChange">
  171. <el-table-column prop="name" label="片名" />
  172. <el-table-column prop="release" label="发行日期" />
  173. <el-table-column
  174. prop="director"
  175. column-key="director"
  176. :filters="[
  177. { text: 'John Lasseter', value: 'John Lasseter' },
  178. { text: 'Peter Docter', value: 'Peter Docter' },
  179. { text: 'Andrew Stanton', value: 'Andrew Stanton' }
  180. ]"
  181. :filter-method="filterMethod"
  182. label="导演" />
  183. <el-table-column prop="runtime" label="时长(分)" />
  184. </el-table>
  185. `,
  186. created() {
  187. this.testData = getTestData();
  188. },
  189. methods: {
  190. filterMethod(value, row) {
  191. return value === row.director;
  192. },
  193. handleFilterChange(filters) {
  194. this.filters = filters;
  195. }
  196. }
  197. }, true);
  198. setTimeout(done, DELAY);
  199. });
  200. afterEach(() => destroyVM(vm));
  201. it('render', () => {
  202. expect(vm.$el.querySelector('.el-table__column-filter-trigger')).to.exist;
  203. });
  204. it('click dropdown', done => {
  205. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  206. triggerEvent(btn, 'click', true, false);
  207. setTimeout(_ => {
  208. const filter = document.body.querySelector('.el-table-filter');
  209. expect(filter).to.exist;
  210. document.body.removeChild(filter);
  211. done();
  212. }, 100);
  213. });
  214. it('click filter', done => {
  215. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  216. triggerEvent(btn, 'click', true, false);
  217. setTimeout(_ => {
  218. const filter = document.body.querySelector('.el-table-filter');
  219. // John Lasseter
  220. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  221. // confrim button
  222. setTimeout(_ => {
  223. triggerEvent(filter.querySelector('.el-table-filter__bottom button'), 'click', true, false);
  224. setTimeout(_ => {
  225. expect(vm.filters['director']).to.be.eql(['John Lasseter']);
  226. expect(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr')).to.length(3);
  227. document.body.removeChild(filter);
  228. done();
  229. }, DELAY);
  230. }, 100);
  231. }, 100);
  232. });
  233. it('click reset', done => {
  234. const btn = vm.$el.querySelector('.el-table__column-filter-trigger');
  235. triggerEvent(btn, 'click', true, false);
  236. setTimeout(_ => {
  237. const filter = document.body.querySelector('.el-table-filter');
  238. // John Lasseter
  239. triggerEvent(filter.querySelector('.el-checkbox'), 'click', true, false);
  240. setTimeout(_ => {
  241. // reset button
  242. triggerEvent(filter.querySelectorAll('.el-table-filter__bottom button')[1], 'click', true, false);
  243. setTimeout(_ => {
  244. expect(vm.filters['director']).to.be.eql([]);
  245. expect(filter.querySelector('.el-table-filter__bottom button').classList.contains('is-disabled')).to.true;
  246. document.body.removeChild(filter);
  247. destroyVM(vm);
  248. done();
  249. }, DELAY);
  250. }, 100);
  251. }, 100);
  252. });
  253. });
  254. describe('events', () => {
  255. const createTable = function(prop = '', opts) {
  256. return createVue({
  257. template: `
  258. <el-table :data="testData" @${prop}="handleEvent">
  259. <el-table-column type="selection" />
  260. <el-table-column prop="name" />
  261. <el-table-column prop="release" />
  262. <el-table-column prop="director" />
  263. <el-table-column prop="runtime"/>
  264. </el-table>
  265. `,
  266. methods: {
  267. handleEvent(...args) {
  268. this.result = args;
  269. }
  270. },
  271. created() {
  272. this.testData = getTestData();
  273. },
  274. data() {
  275. return { result: '', testData: this.testData };
  276. }
  277. }, true);
  278. };
  279. it('select', done => {
  280. const vm = createTable('select');
  281. setTimeout(_ => {
  282. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  283. expect(vm.result).to.length(2);
  284. expect(vm.result[1]).to.have.property('name').to.equal(getTestData()[0].name);
  285. destroyVM(vm);
  286. done();
  287. }, DELAY);
  288. });
  289. it('select-all', done => {
  290. const vm = createTable('select-all');
  291. setTimeout(_ => {
  292. vm.$el.querySelector('.el-checkbox').click();
  293. setTimeout(_ => {
  294. expect(vm.result).to.length(1);
  295. expect(vm.result[0]).to.length(getTestData().length);
  296. destroyVM(vm);
  297. done();
  298. }, DELAY);
  299. }, DELAY);
  300. });
  301. it('selection-change', done => {
  302. const vm = createTable('selection-change');
  303. setTimeout(_ => {
  304. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  305. expect(vm.result).to.length(1);
  306. destroyVM(vm);
  307. done();
  308. }, DELAY);
  309. });
  310. it('cell-mouse-enter', done => {
  311. const vm = createTable('cell-mouse-enter');
  312. setTimeout(_ => {
  313. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  314. triggerEvent(cell.parentNode, 'mouseenter');
  315. expect(vm.result).to.length(4); // row, column, cell, event
  316. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  317. destroyVM(vm);
  318. done();
  319. }, DELAY);
  320. });
  321. it('cell-mouse-leave', done => {
  322. const vm = createTable('cell-mouse-leave');
  323. setTimeout(_ => {
  324. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[7]; // second row
  325. const cell2 = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  326. triggerEvent(cell2.parentNode, 'mouseenter');
  327. triggerEvent(cell.parentNode, 'mouseleave');
  328. expect(vm.result).to.length(4); // row, column, cell, event
  329. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  330. destroyVM(vm);
  331. done();
  332. }, DELAY);
  333. });
  334. it('cell-click', done => {
  335. const vm = createTable('cell-click');
  336. setTimeout(_ => {
  337. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  338. cell.parentNode.click();
  339. expect(vm.result).to.length(4); // row, column, cell, event
  340. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  341. destroyVM(vm);
  342. done();
  343. }, DELAY);
  344. });
  345. it('row-click', done => {
  346. const vm = createTable('row-click');
  347. setTimeout(_ => {
  348. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  349. triggerEvent(cell.parentNode.parentNode, 'click');
  350. expect(vm.result).to.length(3); // row, event, column
  351. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  352. destroyVM(vm);
  353. done();
  354. }, DELAY);
  355. });
  356. it('row-dblclick', done => {
  357. const vm = createTable('row-dblclick');
  358. setTimeout(_ => {
  359. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  360. triggerEvent(cell.parentNode.parentNode, 'dblclick');
  361. expect(vm.result).to.length(2); // row, event
  362. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  363. destroyVM(vm);
  364. done();
  365. }, DELAY);
  366. });
  367. it('current-change', done => {
  368. const vm = createTable('current-change');
  369. setTimeout(_ => {
  370. const cell = vm.$el.querySelectorAll('.el-table__body .cell')[2]; // first row
  371. triggerEvent(cell.parentNode.parentNode, 'click');
  372. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  373. expect(vm.result[0]).to.have.property('name').to.equal(getTestData()[0].name);
  374. expect(vm.result[1]).to.equal(null);
  375. // clear data => current-change should fire again.
  376. const oldRow = vm.result[0];
  377. vm.testData = [];
  378. setTimeout(() => {
  379. expect(vm.result).to.length(2); // currentRow, oldCurrentRow
  380. expect(vm.result[0]).to.equal(null);
  381. expect(vm.result[1]).to.equal(oldRow);
  382. destroyVM(vm);
  383. done();
  384. }, DELAY);
  385. }, DELAY);
  386. });
  387. it('header-click', done => {
  388. const vm = createTable('header-click');
  389. setTimeout(_ => {
  390. const cell = vm.$el.querySelectorAll('.el-table__header th')[1]; // header[prop='name']
  391. triggerEvent(cell, 'click');
  392. expect(vm.result).to.length(2); // column, event
  393. expect(vm.result[0]).to.have.property('property').to.equal('name');
  394. destroyVM(vm);
  395. done();
  396. }, DELAY);
  397. });
  398. });
  399. describe('column attributes', () => {
  400. const createTable = function(props1, props2, props3, props4, opts, tableProps) {
  401. return createVue(Object.assign({
  402. template: `
  403. <el-table :data="testData" ${tableProps || ''}>
  404. <el-table-column prop="name" ${props1 || ''} />
  405. <el-table-column prop="release" ${props2 || ''} />
  406. <el-table-column prop="director" ${props3 || ''} />
  407. <el-table-column prop="runtime" ${props4 || ''} />
  408. </el-table>
  409. `,
  410. created() {
  411. this.testData = getTestData();
  412. }
  413. }, opts));
  414. };
  415. it('label', done => {
  416. const vm = createTable('label="啊哈哈哈"', 'label="啊啦啦啦"');
  417. setTimeout(_ => {
  418. const ths = toArray(vm.$el.querySelectorAll('thead th'))
  419. .map(node => node.textContent).filter(o => o);
  420. expect(ths).to.eql(['啊哈哈哈', '啊啦啦啦']);
  421. destroyVM(vm);
  422. done();
  423. }, DELAY);
  424. });
  425. it('width', done => {
  426. const vm = createTable('width="123px"', ':width="102"', 'width="39"');
  427. setTimeout(_ => {
  428. const ths = toArray(vm.$el.querySelectorAll('.el-table__header-wrapper col'))
  429. .map(node => node.width).filter(o => o);
  430. expect(ths).to.include('123').include('102').include('39');
  431. destroyVM(vm);
  432. done();
  433. }, DELAY);
  434. });
  435. it('fixed', done => {
  436. const vm = createTable(
  437. 'fixed label="test1"',
  438. 'fixed="right" label="test2"',
  439. 'fixed="left" label="test3"');
  440. setTimeout(_ => {
  441. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed th:not(.is-hidden)'))
  442. .map(node => node.textContent))
  443. .to.eql(['test1', 'test3']);
  444. expect(toArray(vm.$el.querySelectorAll('.el-table__fixed-right th:not(.is-hidden)'))
  445. .map(node => node.textContent))
  446. .to.eql(['test2']);
  447. expect(vm.$el.querySelector('.el-table__body-wrapper').style.height).to.equal('');
  448. destroyVM(vm);
  449. done();
  450. }, DELAY);
  451. });
  452. it('resizable', done => {
  453. const vm = createTable(
  454. 'resizable',
  455. ':resizable="false"',
  456. '',
  457. '',
  458. {},
  459. 'border');
  460. setTimeout(_ => {
  461. const firstCol = vm.$el.querySelector('thead th');
  462. triggerEvent(firstCol, 'mousemove');
  463. triggerEvent(firstCol, 'mousedown');
  464. destroyVM(vm);
  465. done();
  466. }, DELAY);
  467. });
  468. it('formatter', done => {
  469. const vm = createTable(
  470. ':formatter="renderCell"', '', '', '', {
  471. methods: {
  472. renderCell(row, column) {
  473. return `[${row.name}]`;
  474. }
  475. }
  476. });
  477. setTimeout(_ => {
  478. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  479. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  480. destroyVM(vm);
  481. done();
  482. }, DELAY);
  483. });
  484. it('show-overflow-tooltip', done => {
  485. const vm = createTable('show-overflow-tooltip');
  486. setTimeout(_ => {
  487. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  488. destroyVM(vm);
  489. done();
  490. }, DELAY);
  491. });
  492. it('show-tooltip-when-overflow', done => { // old version prop name
  493. const vm = createTable('show-tooltip-when-overflow');
  494. setTimeout(_ => {
  495. expect(vm.$el.querySelectorAll('.el-tooltip')).to.length(5);
  496. destroyVM(vm);
  497. done();
  498. }, DELAY);
  499. });
  500. it('inline-template', done => {
  501. const vm = createVue({
  502. template: `
  503. <el-table :data="testData">
  504. <el-table-column prop="name" inline-template>
  505. <span>[{{ row.name }}]</span>
  506. </el-table-column>
  507. <el-table-column prop="release"/>
  508. <el-table-column prop="director"/>
  509. <el-table-column prop="runtime"/>
  510. </el-table>
  511. `,
  512. created() {
  513. this.testData = getTestData();
  514. }
  515. });
  516. setTimeout(_ => {
  517. const cells = toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'));
  518. expect(cells.map(n => n.textContent)).to.eql(getTestData().map(o => `[${o.name}]`));
  519. destroyVM(vm);
  520. done();
  521. }, DELAY);
  522. });
  523. it('render-header', done => {
  524. const vm = createVue({
  525. template: `
  526. <el-table :data="testData">
  527. <el-table-column prop="name" :render-header="renderHeader" label="name">
  528. </el-table-column>
  529. <el-table-column prop="release"/>
  530. <el-table-column prop="director"/>
  531. <el-table-column prop="runtime"/>
  532. </el-table>
  533. `,
  534. methods: {
  535. renderHeader(h, { column, $index }) {
  536. return '' + $index + ':' + column.label;
  537. }
  538. },
  539. created() {
  540. this.testData = getTestData();
  541. }
  542. });
  543. setTimeout(_ => {
  544. const headerCell = vm.$el.querySelector('.el-table__header-wrapper thead tr th:first-child .cell');
  545. expect(headerCell.textContent).to.equal('0:name');
  546. destroyVM(vm);
  547. done();
  548. }, DELAY);
  549. });
  550. it('align', done => {
  551. const vm = createTable('align="left"', 'align="right"', 'align="center"');
  552. setTimeout(_ => {
  553. var len = getTestData().length + 1;
  554. expect(vm.$el.querySelectorAll('.is-left')).to.length(len);
  555. expect(vm.$el.querySelectorAll('.is-right')).to.length(len);
  556. expect(vm.$el.querySelectorAll('.is-center')).to.length(len);
  557. destroyVM(vm);
  558. done();
  559. }, DELAY);
  560. });
  561. it('class-name', done => {
  562. const vm = createTable('class-name="column-1"', 'class-name="column-2 column-class-a"', 'class-name="column-class-a"');
  563. setTimeout(_ => {
  564. var len = getTestData().length + 1;
  565. expect(vm.$el.querySelectorAll('.column-1')).to.length(len);
  566. expect(vm.$el.querySelectorAll('.column-2')).to.length(len);
  567. expect(vm.$el.querySelectorAll('.column-class-a')).to.length(len * 2);
  568. destroyVM(vm);
  569. done();
  570. }, DELAY);
  571. });
  572. it('selectable', done => {
  573. const vm = createVue({
  574. template: `
  575. <el-table :data="testData" @selection-change="change">
  576. <el-table-column type="selection" :selectable="filterSelect" />
  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: [] };
  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(2);
  602. destroyVM(vm);
  603. done();
  604. }, DELAY);
  605. }, DELAY);
  606. });
  607. it('selectable === false & check selectAll status', done => {
  608. const vm = createVue({
  609. template: `
  610. <el-table :data="testData" @selection-change="change">
  611. <el-table-column type="selection" :selectable="filterSelect" />
  612. <el-table-column prop="name" label="name" />
  613. <el-table-column prop="release" label="release" />
  614. <el-table-column prop="director" label="director" />
  615. <el-table-column prop="runtime" label="runtime" />
  616. </el-table>
  617. `,
  618. created() {
  619. },
  620. data() {
  621. return { selected: [], testData: null };
  622. },
  623. methods: {
  624. change(rows) {
  625. this.selected = rows;
  626. },
  627. filterSelect(row, index) {
  628. return false;
  629. }
  630. }
  631. }, true);
  632. vm.testData = getTestData();
  633. setTimeout(_ => {
  634. expect(vm.$el.querySelector('.el-checkbox').__vue__.checked).to.be.false;
  635. setTimeout(_ => {
  636. expect(vm.selected).to.length(0);
  637. destroyVM(vm);
  638. done();
  639. }, DELAY);
  640. }, DELAY);
  641. });
  642. it('emit selection-change after row has been removed', done => {
  643. const vm = createVue({
  644. template: `
  645. <el-table :data="testData" @selection-change="change">
  646. <el-table-column type="selection" />
  647. <el-table-column prop="name" label="name" />
  648. <el-table-column prop="release" label="release" />
  649. <el-table-column prop="director" label="director" />
  650. <el-table-column prop="runtime" label="runtime" />
  651. </el-table>
  652. `,
  653. created() {
  654. this.testData = getTestData();
  655. },
  656. data() {
  657. return { selected: [], testData: null };
  658. },
  659. methods: {
  660. change(rows) {
  661. this.selected = rows;
  662. },
  663. filterSelect(row, index) {
  664. return index > 2;
  665. }
  666. }
  667. }, true);
  668. setTimeout(_ => {
  669. vm.$el.querySelector('.el-checkbox').click();
  670. setTimeout(_ => {
  671. expect(vm.selected).to.length(5);
  672. vm.testData.splice(0, 1);
  673. setTimeout(_ => {
  674. expect(vm.selected).to.length(4);
  675. destroyVM(vm);
  676. done();
  677. });
  678. }, DELAY);
  679. }, DELAY);
  680. });
  681. it('reserve-selection', done => {
  682. const getData = function(page = 0) {
  683. let id = 0;
  684. const rows = [];
  685. const row = () => {
  686. return {
  687. id: ++id + page * 10,
  688. date: new Date().getTime()
  689. };
  690. };
  691. let count = 10;
  692. while (--count) {
  693. rows.push(row());
  694. }
  695. return rows;
  696. };
  697. const vm = createVue({
  698. template: `
  699. <el-table ref="table" :row-key="rowKey" :data="testData" @selection-change="change">
  700. <el-table-column type="selection" reserve-selection />
  701. <el-table-column prop="id" label="id" />
  702. <el-table-column prop="date" label="date" />
  703. </el-table>
  704. `,
  705. created() {
  706. this.testData = getData();
  707. },
  708. data() {
  709. return { selected: [], testData: [] };
  710. },
  711. methods: {
  712. rowKey(row) {
  713. return row.id;
  714. },
  715. change(rows) {
  716. this.selected = rows;
  717. }
  718. }
  719. }, true);
  720. setTimeout(_ => {
  721. // click first
  722. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  723. setTimeout(_ => {
  724. expect(vm.$el.querySelectorAll('.el-checkbox__input.is-checked')).to.length(1);
  725. // go to second page
  726. vm.testData = getData(1);
  727. setTimeout(_ => {
  728. // expect no checked
  729. expect(vm.$el.querySelectorAll('.el-checkbox__input.is-checked')).to.length(0);
  730. // click first checkbox
  731. vm.$el.querySelectorAll('.el-checkbox')[1].click();
  732. vm.$el.querySelectorAll('.el-checkbox')[2].click();
  733. setTimeout(_ => {
  734. // back first page
  735. vm.testData = getData();
  736. setTimeout(_ => {
  737. expect(vm.$el.querySelectorAll('.el-checkbox__input.is-checked')).to.length(1);
  738. // clear
  739. vm.$refs.table.clearSelection();
  740. setTimeout(_ => {
  741. expect(vm.$el.querySelectorAll('.el-checkbox__input.is-checked')).to.length(0);
  742. destroyVM(vm);
  743. done();
  744. }, DELAY);
  745. }, DELAY);
  746. }, DELAY);
  747. }, DELAY);
  748. }, DELAY);
  749. }, DELAY);
  750. });
  751. describe('type', () => {
  752. const createTable = function(type) {
  753. return createVue({
  754. template: `
  755. <el-table :data="testData" @selection-change="change">
  756. <el-table-column type="${type}" />
  757. <el-table-column prop="name" label="name" />
  758. <el-table-column prop="release" label="release" />
  759. <el-table-column prop="director" label="director" />
  760. <el-table-column prop="runtime" label="runtime" />
  761. </el-table>
  762. `,
  763. created() {
  764. this.testData = getTestData();
  765. },
  766. data() {
  767. return { selected: [] };
  768. },
  769. methods: {
  770. change(rows) {
  771. this.selected = rows;
  772. }
  773. }
  774. }, true);
  775. };
  776. describe('= selection', () => {
  777. const vm = createTable('selection');
  778. it('render', done => {
  779. setTimeout(_ => {
  780. expect(vm.$el.querySelectorAll('.el-checkbox')).to.length(getTestData().length + 1);
  781. done();
  782. }, DELAY);
  783. });
  784. it('select all', done => {
  785. vm.$el.querySelector('.el-checkbox').click();
  786. setTimeout(_ => {
  787. expect(vm.selected).to.length(getTestData().length);
  788. done();
  789. }, DELAY);
  790. });
  791. it('cancel all', done => {
  792. vm.$el.querySelector('.el-checkbox').click();
  793. setTimeout(_ => {
  794. expect(vm.selected).to.length(0);
  795. destroyVM(vm);
  796. done();
  797. }, DELAY);
  798. });
  799. it('select one', done => {
  800. const vm2 = createTable('selection');
  801. setTimeout(_ => {
  802. vm2.$el.querySelectorAll('.el-checkbox')[1].click();
  803. setTimeout(_ => {
  804. expect(vm2.selected).to.length(1);
  805. expect(vm2.selected[0].name).to.equal(getTestData()[0].name);
  806. destroyVM(vm2);
  807. done();
  808. }, DELAY);
  809. }, DELAY);
  810. });
  811. });
  812. describe('= index', () => {
  813. const vm = createTable('index');
  814. it('render', done => {
  815. setTimeout(_ => {
  816. expect(toArray(vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:first-child'))
  817. .map(node => node.textContent)).to.eql(['1', '2', '3', '4', '5']);
  818. destroyVM(vm);
  819. done();
  820. }, DELAY);
  821. });
  822. });
  823. });
  824. describe('sortable', () => {
  825. it('render', done => {
  826. const vm = createTable('', '', '', 'sortable');
  827. setTimeout(_ => {
  828. expect(vm.$el.querySelectorAll('.caret-wrapper')).to.length(1);
  829. destroyVM(vm);
  830. done();
  831. }, DELAY);
  832. });
  833. it('sortable method', done => {
  834. const vm = createTable(
  835. 'sortable :sort-method="sortMethod"', '', '', '', {
  836. methods: {
  837. sortMethod(a, b) {
  838. return a.runtime < b.runtime;
  839. }
  840. }
  841. });
  842. setTimeout(_ => {
  843. const elm = vm.$el.querySelector('.caret-wrapper');
  844. elm.click();
  845. setTimeout(_ => {
  846. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  847. expect(toArray(lastCells).map(node => node.textContent)).to.eql(['100', '95', '92', '92', '80']);
  848. destroyVM(vm);
  849. done();
  850. }, DELAY);
  851. }, DELAY);
  852. });
  853. it('sort-change', done => {
  854. let result;
  855. const vm = createTable('sortable="custom"', '', '', '', {
  856. methods: {
  857. sortChange(...args) {
  858. result = args;
  859. }
  860. }
  861. }, '@sort-change="sortChange"');
  862. setTimeout(_ => {
  863. const elm = vm.$el.querySelector('.caret-wrapper');
  864. elm.click();
  865. setTimeout(_ => {
  866. expect(result).to.exist;
  867. destroyVM(vm);
  868. done();
  869. }, DELAY);
  870. }, DELAY);
  871. });
  872. });
  873. describe('click sortable column', () => {
  874. const vm = createTable('', '', '', 'sortable');
  875. it('ascending', done => {
  876. const elm = vm.$el.querySelector('.caret-wrapper');
  877. elm.click();
  878. setTimeout(_ => {
  879. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  880. expect(toArray(lastCells).map(node => node.textContent))
  881. .to.eql(['80', '92', '92', '95', '100']);
  882. done();
  883. }, DELAY);
  884. });
  885. it('descending', done => {
  886. const elm = vm.$el.querySelector('.caret-wrapper');
  887. elm.click();
  888. setTimeout(_ => {
  889. const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
  890. expect(toArray(lastCells).map(node => node.textContent))
  891. .to.eql(['100', '95', '92', '92', '80']);
  892. destroyVM(vm);
  893. done();
  894. }, DELAY);
  895. });
  896. });
  897. });
  898. describe('multi level column', () => {
  899. it('should works', done => {
  900. const vm = createVue({
  901. template: `
  902. <el-table :data="testData">
  903. <el-table-column prop="name" />
  904. <el-table-column label="group">
  905. <el-table-column prop="release"/>
  906. <el-table-column prop="director"/>
  907. </el-table-column>
  908. <el-table-column prop="runtime"/>
  909. </el-table>
  910. `,
  911. created() {
  912. this.testData = null;
  913. }
  914. }, true);
  915. setTimeout(_ => {
  916. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  917. expect(trs.length).equal(2);
  918. const firstRowHeader = trs[0].querySelectorAll('th .cell').length;
  919. const secondRowHeader = trs[1].querySelectorAll('th .cell').length;
  920. expect(firstRowHeader).to.equal(3);
  921. expect(secondRowHeader).to.equal(2);
  922. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('2');
  923. expect(trs[0].querySelector('th:nth-child(2)').getAttribute('colspan')).to.equal('2');
  924. destroyVM(vm);
  925. done();
  926. }, DELAY);
  927. });
  928. it('should works', done => {
  929. const vm = createVue({
  930. template: `
  931. <el-table :data="testData">
  932. <el-table-column prop="name" />
  933. <el-table-column label="group">
  934. <el-table-column label="group's group">
  935. <el-table-column prop="release" />
  936. <el-table-column prop="runtime"/>
  937. </el-table-column>
  938. <el-table-column prop="director" />
  939. </el-table-column>
  940. <el-table-column prop="runtime"/>
  941. </el-table>
  942. `,
  943. created() {
  944. this.testData = null;
  945. }
  946. }, true);
  947. setTimeout(_ => {
  948. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  949. expect(trs.length).equal(3);
  950. const firstRowHeader = trs[0].querySelectorAll('th .cell').length;
  951. const secondRowHeader = trs[1].querySelectorAll('th .cell').length;
  952. const thirdRowHeader = trs[2].querySelectorAll('th .cell').length;
  953. expect(firstRowHeader).to.equal(3);
  954. expect(secondRowHeader).to.equal(2);
  955. expect(thirdRowHeader).to.equal(2);
  956. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('3');
  957. expect(trs[0].querySelector('th:nth-child(2)').getAttribute('colspan')).to.equal('3');
  958. expect(trs[1].querySelector('th:first-child').getAttribute('colspan')).to.equal('2');
  959. expect(trs[1].querySelector('th:nth-child(2)').getAttribute('rowspan')).to.equal('2');
  960. destroyVM(vm);
  961. done();
  962. }, DELAY);
  963. });
  964. it('should work in one column', done => {
  965. const vm = createVue({
  966. template: `
  967. <el-table :data="testData">
  968. <el-table-column label="group">
  969. <el-table-column prop="release"/>
  970. </el-table-column>
  971. </el-table>
  972. `,
  973. created() {
  974. this.testData = null;
  975. }
  976. }, true);
  977. setTimeout(_ => {
  978. const trs = vm.$el.querySelectorAll('.el-table__header tr');
  979. expect(trs.length).equal(2);
  980. const firstRowLength = trs[0].querySelectorAll('th .cell').length;
  981. const secondRowLength = trs[1].querySelectorAll('th .cell').length;
  982. expect(firstRowLength).to.equal(1);
  983. expect(secondRowLength).to.equal(1);
  984. expect(trs[0].querySelector('th:first-child').getAttribute('rowspan')).to.equal('1');
  985. expect(trs[0].querySelector('th:first-child').getAttribute('colspan')).to.equal('1');
  986. destroyVM(vm);
  987. done();
  988. }, DELAY);
  989. });
  990. });
  991. describe('dynamic column attribtes', () => {
  992. const DELAY = 50;
  993. it('label', (done) => {
  994. const vm = createVue({
  995. template: `
  996. <el-table :data="testData">
  997. <el-table-column prop="name" :label="label"/>
  998. <el-table-column prop="release" />
  999. <el-table-column prop="director" />
  1000. <el-table-column prop="runtime" />
  1001. </el-table>
  1002. `,
  1003. data() {
  1004. return {
  1005. label: 'name'
  1006. };
  1007. },
  1008. created() {
  1009. this.testData = getTestData();
  1010. }
  1011. }, true);
  1012. setTimeout(() => {
  1013. expect(vm.$el.querySelector('.el-table__header th .cell').textContent).to.equal('name');
  1014. vm.label = 'NAME';
  1015. vm.$nextTick(() => {
  1016. expect(vm.$el.querySelector('.el-table__header th .cell').textContent).to.equal('NAME');
  1017. });
  1018. done();
  1019. }, DELAY);
  1020. });
  1021. it('align', (done) => {
  1022. const vm = createVue({
  1023. template: `
  1024. <el-table :data="testData">
  1025. <el-table-column prop="name" :align="align"/>
  1026. </el-table>
  1027. `,
  1028. data() {
  1029. return {
  1030. align: 'left'
  1031. };
  1032. },
  1033. created() {
  1034. this.testData = getTestData();
  1035. }
  1036. }, true);
  1037. setTimeout(() => {
  1038. expect(vm.$el.querySelectorAll('.el-table__body td.is-right').length === 0).to.be.true;
  1039. vm.align = 'right';
  1040. vm.$nextTick(() => {
  1041. expect(vm.$el.querySelectorAll('.el-table__body td.is-right').length > 0).to.be.true;
  1042. });
  1043. done();
  1044. }, DELAY);
  1045. });
  1046. it('header-align', (done) => {
  1047. const vm = createVue({
  1048. template: `
  1049. <el-table :data="testData">
  1050. <el-table-column prop="name" :align="align" :header-align="headerAlign"/>
  1051. </el-table>
  1052. `,
  1053. data() {
  1054. return {
  1055. align: 'left',
  1056. headerAlign: null
  1057. };
  1058. },
  1059. created() {
  1060. this.testData = getTestData();
  1061. }
  1062. }, true);
  1063. setTimeout(() => {
  1064. expect(vm.$el.querySelectorAll('.el-table__header th.is-left').length > 0).to.be.true;
  1065. expect(vm.$el.querySelectorAll('.el-table__header td.is-center').length === 0).to.be.true;
  1066. vm.align = 'right';
  1067. vm.$nextTick(() => {
  1068. expect(vm.$el.querySelectorAll('.el-table__header th.is-right').length > 0).to.be.true;
  1069. expect(vm.$el.querySelectorAll('.el-table__header td.is-center').length === 0).to.be.true;
  1070. vm.headerAlign = 'center';
  1071. vm.$nextTick(() => {
  1072. expect(vm.$el.querySelectorAll('.el-table__header th.is-right').length === 0).to.be.true;
  1073. expect(vm.$el.querySelectorAll('.el-table__header td.is-center').length > 0).to.be.true;
  1074. });
  1075. });
  1076. done();
  1077. }, DELAY);
  1078. });
  1079. it('width', (done) => {
  1080. const vm = createVue({
  1081. template: `
  1082. <el-table :data="testData" :fit="false">
  1083. <el-table-column prop="name" :width="width"/>
  1084. </el-table>
  1085. `,
  1086. data() {
  1087. return {
  1088. width: 100
  1089. };
  1090. },
  1091. created() {
  1092. this.testData = getTestData();
  1093. }
  1094. }, true);
  1095. setTimeout(() => {
  1096. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('100');
  1097. vm.width = 200;
  1098. vm.$nextTick(() => {
  1099. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('200');
  1100. });
  1101. done();
  1102. }, DELAY);
  1103. });
  1104. it('min-width', (done) => {
  1105. const vm = createVue({
  1106. template: `
  1107. <el-table :data="testData" :fit="false">
  1108. <el-table-column prop="name" :min-width="width"/>
  1109. </el-table>
  1110. `,
  1111. data() {
  1112. return {
  1113. width: 100
  1114. };
  1115. },
  1116. created() {
  1117. this.testData = getTestData();
  1118. }
  1119. }, true);
  1120. setTimeout(() => {
  1121. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('100');
  1122. vm.width = 200;
  1123. vm.$nextTick(() => {
  1124. expect(vm.$el.querySelector('.el-table__body col').getAttribute('width')).to.equal('200');
  1125. });
  1126. done();
  1127. }, DELAY);
  1128. });
  1129. it('fixed', (done) => {
  1130. const vm = createVue({
  1131. template: `
  1132. <el-table :data="testData">
  1133. <el-table-column :fixed="fixed" />
  1134. <el-table-column prop="release" />
  1135. <el-table-column prop="director" />
  1136. <el-table-column prop="runtime" />
  1137. </el-table>
  1138. `,
  1139. data() {
  1140. return {
  1141. fixed: false
  1142. };
  1143. },
  1144. created() {
  1145. this.testData = getTestData();
  1146. }
  1147. }, true);
  1148. setTimeout(() => {
  1149. expect(!vm.$el.querySelector('.el-table__fixed')).to.be.true;
  1150. vm.fixed = true;
  1151. vm.$nextTick(() => {
  1152. expect(!!vm.$el.querySelector('.el-table__fixed')).to.be.true;
  1153. });
  1154. done();
  1155. }, DELAY);
  1156. });
  1157. it('prop', (done) => {
  1158. const vm = createVue({
  1159. template: `
  1160. <el-table :data="testData">
  1161. <el-table-column :prop="name" />
  1162. <el-table-column prop="release" />
  1163. <el-table-column prop="director" />
  1164. <el-table-column prop="runtime" />
  1165. </el-table>
  1166. `,
  1167. data() {
  1168. return {
  1169. prop: 'name'
  1170. };
  1171. },
  1172. created() {
  1173. this.testData = getTestData();
  1174. }
  1175. }, true);
  1176. setTimeout(() => {
  1177. let firstColumnContent = vm.$el.querySelector('.el-table__body td .cell').textContent;
  1178. let secondColumnContent = vm.$el.querySelector('.el-table__body td:nth-child(2) .cell').textContent;
  1179. expect(firstColumnContent !== secondColumnContent).to.be.true;
  1180. vm.prop = 'release';
  1181. vm.property = 'release';
  1182. vm.$nextTick(() => {
  1183. firstColumnContent = vm.$el.querySelector('.el-table__body td .cell').textContent;
  1184. secondColumnContent = vm.$el.querySelector('.el-table__body td:nth-child(2) .cell').textContent;
  1185. expect(firstColumnContent === secondColumnContent).to.be.true;
  1186. });
  1187. done();
  1188. }, DELAY);
  1189. });
  1190. });
  1191. describe('methods', () => {
  1192. const createTable = function(prop = '', opts) {
  1193. return createVue({
  1194. template: `
  1195. <el-table ref="table" :data="testData" @${prop}="handleEvent">
  1196. <el-table-column type="selection" />
  1197. <el-table-column prop="name" />
  1198. <el-table-column prop="release" />
  1199. <el-table-column prop="director" />
  1200. <el-table-column prop="runtime"/>
  1201. </el-table>
  1202. `,
  1203. methods: {
  1204. handleEvent(selection) {
  1205. this.fireCount++;
  1206. this.selection = selection;
  1207. }
  1208. },
  1209. created() {
  1210. this.testData = getTestData();
  1211. },
  1212. data() {
  1213. return { selection: null, testData: this.testData, fireCount: 0 };
  1214. }
  1215. }, true);
  1216. };
  1217. it('toggleRowSelection', () => {
  1218. const vm = createTable('selection-change');
  1219. vm.$refs.table.toggleRowSelection(vm.testData[0]);
  1220. expect(vm.selection).to.length(1);
  1221. expect(vm.fireCount).to.equal(1);
  1222. // test use second parameter
  1223. vm.$refs.table.toggleRowSelection(vm.testData[0], true);
  1224. expect(vm.fireCount).to.equal(1);
  1225. vm.$refs.table.toggleRowSelection(vm.testData[0], false);
  1226. expect(vm.fireCount).to.equal(2);
  1227. expect(vm.selection).to.length(0);
  1228. destroyVM(vm);
  1229. });
  1230. it('clearSelection', () => {
  1231. const vm = createTable('selection-change');
  1232. vm.$refs.table.toggleRowSelection(vm.testData[0]);
  1233. expect(vm.selection).to.length(1);
  1234. expect(vm.fireCount).to.equal(1);
  1235. // clear selection
  1236. vm.$refs.table.clearSelection();
  1237. expect(vm.fireCount).to.equal(2);
  1238. expect(vm.selection).to.length(0);
  1239. vm.$refs.table.clearSelection();
  1240. expect(vm.fireCount).to.equal(2);
  1241. destroyVM(vm);
  1242. });
  1243. });
  1244. it('hover', done => {
  1245. const vm = createVue({
  1246. template: `
  1247. <el-table :data="testData">
  1248. <el-table-column prop="name" label="片名" fixed />
  1249. <el-table-column prop="release" label="发行日期" />
  1250. <el-table-column prop="director" label="导演" />
  1251. <el-table-column prop="runtime" label="时长(分)" />
  1252. </el-table>
  1253. `,
  1254. created() {
  1255. this.testData = getTestData();
  1256. }
  1257. }, true);
  1258. setTimeout(_ => {
  1259. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  1260. triggerEvent(tr, 'mouseenter', true, false);
  1261. setTimeout(_ => {
  1262. expect(tr.classList.contains('hover-row')).to.true;
  1263. triggerEvent(tr, 'mouseleave', true, false);
  1264. setTimeout(_ => {
  1265. expect(tr.classList.contains('hover-row')).to.false;
  1266. destroyVM(vm);
  1267. done();
  1268. }, DELAY);
  1269. }, DELAY);
  1270. }, DELAY);
  1271. });
  1272. it('highlight-current-row', done => {
  1273. const vm = createVue({
  1274. template: `
  1275. <el-table :data="testData" highlight-current-row>
  1276. <el-table-column prop="name" label="片名" />
  1277. <el-table-column prop="release" label="发行日期" />
  1278. <el-table-column prop="director" label="导演" />
  1279. <el-table-column prop="runtime" label="时长(分)" />
  1280. </el-table>
  1281. `,
  1282. created() {
  1283. this.testData = getTestData();
  1284. }
  1285. }, true);
  1286. setTimeout(_ => {
  1287. const tr = vm.$el.querySelector('.el-table__body-wrapper tbody tr');
  1288. triggerEvent(tr, 'click', true, false);
  1289. setTimeout(_ => {
  1290. expect(tr.classList.contains('current-row')).to.be.true;
  1291. const rows = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr');
  1292. triggerEvent(rows[2], 'click', true, false);
  1293. setTimeout(_ => {
  1294. expect(tr.classList.contains('current-row')).to.be.false;
  1295. expect(rows[2].classList.contains('current-row')).to.be.true;
  1296. destroyVM(vm);
  1297. done();
  1298. }, DELAY);
  1299. }, DELAY);
  1300. }, DELAY);
  1301. });
  1302. });