Skip to content

Commit

Permalink
feat(react-grid): add components for the PagingPanel plugin (#542)
Browse files Browse the repository at this point in the history
  • Loading branch information
gsobolev authored and SergeyAlexeev committed Dec 8, 2017
1 parent 2d12091 commit 3d226bb
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 121 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ export class PagingPanel extends React.PureComponent {
}
}

PagingPanel.Container = Pager;

PagingPanel.propTypes = {
messages: PropTypes.shape({
showAll: PropTypes.string,
Expand Down
13 changes: 12 additions & 1 deletion packages/dx-react-grid-bootstrap3/src/templates/pager.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Pagination, Pager as BootstrapPager } from 'react-bootstrap';
import { firstRowOnPage, lastRowOnPage } from '@devexpress/dx-grid-core';
import { PageSizeSelector } from './page-size-selector';
Expand All @@ -13,12 +14,17 @@ export const Pager = ({
allowedPageSizes,
totalCount,
getMessage,
className,
...restProps
}) => {
const from = firstRowOnPage(currentPage, pageSize, totalCount);
const to = lastRowOnPage(currentPage, pageSize, totalCount);

return (
<div className="clearfix">
<div
className={classNames('clearfix', className)}
{...restProps}
>
{!!allowedPageSizes.length && <PageSizeSelector
pageSize={pageSize}
onPageSizeChange={onPageSizeChange}
Expand Down Expand Up @@ -73,4 +79,9 @@ Pager.propTypes = {
allowedPageSizes: PropTypes.arrayOf(PropTypes.number).isRequired,
totalCount: PropTypes.number.isRequired,
getMessage: PropTypes.func.isRequired,
className: PropTypes.string,
};

Pager.defaultProps = {
className: undefined,
};
148 changes: 80 additions & 68 deletions packages/dx-react-grid-bootstrap3/src/templates/pager.test.jsx
Original file line number Diff line number Diff line change
@@ -1,40 +1,28 @@
import React from 'react';
import { mount } from 'enzyme';
import { mount, shallow } from 'enzyme';
import { Pager } from './pager';

const defaultProps = {
totalPages: 10,
currentPage: 1,
totalCount: 96,
pageSize: 10,
getMessage: key => key,
allowedPageSizes: [],
onCurrentPageChange: () => {},
onPageSizeChange: () => {},
};

describe('Pager', () => {
describe('#render', () => {
const mountPager = ({
currentPage,
totalPages,
pageSize,
totalCount,
getMessage = key => key,
allowedPageSizes = [],
onPageSizeChange = () => {},
onCurrentPageChange = () => {},
}) => mount(<Pager
totalPages={totalPages}
currentPage={currentPage}
totalCount={totalCount}
pageSize={pageSize}
getMessage={getMessage}
allowedPageSizes={allowedPageSizes}
onCurrentPageChange={onCurrentPageChange}
onPageSizeChange={onPageSizeChange}
/>);

it('can show info about rendered pages', () => {
const getMessage = jest.fn();
getMessage.mockImplementation(key => key);

const tree = mountPager({
totalPages: 10,
currentPage: 1,
totalCount: 96,
pageSize: 10,
getMessage,
});
const getMessage = jest.fn(key => key);
const tree = shallow((
<Pager
{...defaultProps}
getMessage={getMessage}
/>
));

expect(getMessage)
.toBeCalledWith('info', { from: 11, to: 20, count: 96 });
Expand All @@ -44,13 +32,12 @@ describe('Pager', () => {

it('can render pagination arrows', () => {
const onCurrentPageChange = jest.fn();
const arrows = mountPager({
totalPages: 10,
currentPage: 2,
totalCount: 96,
pageSize: 10,
onCurrentPageChange,
}).find('.pager li');
const arrows = mount((
<Pager
{...defaultProps}
onCurrentPageChange={onCurrentPageChange}
/>
)).find('.pager li');

const prew = arrows.at(0);
const next = arrows.at(1);
Expand All @@ -66,13 +53,13 @@ describe('Pager', () => {

it('disables the prev arrow if current page is 1', () => {
const onCurrentPageChange = jest.fn();
const arrows = mountPager({
totalPages: 10,
currentPage: 0,
totalCount: 96,
pageSize: 10,
onCurrentPageChange,
}).find('.pager li');
const arrows = mount((
<Pager
{...defaultProps}
currentPage={0}
onCurrentPageChange={onCurrentPageChange}
/>
)).find('.pager li');

const prew = arrows.at(0);
const next = arrows.at(1);
Expand All @@ -87,13 +74,14 @@ describe('Pager', () => {

it('disables the next arrow if current page equals to total page count', () => {
const onCurrentPageChange = jest.fn();
const arrows = mountPager({
totalPages: 10,
currentPage: 9,
totalCount: 96,
pageSize: 5,
onCurrentPageChange,
}).find('.pager li');
const arrows = mount((
<Pager
{...defaultProps}
currentPage={9}
pageSize={5}
onCurrentPageChange={onCurrentPageChange}
/>
)).find('.pager li');

const prew = arrows.at(0);
const next = arrows.at(1);
Expand All @@ -107,27 +95,51 @@ describe('Pager', () => {
});

it('renders page size selector', () => {
const pageSizeSelector = mountPager({
totalPages: 10,
currentPage: 9,
totalCount: 96,
pageSize: 5,
allowedPageSizes: [5, 10],
}).find('PageSizeSelector');

expect(pageSizeSelector).toHaveLength(1);
expect(pageSizeSelector.at(0).prop('getMessage')('showAll')).toBe('showAll');
const pageSizeSelector = shallow((
<Pager
{...defaultProps}
allowedPageSizes={[5, 10]}
/>
)).find('PageSizeSelector');

expect(pageSizeSelector)
.toHaveLength(1);
expect(pageSizeSelector.at(0).prop('getMessage')('showAll'))
.toBe('showAll');
});

it('doesn\'t render page selector if the allowedPageSizes option is not defined ', () => {
const pageSizeSelector = mountPager({
totalPages: 10,
currentPage: 9,
totalCount: 96,
pageSize: 5,
}).find('PageSizeSelector');
const pageSizeSelector = shallow((
<Pager
{...defaultProps}
/>
)).find('PageSizeSelector');

expect(pageSizeSelector).toHaveLength(0);
});

it('should pass rest props to the root element', () => {
const tree = shallow((
<Pager
{...defaultProps}
onClick="onClick"
/>
));

expect(tree.prop('onClick'))
.toBe('onClick');
});

it('should add the passed className to the root element', () => {
const tree = shallow((
<Pager
{...defaultProps}
className="custom-class"
/>
));

expect(tree.is('.custom-class'))
.toBeTruthy();
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ export class PagingPanel extends React.PureComponent {
}
}

PagingPanel.Container = Pager;

PagingPanel.propTypes = {
messages: PropTypes.shape({
showAll: PropTypes.string,
Expand Down
13 changes: 12 additions & 1 deletion packages/dx-react-grid-material-ui/src/templates/pager.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { withStyles } from 'material-ui/styles';
import { PageSizeSelector } from './page-size-selector';
import { Pagination } from './pagination';
Expand All @@ -20,8 +21,13 @@ const PagerBase = ({
onPageSizeChange,
totalCount,
getMessage,
className,
...restProps
}) => (
<div className={classes.pager}>
<div
className={classNames(classes.pager, className)}
{...restProps}
>
<Pagination
totalPages={totalPages}
totalCount={totalCount}
Expand Down Expand Up @@ -49,6 +55,11 @@ PagerBase.propTypes = {
onPageSizeChange: PropTypes.func.isRequired,
totalCount: PropTypes.number.isRequired,
getMessage: PropTypes.func.isRequired,
className: PropTypes.string,
};

PagerBase.defaultProps = {
className: undefined,
};


Expand Down
Loading

0 comments on commit 3d226bb

Please sign in to comment.