scroll.spec.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. 'use strict';
  2. describe('WalkontableScroll', function () {
  3. var $table,
  4. $container,
  5. $wrapper,
  6. debug = false;
  7. beforeEach(function () {
  8. $wrapper = $('<div></div>').css({ overflow: 'hidden' });
  9. $container = $('<div></div>');
  10. $table = $('<table></table>'); // create a table that is not attached to document
  11. $wrapper.append($container);
  12. $container.append($table);
  13. $wrapper.appendTo('body');
  14. createDataArray(100, 4);
  15. });
  16. afterEach(function () {
  17. if (!debug) {
  18. $('.wtHolder').remove();
  19. }
  20. $wrapper.remove();
  21. });
  22. describe('scroll', function () {
  23. it('should scroll to last column when rowHeaders is not in use', function () {
  24. var wt = new Walkontable.Core({
  25. table: $table[0],
  26. data: getData,
  27. totalRows: getTotalRows,
  28. totalColumns: getTotalColumns
  29. });
  30. wt.draw().scrollHorizontal(999).draw();
  31. expect($table.find('tbody tr:eq(0) td:last')[0].innerHTML).toBe('c');
  32. });
  33. it('should scroll to last column when rowHeaders is in use', function () {
  34. function plusOne(i) {
  35. return i + 1;
  36. }
  37. var wt = new Walkontable.Core({
  38. table: $table[0],
  39. data: getData,
  40. totalRows: getTotalRows,
  41. totalColumns: getTotalColumns,
  42. columnHeaders: [function (col, TH) {
  43. TH.innerHTML = plusOne(col);
  44. }],
  45. rowHeaders: [function (row, TH) {
  46. TH.innerHTML = plusOne(row);
  47. }]
  48. });
  49. wt.draw().scrollHorizontal(999).draw();
  50. expect($table.find('tbody tr:eq(0) td:last')[0].innerHTML).toBe('c');
  51. });
  52. it('scroll not scroll the viewport if all rows are visible', function () {
  53. this.data.splice(5);
  54. $wrapper.height(201).width(100);
  55. var wt = new Walkontable.Core({
  56. table: $table[0],
  57. data: getData,
  58. totalRows: getTotalRows,
  59. totalColumns: getTotalColumns
  60. });
  61. wt.draw();
  62. expect(wt.wtTable.getVisibleRowsCount()).toEqual(5);
  63. wt.scrollVertical(999).draw();
  64. expect(wt.wtTable.getCoords($table.find('tbody tr:eq(0) td:eq(0)')[0])).toEqual(new Walkontable.CellCoords(0, 0));
  65. });
  66. it('scroll horizontal should take totalColumns if it is smaller than width', function () {
  67. var wt = new Walkontable.Core({
  68. table: $table[0],
  69. data: getData,
  70. totalRows: getTotalRows,
  71. totalColumns: getTotalColumns
  72. });
  73. wt.draw().scrollHorizontal(999).draw();
  74. expect(wt.wtTable.getCoords($table.find('tbody tr:eq(0) td:eq(0)')[0])).toEqual(new Walkontable.CellCoords(0, 0));
  75. });
  76. it('scroll vertical should scroll to first row if given number smaller than 0', function () {
  77. var wt = new Walkontable.Core({
  78. table: $table[0],
  79. data: getData,
  80. totalRows: getTotalRows,
  81. totalColumns: getTotalColumns
  82. });
  83. wt.draw().scrollVertical(-1).draw();
  84. expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(0, 0));
  85. });
  86. it('scroll vertical should scroll to last row if given number bigger than totalRows', function () {
  87. this.data.splice(20, this.data.length - 20);
  88. var wt = new Walkontable.Core({
  89. table: $table[0],
  90. data: getData,
  91. totalRows: getTotalRows,
  92. totalColumns: getTotalColumns
  93. });
  94. wt.draw().scrollVertical(999).draw();
  95. expect(wt.wtTable.getCoords($table.find('tbody tr:last td:first')[0])).toEqual(new Walkontable.CellCoords(19, 0));
  96. });
  97. it('scroll horizontal should scroll to first row if given number smaller than 0', function () {
  98. var wt = new Walkontable.Core({
  99. table: $table[0],
  100. data: getData,
  101. totalRows: getTotalRows,
  102. totalColumns: getTotalColumns
  103. });
  104. wt.draw().scrollHorizontal(-1).draw();
  105. expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(0, 0));
  106. });
  107. it('scroll horizontal should scroll to last row if given number bigger than totalRows', function () {
  108. var wt = new Walkontable.Core({
  109. table: $table[0],
  110. data: getData,
  111. totalRows: getTotalRows,
  112. totalColumns: getTotalColumns
  113. });
  114. wt.draw().scrollHorizontal(999).draw();
  115. expect(wt.wtTable.getCoords($table.find('tbody tr:first td:last')[0])).toEqual(new Walkontable.CellCoords(0, 3));
  116. });
  117. it('scroll viewport to a cell that is visible should do nothing', function () {
  118. $wrapper.height(201).width(120);
  119. var wt = new Walkontable.Core({
  120. table: $table[0],
  121. data: getData,
  122. totalRows: getTotalRows,
  123. totalColumns: getTotalColumns
  124. });
  125. wt.draw();
  126. var tmp = wt.getViewport();
  127. wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw();
  128. expect(wt.getViewport()).toEqual(tmp);
  129. });
  130. it('scroll viewport to a cell on far right should make it visible on right edge', function () {
  131. $wrapper.width(125).height(201);
  132. var wt = new Walkontable.Core({
  133. table: $table[0],
  134. data: getData,
  135. totalRows: getTotalRows,
  136. totalColumns: getTotalColumns
  137. });
  138. wt.draw();
  139. var height = $wrapper[0].clientHeight;
  140. var visibleRowCount = Math.floor(height / 23);
  141. wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw();
  142. expect(wt.getViewport()).toEqual([0, 1, visibleRowCount - 1, 2]);
  143. });
  144. it('scroll viewport to a cell on far left should make it visible on left edge', function () {
  145. $wrapper.width(100).height(201);
  146. var wt = new Walkontable.Core({
  147. table: $table[0],
  148. data: getData,
  149. totalRows: getTotalRows,
  150. totalColumns: getTotalColumns
  151. });
  152. wt.draw();
  153. var height = $wrapper[0].clientHeight;
  154. var visibleRowCount = Math.floor(height / 23);
  155. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  156. expect(wt.getViewport()).toEqual([0, 3, visibleRowCount - 1, 3]);
  157. wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw();
  158. expect(wt.getViewport()).toEqual([0, 1, visibleRowCount - 1, 1]);
  159. });
  160. it('scroll viewport to a cell on far left should make it visible on left edge (with row header)', function () {
  161. $wrapper.width(140).height(201);
  162. var wt = new Walkontable.Core({
  163. table: $table[0],
  164. data: getData,
  165. totalRows: getTotalRows,
  166. totalColumns: getTotalColumns,
  167. rowHeaders: [function (row, TH) {
  168. TH.innerHTML = row + 1;
  169. }]
  170. });
  171. wt.draw();
  172. var height = $wrapper[0].clientHeight;
  173. var visibleRowCount = Math.floor(height / 23);
  174. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  175. expect(wt.getViewport()).toEqual([0, 3, visibleRowCount - 1, 3]);
  176. wt.scrollViewport(new Walkontable.CellCoords(0, 1)).draw();
  177. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(1);
  178. });
  179. it('scroll viewport to a cell on far right should make it visible on right edge (with row header)', function () {
  180. var wt = new Walkontable.Core({
  181. table: $table[0],
  182. data: getData,
  183. totalRows: getTotalRows,
  184. totalColumns: getTotalColumns,
  185. rowHeaders: [function (row, TH) {
  186. TH.innerHTML = row + 1;
  187. }]
  188. });
  189. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 2)).draw();
  190. expect(wt.wtTable.getCoords($table.find('tbody tr:first td:last')[0])).toEqual(new Walkontable.CellCoords(0, 3));
  191. });
  192. it('scroll viewport to a cell on far bottom should make it visible on bottom edge', function () {
  193. $wrapper.width(125).height(201);
  194. var wt = new Walkontable.Core({
  195. table: $table[0],
  196. data: getData,
  197. totalRows: getTotalRows,
  198. totalColumns: getTotalColumns
  199. });
  200. wt.draw();
  201. wt.scrollViewport(new Walkontable.CellCoords(12, 0)).draw();
  202. expect(wt.getViewport()[0]).toBeAroundValue(5);
  203. expect(wt.getViewport()[1]).toBeAroundValue(0);
  204. expect(wt.getViewport()[2]).toBeAroundValue(12);
  205. expect(wt.getViewport()[3]).toBeAroundValue(1);
  206. });
  207. it('scroll viewport to a cell on far top should make it visible on top edge', function () {
  208. $wrapper.width(100).height(201);
  209. var wt = new Walkontable.Core({
  210. table: $table[0],
  211. data: getData,
  212. totalRows: getTotalRows,
  213. totalColumns: getTotalColumns
  214. });
  215. wt.draw();
  216. wt.scrollViewport(new Walkontable.CellCoords(20, 0)).draw();
  217. wt.scrollViewport(new Walkontable.CellCoords(12, 0)).draw();
  218. expect(wt.wtTable.getCoords($table.find('tbody tr:first td:first')[0])).toEqual(new Walkontable.CellCoords(12, 0));
  219. });
  220. it('scroll viewport to a cell that does not exist (vertically) should throw an error', function () {
  221. this.data.splice(20, this.data.length - 20);
  222. expect(function () {
  223. $wrapper.width(100).height(201);
  224. var wt = new Walkontable.Core({
  225. table: $table[0],
  226. data: getData,
  227. totalRows: getTotalRows,
  228. totalColumns: getTotalColumns
  229. });
  230. wt.draw();
  231. wt.scrollViewport(new Walkontable.CellCoords(40, 0)).draw();
  232. }).toThrow();
  233. });
  234. it('scroll viewport to a cell that does not exist (horizontally) should throw an error', function () {
  235. expect(function () {
  236. $wrapper.width(100).height(201);
  237. var wt = new Walkontable.Core({
  238. table: $table[0],
  239. data: getData,
  240. totalRows: getTotalRows,
  241. totalColumns: getTotalColumns
  242. });
  243. wt.draw();
  244. wt.scrollViewport(new Walkontable.CellCoords(0, 40)).draw();
  245. }).toThrow();
  246. });
  247. it('remove row from the last scroll page should scroll viewport a row up if needed', function () {
  248. $wrapper.width(100).height(210);
  249. var wt = new Walkontable.Core({
  250. table: $table[0],
  251. data: getData,
  252. totalRows: getTotalRows,
  253. totalColumns: getTotalColumns
  254. });
  255. wt.draw().scrollViewport(new Walkontable.CellCoords(getTotalRows() - 1, 0)).draw();
  256. var originalViewportStartRow = wt.getViewport()[0];
  257. this.data.splice(getTotalRows() - 4, 1); // remove row at index 96
  258. wt.draw();
  259. expect(originalViewportStartRow - 1).toEqual(wt.getViewport()[0]);
  260. });
  261. it('should scroll to last row if smaller data source is loaded that does not have currently displayed row', function () {
  262. $wrapper.width(100).height(260);
  263. var wt = new Walkontable.Core({
  264. table: $table[0],
  265. data: getData,
  266. totalRows: getTotalRows,
  267. totalColumns: getTotalColumns
  268. });
  269. wt.draw();
  270. wt.scrollVertical(50).draw();
  271. this.data.splice(30, this.data.length - 30);
  272. wt.draw();
  273. expect($table.find('tbody tr').length).toBeGreaterThan(9);
  274. });
  275. it('should scroll to last column if smaller data source is loaded that does not have currently displayed column', function () {
  276. createDataArray(20, 100);
  277. var wt = new Walkontable.Core({
  278. table: $table[0],
  279. data: getData,
  280. totalRows: getTotalRows,
  281. totalColumns: getTotalColumns
  282. });
  283. wt.draw().scrollHorizontal(50).draw();
  284. createDataArray(100, 30);
  285. wt.draw();
  286. expect($table.find('tbody tr:first td').length).toBeGreaterThan(3);
  287. });
  288. it('should scroll to last row with very high rows', function () {
  289. createDataArray(20, 100);
  290. for (var i = 0, ilen = this.data.length; i < ilen; i++) {
  291. this.data[i][0] += '\n this \nis \na \nmultiline \ncell';
  292. }
  293. $wrapper.width(260).height(201);
  294. var wt = new Walkontable.Core({
  295. table: $table[0],
  296. data: getData,
  297. totalRows: getTotalRows,
  298. totalColumns: getTotalColumns
  299. });
  300. wt.draw();
  301. wt.scrollVertical(20).draw();
  302. expect($table.find('tbody tr:last td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(this.data.length - 1, 0))); // last rendered row should be last data row
  303. });
  304. xit('should scroll to last row with very high rows (respecting fixedRows)', function () {
  305. createDataArray(20, 100);
  306. for (var i = 0, ilen = this.data.length; i < ilen; i++) {
  307. this.data[i][0] += '\n this \nis \na \nmultiline \ncell';
  308. }
  309. var wt = new Walkontable.Core({
  310. table: $table[0],
  311. data: getData,
  312. totalRows: getTotalRows,
  313. totalColumns: getTotalColumns,
  314. fixedRowsTop: 2
  315. });
  316. wt.draw().scrollVertical(2000).draw();
  317. expect($table.find('tbody tr:eq(0) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(0, 0))); // first rendered row should fixed row 0
  318. expect($table.find('tbody tr:eq(1) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(1, 0))); // second rendered row should fixed row 1
  319. expect($table.find('tbody tr:eq(2) td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(2, 0))); // third rendered row should fixed row 1
  320. expect($table.find('tbody tr:last td:first')[0]).toBe(wt.wtTable.getCell(new Walkontable.CellCoords(this.data.length - 1, 0))); // last rendered row should be last data row
  321. });
  322. it('should scroll to last column with very wide cells', function () {
  323. createDataArray(20, 100);
  324. $wrapper.width(260).height(201);
  325. var wt = new Walkontable.Core({
  326. table: $table[0],
  327. data: getData,
  328. totalRows: getTotalRows,
  329. totalColumns: getTotalColumns
  330. });
  331. wt.draw().scrollHorizontal(50).draw();
  332. createDataArray(100, 30);
  333. wt.draw();
  334. expect($table.find('tbody tr:first td').length).toBeGreaterThan(3);
  335. });
  336. it('should scroll the desired cell to the bottom edge even if it\'s located in a fixed column', function (done) {
  337. createDataArray(20, 100);
  338. $wrapper.width(260).height(201);
  339. var wt = new Walkontable.Core({
  340. table: $table[0],
  341. data: getData,
  342. totalRows: getTotalRows,
  343. totalColumns: getTotalColumns,
  344. fixedColumnsLeft: 2
  345. });
  346. wt.draw().scrollViewport(new Walkontable.CellCoords(8, 1)).draw();
  347. setTimeout(function () {
  348. expect(wt.wtTable.getLastVisibleRow()).toBe(8);
  349. done();
  350. }, 20);
  351. });
  352. it('should update the scroll position of overlays only once, when scrolling the master table', function (done) {
  353. createDataArray(100, 100);
  354. $wrapper.width(260).height(201);
  355. var topOverlayCallback = jasmine.createSpy('topOverlayCallback');
  356. var leftOverlayCallback = jasmine.createSpy('leftOverlayCallback');
  357. var wt = new Walkontable.Core({
  358. table: $table[0],
  359. data: getData,
  360. totalRows: getTotalRows,
  361. totalColumns: getTotalColumns,
  362. fixedColumnsLeft: 2,
  363. fixedRowsTop: 2
  364. });
  365. var masterHolder = wt.wtTable.holder;
  366. var leftOverlayHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder;
  367. var topOverlayHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder;
  368. topOverlayHolder.addEventListener('scroll', topOverlayCallback);
  369. leftOverlayHolder.addEventListener('scroll', leftOverlayCallback);
  370. wt.draw();
  371. wt.scrollViewport(new Walkontable.CellCoords(50, 50)).draw();
  372. setTimeout(function () {
  373. expect(topOverlayCallback.calls.count()).toEqual(1);
  374. expect(leftOverlayCallback.calls.count()).toEqual(1);
  375. expect(topOverlayHolder.scrollLeft).toEqual(masterHolder.scrollLeft);
  376. expect(leftOverlayHolder.scrollTop).toEqual(masterHolder.scrollTop);
  377. topOverlayHolder.removeEventListener('scroll', topOverlayCallback);
  378. leftOverlayHolder.removeEventListener('scroll', leftOverlayCallback);
  379. done();
  380. }, 20);
  381. });
  382. it('should update the scroll position of the master table only once, when scrolling the overlay', function (done) {
  383. createDataArray(100, 100);
  384. $wrapper.width(260).height(201);
  385. var masterCallback = jasmine.createSpy('masterCallback');
  386. var topOverlayCallback = jasmine.createSpy('topOverlayCallback');
  387. var leftOverlayCallback = jasmine.createSpy('leftOverlayCallback');
  388. var wt = new Walkontable.Core({
  389. table: $table[0],
  390. data: getData,
  391. totalRows: getTotalRows,
  392. totalColumns: getTotalColumns,
  393. fixedColumnsLeft: 2,
  394. fixedRowsTop: 2
  395. });
  396. var masterHolder = wt.wtTable.holder;
  397. var leftOverlayHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder;
  398. var topOverlayHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder;
  399. masterHolder.addEventListener('scroll', masterCallback);
  400. leftOverlayHolder.addEventListener('scroll', leftOverlayCallback);
  401. wt.draw();
  402. topOverlayHolder.scrollLeft = 400;
  403. wt.draw();
  404. setTimeout(function () {
  405. expect(masterCallback.calls.count()).toEqual(1);
  406. expect(leftOverlayCallback.calls.count()).toEqual(0);
  407. expect(topOverlayHolder.scrollLeft).toEqual(masterHolder.scrollLeft);
  408. leftOverlayHolder.scrollTop = 200;
  409. wt.draw();
  410. }, 50);
  411. setTimeout(function () {
  412. expect(masterCallback.calls.count()).toEqual(2);
  413. expect(leftOverlayCallback.calls.count()).toEqual(1);
  414. expect(leftOverlayHolder.scrollTop).toEqual(masterHolder.scrollTop);
  415. masterHolder.removeEventListener('scroll', masterCallback);
  416. leftOverlayHolder.removeEventListener('scroll', leftOverlayCallback);
  417. done();
  418. }, 100);
  419. });
  420. // Commented due to PhantomJS WheelEvent problem.
  421. // Throws an error: TypeError: '[object WheelEventConstructor]' is not a constructor
  422. xit('should scroll the table when the `wheel` event is triggered on the corner overlay', function () {
  423. createDataArray(100, 100);
  424. $wrapper.width(260).height(201);
  425. var masterCallback = jasmine.createSpy('masterCallback');
  426. var topCallback = jasmine.createSpy('topCallback');
  427. var leftCallback = jasmine.createSpy('leftCallback');
  428. var wt = new Walkontable.Core({
  429. table: $table[0],
  430. data: getData,
  431. totalRows: getTotalRows,
  432. totalColumns: getTotalColumns,
  433. fixedColumnsLeft: 2,
  434. fixedRowsTop: 2
  435. });
  436. wt.draw();
  437. var topLeftCornerOverlayHolder = wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder;
  438. var topHolder = wt.wtOverlays.topOverlay.clone.wtTable.holder;
  439. var leftHolder = wt.wtOverlays.leftOverlay.clone.wtTable.holder;
  440. var masterHolder = wt.wtTable.holder;
  441. masterHolder.addEventListener('scroll', masterCallback);
  442. topHolder.addEventListener('scroll', topCallback);
  443. leftHolder.addEventListener('scroll', leftCallback);
  444. var wheelEvent = new WheelEvent('wheel', {
  445. deltaX: 400
  446. });
  447. topLeftCornerOverlayHolder.dispatchEvent(wheelEvent);
  448. wt.draw();
  449. waits(20);
  450. runs(function () {
  451. expect(masterCallback.callCount).toEqual(1);
  452. expect(topCallback.callCount).toEqual(1);
  453. expect(leftCallback.callCount).toEqual(0);
  454. wheelEvent = new WheelEvent('wheel', {
  455. deltaY: 400
  456. });
  457. topLeftCornerOverlayHolder.dispatchEvent(wheelEvent);
  458. wt.draw();
  459. });
  460. waits(20);
  461. runs(function () {
  462. expect(masterCallback.callCount).toEqual(2);
  463. expect(topCallback.callCount).toEqual(1);
  464. expect(leftCallback.callCount).toEqual(1);
  465. });
  466. });
  467. });
  468. describe('scrollViewport - horizontally', function () {
  469. beforeEach(function () {
  470. $wrapper.width(201).height(201);
  471. });
  472. it('should scroll to last column on the right', function () {
  473. this.data = createSpreadsheetData(10, 10);
  474. $wrapper.width(201).height(201);
  475. var wt = new Walkontable.Core({
  476. table: $table[0],
  477. data: getData,
  478. totalRows: getTotalRows,
  479. totalColumns: getTotalColumns,
  480. columnWidth: 50
  481. });
  482. wt.draw();
  483. expect(wt.wtTable.getLastVisibleColumn()).toEqual(2);
  484. wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw();
  485. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9);
  486. });
  487. it('should not scroll back to a column that is in viewport', function () {
  488. this.data = createSpreadsheetData(10, 10);
  489. var wt = new Walkontable.Core({
  490. table: $table[0],
  491. data: getData,
  492. totalRows: getTotalRows,
  493. totalColumns: getTotalColumns,
  494. columnWidth: 50
  495. });
  496. wt.draw();
  497. expect(wt.wtTable.getLastVisibleColumn()).toEqual(2);
  498. wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw();
  499. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9);
  500. wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw();
  501. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed
  502. wt.scrollViewport(new Walkontable.CellCoords(0, 8)).draw();
  503. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed
  504. wt.scrollViewport(new Walkontable.CellCoords(0, 7)).draw();
  505. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9); // nothing changed
  506. });
  507. it('should scroll back to a column that is before viewport', function () {
  508. this.data = createSpreadsheetData(10, 10);
  509. var wt = new Walkontable.Core({
  510. table: $table[0],
  511. data: getData,
  512. totalRows: getTotalRows,
  513. totalColumns: getTotalColumns,
  514. columnWidth: 50
  515. });
  516. wt.draw();
  517. expect(wt.wtTable.getLastVisibleColumn()).toEqual(2);
  518. wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw();
  519. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9);
  520. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  521. expect(wt.wtTable.getLastVisibleColumn()).toEqual(5);
  522. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw();
  523. expect(wt.wtTable.getLastVisibleColumn()).toEqual(5); // nothing changed
  524. wt.scrollViewport(new Walkontable.CellCoords(0, 9)).draw();
  525. expect(wt.wtTable.getLastVisibleColumn()).toEqual(9);
  526. });
  527. it('should scroll to a column that is after viewport', function () {
  528. this.data = createSpreadsheetData(10, 10);
  529. var wt = new Walkontable.Core({
  530. table: $table[0],
  531. data: getData,
  532. totalRows: getTotalRows,
  533. totalColumns: getTotalColumns,
  534. columnWidth: 50
  535. });
  536. wt.draw();
  537. wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw();
  538. expect(wt.wtTable.getLastVisibleColumn()).toEqual(2);
  539. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw();
  540. expect(wt.wtTable.getLastVisibleColumn()).toEqual(4);
  541. });
  542. it('should scroll to a wide column that is after viewport', function () {
  543. this.data = createSpreadsheetData(10, 10);
  544. var wt = new Walkontable.Core({
  545. table: $table[0],
  546. data: getData,
  547. totalRows: getTotalRows,
  548. totalColumns: getTotalColumns,
  549. columnWidth: function columnWidth(col) {
  550. if (col === 3) {
  551. return 100;
  552. }
  553. return 50;
  554. }
  555. });
  556. wt.draw();
  557. expect(wt.wtTable.getLastVisibleColumn()).toEqual(2);
  558. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(0);
  559. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  560. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  561. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(2);
  562. });
  563. xit('should scroll to a very wide column that is after viewport', function () {
  564. this.data = createSpreadsheetData(10, 10);
  565. var wt = new Walkontable.Core({
  566. table: $table[0],
  567. data: getData,
  568. totalRows: getTotalRows,
  569. totalColumns: getTotalColumns,
  570. columnWidth: function columnWidth(col) {
  571. if (col === 3) {
  572. return 300;
  573. }
  574. return 50;
  575. }
  576. });
  577. wt.draw();
  578. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  579. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(0);
  580. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  581. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  582. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3);
  583. wt.scrollViewport(new Walkontable.CellCoords(0, 2)).draw();
  584. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  585. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(2);
  586. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  587. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  588. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3);
  589. wt.scrollViewport(new Walkontable.CellCoords(0, 4)).draw();
  590. expect(wt.wtTable.getLastVisibleColumn()).toEqual(4);
  591. expect(wt.wtTable.getFirstVisibleColumn()).toEqual(3);
  592. });
  593. xit('should scroll to a very wide column that is after viewport (with fixedColumnsLeft)', function () {
  594. this.data = createSpreadsheetData(1, 10);
  595. var wt = new Walkontable.Core({
  596. table: $table[0],
  597. data: getData,
  598. totalRows: getTotalRows,
  599. totalColumns: getTotalColumns,
  600. columnWidth: function columnWidth(col) {
  601. if (col === 3) {
  602. return 300;
  603. }
  604. return 50;
  605. },
  606. fixedColumnsLeft: 2
  607. });
  608. wt.draw();
  609. wt.scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  610. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  611. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 2)).draw();
  612. expect(wt.wtTable.getFirstVisibleColumn()).toBeGreaterThan(2);
  613. expect(wt.wtTable.getLastVisibleColumn()).toBeGreaterThan(2);
  614. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 3)).draw();
  615. expect(wt.wtTable.getLastVisibleColumn()).toEqual(3);
  616. wt.draw().scrollViewport(new Walkontable.CellCoords(0, 4)).draw();
  617. expect(wt.wtTable.getLastVisibleColumn()).toEqual(4);
  618. });
  619. });
  620. describe('scrollViewport - vertically', function () {
  621. beforeEach(function () {
  622. $wrapper.width(201).height(201);
  623. });
  624. xit('should scroll to a very high row that is after viewport', function () {
  625. this.data = createSpreadsheetData(20, 1);
  626. var txt = 'Very very very very very very very very very very very very very very very very very long text.';
  627. this.data[4][0] = txt;
  628. var wt = new Walkontable.Core({
  629. table: $table[0],
  630. data: getData,
  631. totalRows: getTotalRows,
  632. totalColumns: getTotalColumns
  633. });
  634. wt.draw();
  635. expect(wt.wtTable.getFirstVisibleRow()).toEqual(0);
  636. wt.scrollViewport(new Walkontable.CellCoords(4, 0)).draw();
  637. expect(wt.wtTable.getLastVisibleRow()).toEqual(4);
  638. wt.draw().scrollViewport(new Walkontable.CellCoords(5, 0)).draw();
  639. expect(wt.wtTable.getLastVisibleRow()).toEqual(5);
  640. wt.draw().scrollViewport(new Walkontable.CellCoords(4, 0)).draw();
  641. expect(wt.wtTable.getFirstVisibleRow()).toEqual(4);
  642. wt.draw().scrollViewport(new Walkontable.CellCoords(3, 0)).draw();
  643. expect(wt.wtTable.getFirstVisibleRow()).toEqual(3);
  644. });
  645. xit('should scroll to a very high row that is after viewport (at the end)', function () {
  646. this.data = createSpreadsheetData(20, 1);
  647. var txt = 'Very very very very very very very very very very very very very very very very very long text.';
  648. this.data[19][0] = txt;
  649. var wt = new Walkontable.Core({
  650. table: $table[0],
  651. data: getData,
  652. totalRows: getTotalRows,
  653. totalColumns: getTotalColumns
  654. });
  655. wt.draw().scrollViewport(new Walkontable.CellCoords(18, 0)).draw();
  656. expect($table.find('tbody tr').length).toBe(2);
  657. expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A18');
  658. expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe(txt);
  659. wt.draw().scrollViewport(new Walkontable.CellCoords(19, 0)).draw();
  660. expect($table.find('tbody tr').length).toBe(1);
  661. expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe(txt); // scrolled down
  662. wt.draw().scrollViewport(new Walkontable.CellCoords(18, 0)).draw();
  663. expect($table.find('tbody tr').length).toBe(2);
  664. expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A18'); // scrolled up
  665. expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe(txt);
  666. wt.draw().scrollViewport(new Walkontable.CellCoords(17, 0)).draw();
  667. expect($table.find('tbody tr').length).toBe(3);
  668. expect($table.find('tbody tr:eq(0) td:eq(0)').html()).toBe('A17'); // scrolled up
  669. expect($table.find('tbody tr:eq(1) td:eq(0)').html()).toBe('A18');
  670. expect($table.find('tbody tr:eq(2) td:eq(0)').html()).toBe(txt);
  671. });
  672. });
  673. });