mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2026-06-29 13:40:07 +00:00
Compare commits
19 Commits
react-boot
...
react-boot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c0fc2748c | ||
|
|
973ece8b39 | ||
|
|
0a94f3ce39 | ||
|
|
0ca8e54ce2 | ||
|
|
69d534e26c | ||
|
|
c2a30cb716 | ||
|
|
83dc888d17 | ||
|
|
41da9afbcb | ||
|
|
91816fcc01 | ||
|
|
620309115f | ||
|
|
297f3e0c4f | ||
|
|
d42a10bbae | ||
|
|
5c52412542 | ||
|
|
a5f74cecfe | ||
|
|
a30a8fd96b | ||
|
|
424dbea270 | ||
|
|
b261c33e37 | ||
|
|
7dbdc1943b | ||
|
|
d4be1675db |
@@ -28,10 +28,6 @@ See [getting started](https://react-bootstrap-table.github.io/react-bootstrap-ta
|
|||||||
|
|
||||||
See `react-bootstrap-table2` [storybook](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html).
|
See `react-bootstrap-table2` [storybook](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html).
|
||||||
|
|
||||||
## Roadmap
|
|
||||||
|
|
||||||
See [release plans](https://react-bootstrap-table.github.io/react-bootstrap-table2/blog/2018/01/24/release-plan.html).
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
Please check the [development guide](./docs/development.md).
|
Please check the [development guide](./docs/development.md).
|
||||||
|
|||||||
@@ -113,8 +113,6 @@ Please see [available pagination configurations](https://react-bootstrap-table.g
|
|||||||
|
|
||||||
Remember to install [`react-bootstrap-table2-paginator`](https://www.npmjs.com/package/react-bootstrap-table2-paginator) firstly.
|
Remember to install [`react-bootstrap-table2-paginator`](https://www.npmjs.com/package/react-bootstrap-table2-paginator) firstly.
|
||||||
|
|
||||||
No big changes for pagination, but still can't custom the pagination list, button and sizePerPage dropdown.
|
|
||||||
|
|
||||||
## Table Search
|
## Table Search
|
||||||
The usage of search functionality is a little bit different from legacy search. The mainly different thing is developer have to render the search input field, we do believe it will be very flexible for all the developers who want to custom the search position or search field itself.
|
The usage of search functionality is a little bit different from legacy search. The mainly different thing is developer have to render the search input field, we do believe it will be very flexible for all the developers who want to custom the search position or search field itself.
|
||||||
|
|
||||||
|
|||||||
106
packages/react-bootstrap-table2-example/examples/pagination/custom-page-button.js
vendored
Normal file
106
packages/react-bootstrap-table2-example/examples/pagination/custom-page-button.js
vendored
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint jsx-a11y/href-no-hash: 0 */
|
||||||
|
/* eslint no-unused-vars: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
// ...
|
||||||
|
|
||||||
|
const pageButtonRenderer = ({
|
||||||
|
page,
|
||||||
|
active,
|
||||||
|
disable,
|
||||||
|
title,
|
||||||
|
onPageChange
|
||||||
|
}) => {
|
||||||
|
const handleClick = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onPageChange(page);
|
||||||
|
};
|
||||||
|
const activeStyle = {};
|
||||||
|
if (active) {
|
||||||
|
activeStyle.backgroundColor = 'black';
|
||||||
|
activeStyle.color = 'white';
|
||||||
|
} else {
|
||||||
|
activeStyle.backgroundColor = 'gray';
|
||||||
|
activeStyle.color = 'black';
|
||||||
|
}
|
||||||
|
if (typeof page === 'string') {
|
||||||
|
activeStyle.backgroundColor = 'white';
|
||||||
|
activeStyle.color = 'black';
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<li className="page-item">
|
||||||
|
<a href="#" onClick={ handleClick } style={ activeStyle }>{ page }</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
pageButtonRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
const pageButtonRenderer = ({
|
||||||
|
page,
|
||||||
|
active,
|
||||||
|
disable,
|
||||||
|
title,
|
||||||
|
onPageChange
|
||||||
|
}) => {
|
||||||
|
const handleClick = (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onPageChange(page);
|
||||||
|
};
|
||||||
|
const activeStyle = {};
|
||||||
|
if (active) {
|
||||||
|
activeStyle.backgroundColor = 'black';
|
||||||
|
activeStyle.color = 'white';
|
||||||
|
} else {
|
||||||
|
activeStyle.backgroundColor = 'gray';
|
||||||
|
activeStyle.color = 'black';
|
||||||
|
}
|
||||||
|
if (typeof page === 'string') {
|
||||||
|
activeStyle.backgroundColor = 'white';
|
||||||
|
activeStyle.color = 'black';
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<li className="page-item">
|
||||||
|
<a href="#" onClick={ handleClick } style={ activeStyle }>{ page }</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
pageButtonRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
78
packages/react-bootstrap-table2-example/examples/pagination/custom-page-list.js
vendored
Normal file
78
packages/react-bootstrap-table2-example/examples/pagination/custom-page-list.js
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint jsx-a11y/href-no-hash: 0 */
|
||||||
|
/* eslint jsx-a11y/no-noninteractive-element-interactions: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
// ...
|
||||||
|
|
||||||
|
const pageListRenderer = ({
|
||||||
|
pages,
|
||||||
|
onPageChange
|
||||||
|
}) => {
|
||||||
|
const pageWithoutIndication = pages.filter(p => typeof p.page !== 'string');
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{
|
||||||
|
pageWithoutIndication.map(p => (
|
||||||
|
<button className="btn btn-success" onClick={ () => onPageChange(p.page) }>{ p.page }</button>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
pageListRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
const pageListRenderer = ({
|
||||||
|
pages,
|
||||||
|
onPageChange
|
||||||
|
}) => {
|
||||||
|
const pageWithoutIndication = pages.filter(p => typeof p.page !== 'string');
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{
|
||||||
|
pageWithoutIndication.map(p => (
|
||||||
|
<button className="btn btn-success" onClick={ () => onPageChange(p.page) }>{ p.page }</button>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
pageListRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
96
packages/react-bootstrap-table2-example/examples/pagination/custom-size-per-page-option.js
vendored
Normal file
96
packages/react-bootstrap-table2-example/examples/pagination/custom-size-per-page-option.js
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint jsx-a11y/href-no-hash: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
// ...
|
||||||
|
|
||||||
|
const sizePerPageOptionRenderer = ({
|
||||||
|
text,
|
||||||
|
page,
|
||||||
|
onSizePerPageChange
|
||||||
|
}) => (
|
||||||
|
<li
|
||||||
|
key={ text }
|
||||||
|
role="presentation"
|
||||||
|
className="dropdown-item"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
tabIndex="-1"
|
||||||
|
role="menuitem"
|
||||||
|
data-page={ page }
|
||||||
|
onMouseDown={ (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onSizePerPageChange(page);
|
||||||
|
} }
|
||||||
|
style={ { color: 'red' } }
|
||||||
|
>
|
||||||
|
{ text }
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
sizePerPageOptionRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
`;
|
||||||
|
|
||||||
|
const sizePerPageOptionRenderer = ({
|
||||||
|
text,
|
||||||
|
page,
|
||||||
|
onSizePerPageChange
|
||||||
|
}) => (
|
||||||
|
<li
|
||||||
|
key={ text }
|
||||||
|
role="presentation"
|
||||||
|
className="dropdown-item"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
tabIndex="-1"
|
||||||
|
role="menuitem"
|
||||||
|
data-page={ page }
|
||||||
|
onMouseDown={ (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
onSizePerPageChange(page);
|
||||||
|
} }
|
||||||
|
style={ { color: 'red' } }
|
||||||
|
>
|
||||||
|
{ text }
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
sizePerPageOptionRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
89
packages/react-bootstrap-table2-example/examples/pagination/custom-size-per-page.js
vendored
Normal file
89
packages/react-bootstrap-table2-example/examples/pagination/custom-size-per-page.js
vendored
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint jsx-a11y/href-no-hash: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
// ...
|
||||||
|
|
||||||
|
const sizePerPageRenderer = ({
|
||||||
|
options,
|
||||||
|
currSizePerPage,
|
||||||
|
onSizePerPageChange
|
||||||
|
}) => (
|
||||||
|
<div className="btn-group" role="group">
|
||||||
|
{
|
||||||
|
options.map((option) => {
|
||||||
|
const isSelect = currSizePerPage === \`$\{option.page}\`;
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
key={ option.text }
|
||||||
|
type="button"
|
||||||
|
onClick={ () => onSizePerPageChange(option.page) }
|
||||||
|
className={ \`btn $\{isSelect ? 'btn-secondary' : 'btn-warning'}\` }
|
||||||
|
>
|
||||||
|
{ option.text }
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
sizePerPageRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />s
|
||||||
|
`;
|
||||||
|
|
||||||
|
const sizePerPageRenderer = ({
|
||||||
|
options,
|
||||||
|
currSizePerPage,
|
||||||
|
onSizePerPageChange
|
||||||
|
}) => (
|
||||||
|
<div className="btn-group" role="group">
|
||||||
|
{
|
||||||
|
options.map(option => (
|
||||||
|
<button
|
||||||
|
key={ option.text }
|
||||||
|
type="button"
|
||||||
|
onClick={ () => onSizePerPageChange(option.page) }
|
||||||
|
className={ `btn ${currSizePerPage === `${option.page}` ? 'btn-secondary' : 'btn-warning'}` }
|
||||||
|
>
|
||||||
|
{ option.text }
|
||||||
|
</button>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
sizePerPageRenderer
|
||||||
|
};
|
||||||
|
|
||||||
|
export default () => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable keyField="id" data={ products } columns={ columns } pagination={ paginationFactory(options) } />
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
166
packages/react-bootstrap-table2-example/examples/pagination/fully-custom-pagination.js
vendored
Normal file
166
packages/react-bootstrap-table2-example/examples/pagination/fully-custom-pagination.js
vendored
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory, { PaginationProvider } from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory from 'react-bootstrap-table2-paginator';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
|
||||||
|
class FullyCustomPagination extends React.Component {
|
||||||
|
handleNextPage = ({
|
||||||
|
page,
|
||||||
|
onPageChange
|
||||||
|
}) => () => {
|
||||||
|
onPageChange(page + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
handlePrevPage = ({
|
||||||
|
page,
|
||||||
|
onPageChange
|
||||||
|
}) => () => {
|
||||||
|
onPageChange(page - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSizePerPage = ({
|
||||||
|
page,
|
||||||
|
onSizePerPageChange
|
||||||
|
}, newSizePerPage) => {
|
||||||
|
onSizePerPageChange(newSizePerPage, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<p>Current Page: { paginationProps.page }</p>
|
||||||
|
<p>Current SizePerPage: { paginationProps.sizePerPage }</p>
|
||||||
|
</div>
|
||||||
|
<div className="btn-group" role="group">
|
||||||
|
<button className="btn btn-primary" onClick={ this.handleNextPage(paginationProps) }>Next Page</button>
|
||||||
|
<button className="btn btn-success" onClick={ this.handlePrevPage(paginationProps) }>Prev Page</button>
|
||||||
|
<button className="btn btn-danger" onClick={ () => this.handleSizePerPage(paginationProps, 10) }>Size Per Page: 10</button>
|
||||||
|
<button className="btn btn-warning" onClick={ () => this.handleSizePerPage(paginationProps, 25) }>Size Per Page: 25</button>
|
||||||
|
</div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
|
||||||
|
export default class FullyCustomPagination extends React.Component {
|
||||||
|
handleNextPage = ({
|
||||||
|
page,
|
||||||
|
onPageChange
|
||||||
|
}) => () => {
|
||||||
|
onPageChange(page + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
handlePrevPage = ({
|
||||||
|
page,
|
||||||
|
onPageChange
|
||||||
|
}) => () => {
|
||||||
|
onPageChange(page - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSizePerPage = ({
|
||||||
|
page,
|
||||||
|
onSizePerPageChange
|
||||||
|
}, newSizePerPage) => {
|
||||||
|
onSizePerPageChange(newSizePerPage, page);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<div>
|
||||||
|
<p>Current Page: { paginationProps.page }</p>
|
||||||
|
<p>Current SizePerPage: { paginationProps.sizePerPage }</p>
|
||||||
|
</div>
|
||||||
|
<div className="btn-group" role="group">
|
||||||
|
<button className="btn btn-primary" onClick={ this.handleNextPage(paginationProps) }>Next Page</button>
|
||||||
|
<button className="btn btn-success" onClick={ this.handlePrevPage(paginationProps) }>Prev Page</button>
|
||||||
|
<button className="btn btn-danger" onClick={ () => this.handleSizePerPage(paginationProps, 10) }>Size Per Page: 10</button>
|
||||||
|
<button className="btn btn-warning" onClick={ () => this.handleSizePerPage(paginationProps, 25) }>Size Per Page: 25</button>
|
||||||
|
</div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
102
packages/react-bootstrap-table2-example/examples/pagination/standalone-pagination-list.js
vendored
Normal file
102
packages/react-bootstrap-table2-example/examples/pagination/standalone-pagination-list.js
vendored
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory, { PaginationProvider, PaginationListStandalone } from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory, { PaginationProvider, PaginationListStandalone } from 'react-bootstrap-table2-paginator';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<PaginationListStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
// const pagination = paginationFactory(options);
|
||||||
|
|
||||||
|
export default class StandalonePaginationList extends React.Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<PaginationListStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
102
packages/react-bootstrap-table2-example/examples/pagination/standalone-size-per-page.js
vendored
Normal file
102
packages/react-bootstrap-table2-example/examples/pagination/standalone-size-per-page.js
vendored
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
/* eslint react/prefer-stateless-function: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory, { PaginationProvider, SizePerPageDropdownStandalone } from 'react-bootstrap-table2-paginator';
|
||||||
|
import Code from 'components/common/code-block';
|
||||||
|
import { productsGenerator } from 'utils/common';
|
||||||
|
|
||||||
|
const products = productsGenerator(87);
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const sourceCode = `\
|
||||||
|
import BootstrapTable from 'react-bootstrap-table-next';
|
||||||
|
import paginationFactory, { PaginationProvider, SizePerPageDropdownStandalone } from 'react-bootstrap-table2-paginator';
|
||||||
|
|
||||||
|
const columns = [{
|
||||||
|
dataField: 'id',
|
||||||
|
text: 'Product ID'
|
||||||
|
}, {
|
||||||
|
dataField: 'name',
|
||||||
|
text: 'Product Name'
|
||||||
|
}, {
|
||||||
|
dataField: 'price',
|
||||||
|
text: 'Product Price'
|
||||||
|
}];
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<SizePerPageDropdownStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
// const pagination = paginationFactory(options);
|
||||||
|
|
||||||
|
export default class StandaloneSizePerPage extends React.Component {
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<SizePerPageDropdownStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
<Code>{ sourceCode }</Code>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-bootstrap-table2-example",
|
"name": "react-bootstrap-table2-example",
|
||||||
"version": "1.0.12",
|
"version": "1.0.13",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|||||||
@@ -147,6 +147,13 @@ import ExpandHooks from 'examples/row-expand/expand-hooks';
|
|||||||
import PaginationTable from 'examples/pagination';
|
import PaginationTable from 'examples/pagination';
|
||||||
import PaginationHooksTable from 'examples/pagination/pagination-hooks';
|
import PaginationHooksTable from 'examples/pagination/pagination-hooks';
|
||||||
import CustomPaginationTable from 'examples/pagination/custom-pagination';
|
import CustomPaginationTable from 'examples/pagination/custom-pagination';
|
||||||
|
import CustomPageButtonTable from 'examples/pagination/custom-page-button';
|
||||||
|
import CustomSizePerPageOptionTable from 'examples/pagination/custom-size-per-page-option';
|
||||||
|
import CustomSizePerPageTable from 'examples/pagination/custom-size-per-page';
|
||||||
|
import CustomPageListTable from 'examples/pagination/custom-page-list';
|
||||||
|
import StandalonePaginationList from 'examples/pagination/standalone-pagination-list';
|
||||||
|
import StandaloneSizePerPage from 'examples/pagination/standalone-size-per-page';
|
||||||
|
import FullyCustomPaginationTable from 'examples/pagination/fully-custom-pagination';
|
||||||
|
|
||||||
// search
|
// search
|
||||||
import SearchTable from 'examples/search';
|
import SearchTable from 'examples/search';
|
||||||
@@ -345,7 +352,14 @@ storiesOf('Pagination', module)
|
|||||||
.addDecorator(bootstrapStyle())
|
.addDecorator(bootstrapStyle())
|
||||||
.add('Basic Pagination Table', () => <PaginationTable />)
|
.add('Basic Pagination Table', () => <PaginationTable />)
|
||||||
.add('Pagination Hooks', () => <PaginationHooksTable />)
|
.add('Pagination Hooks', () => <PaginationHooksTable />)
|
||||||
.add('Custom Pagination', () => <CustomPaginationTable />);
|
.add('Custom Pagination', () => <CustomPaginationTable />)
|
||||||
|
.add('Custom Page Button', () => <CustomPageButtonTable />)
|
||||||
|
.add('Custom Page List', () => <CustomPageListTable />)
|
||||||
|
.add('Custom SizePerPage Option', () => <CustomSizePerPageOptionTable />)
|
||||||
|
.add('Custom SizePerPage', () => <CustomSizePerPageTable />)
|
||||||
|
.add('Standalone Pagination List', () => <StandalonePaginationList />)
|
||||||
|
.add('Standalone SizePerPage Dropdown', () => <StandaloneSizePerPage />)
|
||||||
|
.add('Fully Custom Pagination', () => <FullyCustomPaginationTable />);
|
||||||
|
|
||||||
storiesOf('Table Search', module)
|
storiesOf('Table Search', module)
|
||||||
.addDecorator(bootstrapStyle())
|
.addDecorator(bootstrapStyle())
|
||||||
|
|||||||
@@ -37,4 +37,188 @@ import paginationFactory from 'react-bootstrap-table2-paginator';
|
|||||||
|
|
||||||
## Customization
|
## Customization
|
||||||
|
|
||||||
See [pagination props](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html)
|
### Basic Customization
|
||||||
|
|
||||||
|
`react-bootstrap-table2` give some simple ways to customize something like text, styling etc, following is all the props we support for basic customization:
|
||||||
|
|
||||||
|
* [paginationSize](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationpaginationsize-number)
|
||||||
|
* [sizePerPageList](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationsizeperpagelist-array)
|
||||||
|
* [withFirstAndLast](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationwithfirstandlast-bool)
|
||||||
|
* [alwaysShowAllBtns](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationalwaysshowallbtns-bool)
|
||||||
|
* [firstPageText](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationfirstpagetext-any)
|
||||||
|
* [prePageText](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationprepagetext-any)
|
||||||
|
* [nextPageText](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationnextpagetext-any)
|
||||||
|
* [lastPageText](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationlastpagetext-any)
|
||||||
|
* [firstPageTitle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationfirstpagetitle-any)
|
||||||
|
* [prePageTitle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationprepagetitle-any)
|
||||||
|
* [nextPageTitle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationnextpagetitle-any)
|
||||||
|
* [lastPageTitle](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationlastpagetitle-any)
|
||||||
|
* [hideSizePerPage](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationhidesizeperpage-bool)
|
||||||
|
* [hidePageListOnlyOnePage](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationhidepagelistonlyonepage-bool)
|
||||||
|
* [showTotal](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationshowtotal-bool)
|
||||||
|
|
||||||
|
You can check [this online demo](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html?selectedKind=Pagination&selectedStory=Custom%20Pagination&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel) for above props usage.
|
||||||
|
|
||||||
|
### Advance Customization
|
||||||
|
|
||||||
|
Sometime, you may feel above props is not satisfied with your requirement, don't worry, we provide following renderer for each part of pagination:
|
||||||
|
|
||||||
|
* [pageListRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationpagelistrenderer-function)
|
||||||
|
* [pageButtonRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationpagebuttonrenderer-function)
|
||||||
|
* [sizePerPageRenderer](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/pagination-props.html#paginationsizeperpagerenderer-function)
|
||||||
|
* [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
|
||||||
|
|
||||||
|
If you want to customize the pagination component completely, you may get interesting on following solution:
|
||||||
|
|
||||||
|
* 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:
|
||||||
|
|
||||||
|
#### Import PaginationProvider
|
||||||
|
|
||||||
|
```js
|
||||||
|
import paginationFactory, { PaginationProvider } from 'react-bootstrap-table2-paginator';
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Declare custom and totalSize in pagination option:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const paginationOption = {
|
||||||
|
custom: true,
|
||||||
|
totalSize: products.length
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Render PaginationProvider
|
||||||
|
|
||||||
|
```js
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
.....
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
```
|
||||||
|
|
||||||
|
`PaginationProvider` actually is a wrapper for the concumser of react context, so that now you have to get the props from context provide then render to your compoennt and `BootstrapTable`:
|
||||||
|
|
||||||
|
* `paginationProps`: this include everything about pagination, you will use it when you render standalone component or your custom component.
|
||||||
|
* `paginationTableProps`: you don't need to know about this, but you have to render this as props to `BootstrapTable`.
|
||||||
|
|
||||||
|
So far, your customization pagination is supposed to look like it:
|
||||||
|
```js
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
```
|
||||||
|
|
||||||
|
Now, you have to choose, your built-in standalne components or you customize all of them by yourself:
|
||||||
|
|
||||||
|
#### Use Standalone Component
|
||||||
|
`react-bootstrap-table2-paginator` provider two standalone components:
|
||||||
|
|
||||||
|
* Size Per Page Dropdwn Standalone
|
||||||
|
* Pagination List 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';
|
||||||
|
|
||||||
|
<PaginationProvider
|
||||||
|
pagination={ paginationFactory(options) }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
({
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps
|
||||||
|
}) => (
|
||||||
|
<div>
|
||||||
|
<SizePerPageDropdownStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
<BootstrapTable
|
||||||
|
keyField="id"
|
||||||
|
data={ products }
|
||||||
|
columns={ columns }
|
||||||
|
{ ...paginationTableProps }
|
||||||
|
/>
|
||||||
|
<PaginationListStandalone
|
||||||
|
{ ...paginationProps }
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</PaginationProvider>
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it!! The benifit for using standalone is you can much easier to render the standalone component in any posistion. In the future, we will implement more featue like applying `style`, `className` etc on standalone components.
|
||||||
|
|
||||||
|
#### Customization Everything
|
||||||
|
|
||||||
|
If you choose to custom the pagination component by yourself, the `paginationProps` will be important for you. Becasue you have to know for example how to change page or what's the current page etc. Hence, following is all the props in `paginationProps` object:
|
||||||
|
|
||||||
|
```js
|
||||||
|
page,
|
||||||
|
sizePerPage,
|
||||||
|
pageStartIndex,
|
||||||
|
hidePageListOnlyOnePage,
|
||||||
|
hideSizePerPage,
|
||||||
|
alwaysShowAllBtns,
|
||||||
|
withFirstAndLast,
|
||||||
|
dataSize,
|
||||||
|
sizePerPageList,
|
||||||
|
paginationSize,
|
||||||
|
showTotal,
|
||||||
|
pageListRenderer,
|
||||||
|
pageButtonRenderer,
|
||||||
|
sizePerPageRenderer,
|
||||||
|
paginationTotalRenderer,
|
||||||
|
sizePerPageOptionRenderer,
|
||||||
|
firstPageText,
|
||||||
|
prePageText,
|
||||||
|
nextPageText,
|
||||||
|
lastPageText,
|
||||||
|
prePageTitle,
|
||||||
|
nextPageTitle,
|
||||||
|
firstPageTitle,
|
||||||
|
lastPageTitle,
|
||||||
|
onPageChange,
|
||||||
|
onSizePerPageChange
|
||||||
|
```
|
||||||
|
|
||||||
|
In most of case, `page`, `sizePerPage`, `onPageChange` and `onSizePerPageChange` are most important things for developer.
|
||||||
|
|
||||||
|
* `page`: Current page.
|
||||||
|
* `sizePerPage`: Current size per page.
|
||||||
|
* `onPageChange`: Call it when you nede to change page. This function accept one number argument which indicate the new page
|
||||||
|
* `onSizePerPageChange`: Call it when you nede to change size per page. This function accept two number argument which indicate the new sizePerPage and new page
|
||||||
|
|
||||||
|
[Here](https://react-bootstrap-table.github.io/react-bootstrap-table2/storybook/index.html?selectedKind=Pagination&selectedStory=Fully%20Custom%20Pagination&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Factions%2Factions-panel) is a online example.
|
||||||
|
|||||||
@@ -1,6 +1,26 @@
|
|||||||
import createContext from './src/context';
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import createBaseContext from './src/state-context';
|
||||||
|
import createDataContext from './src/data-context';
|
||||||
|
import PaginationListStandalone from './src/pagination-list-standalone';
|
||||||
|
import SizePerPageDropdownStandalone from './src/size-per-page-dropdown-standalone';
|
||||||
|
|
||||||
export default (options = {}) => ({
|
export default (options = {}) => ({
|
||||||
createContext,
|
createContext: createDataContext,
|
||||||
options
|
options
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const { Provider, Consumer } = createBaseContext();
|
||||||
|
|
||||||
|
const CustomizableProvider = props => (
|
||||||
|
<Provider { ...props }>
|
||||||
|
<Consumer>{ paginationProps => props.children(paginationProps) }</Consumer>
|
||||||
|
</Provider>
|
||||||
|
);
|
||||||
|
|
||||||
|
CustomizableProvider.propTypes = {
|
||||||
|
children: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export const PaginationProvider = CustomizableProvider;
|
||||||
|
export { PaginationListStandalone, SizePerPageDropdownStandalone };
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-bootstrap-table2-paginator",
|
"name": "react-bootstrap-table2-paginator",
|
||||||
"version": "1.0.4",
|
"version": "2.0.0",
|
||||||
"description": "it's the pagination addon for react-bootstrap-table2",
|
"description": "it's the pagination addon for react-bootstrap-table2",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,182 +0,0 @@
|
|||||||
/* eslint react/prop-types: 0 */
|
|
||||||
/* eslint react/require-default-props: 0 */
|
|
||||||
/* eslint no-lonely-if: 0 */
|
|
||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
|
|
||||||
import Const from './const';
|
|
||||||
import { BootstrapContext } from './bootstrap';
|
|
||||||
import Pagination from './pagination';
|
|
||||||
import { getByCurrPage, alignPage } from './page';
|
|
||||||
|
|
||||||
export default (
|
|
||||||
isRemotePagination,
|
|
||||||
handleRemotePageChange
|
|
||||||
) => {
|
|
||||||
const PaginationContext = React.createContext();
|
|
||||||
|
|
||||||
class PaginationProvider extends React.Component {
|
|
||||||
static propTypes = {
|
|
||||||
data: PropTypes.array.isRequired
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.handleChangePage = this.handleChangePage.bind(this);
|
|
||||||
this.handleChangeSizePerPage = this.handleChangeSizePerPage.bind(this);
|
|
||||||
|
|
||||||
let currPage;
|
|
||||||
let currSizePerPage;
|
|
||||||
const { options } = props.pagination;
|
|
||||||
const sizePerPageList = options.sizePerPageList || Const.SIZE_PER_PAGE_LIST;
|
|
||||||
|
|
||||||
// initialize current page
|
|
||||||
if (typeof options.page !== 'undefined') {
|
|
||||||
currPage = options.page;
|
|
||||||
} else if (typeof options.pageStartIndex !== 'undefined') {
|
|
||||||
currPage = options.pageStartIndex;
|
|
||||||
} else {
|
|
||||||
currPage = Const.PAGE_START_INDEX;
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize current sizePerPage
|
|
||||||
if (typeof options.sizePerPage !== 'undefined') {
|
|
||||||
currSizePerPage = options.sizePerPage;
|
|
||||||
} else if (typeof sizePerPageList[0] === 'object') {
|
|
||||||
currSizePerPage = sizePerPageList[0].value;
|
|
||||||
} else {
|
|
||||||
currSizePerPage = sizePerPageList[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
this.currPage = currPage;
|
|
||||||
this.currSizePerPage = currSizePerPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
|
||||||
let needNewState = false;
|
|
||||||
let { currPage } = this;
|
|
||||||
const { currSizePerPage } = this;
|
|
||||||
const { onPageChange } = nextProps.pagination.options;
|
|
||||||
|
|
||||||
const pageStartIndex = typeof nextProps.pagination.options.pageStartIndex !== 'undefined' ?
|
|
||||||
nextProps.pagination.options.pageStartIndex : Const.PAGE_START_INDEX;
|
|
||||||
|
|
||||||
// user should align the page when the page is not fit to the data size when remote enable
|
|
||||||
if (!isRemotePagination()) {
|
|
||||||
const newPage = alignPage(nextProps.data, currPage, currSizePerPage, pageStartIndex);
|
|
||||||
if (currPage !== newPage) {
|
|
||||||
currPage = newPage;
|
|
||||||
needNewState = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.currPage = nextProps.pagination.options.page;
|
|
||||||
this.currSizePerPage = nextProps.pagination.options.sizePerPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needNewState) {
|
|
||||||
if (onPageChange) {
|
|
||||||
onPageChange(currPage, currSizePerPage);
|
|
||||||
}
|
|
||||||
this.currPage = currPage;
|
|
||||||
this.currSizePerPage = currSizePerPage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleChangePage(currPage) {
|
|
||||||
const { currSizePerPage } = this;
|
|
||||||
const { pagination: { options } } = this.props;
|
|
||||||
|
|
||||||
if (options.onPageChange) {
|
|
||||||
options.onPageChange(currPage, currSizePerPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.currPage = currPage;
|
|
||||||
|
|
||||||
if (isRemotePagination()) {
|
|
||||||
handleRemotePageChange(currPage, currSizePerPage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.forceUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
handleChangeSizePerPage(currSizePerPage, currPage) {
|
|
||||||
const { pagination: { options } } = this.props;
|
|
||||||
|
|
||||||
if (options.onSizePerPageChange) {
|
|
||||||
options.onSizePerPageChange(currSizePerPage, currPage);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.currPage = currPage;
|
|
||||||
this.currSizePerPage = currSizePerPage;
|
|
||||||
|
|
||||||
if (isRemotePagination()) {
|
|
||||||
handleRemotePageChange(currPage, currSizePerPage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.forceUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
let { data } = this.props;
|
|
||||||
const { pagination: { options }, bootstrap4 } = this.props;
|
|
||||||
const { currPage, currSizePerPage } = this;
|
|
||||||
const withFirstAndLast = typeof options.withFirstAndLast === 'undefined' ?
|
|
||||||
Const.With_FIRST_AND_LAST : options.withFirstAndLast;
|
|
||||||
const alwaysShowAllBtns = typeof options.alwaysShowAllBtns === 'undefined' ?
|
|
||||||
Const.SHOW_ALL_PAGE_BTNS : options.alwaysShowAllBtns;
|
|
||||||
const hideSizePerPage = typeof options.hideSizePerPage === 'undefined' ?
|
|
||||||
Const.HIDE_SIZE_PER_PAGE : options.hideSizePerPage;
|
|
||||||
const hidePageListOnlyOnePage = typeof options.hidePageListOnlyOnePage === 'undefined' ?
|
|
||||||
Const.HIDE_PAGE_LIST_ONLY_ONE_PAGE : options.hidePageListOnlyOnePage;
|
|
||||||
const pageStartIndex = typeof options.pageStartIndex === 'undefined' ?
|
|
||||||
Const.PAGE_START_INDEX : options.pageStartIndex;
|
|
||||||
|
|
||||||
data = isRemotePagination() ?
|
|
||||||
data :
|
|
||||||
getByCurrPage(
|
|
||||||
data,
|
|
||||||
currPage,
|
|
||||||
currSizePerPage,
|
|
||||||
pageStartIndex
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<PaginationContext.Provider value={ { data } }>
|
|
||||||
{ this.props.children }
|
|
||||||
<BootstrapContext.Provider value={ { bootstrap4 } }>
|
|
||||||
<Pagination
|
|
||||||
key="pagination"
|
|
||||||
dataSize={ options.totalSize || this.props.data.length }
|
|
||||||
currPage={ currPage }
|
|
||||||
currSizePerPage={ currSizePerPage }
|
|
||||||
onPageChange={ this.handleChangePage }
|
|
||||||
onSizePerPageChange={ this.handleChangeSizePerPage }
|
|
||||||
sizePerPageList={ options.sizePerPageList || Const.SIZE_PER_PAGE_LIST }
|
|
||||||
paginationSize={ options.paginationSize || Const.PAGINATION_SIZE }
|
|
||||||
pageStartIndex={ pageStartIndex }
|
|
||||||
withFirstAndLast={ withFirstAndLast }
|
|
||||||
alwaysShowAllBtns={ alwaysShowAllBtns }
|
|
||||||
hideSizePerPage={ hideSizePerPage }
|
|
||||||
hidePageListOnlyOnePage={ hidePageListOnlyOnePage }
|
|
||||||
showTotal={ options.showTotal }
|
|
||||||
paginationTotalRenderer={ options.paginationTotalRenderer }
|
|
||||||
firstPageText={ options.firstPageText || Const.FIRST_PAGE_TEXT }
|
|
||||||
prePageText={ options.prePageText || Const.PRE_PAGE_TEXT }
|
|
||||||
nextPageText={ options.nextPageText || Const.NEXT_PAGE_TEXT }
|
|
||||||
lastPageText={ options.lastPageText || Const.LAST_PAGE_TEXT }
|
|
||||||
prePageTitle={ options.prePageTitle || Const.PRE_PAGE_TITLE }
|
|
||||||
nextPageTitle={ options.nextPageTitle || Const.NEXT_PAGE_TITLE }
|
|
||||||
firstPageTitle={ options.firstPageTitle || Const.FIRST_PAGE_TITLE }
|
|
||||||
lastPageTitle={ options.lastPageTitle || Const.LAST_PAGE_TITLE }
|
|
||||||
/>
|
|
||||||
</BootstrapContext.Provider>
|
|
||||||
</PaginationContext.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
Provider: PaginationProvider,
|
|
||||||
Consumer: PaginationContext.Consumer
|
|
||||||
};
|
|
||||||
};
|
|
||||||
100
packages/react-bootstrap-table2-paginator/src/data-context.js
vendored
Normal file
100
packages/react-bootstrap-table2-paginator/src/data-context.js
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint react/require-default-props: 0 */
|
||||||
|
/* eslint no-lonely-if: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
import Const from './const';
|
||||||
|
import { BootstrapContext } from './bootstrap';
|
||||||
|
import Pagination from './pagination';
|
||||||
|
import { getByCurrPage, alignPage } from './page';
|
||||||
|
import createBaseContext from './state-context';
|
||||||
|
|
||||||
|
const { Provider } = createBaseContext();
|
||||||
|
|
||||||
|
const PaginationDataContext = React.createContext();
|
||||||
|
|
||||||
|
class PaginationDataProvider extends Provider {
|
||||||
|
static propTypes = {
|
||||||
|
data: PropTypes.array.isRequired,
|
||||||
|
remoteEmitter: PropTypes.object.isRequired,
|
||||||
|
isRemotePagination: PropTypes.func.isRequired
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
super.componentWillReceiveProps(nextProps);
|
||||||
|
const { currSizePerPage } = this;
|
||||||
|
const { custom, onPageChange } = nextProps.pagination.options;
|
||||||
|
|
||||||
|
const pageStartIndex = typeof nextProps.pagination.options.pageStartIndex !== 'undefined' ?
|
||||||
|
nextProps.pagination.options.pageStartIndex : Const.PAGE_START_INDEX;
|
||||||
|
|
||||||
|
// user should align the page when the page is not fit to the data size when remote enable
|
||||||
|
if (!this.isRemotePagination() && !custom) {
|
||||||
|
const newPage = alignPage(
|
||||||
|
nextProps.data.length, this.currPage, currSizePerPage, pageStartIndex);
|
||||||
|
|
||||||
|
if (this.currPage !== newPage) {
|
||||||
|
if (onPageChange) {
|
||||||
|
onPageChange(newPage, currSizePerPage);
|
||||||
|
}
|
||||||
|
this.currPage = newPage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isRemotePagination = () => this.props.isRemotePagination();
|
||||||
|
|
||||||
|
renderDefaultPagination = () => {
|
||||||
|
if (!this.props.pagination.options.custom) {
|
||||||
|
const {
|
||||||
|
bootstrap4,
|
||||||
|
page: currPage,
|
||||||
|
sizePerPage: currSizePerPage,
|
||||||
|
dataSize,
|
||||||
|
...rest
|
||||||
|
} = this.getPaginationProps();
|
||||||
|
return (
|
||||||
|
<BootstrapContext.Provider value={ { bootstrap4 } }>
|
||||||
|
<Pagination
|
||||||
|
{ ...rest }
|
||||||
|
key="pagination"
|
||||||
|
dataSize={ dataSize || this.props.data.length }
|
||||||
|
currPage={ currPage }
|
||||||
|
currSizePerPage={ currSizePerPage }
|
||||||
|
/>
|
||||||
|
</BootstrapContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
let { data } = this.props;
|
||||||
|
const { pagination: { options } } = this.props;
|
||||||
|
const { currPage, currSizePerPage } = this;
|
||||||
|
const pageStartIndex = typeof options.pageStartIndex === 'undefined' ?
|
||||||
|
Const.PAGE_START_INDEX : options.pageStartIndex;
|
||||||
|
|
||||||
|
data = this.isRemotePagination() ?
|
||||||
|
data :
|
||||||
|
getByCurrPage(
|
||||||
|
data,
|
||||||
|
currPage,
|
||||||
|
currSizePerPage,
|
||||||
|
pageStartIndex
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PaginationDataContext.Provider value={ { data, setRemoteEmitter: this.setRemoteEmitter } }>
|
||||||
|
{ this.props.children }
|
||||||
|
{ this.renderDefaultPagination() }
|
||||||
|
</PaginationDataContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default () => ({
|
||||||
|
Provider: PaginationDataProvider,
|
||||||
|
Consumer: PaginationDataContext.Consumer
|
||||||
|
});
|
||||||
@@ -20,13 +20,14 @@ class PageButton extends Component {
|
|||||||
page,
|
page,
|
||||||
title,
|
title,
|
||||||
active,
|
active,
|
||||||
disabled
|
disabled,
|
||||||
|
className
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const classes = cs({
|
const classes = cs({
|
||||||
active,
|
active,
|
||||||
disabled,
|
disabled,
|
||||||
'page-item': true
|
'page-item': true
|
||||||
});
|
}, className);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className={ classes } title={ title }>
|
<li className={ classes } title={ title }>
|
||||||
@@ -41,6 +42,7 @@ PageButton.propTypes = {
|
|||||||
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
|
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
|
||||||
active: PropTypes.bool.isRequired,
|
active: PropTypes.bool.isRequired,
|
||||||
disabled: PropTypes.bool.isRequired,
|
disabled: PropTypes.bool.isRequired,
|
||||||
|
className: PropTypes.string,
|
||||||
title: PropTypes.string
|
title: PropTypes.string
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,16 +8,10 @@ export default ExtendBase =>
|
|||||||
return (currPage - 1) < pageStartIndex ? pageStartIndex : currPage - 1;
|
return (currPage - 1) < pageStartIndex ? pageStartIndex : currPage - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
goToNextPage() {
|
|
||||||
const { currPage } = this.props;
|
|
||||||
const { lastPage } = this.state;
|
|
||||||
return (currPage + 1) > lastPage ? lastPage : currPage + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
initialState() {
|
initialState() {
|
||||||
const totalPages = this.calculateTotalPage();
|
const totalPages = this.calculateTotalPage();
|
||||||
const lastPage = this.calculateLastPage(totalPages);
|
const lastPage = this.calculateLastPage(totalPages);
|
||||||
return { totalPages, lastPage, dropdownOpen: false };
|
return { totalPages, lastPage };
|
||||||
}
|
}
|
||||||
|
|
||||||
calculateTotalPage(sizePerPage = this.props.currSizePerPage, dataSize = this.props.dataSize) {
|
calculateTotalPage(sizePerPage = this.props.currSizePerPage, dataSize = this.props.dataSize) {
|
||||||
@@ -47,8 +41,9 @@ export default ExtendBase =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
calculatePages(
|
calculatePages(
|
||||||
totalPages = this.state.totalPages,
|
totalPages,
|
||||||
lastPage = this.state.lastPage) {
|
lastPage
|
||||||
|
) {
|
||||||
const {
|
const {
|
||||||
currPage,
|
currPage,
|
||||||
paginationSize,
|
paginationSize,
|
||||||
@@ -94,7 +89,7 @@ export default ExtendBase =>
|
|||||||
return pages;
|
return pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
calculatePageStatus(pages = [], lastPage = this.state.lastPage) {
|
calculatePageStatus(pages = [], lastPage) {
|
||||||
const {
|
const {
|
||||||
currPage,
|
currPage,
|
||||||
pageStartIndex,
|
pageStartIndex,
|
||||||
|
|||||||
@@ -18,13 +18,11 @@ const startIndex = (
|
|||||||
) => end - (sizePerPage - 1);
|
) => end - (sizePerPage - 1);
|
||||||
|
|
||||||
export const alignPage = (
|
export const alignPage = (
|
||||||
data,
|
dataSize,
|
||||||
page,
|
page,
|
||||||
sizePerPage,
|
sizePerPage,
|
||||||
pageStartIndex
|
pageStartIndex
|
||||||
) => {
|
) => {
|
||||||
const dataSize = data.length;
|
|
||||||
|
|
||||||
if (page < pageStartIndex || page > (Math.floor(dataSize / sizePerPage) + pageStartIndex)) {
|
if (page < pageStartIndex || page > (Math.floor(dataSize / sizePerPage) + pageStartIndex)) {
|
||||||
return pageStartIndex;
|
return pageStartIndex;
|
||||||
}
|
}
|
||||||
|
|||||||
77
packages/react-bootstrap-table2-paginator/src/pagination-handler.js
vendored
Normal file
77
packages/react-bootstrap-table2-paginator/src/pagination-handler.js
vendored
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import pageResolver from './page-resolver';
|
||||||
|
|
||||||
|
export default WrappedComponent =>
|
||||||
|
class PaginationHandler extends pageResolver(Component) {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.handleChangePage = this.handleChangePage.bind(this);
|
||||||
|
this.handleChangeSizePerPage = this.handleChangeSizePerPage.bind(this);
|
||||||
|
this.state = this.initialState();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
const { dataSize, currSizePerPage } = nextProps;
|
||||||
|
if (currSizePerPage !== this.props.currSizePerPage || dataSize !== this.props.dataSize) {
|
||||||
|
const totalPages = this.calculateTotalPage(currSizePerPage, dataSize);
|
||||||
|
const lastPage = this.calculateLastPage(totalPages);
|
||||||
|
this.setState({ totalPages, lastPage });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChangeSizePerPage(sizePerPage) {
|
||||||
|
const { currSizePerPage, onSizePerPageChange } = this.props;
|
||||||
|
const selectedSize = typeof sizePerPage === 'string' ? parseInt(sizePerPage, 10) : sizePerPage;
|
||||||
|
let { currPage } = this.props;
|
||||||
|
if (selectedSize !== currSizePerPage) {
|
||||||
|
const newTotalPages = this.calculateTotalPage(selectedSize);
|
||||||
|
const newLastPage = this.calculateLastPage(newTotalPages);
|
||||||
|
if (currPage > newLastPage) currPage = newLastPage;
|
||||||
|
onSizePerPageChange(selectedSize, currPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChangePage(newPage) {
|
||||||
|
let page;
|
||||||
|
const {
|
||||||
|
currPage,
|
||||||
|
pageStartIndex,
|
||||||
|
prePageText,
|
||||||
|
nextPageText,
|
||||||
|
lastPageText,
|
||||||
|
firstPageText,
|
||||||
|
onPageChange
|
||||||
|
} = this.props;
|
||||||
|
const { lastPage } = this.state;
|
||||||
|
|
||||||
|
if (newPage === prePageText) {
|
||||||
|
page = this.backToPrevPage();
|
||||||
|
} else if (newPage === nextPageText) {
|
||||||
|
page = (currPage + 1) > lastPage ? lastPage : currPage + 1;
|
||||||
|
} else if (newPage === lastPageText) {
|
||||||
|
page = lastPage;
|
||||||
|
} else if (newPage === firstPageText) {
|
||||||
|
page = pageStartIndex;
|
||||||
|
} else {
|
||||||
|
page = parseInt(newPage, 10);
|
||||||
|
}
|
||||||
|
if (page !== currPage) {
|
||||||
|
onPageChange(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<WrappedComponent
|
||||||
|
{ ...this.props }
|
||||||
|
lastPage={ this.state.lastPage }
|
||||||
|
totalPages={ this.state.totalPages }
|
||||||
|
onPageChange={ this.handleChangePage }
|
||||||
|
onSizePerPageChange={ this.handleChangeSizePerPage }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
24
packages/react-bootstrap-table2-paginator/src/pagination-list-adapter.js
vendored
Normal file
24
packages/react-bootstrap-table2-paginator/src/pagination-list-adapter.js
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import pageResolver from './page-resolver';
|
||||||
|
import PaginationList from './pagination-list';
|
||||||
|
|
||||||
|
const paginationListAdapter = WrappedComponent =>
|
||||||
|
class PaginationListAdapter extends pageResolver(Component) {
|
||||||
|
render() {
|
||||||
|
const { lastPage, totalPages, pageButtonRenderer, onPageChange } = this.props;
|
||||||
|
const pages = this.calculatePageStatus(this.calculatePages(totalPages, lastPage), lastPage);
|
||||||
|
return (
|
||||||
|
<WrappedComponent
|
||||||
|
pageButtonRenderer={ pageButtonRenderer }
|
||||||
|
onPageChange={ onPageChange }
|
||||||
|
pages={ pages }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const PaginationListWithAdapter = paginationListAdapter(PaginationList);
|
||||||
|
export default paginationListAdapter;
|
||||||
12
packages/react-bootstrap-table2-paginator/src/pagination-list-standalone.js
vendored
Normal file
12
packages/react-bootstrap-table2-paginator/src/pagination-list-standalone.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import PaginationList from './pagination-list';
|
||||||
|
import standaloneAdapter from './standalone-adapter';
|
||||||
|
import PaginationHandler from './pagination-handler';
|
||||||
|
import paginationListAdapter from './pagination-list-adapter';
|
||||||
|
|
||||||
|
const PaginationListStandalone = props => (
|
||||||
|
<PaginationList { ...props } />
|
||||||
|
);
|
||||||
|
|
||||||
|
export default
|
||||||
|
standaloneAdapter(PaginationHandler(paginationListAdapter(PaginationListStandalone)));
|
||||||
@@ -6,13 +6,21 @@ import PageButton from './page-button';
|
|||||||
const PaginatonList = props => (
|
const PaginatonList = props => (
|
||||||
<ul className="pagination react-bootstrap-table-page-btns-ul">
|
<ul className="pagination react-bootstrap-table-page-btns-ul">
|
||||||
{
|
{
|
||||||
props.pages.map(pageProps => (
|
props.pages.map((pageProps) => {
|
||||||
|
if (props.pageButtonRenderer) {
|
||||||
|
return props.pageButtonRenderer({
|
||||||
|
...pageProps,
|
||||||
|
onPageChange: props.onPageChange
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return (
|
||||||
<PageButton
|
<PageButton
|
||||||
key={ pageProps.page }
|
key={ pageProps.page }
|
||||||
{ ...pageProps }
|
{ ...pageProps }
|
||||||
onPageChange={ props.onPageChange }
|
onPageChange={ props.onPageChange }
|
||||||
/>
|
/>
|
||||||
))
|
);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
);
|
);
|
||||||
@@ -24,7 +32,12 @@ PaginatonList.propTypes = {
|
|||||||
disable: PropTypes.bool,
|
disable: PropTypes.bool,
|
||||||
title: PropTypes.string
|
title: PropTypes.string
|
||||||
})).isRequired,
|
})).isRequired,
|
||||||
onPageChange: PropTypes.func.isRequired
|
onPageChange: PropTypes.func.isRequired,
|
||||||
|
pageButtonRenderer: PropTypes.func
|
||||||
|
};
|
||||||
|
|
||||||
|
PaginatonList.defaultProps = {
|
||||||
|
pageButtonRenderer: null
|
||||||
};
|
};
|
||||||
|
|
||||||
export default PaginatonList;
|
export default PaginatonList;
|
||||||
|
|||||||
@@ -4,89 +4,13 @@ import cs from 'classnames';
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import pageResolver from './page-resolver';
|
import pageResolver from './page-resolver';
|
||||||
import SizePerPageDropDown from './size-per-page-dropdown';
|
import paginationHandler from './pagination-handler';
|
||||||
import PaginationList from './pagination-list';
|
import { SizePerPageDropdownAdapter } from './size-per-page-dropdown-adapter';
|
||||||
|
import { PaginationListWithAdapter } from './pagination-list-adapter';
|
||||||
import PaginationTotal from './pagination-total';
|
import PaginationTotal from './pagination-total';
|
||||||
import Const from './const';
|
import Const from './const';
|
||||||
|
|
||||||
class Pagination extends pageResolver(Component) {
|
class Pagination extends pageResolver(Component) {
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.closeDropDown = this.closeDropDown.bind(this);
|
|
||||||
this.toggleDropDown = this.toggleDropDown.bind(this);
|
|
||||||
this.handleChangePage = this.handleChangePage.bind(this);
|
|
||||||
this.handleChangeSizePerPage = this.handleChangeSizePerPage.bind(this);
|
|
||||||
this.state = this.initialState();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
|
||||||
const { dataSize, currSizePerPage } = nextProps;
|
|
||||||
if (currSizePerPage !== this.props.currSizePerPage || dataSize !== this.props.dataSize) {
|
|
||||||
const totalPages = this.calculateTotalPage(currSizePerPage, dataSize);
|
|
||||||
const lastPage = this.calculateLastPage(totalPages);
|
|
||||||
this.setState({ totalPages, lastPage });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleDropDown() {
|
|
||||||
const dropdownOpen = !this.state.dropdownOpen;
|
|
||||||
this.setState(() => {
|
|
||||||
return { dropdownOpen };
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
closeDropDown() {
|
|
||||||
this.setState(() => {
|
|
||||||
return { dropdownOpen: false };
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
handleChangeSizePerPage(sizePerPage) {
|
|
||||||
const { currSizePerPage, onSizePerPageChange } = this.props;
|
|
||||||
const selectedSize = typeof sizePerPage === 'string' ? parseInt(sizePerPage, 10) : sizePerPage;
|
|
||||||
let { currPage } = this.props;
|
|
||||||
if (selectedSize !== currSizePerPage) {
|
|
||||||
const newTotalPages = this.calculateTotalPage(selectedSize);
|
|
||||||
const newLastPage = this.calculateLastPage(newTotalPages);
|
|
||||||
if (currPage > newLastPage) currPage = newLastPage;
|
|
||||||
onSizePerPageChange(selectedSize, currPage);
|
|
||||||
}
|
|
||||||
this.closeDropDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
handleChangePage(newPage) {
|
|
||||||
let page;
|
|
||||||
const {
|
|
||||||
currPage,
|
|
||||||
pageStartIndex,
|
|
||||||
prePageText,
|
|
||||||
nextPageText,
|
|
||||||
lastPageText,
|
|
||||||
firstPageText,
|
|
||||||
onPageChange
|
|
||||||
// keepSizePerPageState
|
|
||||||
} = this.props;
|
|
||||||
const { lastPage } = this.state;
|
|
||||||
|
|
||||||
if (newPage === prePageText) {
|
|
||||||
page = this.backToPrevPage();
|
|
||||||
} else if (newPage === nextPageText) {
|
|
||||||
page = (currPage + 1) > lastPage ? lastPage : currPage + 1;
|
|
||||||
} else if (newPage === lastPageText) {
|
|
||||||
page = lastPage;
|
|
||||||
} else if (newPage === firstPageText) {
|
|
||||||
page = pageStartIndex;
|
|
||||||
} else {
|
|
||||||
page = parseInt(newPage, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (keepSizePerPageState) { this.closeDropDown(); }
|
|
||||||
|
|
||||||
if (page !== currPage) {
|
|
||||||
onPageChange(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultTotal = (from, to, size) => (
|
defaultTotal = (from, to, size) => (
|
||||||
<PaginationTotal
|
<PaginationTotal
|
||||||
from={ from }
|
from={ from }
|
||||||
@@ -104,17 +28,26 @@ class Pagination extends pageResolver(Component) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { totalPages, lastPage, dropdownOpen: open } = this.state;
|
|
||||||
const {
|
const {
|
||||||
showTotal,
|
showTotal,
|
||||||
dataSize,
|
dataSize,
|
||||||
|
pageListRenderer,
|
||||||
|
pageButtonRenderer,
|
||||||
paginationTotalRenderer,
|
paginationTotalRenderer,
|
||||||
|
hidePageListOnlyOnePage,
|
||||||
|
totalPages,
|
||||||
|
lastPage,
|
||||||
|
onPageChange,
|
||||||
sizePerPageList,
|
sizePerPageList,
|
||||||
currSizePerPage,
|
currSizePerPage,
|
||||||
hideSizePerPage,
|
hideSizePerPage,
|
||||||
hidePageListOnlyOnePage
|
sizePerPageRenderer,
|
||||||
|
sizePerPageOptionRenderer,
|
||||||
|
onSizePerPageChange,
|
||||||
|
...rest
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const pages = this.calculatePageStatus(this.calculatePages(totalPages), lastPage);
|
|
||||||
|
const pages = this.calculatePageStatus(this.calculatePages(totalPages, lastPage), lastPage);
|
||||||
const [from, to] = this.calculateFromTo();
|
const [from, to] = this.calculateFromTo();
|
||||||
const pageListClass = cs(
|
const pageListClass = cs(
|
||||||
'react-bootstrap-table-pagination-list',
|
'react-bootstrap-table-pagination-list',
|
||||||
@@ -124,19 +57,14 @@ class Pagination extends pageResolver(Component) {
|
|||||||
return (
|
return (
|
||||||
<div className="row react-bootstrap-table-pagination">
|
<div className="row react-bootstrap-table-pagination">
|
||||||
<div className="col-md-6 col-xs-6 col-sm-6 col-lg-6">
|
<div className="col-md-6 col-xs-6 col-sm-6 col-lg-6">
|
||||||
{
|
<SizePerPageDropdownAdapter
|
||||||
sizePerPageList.length > 1 && !hideSizePerPage ?
|
sizePerPageList={ sizePerPageList }
|
||||||
(
|
currSizePerPage={ currSizePerPage }
|
||||||
<SizePerPageDropDown
|
hideSizePerPage={ hideSizePerPage }
|
||||||
currSizePerPage={ `${currSizePerPage}` }
|
sizePerPageRenderer={ sizePerPageRenderer }
|
||||||
options={ this.calculateSizePerPageStatus() }
|
sizePerPageOptionRenderer={ sizePerPageOptionRenderer }
|
||||||
onSizePerPageChange={ this.handleChangeSizePerPage }
|
onSizePerPageChange={ onSizePerPageChange }
|
||||||
onClick={ this.toggleDropDown }
|
|
||||||
onBlur={ this.closeDropDown }
|
|
||||||
open={ open }
|
|
||||||
/>
|
/>
|
||||||
) : null
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
showTotal ?
|
showTotal ?
|
||||||
this.setTotal(
|
this.setTotal(
|
||||||
@@ -147,9 +75,22 @@ class Pagination extends pageResolver(Component) {
|
|||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
{
|
||||||
|
pageListRenderer ? pageListRenderer({
|
||||||
|
pages,
|
||||||
|
onPageChange
|
||||||
|
}) : (
|
||||||
<div className={ pageListClass }>
|
<div className={ pageListClass }>
|
||||||
<PaginationList pages={ pages } onPageChange={ this.handleChangePage } />
|
<PaginationListWithAdapter
|
||||||
|
{ ...rest }
|
||||||
|
lastPage={ lastPage }
|
||||||
|
totalPages={ totalPages }
|
||||||
|
pageButtonRenderer={ pageButtonRenderer }
|
||||||
|
onPageChange={ onPageChange }
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -165,7 +106,11 @@ Pagination.propTypes = {
|
|||||||
pageStartIndex: PropTypes.number,
|
pageStartIndex: PropTypes.number,
|
||||||
paginationSize: PropTypes.number,
|
paginationSize: PropTypes.number,
|
||||||
showTotal: PropTypes.bool,
|
showTotal: PropTypes.bool,
|
||||||
|
pageListRenderer: PropTypes.func,
|
||||||
|
pageButtonRenderer: PropTypes.func,
|
||||||
|
sizePerPageRenderer: PropTypes.func,
|
||||||
paginationTotalRenderer: PropTypes.func,
|
paginationTotalRenderer: PropTypes.func,
|
||||||
|
sizePerPageOptionRenderer: PropTypes.func,
|
||||||
firstPageText: PropTypes.string,
|
firstPageText: PropTypes.string,
|
||||||
prePageText: PropTypes.string,
|
prePageText: PropTypes.string,
|
||||||
nextPageText: PropTypes.string,
|
nextPageText: PropTypes.string,
|
||||||
@@ -186,7 +131,11 @@ Pagination.defaultProps = {
|
|||||||
withFirstAndLast: Const.With_FIRST_AND_LAST,
|
withFirstAndLast: Const.With_FIRST_AND_LAST,
|
||||||
alwaysShowAllBtns: Const.SHOW_ALL_PAGE_BTNS,
|
alwaysShowAllBtns: Const.SHOW_ALL_PAGE_BTNS,
|
||||||
showTotal: Const.SHOW_TOTAL,
|
showTotal: Const.SHOW_TOTAL,
|
||||||
|
pageListRenderer: null,
|
||||||
|
pageButtonRenderer: null,
|
||||||
|
sizePerPageRenderer: null,
|
||||||
paginationTotalRenderer: Const.PAGINATION_TOTAL,
|
paginationTotalRenderer: Const.PAGINATION_TOTAL,
|
||||||
|
sizePerPageOptionRenderer: null,
|
||||||
firstPageText: Const.FIRST_PAGE_TEXT,
|
firstPageText: Const.FIRST_PAGE_TEXT,
|
||||||
prePageText: Const.PRE_PAGE_TEXT,
|
prePageText: Const.PRE_PAGE_TEXT,
|
||||||
nextPageText: Const.NEXT_PAGE_TEXT,
|
nextPageText: Const.NEXT_PAGE_TEXT,
|
||||||
@@ -200,4 +149,4 @@ Pagination.defaultProps = {
|
|||||||
hidePageListOnlyOnePage: Const.HIDE_PAGE_LIST_ONLY_ONE_PAGE
|
hidePageListOnlyOnePage: Const.HIDE_PAGE_LIST_ONLY_ONE_PAGE
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Pagination;
|
export default paginationHandler(Pagination);
|
||||||
|
|||||||
67
packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown-adapter.js
vendored
Normal file
67
packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown-adapter.js
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
|
||||||
|
import pageResolver from './page-resolver';
|
||||||
|
import SizePerPageDropDown from './size-per-page-dropdown';
|
||||||
|
|
||||||
|
const sizePerPageDropdownAdapter = WrappedComponent =>
|
||||||
|
class SizePerPageDropdownAdapter extends pageResolver(Component) {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.closeDropDown = this.closeDropDown.bind(this);
|
||||||
|
this.toggleDropDown = this.toggleDropDown.bind(this);
|
||||||
|
this.handleChangeSizePerPage = this.handleChangeSizePerPage.bind(this);
|
||||||
|
this.state = { dropdownOpen: false };
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleDropDown() {
|
||||||
|
const dropdownOpen = !this.state.dropdownOpen;
|
||||||
|
this.setState(() => ({ dropdownOpen }));
|
||||||
|
}
|
||||||
|
|
||||||
|
closeDropDown() {
|
||||||
|
this.setState(() => ({ dropdownOpen: false }));
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChangeSizePerPage(sizePerPage) {
|
||||||
|
this.props.onSizePerPageChange(sizePerPage);
|
||||||
|
this.closeDropDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
sizePerPageList,
|
||||||
|
currSizePerPage,
|
||||||
|
hideSizePerPage,
|
||||||
|
sizePerPageRenderer,
|
||||||
|
sizePerPageOptionRenderer
|
||||||
|
} = this.props;
|
||||||
|
const { dropdownOpen: open } = this.state;
|
||||||
|
|
||||||
|
if (sizePerPageList.length > 1 && !hideSizePerPage) {
|
||||||
|
if (sizePerPageRenderer) {
|
||||||
|
return sizePerPageRenderer({
|
||||||
|
options: this.calculateSizePerPageStatus(),
|
||||||
|
currSizePerPage: `${currSizePerPage}`,
|
||||||
|
onSizePerPageChange: this.handleChangeSizePerPage
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<WrappedComponent
|
||||||
|
currSizePerPage={ `${currSizePerPage}` }
|
||||||
|
options={ this.calculateSizePerPageStatus() }
|
||||||
|
optionRenderer={ sizePerPageOptionRenderer }
|
||||||
|
onSizePerPageChange={ this.handleChangeSizePerPage }
|
||||||
|
onClick={ this.toggleDropDown }
|
||||||
|
onBlur={ this.closeDropDown }
|
||||||
|
open={ open }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const SizePerPageDropdownAdapter = sizePerPageDropdownAdapter(SizePerPageDropDown);
|
||||||
|
export default sizePerPageDropdownAdapter;
|
||||||
12
packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown-standalone.js
vendored
Normal file
12
packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown-standalone.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import SizePerPageDropdown from './size-per-page-dropdown';
|
||||||
|
import standaloneAdapter from './standalone-adapter';
|
||||||
|
import paginationHandler from './pagination-handler';
|
||||||
|
import sizePerPageDropdownAdapter from './size-per-page-dropdown-adapter';
|
||||||
|
|
||||||
|
const SizePerPageDropdownStandalone = props => (
|
||||||
|
<SizePerPageDropdown { ...props } />
|
||||||
|
);
|
||||||
|
|
||||||
|
export default
|
||||||
|
standaloneAdapter(paginationHandler(sizePerPageDropdownAdapter(SizePerPageDropdownStandalone)));
|
||||||
@@ -16,6 +16,7 @@ const SizePerPageDropDown = (props) => {
|
|||||||
className,
|
className,
|
||||||
variation,
|
variation,
|
||||||
btnContextual,
|
btnContextual,
|
||||||
|
optionRenderer,
|
||||||
currSizePerPage,
|
currSizePerPage,
|
||||||
onSizePerPageChange
|
onSizePerPageChange
|
||||||
} = props;
|
} = props;
|
||||||
@@ -61,14 +62,22 @@ const SizePerPageDropDown = (props) => {
|
|||||||
aria-labelledby="pageDropDown"
|
aria-labelledby="pageDropDown"
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
options.map(option => (
|
options.map((option) => {
|
||||||
|
if (optionRenderer) {
|
||||||
|
return optionRenderer({
|
||||||
|
...option,
|
||||||
|
onSizePerPageChange
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return (
|
||||||
<SizePerPageOption
|
<SizePerPageOption
|
||||||
{ ...option }
|
{ ...option }
|
||||||
key={ option.text }
|
key={ option.text }
|
||||||
bootstrap4={ bootstrap4 }
|
bootstrap4={ bootstrap4 }
|
||||||
onSizePerPageChange={ onSizePerPageChange }
|
onSizePerPageChange={ onSizePerPageChange }
|
||||||
/>
|
/>
|
||||||
))
|
);
|
||||||
|
})
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
</span>
|
</span>
|
||||||
@@ -88,14 +97,16 @@ SizePerPageDropDown.propTypes = {
|
|||||||
hidden: PropTypes.bool,
|
hidden: PropTypes.bool,
|
||||||
btnContextual: PropTypes.string,
|
btnContextual: PropTypes.string,
|
||||||
variation: PropTypes.oneOf(['dropdown', 'dropup']),
|
variation: PropTypes.oneOf(['dropdown', 'dropup']),
|
||||||
className: PropTypes.string
|
className: PropTypes.string,
|
||||||
|
optionRenderer: PropTypes.func
|
||||||
};
|
};
|
||||||
SizePerPageDropDown.defaultProps = {
|
SizePerPageDropDown.defaultProps = {
|
||||||
open: false,
|
open: false,
|
||||||
hidden: false,
|
hidden: false,
|
||||||
btnContextual: 'btn-default btn-secondary',
|
btnContextual: 'btn-default btn-secondary',
|
||||||
variation: 'dropdown',
|
variation: 'dropdown',
|
||||||
className: ''
|
className: '',
|
||||||
|
optionRenderer: null
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
14
packages/react-bootstrap-table2-paginator/src/standalone-adapter.js
vendored
Normal file
14
packages/react-bootstrap-table2-paginator/src/standalone-adapter.js
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
export default WrappedComponent => ({
|
||||||
|
page,
|
||||||
|
sizePerPage,
|
||||||
|
...rest
|
||||||
|
}) => (
|
||||||
|
<WrappedComponent
|
||||||
|
{ ...rest }
|
||||||
|
currPage={ page }
|
||||||
|
currSizePerPage={ sizePerPage }
|
||||||
|
/>
|
||||||
|
);
|
||||||
169
packages/react-bootstrap-table2-paginator/src/state-context.js
vendored
Normal file
169
packages/react-bootstrap-table2-paginator/src/state-context.js
vendored
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/* eslint react/prop-types: 0 */
|
||||||
|
/* eslint react/require-default-props: 0 */
|
||||||
|
/* eslint no-lonely-if: 0 */
|
||||||
|
import React from 'react';
|
||||||
|
import Const from './const';
|
||||||
|
|
||||||
|
const StateContext = React.createContext();
|
||||||
|
|
||||||
|
class StateProvider extends React.Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.handleChangePage = this.handleChangePage.bind(this);
|
||||||
|
this.handleChangeSizePerPage = this.handleChangeSizePerPage.bind(this);
|
||||||
|
|
||||||
|
let currPage;
|
||||||
|
let currSizePerPage;
|
||||||
|
const { options } = props.pagination;
|
||||||
|
const sizePerPageList = options.sizePerPageList || Const.SIZE_PER_PAGE_LIST;
|
||||||
|
|
||||||
|
// initialize current page
|
||||||
|
if (typeof options.page !== 'undefined') {
|
||||||
|
currPage = options.page;
|
||||||
|
} else if (typeof options.pageStartIndex !== 'undefined') {
|
||||||
|
currPage = options.pageStartIndex;
|
||||||
|
} else {
|
||||||
|
currPage = Const.PAGE_START_INDEX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize current sizePerPage
|
||||||
|
if (typeof options.sizePerPage !== 'undefined') {
|
||||||
|
currSizePerPage = options.sizePerPage;
|
||||||
|
} else if (typeof sizePerPageList[0] === 'object') {
|
||||||
|
currSizePerPage = sizePerPageList[0].value;
|
||||||
|
} else {
|
||||||
|
currSizePerPage = sizePerPageList[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.currPage = currPage;
|
||||||
|
this.currSizePerPage = currSizePerPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(nextProps) {
|
||||||
|
const { custom } = nextProps.pagination.options;
|
||||||
|
|
||||||
|
// user should align the page when the page is not fit to the data size when remote enable
|
||||||
|
if (this.isRemotePagination() || custom) {
|
||||||
|
this.currPage = nextProps.pagination.options.page;
|
||||||
|
this.currSizePerPage = nextProps.pagination.options.sizePerPage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getPaginationProps = () => {
|
||||||
|
const { pagination: { options }, bootstrap4 } = this.props;
|
||||||
|
const { currPage, currSizePerPage } = this;
|
||||||
|
const withFirstAndLast = typeof options.withFirstAndLast === 'undefined' ?
|
||||||
|
Const.With_FIRST_AND_LAST : options.withFirstAndLast;
|
||||||
|
const alwaysShowAllBtns = typeof options.alwaysShowAllBtns === 'undefined' ?
|
||||||
|
Const.SHOW_ALL_PAGE_BTNS : options.alwaysShowAllBtns;
|
||||||
|
const hideSizePerPage = typeof options.hideSizePerPage === 'undefined' ?
|
||||||
|
Const.HIDE_SIZE_PER_PAGE : options.hideSizePerPage;
|
||||||
|
const hidePageListOnlyOnePage = typeof options.hidePageListOnlyOnePage === 'undefined' ?
|
||||||
|
Const.HIDE_PAGE_LIST_ONLY_ONE_PAGE : options.hidePageListOnlyOnePage;
|
||||||
|
const pageStartIndex = typeof options.pageStartIndex === 'undefined' ?
|
||||||
|
Const.PAGE_START_INDEX : options.pageStartIndex;
|
||||||
|
return {
|
||||||
|
...options,
|
||||||
|
bootstrap4,
|
||||||
|
page: currPage,
|
||||||
|
sizePerPage: currSizePerPage,
|
||||||
|
pageStartIndex,
|
||||||
|
hidePageListOnlyOnePage,
|
||||||
|
hideSizePerPage,
|
||||||
|
alwaysShowAllBtns,
|
||||||
|
withFirstAndLast,
|
||||||
|
dataSize: options.totalSize,
|
||||||
|
sizePerPageList: options.sizePerPageList || Const.SIZE_PER_PAGE_LIST,
|
||||||
|
paginationSize: options.paginationSize || Const.PAGINATION_SIZE,
|
||||||
|
showTotal: options.showTotal,
|
||||||
|
pageListRenderer: options.pageListRenderer,
|
||||||
|
pageButtonRenderer: options.pageButtonRenderer,
|
||||||
|
sizePerPageRenderer: options.sizePerPageRenderer,
|
||||||
|
paginationTotalRenderer: options.paginationTotalRenderer,
|
||||||
|
sizePerPageOptionRenderer: options.sizePerPageOptionRenderer,
|
||||||
|
firstPageText: options.firstPageText || Const.FIRST_PAGE_TEXT,
|
||||||
|
prePageText: options.prePageText || Const.PRE_PAGE_TEXT,
|
||||||
|
nextPageText: options.nextPageText || Const.NEXT_PAGE_TEXT,
|
||||||
|
lastPageText: options.lastPageText || Const.LAST_PAGE_TEXT,
|
||||||
|
prePageTitle: options.prePageTitle || Const.PRE_PAGE_TITLE,
|
||||||
|
nextPageTitle: options.nextPageTitle || Const.NEXT_PAGE_TITLE,
|
||||||
|
firstPageTitle: options.firstPageTitle || Const.FIRST_PAGE_TITLE,
|
||||||
|
lastPageTitle: options.lastPageTitle || Const.LAST_PAGE_TITLE,
|
||||||
|
onPageChange: this.handleChangePage,
|
||||||
|
onSizePerPageChange: this.handleChangeSizePerPage
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
setPaginationRemoteEmitter = (remoteEmitter) => {
|
||||||
|
this.remoteEmitter = remoteEmitter;
|
||||||
|
}
|
||||||
|
|
||||||
|
getPaginationRemoteEmitter = () => this.remoteEmitter || this.props.remoteEmitter;
|
||||||
|
|
||||||
|
isRemotePagination = () => {
|
||||||
|
const e = {};
|
||||||
|
this.remoteEmitter.emit('isRemotePagination', e);
|
||||||
|
return e.result;
|
||||||
|
};
|
||||||
|
|
||||||
|
handleChangePage(currPage) {
|
||||||
|
const { currSizePerPage } = this;
|
||||||
|
const { pagination: { options } } = this.props;
|
||||||
|
|
||||||
|
if (options.onPageChange) {
|
||||||
|
options.onPageChange(currPage, currSizePerPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.currPage = currPage;
|
||||||
|
|
||||||
|
if (this.isRemotePagination()) {
|
||||||
|
this.getPaginationRemoteEmitter().emit('paginationChange', currPage, currSizePerPage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.forceUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
handleChangeSizePerPage(currSizePerPage, currPage) {
|
||||||
|
const { pagination: { options } } = this.props;
|
||||||
|
|
||||||
|
if (options.onSizePerPageChange) {
|
||||||
|
options.onSizePerPageChange(currSizePerPage, currPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.currPage = currPage;
|
||||||
|
this.currSizePerPage = currSizePerPage;
|
||||||
|
|
||||||
|
if (this.isRemotePagination()) {
|
||||||
|
this.getPaginationRemoteEmitter().emit('paginationChange', currPage, currSizePerPage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.forceUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const paginationProps = this.getPaginationProps();
|
||||||
|
const pagination = {
|
||||||
|
...this.props.pagination,
|
||||||
|
options: paginationProps
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StateContext.Provider
|
||||||
|
value={ {
|
||||||
|
paginationProps,
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination,
|
||||||
|
setPaginationRemoteEmitter: this.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
} }
|
||||||
|
>
|
||||||
|
{ this.props.children }
|
||||||
|
</StateContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default () => ({
|
||||||
|
Provider: StateProvider,
|
||||||
|
Consumer: StateContext.Consumer
|
||||||
|
});
|
||||||
@@ -1,711 +0,0 @@
|
|||||||
import 'jsdom-global/register';
|
|
||||||
import React from 'react';
|
|
||||||
import { shallow } from 'enzyme';
|
|
||||||
import BootstrapTable from 'react-bootstrap-table-next/src/bootstrap-table';
|
|
||||||
|
|
||||||
import Pagination from '../src/pagination';
|
|
||||||
import Const from '../src/const';
|
|
||||||
import createPaginationContext from '../src/context';
|
|
||||||
import paginationFactory from '../index';
|
|
||||||
|
|
||||||
const data = [];
|
|
||||||
for (let i = 0; i < 100; i += 1) {
|
|
||||||
data.push({
|
|
||||||
id: i,
|
|
||||||
name: `itme name ${i}`
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('PaginationContext', () => {
|
|
||||||
let wrapper;
|
|
||||||
let PaginationContext;
|
|
||||||
|
|
||||||
const columns = [{
|
|
||||||
dataField: 'id',
|
|
||||||
text: 'ID'
|
|
||||||
}, {
|
|
||||||
dataField: 'name',
|
|
||||||
text: 'Name'
|
|
||||||
}];
|
|
||||||
|
|
||||||
const defaultPagination = { options: {} };
|
|
||||||
|
|
||||||
const mockBase = jest.fn((props => (
|
|
||||||
<BootstrapTable
|
|
||||||
keyField="id"
|
|
||||||
data={ data }
|
|
||||||
columns={ columns }
|
|
||||||
{ ...props }
|
|
||||||
/>
|
|
||||||
)));
|
|
||||||
|
|
||||||
const handleRemotePaginationChange = jest.fn();
|
|
||||||
|
|
||||||
function shallowContext(
|
|
||||||
customPagination = defaultPagination,
|
|
||||||
enableRemote = false
|
|
||||||
) {
|
|
||||||
mockBase.mockReset();
|
|
||||||
handleRemotePaginationChange.mockReset();
|
|
||||||
PaginationContext = createPaginationContext(
|
|
||||||
jest.fn().mockReturnValue(enableRemote),
|
|
||||||
handleRemotePaginationChange
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<PaginationContext.Provider
|
|
||||||
pagination={ paginationFactory(customPagination) }
|
|
||||||
columns={ columns }
|
|
||||||
data={ data }
|
|
||||||
>
|
|
||||||
<PaginationContext.Consumer>
|
|
||||||
{
|
|
||||||
paginationProps => mockBase(paginationProps)
|
|
||||||
}
|
|
||||||
</PaginationContext.Consumer>
|
|
||||||
</PaginationContext.Provider>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
describe('default render', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext());
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have correct Provider property after calling createPaginationContext', () => {
|
|
||||||
expect(PaginationContext.Provider).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have correct Consumer property after calling createPaginationContext', () => {
|
|
||||||
expect(PaginationContext.Consumer).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have correct currPage', () => {
|
|
||||||
expect(wrapper.instance().currPage).toEqual(Const.PAGE_START_INDEX);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should have correct currSizePerPage', () => {
|
|
||||||
expect(wrapper.instance().currSizePerPage).toEqual(Const.SIZE_PER_PAGE_LIST[0]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render Pagination component correctly', () => {
|
|
||||||
expect(wrapper.length).toBe(1);
|
|
||||||
const instance = wrapper.instance();
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination).toHaveLength(1);
|
|
||||||
expect(pagination.prop('dataSize')).toEqual(data.length);
|
|
||||||
expect(pagination.prop('currPage')).toEqual(instance.currPage);
|
|
||||||
expect(pagination.prop('currSizePerPage')).toEqual(instance.currSizePerPage);
|
|
||||||
expect(pagination.prop('onPageChange')).toEqual(instance.handleChangePage);
|
|
||||||
expect(pagination.prop('onSizePerPageChange')).toEqual(instance.handleChangeSizePerPage);
|
|
||||||
expect(pagination.prop('sizePerPageList')).toEqual(Const.SIZE_PER_PAGE_LIST);
|
|
||||||
expect(pagination.prop('paginationSize')).toEqual(Const.PAGINATION_SIZE);
|
|
||||||
expect(pagination.prop('pageStartIndex')).toEqual(Const.PAGE_START_INDEX);
|
|
||||||
expect(pagination.prop('withFirstAndLast')).toEqual(Const.With_FIRST_AND_LAST);
|
|
||||||
expect(pagination.prop('alwaysShowAllBtns')).toEqual(Const.SHOW_ALL_PAGE_BTNS);
|
|
||||||
expect(pagination.prop('firstPageText')).toEqual(Const.FIRST_PAGE_TEXT);
|
|
||||||
expect(pagination.prop('prePageText')).toEqual(Const.PRE_PAGE_TEXT);
|
|
||||||
expect(pagination.prop('nextPageText')).toEqual(Const.NEXT_PAGE_TEXT);
|
|
||||||
expect(pagination.prop('lastPageText')).toEqual(Const.LAST_PAGE_TEXT);
|
|
||||||
expect(pagination.prop('firstPageTitle')).toEqual(Const.FIRST_PAGE_TITLE);
|
|
||||||
expect(pagination.prop('prePageTitle')).toEqual(Const.PRE_PAGE_TITLE);
|
|
||||||
expect(pagination.prop('nextPageTitle')).toEqual(Const.NEXT_PAGE_TITLE);
|
|
||||||
expect(pagination.prop('lastPageTitle')).toEqual(Const.LAST_PAGE_TITLE);
|
|
||||||
expect(pagination.prop('hideSizePerPage')).toEqual(Const.HIDE_SIZE_PER_PAGE);
|
|
||||||
expect(pagination.prop('hideSizePerPage')).toEqual(Const.HIDE_SIZE_PER_PAGE);
|
|
||||||
expect(pagination.prop('paginationTotalRenderer')).toBeNull();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should pass correct cell editing props to children element', () => {
|
|
||||||
expect(mockBase.mock.calls[0][0].data).toHaveLength(Const.SIZE_PER_PAGE_LIST[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('componentWillReceiveProps', () => {
|
|
||||||
let instance;
|
|
||||||
let nextProps;
|
|
||||||
|
|
||||||
describe('when nextProps.pagination.options.page is not existing', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
page: 3
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
wrapper.render();
|
|
||||||
nextProps = { data, pagination: defaultPagination };
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not set currPage', () => {
|
|
||||||
expect(instance.currPage).toEqual(3);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when nextProps.pagination.options.sizePerPage is not existing', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
sizePerPage: Const.SIZE_PER_PAGE_LIST[2]
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
wrapper.render();
|
|
||||||
nextProps = { data, pagination: defaultPagination };
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not set currSizePerPage', () => {
|
|
||||||
expect(instance.currSizePerPage).toEqual(Const.SIZE_PER_PAGE_LIST[2]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when remote pagination is enable', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({ ...defaultPagination }, true));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
wrapper.render();
|
|
||||||
nextProps = {
|
|
||||||
data,
|
|
||||||
pagination: { ...defaultPagination, options: { page: 3, sizePerPage: 5 } }
|
|
||||||
};
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should always set currPage from nextProps.pagination.options.page', () => {
|
|
||||||
expect(instance.currPage).toEqual(nextProps.pagination.options.page);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should always set currSizePerPage from nextProps.pagination.options.sizePerPage', () => {
|
|
||||||
expect(instance.currSizePerPage).toEqual(nextProps.pagination.options.sizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when page is not align', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
page: 2
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
wrapper.render();
|
|
||||||
nextProps = {
|
|
||||||
data: [],
|
|
||||||
pagination: { ...defaultPagination }
|
|
||||||
};
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reset currPage to first page', () => {
|
|
||||||
expect(instance.currPage).toEqual(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if options.onPageChange is defined', () => {
|
|
||||||
const onPageChange = jest.fn();
|
|
||||||
beforeEach(() => {
|
|
||||||
onPageChange.mockClear();
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
page: 2
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
wrapper.render();
|
|
||||||
nextProps = {
|
|
||||||
data: [],
|
|
||||||
pagination: { ...defaultPagination, options: { onPageChange } }
|
|
||||||
};
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call options.onPageChange correctly', () => {
|
|
||||||
expect(onPageChange).toHaveBeenCalledTimes(1);
|
|
||||||
expect(onPageChange).toHaveBeenCalledWith(instance.currPage, instance.currSizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('handleChangePage', () => {
|
|
||||||
let instance;
|
|
||||||
const newPage = 3;
|
|
||||||
|
|
||||||
describe('should update component correctly', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext());
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangePage(newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if options.onPageChange is defined', () => {
|
|
||||||
const onPageChange = jest.fn();
|
|
||||||
beforeEach(() => {
|
|
||||||
onPageChange.mockClear();
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
onPageChange
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangePage(newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should still update component correctly', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call options.onPageChange correctly', () => {
|
|
||||||
expect(onPageChange).toHaveBeenCalledTimes(1);
|
|
||||||
expect(onPageChange).toHaveBeenCalledWith(newPage, instance.currSizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if remote pagination is enable', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination
|
|
||||||
}, true));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangePage(newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should still update component correctly', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call handleRemotePageChange correctly', () => {
|
|
||||||
expect(handleRemotePaginationChange).toHaveBeenCalledTimes(1);
|
|
||||||
expect(handleRemotePaginationChange)
|
|
||||||
.toHaveBeenCalledWith(newPage, instance.currSizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('handleChangeSizePerPage', () => {
|
|
||||||
let instance;
|
|
||||||
const newPage = 2;
|
|
||||||
const newSizePerPage = 15;
|
|
||||||
|
|
||||||
describe('should update component correctly', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext());
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if options.onSizePerPageChange is defined', () => {
|
|
||||||
const onSizePerPageChange = jest.fn();
|
|
||||||
beforeEach(() => {
|
|
||||||
onSizePerPageChange.mockClear();
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
onSizePerPageChange
|
|
||||||
}));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should still update component correctly', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call options.onSizePerPageChange correctly', () => {
|
|
||||||
expect(onSizePerPageChange).toHaveBeenCalledTimes(1);
|
|
||||||
expect(onSizePerPageChange).toHaveBeenCalledWith(newSizePerPage, newPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('if remote pagination is enable', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination
|
|
||||||
}, true));
|
|
||||||
instance = wrapper.instance();
|
|
||||||
jest.spyOn(instance, 'forceUpdate');
|
|
||||||
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should still update component correctly', () => {
|
|
||||||
expect(instance.currPage).toEqual(newPage);
|
|
||||||
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
|
||||||
expect(instance.forceUpdate).toHaveBeenCalledTimes(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call handleRemotePageChange correctly', () => {
|
|
||||||
expect(handleRemotePaginationChange).toHaveBeenCalledTimes(1);
|
|
||||||
expect(handleRemotePaginationChange)
|
|
||||||
.toHaveBeenCalledWith(newPage, newSizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.page is defined', () => {
|
|
||||||
const page = 3;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
page
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should set correct currPage', () => {
|
|
||||||
expect(wrapper.instance().currPage).toEqual(page);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('currPage')).toEqual(page);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.sizePerPage is defined', () => {
|
|
||||||
const sizePerPage = Const.SIZE_PER_PAGE_LIST[2];
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
sizePerPage
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should set correct currSizePerPage', () => {
|
|
||||||
expect(wrapper.instance().currSizePerPage).toEqual(sizePerPage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('currSizePerPage')).toEqual(sizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.totalSize is defined', () => {
|
|
||||||
const totalSize = 100;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
totalSize
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('dataSize')).toEqual(totalSize);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.showTotal is defined', () => {
|
|
||||||
const showTotal = true;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
showTotal
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('showTotal')).toEqual(showTotal);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.pageStartIndex is defined', () => {
|
|
||||||
const pageStartIndex = -1;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
pageStartIndex
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('pageStartIndex')).toEqual(pageStartIndex);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.sizePerPageList is defined', () => {
|
|
||||||
const sizePerPageList = [10, 40];
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
sizePerPageList
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('sizePerPageList')).toEqual(sizePerPageList);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.paginationSize is defined', () => {
|
|
||||||
const paginationSize = 10;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
paginationSize
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('paginationSize')).toEqual(paginationSize);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.withFirstAndLast is defined', () => {
|
|
||||||
const withFirstAndLast = false;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
withFirstAndLast
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('withFirstAndLast')).toEqual(withFirstAndLast);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.alwaysShowAllBtns is defined', () => {
|
|
||||||
const alwaysShowAllBtns = true;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
alwaysShowAllBtns
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('alwaysShowAllBtns')).toEqual(alwaysShowAllBtns);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.firstPageText is defined', () => {
|
|
||||||
const firstPageText = '1st';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
firstPageText
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('firstPageText')).toEqual(firstPageText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.prePageText is defined', () => {
|
|
||||||
const prePageText = 'PRE';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
prePageText
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('prePageText')).toEqual(prePageText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.nextPageText is defined', () => {
|
|
||||||
const nextPageText = 'NEXT';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
nextPageText
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('nextPageText')).toEqual(nextPageText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.lastPageText is defined', () => {
|
|
||||||
const lastPageText = 'LAST';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
lastPageText
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('lastPageText')).toEqual(lastPageText);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.firstPageTitle is defined', () => {
|
|
||||||
const firstPageTitle = '1st';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
firstPageTitle
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('firstPageTitle')).toEqual(firstPageTitle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.prePageTitle is defined', () => {
|
|
||||||
const prePageTitle = 'PRE';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
prePageTitle
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('prePageTitle')).toEqual(prePageTitle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.nextPageTitle is defined', () => {
|
|
||||||
const nextPageTitle = 'NEXT';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
nextPageTitle
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('nextPageTitle')).toEqual(nextPageTitle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.lastPageTitle is defined', () => {
|
|
||||||
const lastPageTitle = 'nth';
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
lastPageTitle
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('lastPageTitle')).toEqual(lastPageTitle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.hideSizePerPage is defined', () => {
|
|
||||||
const hideSizePerPage = true;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
hideSizePerPage
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('hideSizePerPage')).toEqual(hideSizePerPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when options.hidePageListOnlyOnePage is defined', () => {
|
|
||||||
const hidePageListOnlyOnePage = true;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(shallowContext({
|
|
||||||
...defaultPagination,
|
|
||||||
hidePageListOnlyOnePage
|
|
||||||
}));
|
|
||||||
wrapper.render();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering Pagination correctly', () => {
|
|
||||||
const pagination = wrapper.find(Pagination);
|
|
||||||
expect(pagination.length).toBe(1);
|
|
||||||
expect(pagination.prop('hidePageListOnlyOnePage')).toEqual(hidePageListOnlyOnePage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
import 'jsdom-global/register';
|
||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
|
||||||
|
import paginationFactory from '../index';
|
||||||
|
import Const from '../src/const';
|
||||||
|
import createStateContext from '../src/data-context';
|
||||||
|
import Pagination from '../src/pagination';
|
||||||
|
import { getByCurrPage } from '../src/page';
|
||||||
|
|
||||||
|
const data = [];
|
||||||
|
for (let i = 0; i < 100; i += 1) {
|
||||||
|
data.push({
|
||||||
|
id: i,
|
||||||
|
name: `itme name ${i}`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('PaginationDataContext', () => {
|
||||||
|
let wrapper;
|
||||||
|
let PaginationDataContext;
|
||||||
|
|
||||||
|
const defaultPagination = { options: { totalSize: data.length }, createContext: jest.fn() };
|
||||||
|
|
||||||
|
const MockComponent = () => null;
|
||||||
|
const renderMockComponent = jest.fn((props => (
|
||||||
|
<MockComponent { ...props } />
|
||||||
|
)));
|
||||||
|
|
||||||
|
const handleRemotePaginationChange = jest.fn();
|
||||||
|
|
||||||
|
function shallowContext(
|
||||||
|
customPagination = defaultPagination,
|
||||||
|
remoteEnabled = false
|
||||||
|
) {
|
||||||
|
renderMockComponent.mockReset();
|
||||||
|
handleRemotePaginationChange.mockReset();
|
||||||
|
PaginationDataContext = createStateContext();
|
||||||
|
const isRemotePagination = jest.fn().mockReturnValue(remoteEnabled);
|
||||||
|
const remoteEmitter = { emit: jest.fn() };
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PaginationDataContext.Provider
|
||||||
|
pagination={ paginationFactory(customPagination) }
|
||||||
|
data={ data }
|
||||||
|
remoteEmitter={ remoteEmitter }
|
||||||
|
isRemotePagination={ isRemotePagination }
|
||||||
|
>
|
||||||
|
<PaginationDataContext.Consumer>
|
||||||
|
{
|
||||||
|
paginationProps => renderMockComponent(paginationProps)
|
||||||
|
}
|
||||||
|
</PaginationDataContext.Consumer>
|
||||||
|
</PaginationDataContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('default render', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Provider property after calling createPaginationDataContext', () => {
|
||||||
|
expect(PaginationDataContext.Provider).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Consumer property after calling createPaginationDataContext', () => {
|
||||||
|
expect(PaginationDataContext.Consumer).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct currPage', () => {
|
||||||
|
expect(wrapper.instance().currPage).toEqual(Const.PAGE_START_INDEX);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct currSizePerPage', () => {
|
||||||
|
expect(wrapper.instance().currSizePerPage).toEqual(Const.SIZE_PER_PAGE_LIST[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correct data props to childrens', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledTimes(1);
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
data: getByCurrPage(
|
||||||
|
data,
|
||||||
|
instance.currPage,
|
||||||
|
instance.currSizePerPage,
|
||||||
|
Const.PAGE_START_INDEX
|
||||||
|
),
|
||||||
|
setRemoteEmitter: instance.setRemoteEmitter
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('default render', () => {
|
||||||
|
describe('when options.custom is negative', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render Pagination component correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
const pagination = wrapper.find(Pagination);
|
||||||
|
expect(pagination).toHaveLength(1);
|
||||||
|
|
||||||
|
expect(pagination.prop('dataSize')).toEqual(data.length);
|
||||||
|
expect(pagination.prop('currPage')).toEqual(instance.currPage);
|
||||||
|
expect(pagination.prop('currSizePerPage')).toEqual(instance.currSizePerPage);
|
||||||
|
expect(pagination.prop('onPageChange')).toEqual(instance.handleChangePage);
|
||||||
|
expect(pagination.prop('onSizePerPageChange')).toEqual(instance.handleChangeSizePerPage);
|
||||||
|
expect(pagination.prop('sizePerPageList')).toEqual(Const.SIZE_PER_PAGE_LIST);
|
||||||
|
expect(pagination.prop('paginationSize')).toEqual(Const.PAGINATION_SIZE);
|
||||||
|
expect(pagination.prop('pageStartIndex')).toEqual(Const.PAGE_START_INDEX);
|
||||||
|
expect(pagination.prop('withFirstAndLast')).toEqual(Const.With_FIRST_AND_LAST);
|
||||||
|
expect(pagination.prop('alwaysShowAllBtns')).toEqual(Const.SHOW_ALL_PAGE_BTNS);
|
||||||
|
expect(pagination.prop('firstPageText')).toEqual(Const.FIRST_PAGE_TEXT);
|
||||||
|
expect(pagination.prop('prePageText')).toEqual(Const.PRE_PAGE_TEXT);
|
||||||
|
expect(pagination.prop('nextPageText')).toEqual(Const.NEXT_PAGE_TEXT);
|
||||||
|
expect(pagination.prop('lastPageText')).toEqual(Const.LAST_PAGE_TEXT);
|
||||||
|
expect(pagination.prop('firstPageTitle')).toEqual(Const.FIRST_PAGE_TITLE);
|
||||||
|
expect(pagination.prop('prePageTitle')).toEqual(Const.PRE_PAGE_TITLE);
|
||||||
|
expect(pagination.prop('nextPageTitle')).toEqual(Const.NEXT_PAGE_TITLE);
|
||||||
|
expect(pagination.prop('lastPageTitle')).toEqual(Const.LAST_PAGE_TITLE);
|
||||||
|
expect(pagination.prop('hideSizePerPage')).toEqual(Const.HIDE_SIZE_PER_PAGE);
|
||||||
|
expect(pagination.prop('hideSizePerPage')).toEqual(Const.HIDE_SIZE_PER_PAGE);
|
||||||
|
expect(pagination.prop('paginationTotalRenderer')).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.custom is positive', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
custom: true
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render Pagination component', () => {
|
||||||
|
const pagination = wrapper.find(Pagination);
|
||||||
|
expect(pagination).toHaveLength(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when remote pagination enabled', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({}, true));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('just pass data props to children', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledTimes(1);
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
data: instance.props.data,
|
||||||
|
setRemoteEmitter: instance.setRemoteEmitter
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('componentWillReceiveProps', () => {
|
||||||
|
let instance;
|
||||||
|
let nextProps;
|
||||||
|
describe('when page is not align', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
page: 2
|
||||||
|
}));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
wrapper.render();
|
||||||
|
nextProps = {
|
||||||
|
data: [],
|
||||||
|
pagination: { ...defaultPagination }
|
||||||
|
};
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should reset currPage to first page', () => {
|
||||||
|
expect(instance.currPage).toEqual(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if options.onPageChange is defined', () => {
|
||||||
|
const onPageChange = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
onPageChange.mockClear();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
page: 2
|
||||||
|
}));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
wrapper.render();
|
||||||
|
nextProps = {
|
||||||
|
data: [],
|
||||||
|
pagination: { ...defaultPagination, options: { onPageChange } }
|
||||||
|
};
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call options.onPageChange correctly', () => {
|
||||||
|
expect(onPageChange).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onPageChange).toHaveBeenCalledWith(instance.currPage, instance.currSizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -46,8 +46,6 @@ describe('PageResolver', () => {
|
|||||||
expect(instance.state.lastPage).toBeDefined();
|
expect(instance.state.lastPage).toBeDefined();
|
||||||
expect(instance.state.lastPage).toEqual(
|
expect(instance.state.lastPage).toEqual(
|
||||||
instance.calculateLastPage(instance.state.totalPages));
|
instance.calculateLastPage(instance.state.totalPages));
|
||||||
expect(instance.state.dropdownOpen).toBeDefined();
|
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -81,35 +79,6 @@ describe('PageResolver', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('goToNextPage', () => {
|
|
||||||
const props = createMockProps();
|
|
||||||
|
|
||||||
describe('when props.currPage is not hitting state.lastPage', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const mockElement = React.createElement(MockComponent, props, null);
|
|
||||||
wrapper = shallow(mockElement);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should getting previous page correctly', () => {
|
|
||||||
const instance = wrapper.instance();
|
|
||||||
expect(instance.goToNextPage()).toEqual(props.currPage + 1);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when props.currPage is hitting state.lastpage', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
props.currPage = 10;
|
|
||||||
const mockElement = React.createElement(MockComponent, props, null);
|
|
||||||
wrapper = shallow(mockElement);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should always getting page which must eq props.pageStartIndex', () => {
|
|
||||||
const instance = wrapper.instance();
|
|
||||||
expect(instance.goToNextPage()).toEqual(instance.state.lastPage);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('calculateFromTo', () => {
|
describe('calculateFromTo', () => {
|
||||||
const props = createMockProps();
|
const props = createMockProps();
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
@@ -192,7 +161,7 @@ describe('PageResolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe('calculatePages', () => {
|
describe('calculatePages', () => {
|
||||||
describe('calculate by state.totalPages and state.lastPage', () => {
|
describe('calculate by totalPages and lastPage', () => {
|
||||||
const props = createMockProps();
|
const props = createMockProps();
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
const mockElement = React.createElement(MockComponent, props, null);
|
const mockElement = React.createElement(MockComponent, props, null);
|
||||||
@@ -201,7 +170,7 @@ describe('PageResolver', () => {
|
|||||||
|
|
||||||
it('should getting pages list correctly', () => {
|
it('should getting pages list correctly', () => {
|
||||||
const instance = wrapper.instance();
|
const instance = wrapper.instance();
|
||||||
expect(instance.calculatePages()).toEqual(
|
expect(instance.calculatePages(instance.state.totalPages, instance.state.lastPage)).toEqual(
|
||||||
[props.prePageText, 1, 2, 3, 4, 5, props.nextPageText, props.lastPageText]);
|
[props.prePageText, 1, 2, 3, 4, 5, props.nextPageText, props.lastPageText]);
|
||||||
|
|
||||||
expect(instance.calculatePages(4, 4)).toEqual(
|
expect(instance.calculatePages(4, 4)).toEqual(
|
||||||
@@ -218,7 +187,9 @@ describe('PageResolver', () => {
|
|||||||
currPages.forEach((currPage) => {
|
currPages.forEach((currPage) => {
|
||||||
props.currPage = currPage + 1;
|
props.currPage = currPage + 1;
|
||||||
wrapper = shallow(<MockComponent { ...props } />);
|
wrapper = shallow(<MockComponent { ...props } />);
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
|
|
||||||
if (props.currPage < 4) {
|
if (props.currPage < 4) {
|
||||||
expect(pageList).toEqual(
|
expect(pageList).toEqual(
|
||||||
@@ -253,7 +224,9 @@ describe('PageResolver', () => {
|
|||||||
[1, 3, 5, 8, 10].forEach((paginationSize) => {
|
[1, 3, 5, 8, 10].forEach((paginationSize) => {
|
||||||
props.paginationSize = paginationSize;
|
props.paginationSize = paginationSize;
|
||||||
wrapper = shallow(<MockComponent { ...props } />);
|
wrapper = shallow(<MockComponent { ...props } />);
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
const result = pageList.filter(p => indicators.indexOf(p) === -1);
|
const result = pageList.filter(p => indicators.indexOf(p) === -1);
|
||||||
expect(result.length).toEqual(props.paginationSize);
|
expect(result.length).toEqual(props.paginationSize);
|
||||||
});
|
});
|
||||||
@@ -267,7 +240,9 @@ describe('PageResolver', () => {
|
|||||||
[1, 2, 3, 4, 5, 6, 7].forEach((currPage) => {
|
[1, 2, 3, 4, 5, 6, 7].forEach((currPage) => {
|
||||||
props.currPage = currPage;
|
props.currPage = currPage;
|
||||||
wrapper = shallow(<MockComponent { ...props } />);
|
wrapper = shallow(<MockComponent { ...props } />);
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
expect(pageList.indexOf(props.lastPageText) > -1).toBeTruthy();
|
expect(pageList.indexOf(props.lastPageText) > -1).toBeTruthy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -278,7 +253,9 @@ describe('PageResolver', () => {
|
|||||||
[10, 9, 8, 7, 6, 5, 4].forEach((currPage) => {
|
[10, 9, 8, 7, 6, 5, 4].forEach((currPage) => {
|
||||||
props.currPage = currPage;
|
props.currPage = currPage;
|
||||||
wrapper = shallow(<MockComponent { ...props } />);
|
wrapper = shallow(<MockComponent { ...props } />);
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
expect(pageList.indexOf(props.firstPageText) > -1).toBeTruthy();
|
expect(pageList.indexOf(props.firstPageText) > -1).toBeTruthy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -293,7 +270,9 @@ describe('PageResolver', () => {
|
|||||||
props.currPage = currPage + 1;
|
props.currPage = currPage + 1;
|
||||||
props.withFirstAndLast = false;
|
props.withFirstAndLast = false;
|
||||||
wrapper = shallow(<MockComponent { ...props } />);
|
wrapper = shallow(<MockComponent { ...props } />);
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
expect(pageList.indexOf(props.lastPageText) > -1).toBeFalsy();
|
expect(pageList.indexOf(props.lastPageText) > -1).toBeFalsy();
|
||||||
expect(pageList.indexOf(props.firstPageText) > -1).toBeFalsy();
|
expect(pageList.indexOf(props.firstPageText) > -1).toBeFalsy();
|
||||||
});
|
});
|
||||||
@@ -311,7 +290,9 @@ describe('PageResolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should getting last page correctly', () => {
|
it('should getting last page correctly', () => {
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
expect(pageList).toEqual(
|
expect(pageList).toEqual(
|
||||||
[props.prePageText, -2, -1, 0, 1, 2, props.nextPageText, props.lastPageText]);
|
[props.prePageText, -2, -1, 0, 1, 2, props.nextPageText, props.lastPageText]);
|
||||||
});
|
});
|
||||||
@@ -329,7 +310,9 @@ describe('PageResolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should always having next and previous page indication', () => {
|
it('should always having next and previous page indication', () => {
|
||||||
const pageList = wrapper.instance().calculatePages();
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
expect(pageList.indexOf(props.nextPageText) > -1).toBeTruthy();
|
expect(pageList.indexOf(props.nextPageText) > -1).toBeTruthy();
|
||||||
expect(pageList.indexOf(props.prePageText) > -1).toBeTruthy();
|
expect(pageList.indexOf(props.prePageText) > -1).toBeTruthy();
|
||||||
});
|
});
|
||||||
@@ -345,7 +328,10 @@ describe('PageResolver', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should getting empty array', () => {
|
it('should getting empty array', () => {
|
||||||
expect(wrapper.instance().calculatePages()).toEqual([]);
|
const instance = wrapper.instance();
|
||||||
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
|
expect(pageList).toEqual([]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -360,7 +346,9 @@ describe('PageResolver', () => {
|
|||||||
const mockElement = React.createElement(MockComponent, props, null);
|
const mockElement = React.createElement(MockComponent, props, null);
|
||||||
wrapper = shallow(mockElement);
|
wrapper = shallow(mockElement);
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
pageStatus = instance.calculatePageStatus(instance.calculatePages());
|
const pageList = instance.calculatePages(
|
||||||
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
|
pageStatus = instance.calculatePageStatus(pageList, instance.state.lastPage);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should returning correct format for page status', () => {
|
it('should returning correct format for page status', () => {
|
||||||
@@ -388,8 +376,9 @@ describe('PageResolver', () => {
|
|||||||
const mockElement = React.createElement(MockComponent, props, null);
|
const mockElement = React.createElement(MockComponent, props, null);
|
||||||
wrapper = shallow(mockElement);
|
wrapper = shallow(mockElement);
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
const pageList = instance.calculatePages();
|
const pageList = instance.calculatePages(
|
||||||
pageStatus = instance.calculatePageStatus(pageList);
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
|
pageStatus = instance.calculatePageStatus(pageList, instance.state.lastPage);
|
||||||
|
|
||||||
expect(pageStatus.find(p => p.page === props.prePageText)).not.toBeDefined();
|
expect(pageStatus.find(p => p.page === props.prePageText)).not.toBeDefined();
|
||||||
});
|
});
|
||||||
@@ -401,8 +390,9 @@ describe('PageResolver', () => {
|
|||||||
const mockElement = React.createElement(MockComponent, props, null);
|
const mockElement = React.createElement(MockComponent, props, null);
|
||||||
wrapper = shallow(mockElement);
|
wrapper = shallow(mockElement);
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
const pageList = instance.calculatePages();
|
const pageList = instance.calculatePages(
|
||||||
pageStatus = instance.calculatePageStatus(pageList);
|
instance.state.totalPages, instance.state.lastPage);
|
||||||
|
pageStatus = instance.calculatePageStatus(pageList, instance.state.lastPage);
|
||||||
|
|
||||||
expect(pageStatus.find(p => p.page === props.nextPageText)).not.toBeDefined();
|
expect(pageStatus.find(p => p.page === props.nextPageText)).not.toBeDefined();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -46,29 +46,15 @@ describe('Page Functions', () => {
|
|||||||
const pageStartIndex = 1;
|
const pageStartIndex = 1;
|
||||||
const sizePerPage = 10;
|
const sizePerPage = 10;
|
||||||
const page = 3;
|
const page = 3;
|
||||||
describe('if the page does not fit the pages interval calculated from the length of store.data', () => {
|
describe('if the page does not fit the pages which calculated from the length of data', () => {
|
||||||
beforeEach(() => {
|
|
||||||
data = [];
|
|
||||||
for (let i = 0; i < 15; i += 1) {
|
|
||||||
data.push({ id: i, name: `test_name${i}` });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return pageStartIndex argument', () => {
|
it('should return pageStartIndex argument', () => {
|
||||||
expect(alignPage(data, page, sizePerPage, pageStartIndex)).toEqual(pageStartIndex);
|
expect(alignPage(15, page, sizePerPage, pageStartIndex)).toEqual(pageStartIndex);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('if the length of store.data is large than the end page index', () => {
|
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}` });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return current page', () => {
|
it('should return current page', () => {
|
||||||
expect(alignPage(data, page, sizePerPage, pageStartIndex)).toEqual(page);
|
expect(alignPage(30, page, sizePerPage, pageStartIndex)).toEqual(page);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,203 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import sinon from 'sinon';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
|
||||||
|
import paginationHandler from '../src/pagination-handler';
|
||||||
|
|
||||||
|
const MockComponent = () => null;
|
||||||
|
const MockComponentWithPaginationHandler = paginationHandler(MockComponent);
|
||||||
|
|
||||||
|
describe('paginationHandler', () => {
|
||||||
|
let wrapper;
|
||||||
|
let instance;
|
||||||
|
|
||||||
|
const createMockProps = props => ({
|
||||||
|
dataSize: 100,
|
||||||
|
sizePerPageList: [10, 20, 30, 50],
|
||||||
|
currPage: 1,
|
||||||
|
currSizePerPage: 10,
|
||||||
|
pageStartIndex: 1,
|
||||||
|
paginationSize: 5,
|
||||||
|
withFirstAndLast: true,
|
||||||
|
firstPageText: '<<',
|
||||||
|
prePageText: '<',
|
||||||
|
nextPageText: '>',
|
||||||
|
lastPageText: '>>',
|
||||||
|
alwaysShowAllBtns: false,
|
||||||
|
onPageChange: sinon.stub(),
|
||||||
|
onSizePerPageChange: sinon.stub(),
|
||||||
|
hidePageListOnlyOnePage: false,
|
||||||
|
hideSizePerPage: false,
|
||||||
|
...props
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('default pagiantion', () => {
|
||||||
|
const props = createMockProps();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<MockComponentWithPaginationHandler { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should having correct state', () => {
|
||||||
|
expect(instance.state).toBeDefined();
|
||||||
|
expect(instance.state.totalPages).toEqual(instance.calculateTotalPage());
|
||||||
|
expect(instance.state.lastPage).toEqual(
|
||||||
|
instance.calculateLastPage(instance.state.totalPages));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should rendering PaginationList component successfully', () => {
|
||||||
|
const wrapperedComponent = wrapper.find(MockComponent);
|
||||||
|
expect(wrapperedComponent.length).toBe(1);
|
||||||
|
expect(wrapperedComponent.props().lastPage).toEqual(instance.state.lastPage);
|
||||||
|
expect(wrapperedComponent.props().totalPages).toEqual(instance.state.totalPages);
|
||||||
|
expect(wrapperedComponent.props().onPageChange).toEqual(instance.handleChangePage);
|
||||||
|
expect(wrapperedComponent.props().onSizePerPageChange)
|
||||||
|
.toEqual(instance.handleChangeSizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleChangePage', () => {
|
||||||
|
const props = createMockProps();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
props.currPage = 6;
|
||||||
|
wrapper = shallow(<MockComponentWithPaginationHandler { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
props.onPageChange.reset();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onPageChange correctly when new page is eq props.prePageText', () => {
|
||||||
|
instance.handleChangePage(props.prePageText);
|
||||||
|
expect(props.onPageChange.callCount).toBe(1);
|
||||||
|
expect(props.onPageChange.calledWith(5)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onPageChange correctly when new page is eq props.nextPageText', () => {
|
||||||
|
instance.handleChangePage(props.nextPageText);
|
||||||
|
expect(props.onPageChange.callCount).toBe(1);
|
||||||
|
expect(props.onPageChange.calledWith(7)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onPageChange correctly when new page is eq props.lastPageText', () => {
|
||||||
|
instance.handleChangePage(props.lastPageText);
|
||||||
|
expect(props.onPageChange.callCount).toBe(1);
|
||||||
|
expect(props.onPageChange.calledWith(10)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onPageChange correctly when new page is eq props.firstPageText', () => {
|
||||||
|
instance.handleChangePage(props.firstPageText);
|
||||||
|
expect(props.onPageChange.callCount).toBe(1);
|
||||||
|
expect(props.onPageChange.calledWith(props.pageStartIndex)).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onPageChange correctly when new page is a numeric page', () => {
|
||||||
|
const newPage = '8';
|
||||||
|
instance.handleChangePage(newPage);
|
||||||
|
expect(props.onPageChange.callCount).toBe(1);
|
||||||
|
expect(props.onPageChange.calledWith(parseInt(newPage, 10))).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not calling props.onPageChange correctly when page is not changed', () => {
|
||||||
|
const newPage = props.currPage;
|
||||||
|
instance.handleChangePage(newPage);
|
||||||
|
expect(props.onPageChange.callCount).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleChangeSizePerPage', () => {
|
||||||
|
const props = createMockProps();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<MockComponentWithPaginationHandler { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should always setting state.dropdownOpen to false', () => {
|
||||||
|
instance.handleChangeSizePerPage(10);
|
||||||
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when new sizePerPage is same as current one', () => {
|
||||||
|
it('should not calling props.onSizePerPageChange callback', () => {
|
||||||
|
instance.handleChangeSizePerPage(10);
|
||||||
|
expect(props.onSizePerPageChange.callCount).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when new sizePerPage is diff than current one', () => {
|
||||||
|
it('should not calling props.onSizePerPageChange callback', () => {
|
||||||
|
instance.handleChangeSizePerPage(30);
|
||||||
|
expect(props.onSizePerPageChange.callCount).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and new current page is still in the new lagination list', () => {
|
||||||
|
it('should calling props.onSizePerPageChange with correct argument', () => {
|
||||||
|
expect(props.onSizePerPageChange.calledWith(30, props.currPage));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('and new current page is still in the new lagination list', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(
|
||||||
|
<MockComponentWithPaginationHandler { ...createMockProps({ currPage: 10 }) } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should calling props.onSizePerPageChange with correct argument', () => {
|
||||||
|
expect(props.onSizePerPageChange.calledWith(30, 4));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('componentWillReceiveProps', () => {
|
||||||
|
describe('when next props.currSizePerPage is diff than current one', () => {
|
||||||
|
const nextProps = createMockProps({ currSizePerPage: 20 });
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<MockComponentWithPaginationHandler { ...createMockProps() } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should setting correct state.totalPages', () => {
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
expect(instance.state.totalPages).toEqual(
|
||||||
|
instance.calculateTotalPage(nextProps.currSizePerPage));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should setting correct state.lastPage', () => {
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
const totalPages = instance.calculateTotalPage(nextProps.currSizePerPage);
|
||||||
|
expect(instance.state.lastPage).toEqual(
|
||||||
|
instance.calculateLastPage(totalPages));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when next props.dataSize is diff than current one', () => {
|
||||||
|
const nextProps = createMockProps({ dataSize: 33 });
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<MockComponentWithPaginationHandler { ...createMockProps() } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should setting correct state.totalPages', () => {
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
expect(instance.state.totalPages).toEqual(
|
||||||
|
instance.calculateTotalPage(nextProps.currSizePerPage, nextProps.dataSize));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should setting correct state.lastPage', () => {
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
const totalPages = instance.calculateTotalPage(
|
||||||
|
nextProps.currSizePerPage, nextProps.dataSize);
|
||||||
|
expect(instance.state.lastPage).toEqual(
|
||||||
|
instance.calculateLastPage(totalPages));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
import paginationListAdapter from '../src/pagination-list-adapter';
|
||||||
|
|
||||||
|
|
||||||
|
const MockComponent = () => null;
|
||||||
|
|
||||||
|
const PaginationListAdapter = paginationListAdapter(MockComponent);
|
||||||
|
describe('paginationListAdapter', () => {
|
||||||
|
let wrapper;
|
||||||
|
|
||||||
|
const props = {
|
||||||
|
totalPages: 10,
|
||||||
|
lastPage: 10,
|
||||||
|
pageButtonRenderer: jest.fn(),
|
||||||
|
onPageChange: jest.fn()
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('render', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<PaginationListAdapter { ...props } />);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render successfully', () => {
|
||||||
|
const mockComponent = wrapper.find(MockComponent);
|
||||||
|
expect(mockComponent).toHaveLength(1);
|
||||||
|
expect(mockComponent.props().pages).toBeDefined();
|
||||||
|
expect(mockComponent.props().pageButtonRenderer).toBeDefined();
|
||||||
|
expect(mockComponent.props().onPageChange).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -39,4 +39,22 @@ describe('PaginationList', () => {
|
|||||||
expect(wrapper.find('ul.react-bootstrap-table-page-btns-ul').length).toBe(1);
|
expect(wrapper.find('ul.react-bootstrap-table-page-btns-ul').length).toBe(1);
|
||||||
expect(wrapper.find(PageButton).length).toBe(pages.length);
|
expect(wrapper.find(PageButton).length).toBe(pages.length);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when props.pageButtonRenderer is existing', () => {
|
||||||
|
const pageButtonRenderer = jest.fn().mockReturnValue(null);
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(
|
||||||
|
<PaginationList
|
||||||
|
pages={ pages }
|
||||||
|
onPageChange={ onPageChange }
|
||||||
|
pageButtonRenderer={ pageButtonRenderer }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call props.pageButtonRenderer correctly', () => {
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(pageButtonRenderer).toHaveBeenCalledTimes(pages.length);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { shallow } from 'enzyme';
|
|||||||
import SizePerPageDropDown from '../src/size-per-page-dropdown';
|
import SizePerPageDropDown from '../src/size-per-page-dropdown';
|
||||||
import PaginationList from '../src/pagination-list';
|
import PaginationList from '../src/pagination-list';
|
||||||
import Pagination from '../src/pagination';
|
import Pagination from '../src/pagination';
|
||||||
|
import PaginationTotal from '../src/pagination-total';
|
||||||
|
|
||||||
describe('Pagination', () => {
|
describe('Pagination', () => {
|
||||||
let wrapper;
|
let wrapper;
|
||||||
@@ -40,7 +41,7 @@ describe('Pagination', () => {
|
|||||||
|
|
||||||
it('should rendering correctly', () => {
|
it('should rendering correctly', () => {
|
||||||
expect(wrapper.length).toBe(1);
|
expect(wrapper.length).toBe(1);
|
||||||
expect(wrapper.hasClass('react-bootstrap-table-pagination')).toBeTruthy();
|
expect(wrapper.dive().hasClass('react-bootstrap-table-pagination')).toBeTruthy();
|
||||||
expect(wrapper.find('.react-bootstrap-table-pagination-list-hidden').length).toBe(0);
|
expect(wrapper.find('.react-bootstrap-table-pagination-list-hidden').length).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -51,50 +52,6 @@ describe('Pagination', () => {
|
|||||||
instance.calculateLastPage(instance.state.totalPages));
|
instance.calculateLastPage(instance.state.totalPages));
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should rendering PaginationList component successfully', () => {
|
|
||||||
const paginationList = wrapper.find(PaginationList);
|
|
||||||
expect(paginationList.length).toBe(1);
|
|
||||||
expect(paginationList.prop('pages')).toEqual(instance.calculatePageStatus(instance.calculatePages()));
|
|
||||||
expect(paginationList.prop('onPageChange')).toEqual(instance.handleChangePage);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should rendering SizePerPageDropDown component successfully', () => {
|
|
||||||
const sizePerPageDropDown = wrapper.find(SizePerPageDropDown);
|
|
||||||
expect(sizePerPageDropDown.length).toBe(1);
|
|
||||||
|
|
||||||
expect(sizePerPageDropDown.prop('currSizePerPage')).toEqual(`${props.currSizePerPage}`);
|
|
||||||
expect(sizePerPageDropDown.prop('options')).toEqual(instance.calculateSizePerPageStatus());
|
|
||||||
expect(sizePerPageDropDown.prop('onSizePerPageChange')).toEqual(instance.handleChangeSizePerPage);
|
|
||||||
expect(sizePerPageDropDown.prop('onClick')).toEqual(instance.toggleDropDown);
|
|
||||||
expect(sizePerPageDropDown.prop('open')).toEqual(instance.state.dropdownOpen);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when props.sizePerPageList is empty array', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const props = createMockProps({ sizePerPageList: [] });
|
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
|
||||||
instance = wrapper.instance();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not rendering SizePerPageDropDown component', () => {
|
|
||||||
const sizePerPageDropDown = wrapper.find(SizePerPageDropDown);
|
|
||||||
expect(sizePerPageDropDown.length).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when props.hideSizePerPage is true', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const props = createMockProps({ hideSizePerPage: true });
|
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
|
||||||
instance = wrapper.instance();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not rendering SizePerPageDropDown component', () => {
|
|
||||||
const sizePerPageDropDown = wrapper.find(SizePerPageDropDown);
|
|
||||||
expect(sizePerPageDropDown.length).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when props.hidePageListOnlyOnePage is true', () => {
|
describe('when props.hidePageListOnlyOnePage is true', () => {
|
||||||
@@ -105,184 +62,78 @@ describe('Pagination', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should find react-bootstrap-table-pagination-list-hidden class when only one page', () => {
|
it('should find react-bootstrap-table-pagination-list-hidden class when only one page', () => {
|
||||||
expect(wrapper.find('.react-bootstrap-table-pagination-list-hidden').length).toBe(1);
|
expect(wrapper.dive().find('.react-bootstrap-table-pagination-list-hidden').length).toBe(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('componentWillReceiveProps', () => {
|
describe('when props.pageListRenderer is defined', () => {
|
||||||
describe('when next props.currSizePerPage is diff than current one', () => {
|
let pageListRenderer;
|
||||||
const nextProps = createMockProps({ currSizePerPage: 20 });
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
wrapper = shallow(<Pagination { ...createMockProps() } />);
|
pageListRenderer = jest.fn().mockReturnValue(null);
|
||||||
instance = wrapper.instance();
|
const props = createMockProps({ pageListRenderer });
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state.totalPages', () => {
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
expect(instance.state.totalPages).toEqual(
|
|
||||||
instance.calculateTotalPage(nextProps.currSizePerPage));
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state.lastPage', () => {
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
const totalPages = instance.calculateTotalPage(nextProps.currSizePerPage);
|
|
||||||
expect(instance.state.lastPage).toEqual(
|
|
||||||
instance.calculateLastPage(totalPages));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when next props.dataSize is diff than current one', () => {
|
|
||||||
const nextProps = createMockProps({ dataSize: 33 });
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(<Pagination { ...createMockProps() } />);
|
|
||||||
instance = wrapper.instance();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state.totalPages', () => {
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
expect(instance.state.totalPages).toEqual(
|
|
||||||
instance.calculateTotalPage(nextProps.currSizePerPage, nextProps.dataSize));
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should setting correct state.lastPage', () => {
|
|
||||||
instance.componentWillReceiveProps(nextProps);
|
|
||||||
const totalPages = instance.calculateTotalPage(
|
|
||||||
nextProps.currSizePerPage, nextProps.dataSize);
|
|
||||||
expect(instance.state.lastPage).toEqual(
|
|
||||||
instance.calculateLastPage(totalPages));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('toggleDropDown', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
const props = createMockProps();
|
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
wrapper = shallow(<Pagination { ...props } />);
|
||||||
|
wrapper.render();
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should setting state.dropdownOpen as true when it is false', () => {
|
it('should not render PaginationList', () => {
|
||||||
instance.toggleDropDown();
|
expect(wrapper.dive().find(PaginationList)).toHaveLength(0);
|
||||||
expect(instance.state.dropdownOpen).toBeTruthy();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should setting state.dropdownOpen as false when it is true', () => {
|
it('should call props.pageListRenderer correctly', () => {
|
||||||
instance.toggleDropDown();
|
expect(pageListRenderer).toHaveBeenCalledTimes(1);
|
||||||
instance.toggleDropDown();
|
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('closeDropDown', () => {
|
describe('when props.sizePerPageRenderer is defined', () => {
|
||||||
|
let sizePerPageRenderer;
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
const props = createMockProps();
|
sizePerPageRenderer = jest.fn().mockReturnValue(null);
|
||||||
|
const props = createMockProps({ sizePerPageRenderer });
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
wrapper = shallow(<Pagination { ...props } />);
|
||||||
|
wrapper.render();
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should always setting state.dropdownOpen as false', () => {
|
it('should not render SizePerPageDropDown', () => {
|
||||||
instance.closeDropDown();
|
expect(wrapper.dive().find(SizePerPageDropDown)).toHaveLength(0);
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
});
|
||||||
instance.closeDropDown();
|
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
it('should call props.sizePerPageRenderer correctly', () => {
|
||||||
|
expect(sizePerPageRenderer).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('handleChangeSizePerPage', () => {
|
describe('when props.showTotal is true', () => {
|
||||||
const props = createMockProps();
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
const props = createMockProps({ showTotal: true });
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
wrapper = shallow(<Pagination { ...props } />);
|
||||||
|
wrapper.render();
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should always setting state.dropdownOpen to false', () => {
|
it('should render PaginationTotal correctly', () => {
|
||||||
instance.handleChangeSizePerPage(10);
|
expect(wrapper.dive().find(PaginationTotal)).toHaveLength(1);
|
||||||
expect(instance.state.dropdownOpen).toBeFalsy();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when new sizePerPage is same as current one', () => {
|
describe('if props.paginationTotalRenderer is defined', () => {
|
||||||
it('should not calling props.onSizePerPageChange callback', () => {
|
let paginationTotalRenderer;
|
||||||
instance.handleChangeSizePerPage(10);
|
|
||||||
expect(props.onSizePerPageChange.callCount).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when new sizePerPage is diff than current one', () => {
|
|
||||||
it('should not calling props.onSizePerPageChange callback', () => {
|
|
||||||
instance.handleChangeSizePerPage(30);
|
|
||||||
expect(props.onSizePerPageChange.callCount).toBe(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('and new current page is still in the new lagination list', () => {
|
|
||||||
it('should calling props.onSizePerPageChange with correct argument', () => {
|
|
||||||
expect(props.onSizePerPageChange.calledWith(30, props.currPage));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('and new current page is still in the new lagination list', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
wrapper = shallow(<Pagination { ...createMockProps({ currPage: 10 }) } />);
|
|
||||||
instance = wrapper.instance();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.onSizePerPageChange with correct argument', () => {
|
|
||||||
expect(props.onSizePerPageChange.calledWith(30, 4));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('handleChangePage', () => {
|
|
||||||
const props = createMockProps();
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
props.currPage = 6;
|
paginationTotalRenderer = jest.fn();
|
||||||
|
const props = createMockProps({ showTotal: true, paginationTotalRenderer });
|
||||||
wrapper = shallow(<Pagination { ...props } />);
|
wrapper = shallow(<Pagination { ...props } />);
|
||||||
|
wrapper.render();
|
||||||
instance = wrapper.instance();
|
instance = wrapper.instance();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
it('should not render PaginationTotal', () => {
|
||||||
props.onPageChange.reset();
|
expect(wrapper.dive().find(PaginationTotal)).toHaveLength(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should calling props.onPageChange correctly when new page is eq props.prePageText', () => {
|
it('should call props.paginationTotalRenderer correctly', () => {
|
||||||
instance.handleChangePage(props.prePageText);
|
expect(paginationTotalRenderer).toHaveBeenCalledTimes(1);
|
||||||
expect(props.onPageChange.callCount).toBe(1);
|
});
|
||||||
expect(props.onPageChange.calledWith(5)).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.onPageChange correctly when new page is eq props.nextPageText', () => {
|
|
||||||
instance.handleChangePage(props.nextPageText);
|
|
||||||
expect(props.onPageChange.callCount).toBe(1);
|
|
||||||
expect(props.onPageChange.calledWith(7)).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.onPageChange correctly when new page is eq props.lastPageText', () => {
|
|
||||||
instance.handleChangePage(props.lastPageText);
|
|
||||||
expect(props.onPageChange.callCount).toBe(1);
|
|
||||||
expect(props.onPageChange.calledWith(10)).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.onPageChange correctly when new page is eq props.firstPageText', () => {
|
|
||||||
instance.handleChangePage(props.firstPageText);
|
|
||||||
expect(props.onPageChange.callCount).toBe(1);
|
|
||||||
expect(props.onPageChange.calledWith(props.pageStartIndex)).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should calling props.onPageChange correctly when new page is a numeric page', () => {
|
|
||||||
const newPage = '8';
|
|
||||||
instance.handleChangePage(newPage);
|
|
||||||
expect(props.onPageChange.callCount).toBe(1);
|
|
||||||
expect(props.onPageChange.calledWith(parseInt(newPage, 10))).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not calling props.onPageChange correctly when page is not changed', () => {
|
|
||||||
const newPage = props.currPage;
|
|
||||||
instance.handleChangePage(newPage);
|
|
||||||
expect(props.onPageChange.callCount).toBe(0);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,146 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
import sizePerPageDropdownAdapter from '../src/size-per-page-dropdown-adapter';
|
||||||
|
|
||||||
|
|
||||||
|
const MockComponent = () => null;
|
||||||
|
|
||||||
|
const SizePerPageDropdownAdapter = sizePerPageDropdownAdapter(MockComponent);
|
||||||
|
describe('sizePerPageDropdownAdapter', () => {
|
||||||
|
let wrapper;
|
||||||
|
let instance;
|
||||||
|
|
||||||
|
const createMockProps = props => ({
|
||||||
|
dataSize: 100,
|
||||||
|
sizePerPageList: [10, 20, 30, 50],
|
||||||
|
currPage: 1,
|
||||||
|
currSizePerPage: 10,
|
||||||
|
alwaysShowAllBtns: false,
|
||||||
|
onSizePerPageChange: jest.fn(),
|
||||||
|
hidePageListOnlyOnePage: false,
|
||||||
|
hideSizePerPage: false,
|
||||||
|
optionRenderer: jest.fn(),
|
||||||
|
sizePerPageOptionRenderer: jest.fn(),
|
||||||
|
...props
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('render', () => {
|
||||||
|
const props = createMockProps();
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render successfully', () => {
|
||||||
|
const mockComponent = wrapper.find(MockComponent);
|
||||||
|
expect(mockComponent).toHaveLength(1);
|
||||||
|
|
||||||
|
expect(mockComponent.props().currSizePerPage).toEqual(`${props.currSizePerPage}`);
|
||||||
|
expect(mockComponent.props().options).toBeDefined();
|
||||||
|
expect(mockComponent.props().optionRenderer).toBeDefined();
|
||||||
|
expect(mockComponent.props().onSizePerPageChange).toEqual(instance.handleChangeSizePerPage);
|
||||||
|
expect(mockComponent.props().onClick).toEqual(instance.toggleDropDown);
|
||||||
|
expect(mockComponent.props().onBlur).toEqual(instance.closeDropDown);
|
||||||
|
expect(mockComponent.props().open).toEqual(instance.state.dropdownOpen);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when props.sizePerPageList is empty array', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const props = createMockProps({ sizePerPageList: [] });
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render component', () => {
|
||||||
|
const sizePerPageDropDown = wrapper.find(MockComponent);
|
||||||
|
expect(sizePerPageDropDown.length).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when props.hideSizePerPage is true', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const props = createMockProps({ hideSizePerPage: true });
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not rendering SizePerPageDropDown component', () => {
|
||||||
|
const sizePerPageDropDown = wrapper.find(MockComponent);
|
||||||
|
expect(sizePerPageDropDown.length).toBe(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('toggleDropDown', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const props = createMockProps();
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state.dropdownOpen as true when it is false', () => {
|
||||||
|
instance.toggleDropDown();
|
||||||
|
expect(instance.state.dropdownOpen).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set state.dropdownOpen as false when it is true', () => {
|
||||||
|
instance.toggleDropDown();
|
||||||
|
instance.toggleDropDown();
|
||||||
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('closeDropDown', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
const props = createMockProps();
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should always set state.dropdownOpen as false', () => {
|
||||||
|
instance.closeDropDown();
|
||||||
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
|
instance.closeDropDown();
|
||||||
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleChangeSizePerPage', () => {
|
||||||
|
let props;
|
||||||
|
const sizePerPage = 25;
|
||||||
|
beforeEach(() => {
|
||||||
|
props = createMockProps();
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
instance.handleChangeSizePerPage(sizePerPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call props.onSizePerPageChange correctly', () => {
|
||||||
|
expect(props.onSizePerPageChange).toHaveBeenCalledTimes(1);
|
||||||
|
expect(props.onSizePerPageChange).toHaveBeenCalledWith(sizePerPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should always set state.dropdownOpen as false', () => {
|
||||||
|
expect(instance.state.dropdownOpen).toBeFalsy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when props.sizePerPageRenderer is defined', () => {
|
||||||
|
const sizePerPageRenderer = jest.fn().mockReturnValue(null);
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
sizePerPageRenderer.mockClear();
|
||||||
|
const props = createMockProps({ sizePerPageRenderer });
|
||||||
|
wrapper = shallow(<SizePerPageDropdownAdapter { ...props } />);
|
||||||
|
instance = wrapper.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render default component', () => {
|
||||||
|
expect(wrapper.find(MockComponent)).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call props.sizePerPageRenderer correctly', () => {
|
||||||
|
expect(sizePerPageRenderer).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -178,4 +178,23 @@ describe('SizePerPageDropDown', () => {
|
|||||||
expect(wrapper.hasClass(className)).toBeTruthy();
|
expect(wrapper.hasClass(className)).toBeTruthy();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when optionRenderer prop is defined', () => {
|
||||||
|
const optionRenderer = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
optionRenderer.mockReset();
|
||||||
|
wrapper = shallowWithContext(
|
||||||
|
<SizePerPageDropDown { ...props } optionRenderer={ optionRenderer } />,
|
||||||
|
{ bootstrap4: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render SizePerPageOption', () => {
|
||||||
|
expect(wrapper.find(SizePerPageOption)).toHaveLength(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call optionRenderer prop correctly', () => {
|
||||||
|
expect(optionRenderer).toHaveBeenCalledTimes(props.options.length);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
import standaloneAdapter from '../src/standalone-adapter';
|
||||||
|
|
||||||
|
|
||||||
|
const MockStandalone = () => null;
|
||||||
|
|
||||||
|
const MockStandaloneWithAdapter = standaloneAdapter(MockStandalone);
|
||||||
|
describe('standaloneAdapter', () => {
|
||||||
|
let wrapper;
|
||||||
|
|
||||||
|
const props = {
|
||||||
|
page: 2,
|
||||||
|
sizePerPage: 10,
|
||||||
|
name1: 'A',
|
||||||
|
name2: 'B'
|
||||||
|
};
|
||||||
|
describe('render', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(<MockStandaloneWithAdapter { ...props } />);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render successfully', () => {
|
||||||
|
expect(wrapper.find(MockStandalone)).toHaveLength(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should convert props.page as currPage to child component', () => {
|
||||||
|
const mockStandalone = wrapper.find(MockStandalone);
|
||||||
|
expect(mockStandalone.props().currPage).toEqual(props.page);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should convert props.sizePerPage as currSizePerPage to child component', () => {
|
||||||
|
const mockStandalone = wrapper.find(MockStandalone);
|
||||||
|
expect(mockStandalone.props().currSizePerPage).toEqual(props.sizePerPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should just pass remain props to child component', () => {
|
||||||
|
const mockStandalone = wrapper.find(MockStandalone);
|
||||||
|
const { page, sizePerPage, ...origin } = props;
|
||||||
|
const { currPage, currSizePerPage, ...rest } = mockStandalone.props();
|
||||||
|
expect(rest).toEqual(origin);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,841 @@
|
|||||||
|
/* eslint no-param-reassign: 0 */
|
||||||
|
import 'jsdom-global/register';
|
||||||
|
import React from 'react';
|
||||||
|
import { shallow } from 'enzyme';
|
||||||
|
|
||||||
|
import Const from '../src/const';
|
||||||
|
import createStateContext from '../src/state-context';
|
||||||
|
import paginationFactory from '../index';
|
||||||
|
|
||||||
|
const data = [];
|
||||||
|
for (let i = 0; i < 100; i += 1) {
|
||||||
|
data.push({
|
||||||
|
id: i,
|
||||||
|
name: `itme name ${i}`
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('PaginationStateContext', () => {
|
||||||
|
let wrapper;
|
||||||
|
let remoteEmitter;
|
||||||
|
let PaginationStateContext;
|
||||||
|
|
||||||
|
const defaultPagination = { options: {}, createContext: jest.fn() };
|
||||||
|
|
||||||
|
const MockComponent = () => null;
|
||||||
|
const renderMockComponent = jest.fn((props => (
|
||||||
|
<MockComponent { ...props } />
|
||||||
|
)));
|
||||||
|
|
||||||
|
const handleRemotePaginationChange = jest.fn();
|
||||||
|
|
||||||
|
function shallowContext(
|
||||||
|
customPagination = defaultPagination
|
||||||
|
) {
|
||||||
|
const additionProps = {};
|
||||||
|
renderMockComponent.mockReset();
|
||||||
|
handleRemotePaginationChange.mockReset();
|
||||||
|
PaginationStateContext = createStateContext();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PaginationStateContext.Provider
|
||||||
|
pagination={ paginationFactory(customPagination) }
|
||||||
|
data={ data }
|
||||||
|
{ ...additionProps }
|
||||||
|
>
|
||||||
|
<PaginationStateContext.Consumer>
|
||||||
|
{
|
||||||
|
paginationProps => renderMockComponent(paginationProps)
|
||||||
|
}
|
||||||
|
</PaginationStateContext.Consumer>
|
||||||
|
</PaginationStateContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setRemotePaginationEmitter(
|
||||||
|
instance,
|
||||||
|
remoteEnabled = false
|
||||||
|
) {
|
||||||
|
remoteEmitter = { emit: jest.fn() };
|
||||||
|
if (remoteEnabled) {
|
||||||
|
remoteEmitter.emit = jest.fn().mockImplementation((evtName, d = {}) => {
|
||||||
|
if (evtName === 'isRemotePagination') {
|
||||||
|
d.result = remoteEnabled;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
instance.setPaginationRemoteEmitter(remoteEmitter);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('default render', () => {
|
||||||
|
const options = { totalSize: data.length };
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext(options));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Provider property after calling createPaginationStateContext', () => {
|
||||||
|
expect(PaginationStateContext.Provider).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct Consumer property after calling createPaginationStateContext', () => {
|
||||||
|
expect(PaginationStateContext.Consumer).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct currPage', () => {
|
||||||
|
expect(wrapper.instance().currPage).toEqual(Const.PAGE_START_INDEX);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have correct currSizePerPage', () => {
|
||||||
|
expect(wrapper.instance().currSizePerPage).toEqual(Const.SIZE_PER_PAGE_LIST[0]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get correct pagination props', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
expect(wrapper.length).toBe(1);
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledTimes(1);
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct pagination states from getPaginationProps function', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
const paginationProps = instance.getPaginationProps();
|
||||||
|
|
||||||
|
expect(paginationProps.dataSize).toEqual(data.length);
|
||||||
|
expect(paginationProps.page).toEqual(instance.currPage);
|
||||||
|
expect(paginationProps.sizePerPage).toEqual(instance.currSizePerPage);
|
||||||
|
expect(paginationProps.onPageChange).toEqual(instance.handleChangePage);
|
||||||
|
expect(paginationProps.onSizePerPageChange).toEqual(instance.handleChangeSizePerPage);
|
||||||
|
expect(paginationProps.sizePerPageList).toEqual(Const.SIZE_PER_PAGE_LIST);
|
||||||
|
expect(paginationProps.paginationSize).toEqual(Const.PAGINATION_SIZE);
|
||||||
|
expect(paginationProps.showTotal).toEqual(options.showTotal);
|
||||||
|
expect(paginationProps.hidePageListOnlyOnePage).toEqual(Const.HIDE_PAGE_LIST_ONLY_ONE_PAGE);
|
||||||
|
expect(paginationProps.pageStartIndex).toEqual(Const.PAGE_START_INDEX);
|
||||||
|
expect(paginationProps.withFirstAndLast).toEqual(Const.With_FIRST_AND_LAST);
|
||||||
|
expect(paginationProps.alwaysShowAllBtns).toEqual(Const.SHOW_ALL_PAGE_BTNS);
|
||||||
|
expect(paginationProps.firstPageText).toEqual(Const.FIRST_PAGE_TEXT);
|
||||||
|
expect(paginationProps.prePageText).toEqual(Const.PRE_PAGE_TEXT);
|
||||||
|
expect(paginationProps.nextPageText).toEqual(Const.NEXT_PAGE_TEXT);
|
||||||
|
expect(paginationProps.lastPageText).toEqual(Const.LAST_PAGE_TEXT);
|
||||||
|
expect(paginationProps.firstPageTitle).toEqual(Const.FIRST_PAGE_TITLE);
|
||||||
|
expect(paginationProps.prePageTitle).toEqual(Const.PRE_PAGE_TITLE);
|
||||||
|
expect(paginationProps.nextPageTitle).toEqual(Const.NEXT_PAGE_TITLE);
|
||||||
|
expect(paginationProps.lastPageTitle).toEqual(Const.LAST_PAGE_TITLE);
|
||||||
|
expect(paginationProps.hideSizePerPage).toEqual(Const.HIDE_SIZE_PER_PAGE);
|
||||||
|
expect(paginationProps.paginationTotalRenderer).toEqual(options.paginationTotalRenderer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('compoientWillReceiveProps', () => {
|
||||||
|
let instance;
|
||||||
|
let nextProps;
|
||||||
|
|
||||||
|
describe('if remote pagination is enable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination
|
||||||
|
}, true));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance, true);
|
||||||
|
nextProps = {
|
||||||
|
data,
|
||||||
|
pagination: { ...defaultPagination, options: { page: 3, sizePerPage: 5 } }
|
||||||
|
};
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should always reset currPage and currSizePerPage', () => {
|
||||||
|
expect(instance.currPage).toEqual(nextProps.pagination.options.page);
|
||||||
|
expect(instance.currSizePerPage).toEqual(nextProps.pagination.options.sizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if options.custom is true', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
custom: true
|
||||||
|
}, true));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance, true);
|
||||||
|
nextProps = {
|
||||||
|
data,
|
||||||
|
pagination: { ...defaultPagination, options: { page: 3, sizePerPage: 5, custom: true } }
|
||||||
|
};
|
||||||
|
instance.componentWillReceiveProps(nextProps);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should always reset currPage and currSizePerPage', () => {
|
||||||
|
expect(instance.currPage).toEqual(nextProps.pagination.options.page);
|
||||||
|
expect(instance.currSizePerPage).toEqual(nextProps.pagination.options.sizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleChangePage', () => {
|
||||||
|
let instance;
|
||||||
|
const newPage = 3;
|
||||||
|
|
||||||
|
describe('should update component correctly', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangePage(newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if options.onPageChange is defined', () => {
|
||||||
|
const onPageChange = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
onPageChange.mockClear();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
onPageChange
|
||||||
|
}));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangePage(newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should still update component correctly', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call options.onPageChange correctly', () => {
|
||||||
|
expect(onPageChange).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onPageChange).toHaveBeenCalledWith(newPage, instance.currSizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if remote pagination is enable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination
|
||||||
|
}, true));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance, true);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangePage(newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should still update component correctly', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit paginationChange event correctly', () => {
|
||||||
|
expect(remoteEmitter.emit).toHaveBeenLastCalledWith('paginationChange', instance.currPage, instance.currSizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('handleChangeSizePerPage', () => {
|
||||||
|
let instance;
|
||||||
|
const newPage = 2;
|
||||||
|
const newSizePerPage = 15;
|
||||||
|
|
||||||
|
describe('should update component correctly', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext());
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if options.onSizePerPageChange is defined', () => {
|
||||||
|
const onSizePerPageChange = jest.fn();
|
||||||
|
beforeEach(() => {
|
||||||
|
onSizePerPageChange.mockClear();
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
onSizePerPageChange
|
||||||
|
}));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should still update component correctly', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should call options.onSizePerPageChange correctly', () => {
|
||||||
|
expect(onSizePerPageChange).toHaveBeenCalledTimes(1);
|
||||||
|
expect(onSizePerPageChange).toHaveBeenCalledWith(newSizePerPage, newPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('if remote pagination is enable', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination
|
||||||
|
}, true));
|
||||||
|
instance = wrapper.instance();
|
||||||
|
setRemotePaginationEmitter(instance, true);
|
||||||
|
jest.spyOn(instance, 'forceUpdate');
|
||||||
|
instance.handleChangeSizePerPage(newSizePerPage, newPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should still update component correctly', () => {
|
||||||
|
expect(instance.currPage).toEqual(newPage);
|
||||||
|
expect(instance.currSizePerPage).toEqual(newSizePerPage);
|
||||||
|
expect(instance.forceUpdate).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should emit paginationChange event correctly', () => {
|
||||||
|
expect(remoteEmitter.emit).toHaveBeenLastCalledWith('paginationChange', instance.currPage, instance.currSizePerPage);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.page is defined', () => {
|
||||||
|
const page = 3;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
page
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set correct currPage', () => {
|
||||||
|
expect(wrapper.instance().currPage).toEqual(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.sizePerPage is defined', () => {
|
||||||
|
const sizePerPage = Const.SIZE_PER_PAGE_LIST[2];
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
sizePerPage
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set correct currSizePerPage', () => {
|
||||||
|
expect(wrapper.instance().currSizePerPage).toEqual(sizePerPage);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.totalSize is defined', () => {
|
||||||
|
const totalSize = 100;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
totalSize
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.showTotal is defined', () => {
|
||||||
|
const showTotal = true;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
showTotal
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.pageStartIndex is defined', () => {
|
||||||
|
const pageStartIndex = -1;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
pageStartIndex
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.sizePerPageList is defined', () => {
|
||||||
|
const sizePerPageList = [10, 40];
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
sizePerPageList
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.paginationSize is defined', () => {
|
||||||
|
const paginationSize = 10;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
paginationSize
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.withFirstAndLast is defined', () => {
|
||||||
|
const withFirstAndLast = false;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
withFirstAndLast
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.alwaysShowAllBtns is defined', () => {
|
||||||
|
const alwaysShowAllBtns = true;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
alwaysShowAllBtns
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.firstPageText is defined', () => {
|
||||||
|
const firstPageText = '1st';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
firstPageText
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.prePageText is defined', () => {
|
||||||
|
const prePageText = 'PRE';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
prePageText
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.nextPageText is defined', () => {
|
||||||
|
const nextPageText = 'NEXT';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
nextPageText
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.lastPageText is defined', () => {
|
||||||
|
const lastPageText = 'LAST';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
lastPageText
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.firstPageTitle is defined', () => {
|
||||||
|
const firstPageTitle = '1st';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
firstPageTitle
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.prePageTitle is defined', () => {
|
||||||
|
const prePageTitle = 'PRE';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
prePageTitle
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.nextPageTitle is defined', () => {
|
||||||
|
const nextPageTitle = 'NEXT';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
nextPageTitle
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.lastPageTitle is defined', () => {
|
||||||
|
const lastPageTitle = 'nth';
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
lastPageTitle
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.hideSizePerPage is defined', () => {
|
||||||
|
const hideSizePerPage = true;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
hideSizePerPage
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when options.hidePageListOnlyOnePage is defined', () => {
|
||||||
|
const hidePageListOnlyOnePage = true;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
wrapper = shallow(shallowContext({
|
||||||
|
...defaultPagination,
|
||||||
|
hidePageListOnlyOnePage
|
||||||
|
}));
|
||||||
|
wrapper.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render correctly', () => {
|
||||||
|
const instance = wrapper.instance();
|
||||||
|
|
||||||
|
expect(renderMockComponent).toHaveBeenCalledWith({
|
||||||
|
paginationProps: instance.getPaginationProps(),
|
||||||
|
paginationTableProps: {
|
||||||
|
pagination: {
|
||||||
|
createContext: expect.any(Function),
|
||||||
|
options: instance.getPaginationProps()
|
||||||
|
},
|
||||||
|
setPaginationRemoteEmitter: instance.setPaginationRemoteEmitter
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "react-bootstrap-table-next",
|
"name": "react-bootstrap-table-next",
|
||||||
"version": "1.4.3",
|
"version": "2.0.0",
|
||||||
"description": "Next generation of react-bootstrap-table",
|
"description": "Next generation of react-bootstrap-table",
|
||||||
"main": "./lib/index.js",
|
"main": "./lib/index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -40,8 +40,7 @@ const withContext = Base =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (props.pagination) {
|
if (props.pagination) {
|
||||||
this.PaginationContext = props.pagination.createContext(
|
this.PaginationContext = props.pagination.createContext();
|
||||||
this.isRemotePagination, this.handleRemotePageChange);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (props.search && props.search.searchContext) {
|
if (props.search && props.search.searchContext) {
|
||||||
@@ -52,6 +51,10 @@ const withContext = Base =>
|
|||||||
if (props.setDependencyModules) {
|
if (props.setDependencyModules) {
|
||||||
props.setDependencyModules(_);
|
props.setDependencyModules(_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (props.setPaginationRemoteEmitter) {
|
||||||
|
props.setPaginationRemoteEmitter(this.remoteEmitter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
@@ -150,6 +153,8 @@ const withContext = Base =>
|
|||||||
pagination={ this.props.pagination }
|
pagination={ this.props.pagination }
|
||||||
data={ rootProps.getData(filterProps, searchProps, sortProps) }
|
data={ rootProps.getData(filterProps, searchProps, sortProps) }
|
||||||
bootstrap4={ this.props.bootstrap4 }
|
bootstrap4={ this.props.bootstrap4 }
|
||||||
|
isRemotePagination={ this.isRemotePagination }
|
||||||
|
remoteEmitter={ this.remoteEmitter }
|
||||||
>
|
>
|
||||||
<this.PaginationContext.Consumer>
|
<this.PaginationContext.Consumer>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,10 +23,10 @@ class RowExpandProvider extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleRowExpand = (rowKey, expanded, rowIndex, e) => {
|
handleRowExpand = (rowKey, expanded, rowIndex, e) => {
|
||||||
if (this.props.expandRow.nonExpandable.includes(rowKey)) {
|
const { data, keyField, expandRow: { onExpand, onlyOneExpanding, nonExpandable } } = this.props;
|
||||||
|
if (nonExpandable && nonExpandable.includes(rowKey)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const { data, keyField, expandRow: { onExpand, onlyOneExpanding } } = this.props;
|
|
||||||
|
|
||||||
let currExpanded = [...this.state.expanded];
|
let currExpanded = [...this.state.expanded];
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
|
import EventEmitter from 'events';
|
||||||
import _ from '../utils';
|
import _ from '../utils';
|
||||||
|
|
||||||
export default ExtendBase =>
|
export default ExtendBase =>
|
||||||
class RemoteResolver extends ExtendBase {
|
class RemoteResolver extends ExtendBase {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.remoteEmitter = new EventEmitter();
|
||||||
|
this.remoteEmitter.on('paginationChange', this.handleRemotePageChange);
|
||||||
|
this.remoteEmitter.on('isRemotePagination', this.isRemotePagination);
|
||||||
|
}
|
||||||
|
|
||||||
getNewestState = (state = {}) => {
|
getNewestState = (state = {}) => {
|
||||||
let sortOrder;
|
let sortOrder;
|
||||||
let sortField;
|
let sortField;
|
||||||
@@ -47,9 +55,10 @@ export default ExtendBase =>
|
|||||||
return remote === true || (_.isObject(remote) && remote.search) || this.isRemotePagination();
|
return remote === true || (_.isObject(remote) && remote.search) || this.isRemotePagination();
|
||||||
}
|
}
|
||||||
|
|
||||||
isRemotePagination = () => {
|
isRemotePagination = (e = {}) => {
|
||||||
const { remote } = this.props;
|
const { remote } = this.props;
|
||||||
return remote === true || (_.isObject(remote) && remote.pagination);
|
e.result = (remote === true || (_.isObject(remote) && remote.pagination));
|
||||||
|
return e.result;
|
||||||
}
|
}
|
||||||
|
|
||||||
isRemoteFiltering = () => {
|
isRemoteFiltering = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user