@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.
@@ -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 _propTypes = _interopRequireDefault(require("prop-types"));
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
- pageSize: pageSize,
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: interpolationObject => _index.default.t('Page {{page}} of {{pageCount}}, items {{firstItem}}-{{lastItem}} of {{total}}', interpolationObject),
111
+ pageSummaryText: _getDefaultPageSummaryText.getDefaultPageSummaryText,
93
112
  previousPageText: () => _index.default.t('Previous')
94
113
  };
95
114
  Pagination.propTypes = {
96
- page: _propTypes.default.number.isRequired,
97
- pageCount: _propTypes.default.number.isRequired,
98
- pageSize: _propTypes.default.number.isRequired,
99
- total: _propTypes.default.number.isRequired,
100
- className: _propTypes.default.string,
101
- dataTest: _propTypes.default.string,
102
- hidePageSelect: _propTypes.default.bool,
103
- hidePageSizeSelect: _propTypes.default.bool,
104
- hidePageSummary: _propTypes.default.bool,
105
- nextPageText: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
106
- pageSelectText: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
107
- pageSizeSelectText: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
108
- pageSizes: _propTypes.default.arrayOf(_propTypes.default.string),
109
- pageSummaryText: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
110
- previousPageText: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
111
- onPageChange: _propTypes.default.func,
112
- onPageSizeChange: _propTypes.default.func
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: { // Fixes 'defaultProps' errors for storybook
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('Page nr {{page}} of {{pageCount}} pages, items {{firstItem}}-{{lastItem}}, NO TOTAL', interpolationObject)
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 = { ...WithoutGoToPageSelect.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
- ...mockPagers.atTenthPage
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, mockPagers.atFirstPage)));
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, mockPagers.atLastPage)));
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 * as mockPagers from '../__fixtures__/index.js';
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, mockPagers.atTenthPage)));
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('displays the correct information for a first page', () => {
17
- const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, mockPagers.atFirstPage)));
18
- const expectedString = 'Page 1 of 21, items 1-50 of 1035';
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('displays the correct information for a last page', () => {
22
- const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, mockPagers.atLastPage)));
23
- const expectedString = 'Page 21 of 21, items 1001-1035 of 1035';
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('displays the correct information for a page between first and last', () => {
27
- const wrapper = shallow( /*#__PURE__*/React.createElement(PageSummary, _extends({}, props, mockPagers.atTenthPage)));
28
- const expectedString = 'Page 10 of 21, items 451-500 of 1035';
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
- const props = { ...mockPagers.atTenthPage,
11
- onPageChange: () => {},
12
- onPageSizeChange: () => {}
13
- };
14
- it('renders without errors', () => {
15
- shallow( /*#__PURE__*/React.createElement(Pagination, props));
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
- it('renders a PageSelect and PageSizeSelect by default', () => {
18
- const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, props));
19
- expect(wrapper.find(PageSelect).length).toEqual(1);
20
- expect(wrapper.find(PageSizeSelect).length).toEqual(1);
21
- });
22
- it('renders without a PageSelect when hidePageSelect is true', () => {
23
- const wrapper = shallow( /*#__PURE__*/React.createElement(Pagination, _extends({}, props, {
24
- hidePageSelect: true
25
- })));
26
- expect(wrapper.find(PageSelect).length).toEqual(0);
27
- expect(wrapper.find(PageSizeSelect).length).toEqual(1);
28
- });
29
- it('renders without a PageSizeSelect when hidePageSizeSelect is true', () => {
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
- "Page nr {{page}} of {{pageCount}} pages, items {{firstItem}}-{{lastItem}}, NO TOTAL": "Page nr {{page}} of {{pageCount}} pages, items {{firstItem}}-{{lastItem}}, NO TOTAL"
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: page === pageCount,
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 };