scroll.spec.js 28 KB

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