Skip to content

Commit 9829a37

Browse files
author
Reupen Shah
committed
fix infinitescroll scrolling
1 parent ff9de89 commit 9829a37

File tree

1 file changed

+33
-32
lines changed

1 file changed

+33
-32
lines changed

src/features/infinite-scroll/js/infinite-scroll.js

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@
142142
* used if you're subsequently going to call `dataRemovedTop` or `dataRemovedBottom`
143143
*/
144144
saveScrollPercentage: function() {
145-
grid.infiniteScroll.prevScrolltopPercentage = grid.renderContainers.body.prevScrolltopPercentage;
146-
grid.infiniteScroll.previousVisibleRows = grid.renderContainers.body.visibleRowCache.length;
145+
grid.infiniteScroll.prevScrollTop = grid.renderContainers.body.prevScrollTop;
146+
grid.infiniteScroll.previousVisibleRows = grid.getVisibleRowCount();
147147
},
148148

149149

@@ -320,7 +320,7 @@
320320
// to be at approximately the row we're currently at
321321
grid.infiniteScroll.previousVisibleRows = grid.renderContainers.body.visibleRowCache.length;
322322
grid.infiniteScroll.direction = grid.scrollDirection;
323-
delete grid.infiniteScroll.prevScrolltopPercentage;
323+
delete grid.infiniteScroll.prevScrollTop;
324324

325325
if (grid.scrollDirection === uiGridConstants.scrollDirection.UP && grid.infiniteScroll.scrollUp ) {
326326
grid.infiniteScroll.dataLoading = true;
@@ -356,32 +356,30 @@
356356
adjustScroll: function(grid){
357357
var promise = $q.defer();
358358
$timeout(function () {
359-
var newPercentage;
359+
var newPercentage, viewportHeight, rowHeight, newVisibleRows, oldTop, newTop;
360+
361+
viewportHeight = grid.getViewportHeight() + grid.headerHeight - grid.renderContainers.body.headerHeight - grid.scrollbarHeight;
362+
rowHeight = grid.options.rowHeight;
360363

361364
if ( grid.infiniteScroll.direction === undefined ){
362365
// called from initialize, tweak our scroll up a little
363366
service.adjustInfiniteScrollPosition(grid, 0);
364367
}
365368

366-
var newVisibleRows = grid.renderContainers.body.visibleRowCache.length;
367-
var oldPercentage, oldTopRow;
368-
var halfViewport = grid.getViewportHeight() / grid.options.rowHeight / 2;
369+
newVisibleRows = grid.getVisibleRowCount();
369370

370371
if ( grid.infiniteScroll.direction === uiGridConstants.scrollDirection.UP ){
371-
oldPercentage = grid.infiniteScroll.prevScrolltopPercentage || 0;
372-
oldTopRow = oldPercentage * grid.infiniteScroll.previousVisibleRows;
373-
newPercentage = ( newVisibleRows - grid.infiniteScroll.previousVisibleRows + oldTopRow + halfViewport ) / newVisibleRows;
374-
service.adjustInfiniteScrollPosition(grid, newPercentage);
372+
oldTop = grid.infiniteScroll.prevScrollTop || 0;
373+
newTop = oldTop + (newVisibleRows - grid.infiniteScroll.previousVisibleRows)*rowHeight;
374+
service.adjustInfiniteScrollPosition(grid, newTop);
375375
$timeout( function() {
376376
promise.resolve();
377377
});
378378
}
379379

380380
if ( grid.infiniteScroll.direction === uiGridConstants.scrollDirection.DOWN ){
381-
oldPercentage = grid.infiniteScroll.prevScrolltopPercentage || 1;
382-
oldTopRow = oldPercentage * grid.infiniteScroll.previousVisibleRows;
383-
newPercentage = ( oldTopRow - halfViewport ) / newVisibleRows;
384-
service.adjustInfiniteScrollPosition(grid, newPercentage);
381+
newTop = grid.infiniteScroll.prevScrollTop || (grid.infiniteScroll.previousVisibleRows*rowHeight - viewportHeight);
382+
service.adjustInfiniteScrollPosition(grid, newTop);
385383
$timeout( function() {
386384
promise.resolve();
387385
});
@@ -398,18 +396,23 @@
398396
* @methodOf ui.grid.infiniteScroll.service:uiGridInfiniteScrollService
399397
* @description This function fires 'needLoadMoreData' or 'needLoadMoreDataTop' event based on scrollDirection
400398
* @param {Grid} grid the grid we're working on
401-
* @param {number} percentage the percentage through the grid that we want to scroll to
399+
* @param {number} scrollTop the position through the grid that we want to scroll to
402400
* @returns {promise} a promise that is resolved when the scrolling finishes
403401
*/
404-
adjustInfiniteScrollPosition: function (grid, percentage) {
405-
var scrollEvent = new ScrollEvent(grid, null, null, 'ui.grid.adjustInfiniteScrollPosition');
402+
adjustInfiniteScrollPosition: function (grid, scrollTop) {
403+
var scrollEvent = new ScrollEvent(grid, null, null, 'ui.grid.adjustInfiniteScrollPosition'),
404+
visibleRows = grid.getVisibleRowCount(),
405+
viewportHeight = grid.getViewportHeight() + grid.headerHeight - grid.renderContainers.body.headerHeight - grid.scrollbarHeight,
406+
rowHeight = grid.options.rowHeight,
407+
scrollHeight = visibleRows*rowHeight-viewportHeight;
406408

407409
//for infinite scroll, if there are pages upwards then never allow it to be at the zero position so the up button can be active
408-
if ( percentage === 0 && grid.infiniteScroll.scrollUp ) {
409-
scrollEvent.y = {pixels: 1};
410+
if (scrollTop === 0 && grid.infiniteScroll.scrollUp) {
411+
// using pixels results in a relative scroll, hence we have to use percentage
412+
scrollEvent.y = {percentage: 1/scrollHeight};
410413
}
411414
else {
412-
scrollEvent.y = {percentage: percentage};
415+
scrollEvent.y = {percentage: scrollTop/scrollHeight};
413416
}
414417
grid.scrollContainers('', scrollEvent);
415418
},
@@ -431,17 +434,18 @@
431434
* @returns {promise} a promise that is resolved when the scrolling finishes
432435
*/
433436
dataRemovedTop: function( grid, scrollUp, scrollDown ) {
437+
var newVisibleRows, oldTop, newTop, rowHeight;
434438
service.setScrollDirections( grid, scrollUp, scrollDown );
435439

436-
var newVisibleRows = grid.renderContainers.body.visibleRowCache.length;
437-
var oldScrollRow = grid.infiniteScroll.prevScrolltopPercentage * grid.infiniteScroll.previousVisibleRows;
440+
newVisibleRows = grid.renderContainers.body.visibleRowCache.length;
441+
oldTop = grid.infiniteScroll.prevScrollTop;
442+
rowHeight = grid.options.rowHeight;
438443

439444
// since we removed from the top, our new scroll row will be the old scroll row less the number
440445
// of rows removed
441-
var newScrollRow = oldScrollRow - ( grid.infiniteScroll.previousVisibleRows - newVisibleRows );
442-
var newScrollPercent = newScrollRow / newVisibleRows;
446+
newTop = oldTop - ( grid.infiniteScroll.previousVisibleRows - newVisibleRows )*rowHeight;
443447

444-
return service.adjustInfiniteScrollPosition( grid, newScrollPercent );
448+
return service.adjustInfiniteScrollPosition( grid, newTop );
445449
},
446450

447451
/**
@@ -459,15 +463,12 @@
459463
* fire infinite scroll events downward
460464
*/
461465
dataRemovedBottom: function( grid, scrollUp, scrollDown ) {
466+
var newTop;
462467
service.setScrollDirections( grid, scrollUp, scrollDown );
463468

464-
var newVisibleRows = grid.renderContainers.body.visibleRowCache.length;
465-
var oldScrollRow = grid.infiniteScroll.prevScrolltopPercentage * grid.infiniteScroll.previousVisibleRows;
466-
467-
// since we removed from the bottom, our new scroll row will be same as the old scroll row
468-
var newScrollPercent = oldScrollRow / newVisibleRows;
469+
newTop = grid.infiniteScroll.prevScrollTop;
469470

470-
return service.adjustInfiniteScrollPosition( grid, newScrollPercent );
471+
return service.adjustInfiniteScrollPosition( grid, newTop );
471472
}
472473
};
473474
return service;

0 commit comments

Comments
 (0)