@dhis2-ui/pagination 8.0.1 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/__fixtures__/index.js +14 -2
- package/build/cjs/__tests__/get-item-range.test.js +88 -0
- package/build/cjs/__tests__/page-controls.test.js +7 -9
- package/build/cjs/__tests__/page-summary.test.js +32 -50
- package/build/cjs/__tests__/pagination.test.js +48 -32
- package/build/cjs/get-default-page-summary-text.js +44 -0
- package/build/cjs/get-item-range.js +47 -0
- package/build/cjs/locales/en/translations.json +4 -2
- package/build/cjs/page-controls.js +4 -4
- package/build/cjs/page-summary.js +9 -38
- package/build/cjs/pagination.js +52 -31
- package/build/cjs/pagination.stories.js +25 -11
- package/build/es/__fixtures__/index.js +10 -0
- package/build/es/__tests__/get-item-range.test.js +80 -0
- package/build/es/__tests__/page-controls.test.js +7 -4
- package/build/es/__tests__/page-summary.test.js +33 -46
- package/build/es/__tests__/pagination.test.js +48 -32
- package/build/es/get-default-page-summary-text.js +33 -0
- package/build/es/get-item-range.js +38 -0
- package/build/es/locales/en/translations.json +4 -2
- package/build/es/page-controls.js +4 -4
- package/build/es/page-summary.js +10 -36
- package/build/es/pagination.js +33 -15
- package/build/es/pagination.stories.js +21 -10
- package/package.json +5 -5
package/build/cjs/pagination.js
CHANGED
|
@@ -7,12 +7,18 @@ exports.Pagination = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _style = _interopRequireDefault(require("styled-jsx/style"));
|
|
9
9
|
|
|
10
|
+
var _propTypes = require("@dhis2/prop-types");
|
|
11
|
+
|
|
10
12
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
11
13
|
|
|
12
|
-
var
|
|
14
|
+
var _propTypes2 = _interopRequireDefault(require("prop-types"));
|
|
13
15
|
|
|
14
16
|
var _react = _interopRequireDefault(require("react"));
|
|
15
17
|
|
|
18
|
+
var _getDefaultPageSummaryText = require("./get-default-page-summary-text.js");
|
|
19
|
+
|
|
20
|
+
var _getItemRange = require("./get-item-range.js");
|
|
21
|
+
|
|
16
22
|
var _index = _interopRequireDefault(require("./locales/index.js"));
|
|
17
23
|
|
|
18
24
|
var _pageControls = require("./page-controls.js");
|
|
@@ -28,22 +34,34 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
28
34
|
const Pagination = ({
|
|
29
35
|
className,
|
|
30
36
|
dataTest,
|
|
31
|
-
hidePageSizeSelect,
|
|
32
37
|
hidePageSelect,
|
|
38
|
+
hidePageSizeSelect,
|
|
33
39
|
hidePageSummary,
|
|
40
|
+
isLastPage,
|
|
41
|
+
nextPageText,
|
|
42
|
+
onPageChange,
|
|
43
|
+
onPageSizeChange,
|
|
34
44
|
page,
|
|
35
45
|
pageCount,
|
|
46
|
+
pageLength,
|
|
47
|
+
pageSelectText,
|
|
36
48
|
pageSize,
|
|
37
|
-
total,
|
|
38
49
|
pageSizes,
|
|
39
|
-
onPageChange,
|
|
40
|
-
onPageSizeChange,
|
|
41
|
-
nextPageText,
|
|
42
|
-
pageSelectText,
|
|
43
50
|
pageSizeSelectText,
|
|
44
51
|
pageSummaryText,
|
|
45
|
-
previousPageText
|
|
52
|
+
previousPageText,
|
|
53
|
+
total
|
|
46
54
|
}) => {
|
|
55
|
+
const {
|
|
56
|
+
firstItem,
|
|
57
|
+
lastItem
|
|
58
|
+
} = (0, _getItemRange.getItemRange)({
|
|
59
|
+
isLastPage,
|
|
60
|
+
page,
|
|
61
|
+
pageLength,
|
|
62
|
+
pageSize,
|
|
63
|
+
total
|
|
64
|
+
});
|
|
47
65
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
48
66
|
"data-test": dataTest,
|
|
49
67
|
className: "jsx-3647884394" + " " + ((0, _classnames.default)('container', className) || "")
|
|
@@ -57,14 +75,15 @@ const Pagination = ({
|
|
|
57
75
|
pageSizeSelectText: pageSizeSelectText
|
|
58
76
|
}), !hidePageSummary && /*#__PURE__*/_react.default.createElement(_pageSummary.PageSummary, {
|
|
59
77
|
dataTest: dataTest,
|
|
78
|
+
firstItem: firstItem,
|
|
79
|
+
lastItem: lastItem,
|
|
60
80
|
page: page,
|
|
61
81
|
pageCount: pageCount,
|
|
62
|
-
|
|
63
|
-
total: total
|
|
64
|
-
pageSummaryText: pageSummaryText
|
|
82
|
+
pageSummaryText: pageSummaryText,
|
|
83
|
+
total: total
|
|
65
84
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
66
85
|
className: "jsx-3647884394" + " " + "page-navigation"
|
|
67
|
-
}, !hidePageSelect && /*#__PURE__*/_react.default.createElement(_pageSelect.PageSelect, {
|
|
86
|
+
}, !hidePageSelect && total && /*#__PURE__*/_react.default.createElement(_pageSelect.PageSelect, {
|
|
68
87
|
dataTest: dataTest,
|
|
69
88
|
pageSelectText: pageSelectText,
|
|
70
89
|
page: page,
|
|
@@ -72,9 +91,9 @@ const Pagination = ({
|
|
|
72
91
|
onChange: onPageChange
|
|
73
92
|
}), /*#__PURE__*/_react.default.createElement(_pageControls.PageControls, {
|
|
74
93
|
dataTest: dataTest,
|
|
94
|
+
isLastPage: isLastPage || page === pageCount,
|
|
75
95
|
nextPageText: nextPageText,
|
|
76
96
|
page: page,
|
|
77
|
-
pageCount: pageCount,
|
|
78
97
|
previousPageText: previousPageText,
|
|
79
98
|
onClick: onPageChange
|
|
80
99
|
})), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
@@ -89,25 +108,27 @@ Pagination.defaultProps = {
|
|
|
89
108
|
nextPageText: () => _index.default.t('Next'),
|
|
90
109
|
pageSelectText: () => _index.default.t('Page'),
|
|
91
110
|
pageSizeSelectText: () => _index.default.t('Items per page'),
|
|
92
|
-
pageSummaryText:
|
|
111
|
+
pageSummaryText: _getDefaultPageSummaryText.getDefaultPageSummaryText,
|
|
93
112
|
previousPageText: () => _index.default.t('Previous')
|
|
94
113
|
};
|
|
95
114
|
Pagination.propTypes = {
|
|
96
|
-
page:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
115
|
+
page: _propTypes2.default.number.isRequired,
|
|
116
|
+
pageSize: _propTypes2.default.number.isRequired,
|
|
117
|
+
className: _propTypes2.default.string,
|
|
118
|
+
dataTest: _propTypes2.default.string,
|
|
119
|
+
hidePageSelect: _propTypes2.default.bool,
|
|
120
|
+
hidePageSizeSelect: _propTypes2.default.bool,
|
|
121
|
+
hidePageSummary: _propTypes2.default.bool,
|
|
122
|
+
isLastPage: _propTypes2.default.bool,
|
|
123
|
+
nextPageText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
|
124
|
+
pageCount: _propTypes2.default.number,
|
|
125
|
+
pageLength: (0, _propTypes.requiredIf)(props => props.isLastPage, _propTypes2.default.number),
|
|
126
|
+
pageSelectText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
|
127
|
+
pageSizeSelectText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
|
128
|
+
pageSizes: _propTypes2.default.arrayOf(_propTypes2.default.string),
|
|
129
|
+
pageSummaryText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
|
130
|
+
previousPageText: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.func]),
|
|
131
|
+
total: _propTypes2.default.number,
|
|
132
|
+
onPageChange: _propTypes2.default.func,
|
|
133
|
+
onPageSizeChange: _propTypes2.default.func
|
|
113
134
|
};
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WithoutAnySelect = exports.WithCustomPageSummary = exports.WithoutPageSummary = exports.WithoutGoToPageSelect = exports.WithoutPageSizeSelect = exports.PagerAtLastPage = exports.PagerAtFirstPage = exports.Default = exports.default = void 0;
|
|
6
|
+
exports.WithoutAnySelect = exports.WithCustomPageSummary = exports.WithoutPageSummary = exports.WithoutGoToPageSelect = exports.WithoutPageSizeSelect = exports.NoTotalAtLastPageWithoutPageLength = exports.NoTotalAtLastPage = exports.NoTotal = exports.PagerAtLastPage = exports.PagerAtFirstPage = exports.Default = exports.default = void 0;
|
|
7
7
|
|
|
8
8
|
var _d2I18n = _interopRequireDefault(require("@dhis2/d2-i18n"));
|
|
9
9
|
|
|
@@ -52,11 +52,9 @@ var _default = {
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
// Default args for stories
|
|
55
|
-
args: {
|
|
56
|
-
..._pagination.Pagination.defaultProps,
|
|
55
|
+
args: {
|
|
57
56
|
onPageChange: logOnPageChange,
|
|
58
|
-
onPageSizeChange: logOnPageSizeChange
|
|
59
|
-
...pagers.atTenthPage
|
|
57
|
+
onPageSizeChange: logOnPageSizeChange
|
|
60
58
|
}
|
|
61
59
|
};
|
|
62
60
|
exports.default = _default;
|
|
@@ -65,6 +63,8 @@ const Template = args => /*#__PURE__*/_react.default.createElement(_pagination.P
|
|
|
65
63
|
|
|
66
64
|
const Default = Template.bind({});
|
|
67
65
|
exports.Default = Default;
|
|
66
|
+
Default.args = { ...pagers.atTenthPage
|
|
67
|
+
};
|
|
68
68
|
const PagerAtFirstPage = Template.bind({});
|
|
69
69
|
exports.PagerAtFirstPage = PagerAtFirstPage;
|
|
70
70
|
PagerAtFirstPage.args = { ...pagers.atFirstPage
|
|
@@ -73,28 +73,42 @@ const PagerAtLastPage = Template.bind({});
|
|
|
73
73
|
exports.PagerAtLastPage = PagerAtLastPage;
|
|
74
74
|
PagerAtLastPage.args = { ...pagers.atLastPage
|
|
75
75
|
};
|
|
76
|
+
const NoTotal = Template.bind({});
|
|
77
|
+
exports.NoTotal = NoTotal;
|
|
78
|
+
NoTotal.args = { ...pagers.noTotal
|
|
79
|
+
};
|
|
80
|
+
const NoTotalAtLastPage = Template.bind({});
|
|
81
|
+
exports.NoTotalAtLastPage = NoTotalAtLastPage;
|
|
82
|
+
NoTotalAtLastPage.args = { ...pagers.noTotalAtLastPage,
|
|
83
|
+
pageLength: 26
|
|
84
|
+
};
|
|
85
|
+
const NoTotalAtLastPageWithoutPageLength = Template.bind({});
|
|
86
|
+
exports.NoTotalAtLastPageWithoutPageLength = NoTotalAtLastPageWithoutPageLength;
|
|
87
|
+
NoTotalAtLastPageWithoutPageLength.args = { ...pagers.noTotalAtLastPage
|
|
88
|
+
};
|
|
76
89
|
const WithoutPageSizeSelect = Template.bind({});
|
|
77
90
|
exports.WithoutPageSizeSelect = WithoutPageSizeSelect;
|
|
78
|
-
WithoutPageSizeSelect.args = {
|
|
91
|
+
WithoutPageSizeSelect.args = { ...pagers.atTenthPage,
|
|
79
92
|
hidePageSizeSelect: true
|
|
80
93
|
};
|
|
81
94
|
const WithoutGoToPageSelect = Template.bind({});
|
|
82
95
|
exports.WithoutGoToPageSelect = WithoutGoToPageSelect;
|
|
83
|
-
WithoutGoToPageSelect.args = {
|
|
96
|
+
WithoutGoToPageSelect.args = { ...pagers.atTenthPage,
|
|
84
97
|
hidePageSelect: true
|
|
85
98
|
};
|
|
86
99
|
const WithoutPageSummary = Template.bind({});
|
|
87
100
|
exports.WithoutPageSummary = WithoutPageSummary;
|
|
88
|
-
WithoutPageSummary.args = {
|
|
101
|
+
WithoutPageSummary.args = { ...pagers.atTenthPage,
|
|
89
102
|
hidePageSummary: true
|
|
90
103
|
};
|
|
91
104
|
const WithCustomPageSummary = Template.bind({});
|
|
92
105
|
exports.WithCustomPageSummary = WithCustomPageSummary;
|
|
93
|
-
WithCustomPageSummary.args = {
|
|
94
|
-
pageSummaryText: interpolationObject => _d2I18n.default.t('
|
|
106
|
+
WithCustomPageSummary.args = { ...pagers.atTenthPage,
|
|
107
|
+
pageSummaryText: interpolationObject => _d2I18n.default.t('You are at page {{page}} showing items {{firstItem}}-{{lastItem}}, but there are {{pageCount}} pages and {{total}} items', interpolationObject)
|
|
95
108
|
};
|
|
96
109
|
const WithoutAnySelect = Template.bind({});
|
|
97
110
|
exports.WithoutAnySelect = WithoutAnySelect;
|
|
98
|
-
WithoutAnySelect.args = { ...
|
|
111
|
+
WithoutAnySelect.args = { ...pagers.atTenthPage,
|
|
112
|
+
...WithoutGoToPageSelect.args,
|
|
99
113
|
...WithoutPageSizeSelect.args
|
|
100
114
|
};
|
|
@@ -15,4 +15,14 @@ export const atLastPage = {
|
|
|
15
15
|
pageCount: 21,
|
|
16
16
|
total: 1035,
|
|
17
17
|
pageSize: 50
|
|
18
|
+
};
|
|
19
|
+
export const noTotal = {
|
|
20
|
+
page: 2,
|
|
21
|
+
pageSize: 50,
|
|
22
|
+
isLastPage: false
|
|
23
|
+
};
|
|
24
|
+
export const noTotalAtLastPage = {
|
|
25
|
+
page: 4,
|
|
26
|
+
pageSize: 50,
|
|
27
|
+
isLastPage: true
|
|
18
28
|
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as mockPagers from '../__fixtures__/index.js';
|
|
2
|
+
import { getItemRange } from '../get-item-range.js';
|
|
3
|
+
describe('getItemRange', () => {
|
|
4
|
+
it('calculates the firstItem and lastItem correctly', () => {
|
|
5
|
+
const {
|
|
6
|
+
page,
|
|
7
|
+
pageSize,
|
|
8
|
+
total
|
|
9
|
+
} = mockPagers.atTenthPage;
|
|
10
|
+
const {
|
|
11
|
+
firstItem,
|
|
12
|
+
lastItem
|
|
13
|
+
} = getItemRange({
|
|
14
|
+
page,
|
|
15
|
+
pageSize,
|
|
16
|
+
total
|
|
17
|
+
});
|
|
18
|
+
expect(firstItem).toEqual(451);
|
|
19
|
+
expect(lastItem).toEqual(500);
|
|
20
|
+
});
|
|
21
|
+
it('returns 0 for firstItem and lastItem if the total is 0', () => {
|
|
22
|
+
const {
|
|
23
|
+
firstItem,
|
|
24
|
+
lastItem
|
|
25
|
+
} = getItemRange({
|
|
26
|
+
page: 1,
|
|
27
|
+
pageSize: 50,
|
|
28
|
+
total: 0
|
|
29
|
+
});
|
|
30
|
+
expect(firstItem).toEqual(0);
|
|
31
|
+
expect(lastItem).toEqual(0);
|
|
32
|
+
});
|
|
33
|
+
it('uses the total count as lastItem when the last page is reached', () => {
|
|
34
|
+
const {
|
|
35
|
+
page,
|
|
36
|
+
pageSize,
|
|
37
|
+
total
|
|
38
|
+
} = mockPagers.atLastPage;
|
|
39
|
+
const {
|
|
40
|
+
lastItem
|
|
41
|
+
} = getItemRange({
|
|
42
|
+
page,
|
|
43
|
+
pageSize,
|
|
44
|
+
total
|
|
45
|
+
});
|
|
46
|
+
expect(lastItem).toEqual(total);
|
|
47
|
+
});
|
|
48
|
+
it('handles pagers without totals', () => {
|
|
49
|
+
const {
|
|
50
|
+
firstItem,
|
|
51
|
+
lastItem
|
|
52
|
+
} = getItemRange({
|
|
53
|
+
page: 3,
|
|
54
|
+
pageSize: 50
|
|
55
|
+
});
|
|
56
|
+
expect(firstItem).toEqual(101);
|
|
57
|
+
expect(lastItem).toEqual(150);
|
|
58
|
+
});
|
|
59
|
+
it('bases the lastItem on the pageLength for pagers without total when the last page is reached', () => {
|
|
60
|
+
const {
|
|
61
|
+
lastItem
|
|
62
|
+
} = getItemRange({
|
|
63
|
+
page: 3,
|
|
64
|
+
pageSize: 50,
|
|
65
|
+
pageLength: 21,
|
|
66
|
+
isLastPage: true
|
|
67
|
+
});
|
|
68
|
+
expect(lastItem).toEqual(121);
|
|
69
|
+
});
|
|
70
|
+
it('sets lastItem to NaN when on the last page and there is no total or pageLength', () => {
|
|
71
|
+
const {
|
|
72
|
+
lastItem
|
|
73
|
+
} = getItemRange({
|
|
74
|
+
page: 3,
|
|
75
|
+
pageSize: 50,
|
|
76
|
+
isLastPage: true
|
|
77
|
+
});
|
|
78
|
+
expect(lastItem).toEqual(NaN);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
@@ -2,7 +2,6 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
|
|
|
2
2
|
|
|
3
3
|
import { shallow } from 'enzyme';
|
|
4
4
|
import React from 'react';
|
|
5
|
-
import * as mockPagers from '../__fixtures__/index.js';
|
|
6
5
|
import { PageControls } from '../page-controls.js';
|
|
7
6
|
describe('<PageControls />', () => {
|
|
8
7
|
const mockOnClick = jest.fn();
|
|
@@ -11,7 +10,7 @@ describe('<PageControls />', () => {
|
|
|
11
10
|
onClick: mockOnClick,
|
|
12
11
|
nextPageText: 'Next',
|
|
13
12
|
previousPageText: 'Previous',
|
|
14
|
-
|
|
13
|
+
page: 10
|
|
15
14
|
};
|
|
16
15
|
beforeEach(() => {
|
|
17
16
|
mockOnClick.mockClear();
|
|
@@ -25,12 +24,16 @@ describe('<PageControls />', () => {
|
|
|
25
24
|
expect(wrapper.find('.button-next').getElement().props.disabled).toEqual(false);
|
|
26
25
|
});
|
|
27
26
|
it('disables the previous page button on the first page', () => {
|
|
28
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(PageControls, _extends({}, props,
|
|
27
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(PageControls, _extends({}, props, {
|
|
28
|
+
page: 1
|
|
29
|
+
})));
|
|
29
30
|
expect(wrapper.find('.button-previous').getElement().props.disabled).toEqual(true);
|
|
30
31
|
expect(wrapper.find('.button-next').getElement().props.disabled).toEqual(false);
|
|
31
32
|
});
|
|
32
33
|
it('disables the next page button on the last page', () => {
|
|
33
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(PageControls, _extends({}, props,
|
|
34
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(PageControls, _extends({}, props, {
|
|
35
|
+
isLastPage: true
|
|
36
|
+
})));
|
|
34
37
|
expect(wrapper.find('.button-previous').getElement().props.disabled).toEqual(false);
|
|
35
38
|
expect(wrapper.find('.button-next').getElement().props.disabled).toEqual(true);
|
|
36
39
|
});
|
|
@@ -2,8 +2,7 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
|
|
|
2
2
|
|
|
3
3
|
import { shallow } from 'enzyme';
|
|
4
4
|
import React from 'react';
|
|
5
|
-
import
|
|
6
|
-
import { PageSummary, getItemRange } from '../page-summary.js';
|
|
5
|
+
import { PageSummary } from '../page-summary.js';
|
|
7
6
|
import { Pagination } from '../pagination.js';
|
|
8
7
|
describe('<PageSummary />', () => {
|
|
9
8
|
const props = {
|
|
@@ -11,55 +10,43 @@ describe('<PageSummary />', () => {
|
|
|
11
10
|
pageSummaryText: Pagination.defaultProps.pageSummaryText
|
|
12
11
|
};
|
|
13
12
|
it('renders without errors', () => {
|
|
14
|
-
shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props,
|
|
13
|
+
shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, {
|
|
14
|
+
firstItem: 51,
|
|
15
|
+
lastItem: 100,
|
|
16
|
+
page: 2,
|
|
17
|
+
pageCount: 5,
|
|
18
|
+
total: 224
|
|
19
|
+
})));
|
|
15
20
|
});
|
|
16
|
-
it('
|
|
17
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props,
|
|
18
|
-
|
|
21
|
+
it('renders the correct message when both total and lastItem are provided', () => {
|
|
22
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, {
|
|
23
|
+
firstItem: 51,
|
|
24
|
+
lastItem: 100,
|
|
25
|
+
page: 2,
|
|
26
|
+
pageCount: 5,
|
|
27
|
+
total: 224
|
|
28
|
+
})));
|
|
29
|
+
const expectedString = 'Page 2 of 5, items 51-100 of 224';
|
|
19
30
|
expect(wrapper.find('span').text()).toEqual(expectedString);
|
|
20
31
|
});
|
|
21
|
-
it('
|
|
22
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props,
|
|
23
|
-
|
|
32
|
+
it('renders the correct message when only lastItem is provided', () => {
|
|
33
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, {
|
|
34
|
+
firstItem: 51,
|
|
35
|
+
lastItem: 100,
|
|
36
|
+
page: 2,
|
|
37
|
+
pageCount: 5
|
|
38
|
+
})));
|
|
39
|
+
const expectedString = 'Page 2, items 51-100';
|
|
24
40
|
expect(wrapper.find('span').text()).toEqual(expectedString);
|
|
25
41
|
});
|
|
26
|
-
it('
|
|
27
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props,
|
|
28
|
-
|
|
42
|
+
it('renders the correct message when total is missing and lastItem is not a number', () => {
|
|
43
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, {
|
|
44
|
+
firstItem: 51,
|
|
45
|
+
lastItem: NaN,
|
|
46
|
+
page: 2,
|
|
47
|
+
pageCount: 5
|
|
48
|
+
})));
|
|
49
|
+
const expectedString = 'Page 2';
|
|
29
50
|
expect(wrapper.find('span').text()).toEqual(expectedString);
|
|
30
51
|
});
|
|
31
|
-
describe('getItemRange', () => {
|
|
32
|
-
it('calculates the firstItem and lastItem correctly', () => {
|
|
33
|
-
const {
|
|
34
|
-
page,
|
|
35
|
-
pageSize,
|
|
36
|
-
total
|
|
37
|
-
} = mockPagers.atTenthPage;
|
|
38
|
-
const {
|
|
39
|
-
firstItem,
|
|
40
|
-
lastItem
|
|
41
|
-
} = getItemRange(page, pageSize, total);
|
|
42
|
-
expect(firstItem).toEqual(451);
|
|
43
|
-
expect(lastItem).toEqual(500);
|
|
44
|
-
});
|
|
45
|
-
it('returns 0 for firstItem and lastItem if the total is 0', () => {
|
|
46
|
-
const {
|
|
47
|
-
firstItem,
|
|
48
|
-
lastItem
|
|
49
|
-
} = getItemRange(1, 50, 0);
|
|
50
|
-
expect(firstItem).toEqual(0);
|
|
51
|
-
expect(lastItem).toEqual(0);
|
|
52
|
-
});
|
|
53
|
-
it('uses the total count as lastItem when the last page is reached', () => {
|
|
54
|
-
const {
|
|
55
|
-
page,
|
|
56
|
-
pageSize,
|
|
57
|
-
total
|
|
58
|
-
} = mockPagers.atLastPage;
|
|
59
|
-
const {
|
|
60
|
-
lastItem
|
|
61
|
-
} = getItemRange(page, pageSize, total);
|
|
62
|
-
expect(lastItem).toEqual(total);
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
52
|
});
|
|
@@ -7,38 +7,54 @@ import { PageSelect } from '../page-select.js';
|
|
|
7
7
|
import { PageSizeSelect } from '../page-size-select.js';
|
|
8
8
|
import { Pagination } from '../pagination.js';
|
|
9
9
|
describe('<Pagination />', () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
describe('Pagination with total and totalPages', () => {
|
|
11
|
+
const props = { ...mockPagers.atTenthPage,
|
|
12
|
+
onPageChange: () => {},
|
|
13
|
+
onPageSizeChange: () => {}
|
|
14
|
+
};
|
|
15
|
+
it('renders without errors', () => {
|
|
16
|
+
shallow( /*#__PURE__*/React.createElement(Pagination, props));
|
|
17
|
+
});
|
|
18
|
+
it('renders a PageSelect and PageSizeSelect by default', () => {
|
|
19
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, props));
|
|
20
|
+
expect(wrapper.find(PageSelect).length).toEqual(1);
|
|
21
|
+
expect(wrapper.find(PageSizeSelect).length).toEqual(1);
|
|
22
|
+
});
|
|
23
|
+
it('renders without a PageSelect when hidePageSelect is true', () => {
|
|
24
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
|
|
25
|
+
hidePageSelect: true
|
|
26
|
+
})));
|
|
27
|
+
expect(wrapper.find(PageSelect).length).toEqual(0);
|
|
28
|
+
expect(wrapper.find(PageSizeSelect).length).toEqual(1);
|
|
29
|
+
});
|
|
30
|
+
it('renders without a PageSizeSelect when hidePageSizeSelect is true', () => {
|
|
31
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
|
|
32
|
+
hidePageSizeSelect: true
|
|
33
|
+
})));
|
|
34
|
+
expect(wrapper.find(PageSelect).length).toEqual(1);
|
|
35
|
+
expect(wrapper.find(PageSizeSelect).length).toEqual(0);
|
|
36
|
+
});
|
|
37
|
+
it('renders without PageSelect and PageSizeSelect when both are true', () => {
|
|
38
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
|
|
39
|
+
hidePageSelect: true,
|
|
40
|
+
hidePageSizeSelect: true
|
|
41
|
+
})));
|
|
42
|
+
expect(wrapper.find(PageSelect).length).toEqual(0);
|
|
43
|
+
expect(wrapper.find(PageSizeSelect).length).toEqual(0);
|
|
44
|
+
});
|
|
16
45
|
});
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
|
|
31
|
-
hidePageSizeSelect: true
|
|
32
|
-
})));
|
|
33
|
-
expect(wrapper.find(PageSelect).length).toEqual(1);
|
|
34
|
-
expect(wrapper.find(PageSizeSelect).length).toEqual(0);
|
|
35
|
-
});
|
|
36
|
-
it('renders without PageSelect and PageSizeSelect when both are true', () => {
|
|
37
|
-
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
|
|
38
|
-
hidePageSelect: true,
|
|
39
|
-
hidePageSizeSelect: true
|
|
40
|
-
})));
|
|
41
|
-
expect(wrapper.find(PageSelect).length).toEqual(0);
|
|
42
|
-
expect(wrapper.find(PageSizeSelect).length).toEqual(0);
|
|
46
|
+
describe('Pagination without total and totalPages', () => {
|
|
47
|
+
const props = { ...mockPagers.noTotal,
|
|
48
|
+
onPageChange: () => {},
|
|
49
|
+
onPageSizeChange: () => {}
|
|
50
|
+
};
|
|
51
|
+
it('renders without errors', () => {
|
|
52
|
+
shallow( /*#__PURE__*/React.createElement(Pagination, props));
|
|
53
|
+
});
|
|
54
|
+
it('renders with a PageSizeSelect but without a PageSelect', () => {
|
|
55
|
+
const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, props));
|
|
56
|
+
expect(wrapper.find(PageSizeSelect).length).toEqual(1);
|
|
57
|
+
expect(wrapper.find(PageSelect).length).toEqual(0);
|
|
58
|
+
});
|
|
43
59
|
});
|
|
44
60
|
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import i18n from './locales/index.js';
|
|
2
|
+
|
|
3
|
+
const isValidNumber = input => typeof input === 'number' && !isNaN(input);
|
|
4
|
+
|
|
5
|
+
export const getDefaultPageSummaryText = ({
|
|
6
|
+
firstItem,
|
|
7
|
+
lastItem,
|
|
8
|
+
page,
|
|
9
|
+
pageCount,
|
|
10
|
+
total
|
|
11
|
+
}) => {
|
|
12
|
+
if (isValidNumber(total) && isValidNumber(lastItem)) {
|
|
13
|
+
return i18n.t('Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}', {
|
|
14
|
+
page,
|
|
15
|
+
pageCount,
|
|
16
|
+
firstItem,
|
|
17
|
+
lastItem,
|
|
18
|
+
total
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (isValidNumber(lastItem)) {
|
|
23
|
+
return i18n.t('Page {{page}}, items {{firstItem}}-{{lastItem}}', {
|
|
24
|
+
page,
|
|
25
|
+
firstItem,
|
|
26
|
+
lastItem
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return i18n.t('Page {{page}}', {
|
|
31
|
+
page
|
|
32
|
+
});
|
|
33
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export const getItemRange = ({
|
|
2
|
+
isLastPage,
|
|
3
|
+
page,
|
|
4
|
+
pageLength,
|
|
5
|
+
pageSize,
|
|
6
|
+
total
|
|
7
|
+
}) => {
|
|
8
|
+
// page is 1-based
|
|
9
|
+
let firstItem = (page - 1) * pageSize + 1;
|
|
10
|
+
let lastItem = firstItem + pageSize - 1;
|
|
11
|
+
|
|
12
|
+
if (typeof total === 'number') {
|
|
13
|
+
if (total === 0) {
|
|
14
|
+
/*
|
|
15
|
+
* if no items are found, the pager total is 0
|
|
16
|
+
* and the first and last item should be be 0 too
|
|
17
|
+
*/
|
|
18
|
+
firstItem = 0;
|
|
19
|
+
lastItem = 0;
|
|
20
|
+
} else if (lastItem > total) {
|
|
21
|
+
lastItem = total;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (typeof pageLength === 'number') {
|
|
26
|
+
lastItem = firstItem + pageLength - 1;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (isLastPage && isNaN(total) && isNaN(pageLength)) {
|
|
30
|
+
// impossible to accurately determine the last item
|
|
31
|
+
lastItem = NaN;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
firstItem,
|
|
36
|
+
lastItem
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
+
"Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}": "Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}",
|
|
3
|
+
"Page {{page}}, items {{firstItem}}-{{lastItem}}": "Page {{page}}, items {{firstItem}}-{{lastItem}}",
|
|
4
|
+
"Page {{page}}": "Page {{page}}",
|
|
2
5
|
"Next": "Next",
|
|
3
6
|
"Page": "Page",
|
|
4
7
|
"Items per page": "Items per page",
|
|
5
|
-
"Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}": "Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}",
|
|
6
8
|
"Previous": "Previous",
|
|
7
|
-
"
|
|
9
|
+
"You are at page {{page}} showing items {{firstItem}}-{{lastItem}}, but there are {{pageCount}} pages and {{total}} items": "You are at page {{page}} showing items {{firstItem}}-{{lastItem}}, but there are {{pageCount}} pages and {{total}} items"
|
|
8
10
|
}
|
|
@@ -15,10 +15,10 @@ const translate = (prop, interpolationObject) => {
|
|
|
15
15
|
|
|
16
16
|
const PageControls = ({
|
|
17
17
|
dataTest,
|
|
18
|
+
isLastPage,
|
|
18
19
|
onClick,
|
|
19
20
|
nextPageText,
|
|
20
21
|
page,
|
|
21
|
-
pageCount,
|
|
22
22
|
previousPageText
|
|
23
23
|
}) => /*#__PURE__*/React.createElement("div", {
|
|
24
24
|
"data-test": `${dataTest}-pagecontrols`,
|
|
@@ -34,7 +34,7 @@ const PageControls = ({
|
|
|
34
34
|
secondary: true,
|
|
35
35
|
className: "button-next",
|
|
36
36
|
small: true,
|
|
37
|
-
disabled:
|
|
37
|
+
disabled: !!isLastPage,
|
|
38
38
|
onClick: () => onClick(page + 1),
|
|
39
39
|
dataTest: `${dataTest}-page-next`
|
|
40
40
|
}, translate(nextPageText), /*#__PURE__*/React.createElement(IconChevronRight16, null)), /*#__PURE__*/React.createElement(_JSXStyle, {
|
|
@@ -46,8 +46,8 @@ PageControls.propTypes = {
|
|
|
46
46
|
dataTest: PropTypes.string.isRequired,
|
|
47
47
|
nextPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
|
|
48
48
|
page: PropTypes.number.isRequired,
|
|
49
|
-
pageCount: PropTypes.number.isRequired,
|
|
50
49
|
previousPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.func]).isRequired,
|
|
51
|
-
onClick: PropTypes.func.isRequired
|
|
50
|
+
onClick: PropTypes.func.isRequired,
|
|
51
|
+
isLastPage: PropTypes.bool
|
|
52
52
|
};
|
|
53
53
|
export { PageControls };
|