diff --git a/packages/react-bootstrap-table2-paginator/src/page.js b/packages/react-bootstrap-table2-paginator/src/page.js index aa3085a..3a9b863 100644 --- a/packages/react-bootstrap-table2-paginator/src/page.js +++ b/packages/react-bootstrap-table2-paginator/src/page.js @@ -1,12 +1,39 @@ +/* eslint no-param-reassign: 0 */ + +const getNormalizedPage = ( + page, + pageStartIndex +) => { + const offset = Math.abs(1 - pageStartIndex); + return page + offset; +}; + +const endIndex = ( + page, + sizePerPage, + pageStartIndex +) => (getNormalizedPage(page, pageStartIndex) * sizePerPage) - 1; + +const startIndex = ( + end, + sizePerPage, +) => end - (sizePerPage - 1); + +export const alignPage = (store, pageStartIndex, sizePerPage) => { + const end = endIndex(store.page, sizePerPage, pageStartIndex); + const dataSize = store.data.length; + + if (end - 1 > dataSize) { + return pageStartIndex; + } + return store.page; +}; + export const getByCurrPage = (store, pageStartIndex) => { const dataSize = store.data.length; if (!dataSize) return []; - const getNormalizedPage = () => { - const offset = Math.abs(1 - pageStartIndex); - return store.page + offset; - }; - const end = (getNormalizedPage() * store.sizePerPage) - 1; - const start = end - (store.sizePerPage - 1); + const end = endIndex(store.page, store.sizePerPage, pageStartIndex); + const start = startIndex(end, store.sizePerPage); const result = []; for (let i = start; i <= end; i += 1) { diff --git a/packages/react-bootstrap-table2-paginator/src/wrapper.js b/packages/react-bootstrap-table2-paginator/src/wrapper.js index ff88c59..784687a 100644 --- a/packages/react-bootstrap-table2-paginator/src/wrapper.js +++ b/packages/react-bootstrap-table2-paginator/src/wrapper.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import Const from './const'; import Pagination from './pagination'; -import { getByCurrPage } from './page'; +import { getByCurrPage, alignPage } from './page'; export default (Base, { remoteResolver @@ -49,17 +49,21 @@ export default (Base, { componentWillReceiveProps(nextProps) { let needNewState = false; let { currPage, currSizePerPage } = this.state; - const { page, sizePerPage, pageStartIndex, onPageChange } = nextProps.pagination.options; + const { page, sizePerPage, onPageChange } = nextProps.pagination.options; + + const pageStartIndex = typeof nextProps.pagination.options.pageStartIndex !== 'undefined' ? + nextProps.pagination.options.pageStartIndex : Const.PAGE_START_INDEX; if (typeof page !== 'undefined' && currPage !== page) { // user defined page currPage = page; needNewState = true; } else if (nextProps.isDataChanged) { + currPage = alignPage(this.props.store, pageStartIndex, currSizePerPage); needNewState = true; } if (typeof currPage === 'undefined') { - currPage = typeof pageStartIndex !== 'undefined' ? pageStartIndex : Const.PAGE_START_INDEX; + currPage = pageStartIndex; } if (typeof sizePerPage !== 'undefined') { diff --git a/packages/react-bootstrap-table2-paginator/test/page.test.js b/packages/react-bootstrap-table2-paginator/test/page.test.js index 1e092c9..bd63574 100644 --- a/packages/react-bootstrap-table2-paginator/test/page.test.js +++ b/packages/react-bootstrap-table2-paginator/test/page.test.js @@ -1,5 +1,5 @@ import Store from 'react-bootstrap-table-next/src/store'; -import { getByCurrPage } from '../src/page'; +import { getByCurrPage, alignPage } from '../src/page'; describe('Page Functions', () => { let data; @@ -48,4 +48,40 @@ describe('Page Functions', () => { }); }); }); + + describe('alignPage', () => { + const pageStartIndex = 1; + const sizePerPage = 10; + describe('if the length of store.data is less than the end page index', () => { + beforeEach(() => { + data = []; + for (let i = 0; i < 15; i += 1) { + data.push({ id: i, name: `test_name${i}` }); + } + store = new Store('id'); + store.data = data; + store.page = 2; + }); + + it('should return pageStartIndex argument', () => { + expect(alignPage(store, pageStartIndex, sizePerPage)).toEqual(pageStartIndex); + }); + }); + + describe('if the length of store.data is large than the end page index', () => { + beforeEach(() => { + data = []; + for (let i = 0; i < 30; i += 1) { + data.push({ id: i, name: `test_name${i}` }); + } + store = new Store('id'); + store.data = data; + store.page = 2; + }); + + it('should return current page', () => { + expect(alignPage(store, pageStartIndex, sizePerPage)).toEqual(store.page); + }); + }); + }); }); diff --git a/packages/react-bootstrap-table2-paginator/test/wrapper.test.js b/packages/react-bootstrap-table2-paginator/test/wrapper.test.js index feea75c..f636fe3 100644 --- a/packages/react-bootstrap-table2-paginator/test/wrapper.test.js +++ b/packages/react-bootstrap-table2-paginator/test/wrapper.test.js @@ -176,23 +176,6 @@ describe('Wrapper', () => { expect(props.store.page).toEqual(instance.state.currPage); }); }); - - describe('when nextProps.isDataChanged is true, currPage is undefined and options.pageStartIndex exists', () => { - beforeEach(() => { - nextProps.isDataChanged = true; - nextProps.pagination.options.pageStartIndex = 0; - instance.state.currPage = undefined; - instance.componentWillReceiveProps(nextProps); - }); - - it('should setting currPage state correctly', () => { - expect(instance.state.currPage).toBe(nextProps.pagination.options.pageStartIndex); - }); - - it('should saving store.page correctly', () => { - expect(props.store.page).toEqual(instance.state.currPage); - }); - }); }); });