diff --git a/packages/react-bootstrap-table2-paginator/README.md b/packages/react-bootstrap-table2-paginator/README.md index b3d30eb..ede9040 100644 --- a/packages/react-bootstrap-table2-paginator/README.md +++ b/packages/react-bootstrap-table2-paginator/README.md @@ -69,23 +69,23 @@ Sometime, you may feel above props is not satisfied with your requirement, don't * [sizePerPageOptionRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationsizeperpageoptionrenderer-function) * [paginationTotalRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationpaginationtotalrenderer-function) -### Professional +### Fully Customization -If you want to customize the pagination component completely, you may get interesting on following solution: +If you want to customize the pagination component completely, you may get interesting on following solutions: * Standalone * Non-standalone -`react-bootstrap-table2-paginator` have a `PaginationProvider` which is a react context and you will be easier to customize the pagination components under the scope of `PaginationProvider`. Let's introduce it step by step: +`react-bootstrap-table2-paginator` have a `PaginationProvider` which is a react context and that will be easier to customize the pagination components under the scope of `PaginationProvider`. Let's introduce it step by step: -#### Import PaginationProvider +#### 1. Import PaginationProvider ```js import paginationFactory, { PaginationProvider } from 'react-bootstrap-table2-paginator'; ``` -#### Declare custom and totalSize in pagination option: +#### 2. Declare custom and totalSize in pagination option: ```js const paginationOption = { @@ -94,7 +94,7 @@ const paginationOption = { }; ``` -#### Render PaginationProvider +#### 3. Render PaginationProvider ```js ``` -Now, you have to choose, your built-in standalne components or you customize all of them by yourself: +Now, you have to choose which solution you like: standalone or non-standalone ? -#### Use Standalone Component -`react-bootstrap-table2-paginator` provider two standalone components: +#### 4.1 Use Standalone Component +`react-bootstrap-table2-paginator` provider three standalone components: * Size Per Page Dropdwn Standalone * Pagination List Standalone +* Pagination Total Standalone When render each standalone, you just need to pass the `paginationProps` props to standalone component: ```js -import paginationFactory, { PaginationProvider, PaginationListStandalone, SizePerPageDropdownStandalone } from 'react-bootstrap-table2-paginator'; +import paginationFactory, { + PaginationProvider, + PaginationListStandalone, + SizePerPageDropdownStandalone, + PaginationTotalStandalone +} from 'react-bootstrap-table2-paginator'; + ({ createContext: createDataContext, @@ -23,4 +24,4 @@ CustomizableProvider.propTypes = { }; export const PaginationProvider = CustomizableProvider; -export { PaginationListStandalone, SizePerPageDropdownStandalone }; +export { PaginationListStandalone, SizePerPageDropdownStandalone, PaginationTotalStandalone }; diff --git a/packages/react-bootstrap-table2-paginator/src/pagination-total-adapter.js b/packages/react-bootstrap-table2-paginator/src/pagination-total-adapter.js new file mode 100644 index 0000000..2c990f0 --- /dev/null +++ b/packages/react-bootstrap-table2-paginator/src/pagination-total-adapter.js @@ -0,0 +1,24 @@ +/* eslint react/prop-types: 0 */ +import React, { Component } from 'react'; + +import pageResolver from './page-resolver'; +import PaginationTotal from './pagination-total'; + +const paginationTotalAdapter = WrappedComponent => + class PaginationTotalAdapter extends pageResolver(Component) { + render() { + const [from, to] = this.calculateFromTo(); + return ( + + ); + } + }; + + +export const PaginationTotalWithAdapter = paginationTotalAdapter(PaginationTotal); +export default paginationTotalAdapter; diff --git a/packages/react-bootstrap-table2-paginator/src/pagination-total-standalone.js b/packages/react-bootstrap-table2-paginator/src/pagination-total-standalone.js new file mode 100644 index 0000000..553b8ae --- /dev/null +++ b/packages/react-bootstrap-table2-paginator/src/pagination-total-standalone.js @@ -0,0 +1,11 @@ +import React from 'react'; +import PaginationTotal from './pagination-total'; +import standaloneAdapter from './standalone-adapter'; +import paginationTotalAdapter from './pagination-total-adapter'; + +const PaginationTotalStandalone = props => ( + +); + +export default +standaloneAdapter(paginationTotalAdapter(PaginationTotalStandalone)); diff --git a/packages/react-bootstrap-table2-paginator/src/pagination-total.js b/packages/react-bootstrap-table2-paginator/src/pagination-total.js index f8b29fb..d602b5e 100644 --- a/packages/react-bootstrap-table2-paginator/src/pagination-total.js +++ b/packages/react-bootstrap-table2-paginator/src/pagination-total.js @@ -1,16 +1,26 @@ import React from 'react'; import PropTypes from 'prop-types'; -const PaginationTotal = props => ( - -  Showing rows { props.from } to { props.to } of { props.dataSize } - -); +const PaginationTotal = (props) => { + if (props.paginationTotalRenderer) { + return props.paginationTotalRenderer(props.from, props.to, props.dataSize); + } + return ( + +  Showing rows { props.from } to { props.to } of { props.dataSize } + + ); +}; PaginationTotal.propTypes = { from: PropTypes.number.isRequired, to: PropTypes.number.isRequired, - dataSize: PropTypes.number.isRequired + dataSize: PropTypes.number.isRequired, + paginationTotalRenderer: PropTypes.func +}; + +PaginationTotal.defaultProps = { + paginationTotalRenderer: undefined }; export default PaginationTotal; diff --git a/packages/react-bootstrap-table2-paginator/src/pagination.js b/packages/react-bootstrap-table2-paginator/src/pagination.js index 5b60acc..fa2bd86 100644 --- a/packages/react-bootstrap-table2-paginator/src/pagination.js +++ b/packages/react-bootstrap-table2-paginator/src/pagination.js @@ -5,30 +5,16 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import pageResolver from './page-resolver'; import paginationHandler from './pagination-handler'; -import { SizePerPageDropdownAdapter } from './size-per-page-dropdown-adapter'; +import { SizePerPageDropdownWithAdapter } from './size-per-page-dropdown-adapter'; import { PaginationListWithAdapter } from './pagination-list-adapter'; -import PaginationTotal from './pagination-total'; +import { PaginationTotalWithAdapter } from './pagination-total-adapter'; import Const from './const'; class Pagination extends pageResolver(Component) { - defaultTotal = (from, to, size) => ( - - ); - - setTotal = (from, to, size, total) => { - if (total && (typeof total === 'function')) { - return total(from, to, size); - } - - return this.defaultTotal(from, to, size); - }; - render() { const { + currPage, + pageStartIndex, showTotal, dataSize, pageListRenderer, @@ -48,7 +34,6 @@ class Pagination extends pageResolver(Component) { } = this.props; const pages = this.calculatePageStatus(this.calculatePages(totalPages, lastPage), lastPage); - const [from, to] = this.calculateFromTo(); const pageListClass = cs( 'react-bootstrap-table-pagination-list', 'col-md-6 col-xs-6 col-sm-6 col-lg-6', { @@ -57,7 +42,7 @@ class Pagination extends pageResolver(Component) { return (
- { showTotal ? - this.setTotal( - from, - to, - dataSize, - paginationTotalRenderer - ) : null + : null }
{ @@ -83,6 +69,9 @@ class Pagination extends pageResolver(Component) {
}; -export const SizePerPageDropdownAdapter = sizePerPageDropdownAdapter(SizePerPageDropDown); +export const SizePerPageDropdownWithAdapter = sizePerPageDropdownAdapter(SizePerPageDropDown); export default sizePerPageDropdownAdapter; diff --git a/packages/react-bootstrap-table2-paginator/test/pagination-total-adapter.test.js b/packages/react-bootstrap-table2-paginator/test/pagination-total-adapter.test.js new file mode 100644 index 0000000..cef94c9 --- /dev/null +++ b/packages/react-bootstrap-table2-paginator/test/pagination-total-adapter.test.js @@ -0,0 +1,34 @@ +import React from 'react'; +import { shallow } from 'enzyme'; +import paginationTotalAdapter from '../src/pagination-total-adapter'; + + +const MockComponent = () => null; + +const PaginationTotalAdapter = paginationTotalAdapter(MockComponent); + +describe('paginationTotalAdapter', () => { + let wrapper; + + const props = { + dataSize: 20, + currPage: 1, + currSizePerPage: 10, + paginationTotalRenderer: jest.fn() + }; + + describe('render', () => { + beforeEach(() => { + wrapper = shallow(); + }); + + it('should render successfully', () => { + const mockComponent = wrapper.find(MockComponent); + expect(mockComponent).toHaveLength(1); + expect(mockComponent.props().from).toBeDefined(); + expect(mockComponent.props().to).toBeDefined(); + expect(mockComponent.props().dataSize).toEqual(props.dataSize); + expect(mockComponent.props().paginationTotalRenderer).toEqual(props.paginationTotalRenderer); + }); + }); +}); diff --git a/packages/react-bootstrap-table2-paginator/test/pagination.test.js b/packages/react-bootstrap-table2-paginator/test/pagination.test.js index 2c9ee20..5967339 100644 --- a/packages/react-bootstrap-table2-paginator/test/pagination.test.js +++ b/packages/react-bootstrap-table2-paginator/test/pagination.test.js @@ -1,11 +1,10 @@ import React from 'react'; import sinon from 'sinon'; -import { shallow } from 'enzyme'; +import { shallow, render } from 'enzyme'; import SizePerPageDropDown from '../src/size-per-page-dropdown'; import PaginationList from '../src/pagination-list'; import Pagination from '../src/pagination'; -import PaginationTotal from '../src/pagination-total'; describe('Pagination', () => { let wrapper; @@ -107,28 +106,24 @@ describe('Pagination', () => { describe('when props.showTotal is true', () => { beforeEach(() => { const props = createMockProps({ showTotal: true }); - wrapper = shallow(); - wrapper.render(); - instance = wrapper.instance(); + wrapper = render(); }); it('should render PaginationTotal correctly', () => { - expect(wrapper.dive().find(PaginationTotal)).toHaveLength(1); + expect(wrapper.find('.react-bootstrap-table-pagination-total')).toHaveLength(1); }); describe('if props.paginationTotalRenderer is defined', () => { let paginationTotalRenderer; beforeEach(() => { - paginationTotalRenderer = jest.fn(); + paginationTotalRenderer = jest.fn(() =>
); const props = createMockProps({ showTotal: true, paginationTotalRenderer }); - wrapper = shallow(); - wrapper.render(); - instance = wrapper.instance(); + wrapper = render(); }); it('should not render PaginationTotal', () => { - expect(wrapper.dive().find(PaginationTotal)).toHaveLength(0); + expect(wrapper.find('.react-bootstrap-table-pagination-total')).toHaveLength(0); }); it('should call props.paginationTotalRenderer correctly', () => {