Skip to content

Commit

Permalink
fix for #998 (#1001)
Browse files Browse the repository at this point in the history
* fix for #998

* add patch for scrollToColumn too

* prettier
  • Loading branch information
dcolens authored and wuweiweiwu committed May 8, 2018
1 parent b1f5a3c commit 6226f56
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 2 deletions.
81 changes: 81 additions & 0 deletions source/Grid/Grid.jest.js
Original file line number Diff line number Diff line change
Expand Up @@ -637,6 +637,87 @@ describe('Grid', () => {
expect(node.scrollTop).toBe(1920);
});

// See issue #998
it('call to recomputeGridSize should not reset position to scrollTo[Row|Column] when scrolling forward', () => {
const cellRendererCalls = [];
function cellRenderer({columnIndex, key, rowIndex, style}) {
cellRendererCalls.push({columnIndex, rowIndex});
return defaultCellRenderer({columnIndex, key, rowIndex, style});
}
const props = {
cellRenderer,
columnWidth: 100,
height: 40,
rowHeight: 20,
scrollToRow: 0,
scrollToColumn: 0,
width: 100,
};

const grid = render(getMarkup(props));
expect(cellRendererCalls).toEqual([
{columnIndex: 0, rowIndex: 0},
{columnIndex: 0, rowIndex: 1},
]);

//scroll forward to row 45
simulateScroll({grid, scrollTop: 900, scrollLeft: 2400});

expect(grid.state.scrollDirectionVertical).toEqual(
SCROLL_DIRECTION_FORWARD,
);
cellRendererCalls.splice(0);

grid.recomputeGridSize({rowIndex: 45, columnIndex: 24});

//grid should still be at row 45, column 24
expect(cellRendererCalls).toEqual([
{columnIndex: 24, rowIndex: 45},
{columnIndex: 24, rowIndex: 46},
]);
});
// see #998
it('call to recomputeGridSize should not reset position to scrollTo[Row|Column] when scrolling backward', () => {
const cellRendererCalls = [];
function cellRenderer({columnIndex, key, rowIndex, style}) {
cellRendererCalls.push({columnIndex, rowIndex});
return defaultCellRenderer({columnIndex, key, rowIndex, style});
}
const props = {
cellRenderer,
columnWidth: 100,
height: 40,
rowHeight: 20,
scrollToRow: 99,
scrollToColumn: 49,
width: 100,
};

const grid = render(getMarkup(props));
expect(cellRendererCalls).toEqual([
{columnIndex: 0, rowIndex: 0},
{columnIndex: 0, rowIndex: 1},
{columnIndex: 49, rowIndex: 98},
{columnIndex: 49, rowIndex: 99},
]);

//scroll backward to row 45
simulateScroll({grid, scrollTop: 900, scrollLeft: 2400});

expect(grid.state.scrollDirectionVertical).toEqual(
SCROLL_DIRECTION_BACKWARD,
);
cellRendererCalls.splice(0);

grid.recomputeGridSize({rowIndex: 45, columnIndex: 24});

//grid should still be at row 45 and column 24
expect(cellRendererCalls).toEqual([
{columnIndex: 24, rowIndex: 45},
{columnIndex: 24, rowIndex: 46},
]);
});

it('should restore scroll offset for column when row count increases from 0 (and vice versa)', () => {
const props = {
columnWidth: 50,
Expand Down
12 changes: 10 additions & 2 deletions source/Grid/Grid.js
Original file line number Diff line number Diff line change
Expand Up @@ -522,8 +522,16 @@ class Grid extends React.PureComponent<Props, State> {
// In this case the cDU handler can't know if they changed.
// Store this flag to let the next cDU pass know it needs to recompute the scroll offset.
this._recomputeScrollLeftFlag =
scrollToColumn >= 0 && columnIndex <= scrollToColumn;
this._recomputeScrollTopFlag = scrollToRow >= 0 && rowIndex <= scrollToRow;
scrollToColumn >= 0 &&
(this.state.scrollDirectionHorizontal === SCROLL_DIRECTION_FORWARD
? columnIndex <= scrollToColumn
: columnIndex >= scrollToColumn);

this._recomputeScrollTopFlag =
scrollToRow >= 0 &&
(this.state.scrollDirectionVertical === SCROLL_DIRECTION_FORWARD
? rowIndex <= scrollToRow
: rowIndex >= scrollToRow);

// Clear cell cache in case we are scrolling;
// Invalid row heights likely mean invalid cached content as well.
Expand Down

0 comments on commit 6226f56

Please sign in to comment.