1 | import { __rest } from "tslib";
|
2 | import * as React from 'react';
|
3 | import styles from '@patternfly/react-styles/css/components/Pagination/pagination';
|
4 | import { css } from '@patternfly/react-styles';
|
5 | import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';
|
6 | import AngleDoubleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-left-icon';
|
7 | import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
|
8 | import AngleDoubleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-right-icon';
|
9 | import { Button, ButtonVariant } from '../Button';
|
10 | import { pluralize } from '../../helpers';
|
11 | import { KEY_CODES } from '../../helpers/constants';
|
12 | export class Navigation extends React.Component {
|
13 | constructor(props) {
|
14 | super(props);
|
15 | this.handleNewPage = (_evt, newPage) => {
|
16 | const { perPage, onSetPage } = this.props;
|
17 | const startIdx = (newPage - 1) * perPage;
|
18 | const endIdx = newPage * perPage;
|
19 | return onSetPage(_evt, newPage, perPage, startIdx, endIdx);
|
20 | };
|
21 | this.state = { userInputPage: this.props.page };
|
22 | }
|
23 | static parseInteger(input, lastPage) {
|
24 |
|
25 | let inputPage = Number.parseInt(input, 10);
|
26 | if (!Number.isNaN(inputPage)) {
|
27 | inputPage = inputPage > lastPage ? lastPage : inputPage;
|
28 | inputPage = inputPage < 1 ? 1 : inputPage;
|
29 | }
|
30 | return inputPage;
|
31 | }
|
32 | onChange(event, lastPage) {
|
33 | const inputPage = Navigation.parseInteger(event.target.value, lastPage);
|
34 | this.setState({ userInputPage: Number.isNaN(inputPage) ? event.target.value : inputPage });
|
35 | }
|
36 | onKeyDown(event, page, lastPage, onPageInput) {
|
37 | if (event.keyCode === KEY_CODES.ENTER) {
|
38 | const inputPage = Navigation.parseInteger(this.state.userInputPage, lastPage);
|
39 | onPageInput(event, Number.isNaN(inputPage) ? page : inputPage);
|
40 | this.handleNewPage(event, Number.isNaN(inputPage) ? page : inputPage);
|
41 | }
|
42 | }
|
43 | componentDidUpdate(lastState) {
|
44 | if (this.props.page !== lastState.page &&
|
45 | this.props.page <= this.props.lastPage &&
|
46 | this.state.userInputPage !== this.props.page) {
|
47 | this.setState({ userInputPage: this.props.page });
|
48 | }
|
49 | }
|
50 | render() {
|
51 | const _a = this.props, { page,
|
52 |
|
53 | perPage,
|
54 |
|
55 | onSetPage, isDisabled, itemCount, lastPage, firstPage, pagesTitle, pagesTitlePlural, toLastPage, toNextPage, toFirstPage, toPreviousPage, currPage, paginationTitle, ofWord, onNextClick, onPreviousClick, onFirstClick, onLastClick, onPageInput, className, isCompact } = _a, props = __rest(_a, ["page", "perPage", "onSetPage", "isDisabled", "itemCount", "lastPage", "firstPage", "pagesTitle", "pagesTitlePlural", "toLastPage", "toNextPage", "toFirstPage", "toPreviousPage", "currPage", "paginationTitle", "ofWord", "onNextClick", "onPreviousClick", "onFirstClick", "onLastClick", "onPageInput", "className", "isCompact"]);
|
56 | const { userInputPage } = this.state;
|
57 | return (React.createElement("nav", Object.assign({ className: css(styles.paginationNav, className), "aria-label": paginationTitle }, props),
|
58 | !isCompact && (React.createElement("div", { className: css(styles.paginationNavControl, styles.modifiers.first) },
|
59 | React.createElement(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === firstPage || page === 0, "aria-label": toFirstPage, "data-action": "first", onClick: event => {
|
60 | onFirstClick(event, 1);
|
61 | this.handleNewPage(event, 1);
|
62 | this.setState({ userInputPage: 1 });
|
63 | } },
|
64 | React.createElement(AngleDoubleLeftIcon, null)))),
|
65 | React.createElement("div", { className: styles.paginationNavControl },
|
66 | React.createElement(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === firstPage || page === 0, "data-action": "previous", onClick: event => {
|
67 | const newPage = page - 1 >= 1 ? page - 1 : 1;
|
68 | onPreviousClick(event, newPage);
|
69 | this.handleNewPage(event, newPage);
|
70 | this.setState({ userInputPage: newPage });
|
71 | }, "aria-label": toPreviousPage },
|
72 | React.createElement(AngleLeftIcon, null))),
|
73 | !isCompact && (React.createElement("div", { className: styles.paginationNavPageSelect },
|
74 | React.createElement("input", { className: css(styles.formControl), "aria-label": currPage, type: "number", disabled: isDisabled || (itemCount && page === firstPage && page === lastPage && itemCount >= 0) || page === 0, min: lastPage <= 0 && firstPage <= 0 ? 0 : 1, max: lastPage, value: userInputPage, onKeyDown: event => this.onKeyDown(event, page, lastPage, onPageInput), onChange: event => this.onChange(event, lastPage) }),
|
75 | (itemCount || itemCount === 0) && (React.createElement("span", { "aria-hidden": "true" },
|
76 | ofWord,
|
77 | " ",
|
78 | pagesTitle ? pluralize(lastPage, pagesTitle, pagesTitlePlural) : lastPage)))),
|
79 | React.createElement("div", { className: styles.paginationNavControl },
|
80 | React.createElement(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === lastPage, "aria-label": toNextPage, "data-action": "next", onClick: event => {
|
81 | const newPage = page + 1 <= lastPage ? page + 1 : lastPage;
|
82 | onNextClick(event, newPage);
|
83 | this.handleNewPage(event, newPage);
|
84 | this.setState({ userInputPage: newPage });
|
85 | } },
|
86 | React.createElement(AngleRightIcon, null))),
|
87 | !isCompact && (React.createElement("div", { className: css(styles.paginationNavControl, styles.modifiers.last) },
|
88 | React.createElement(Button, { variant: ButtonVariant.plain, isDisabled: isDisabled || page === lastPage, "aria-label": toLastPage, "data-action": "last", onClick: event => {
|
89 | onLastClick(event, lastPage);
|
90 | this.handleNewPage(event, lastPage);
|
91 | this.setState({ userInputPage: lastPage });
|
92 | } },
|
93 | React.createElement(AngleDoubleRightIcon, null))))));
|
94 | }
|
95 | }
|
96 | Navigation.displayName = 'Navigation';
|
97 | Navigation.defaultProps = {
|
98 | className: '',
|
99 | isDisabled: false,
|
100 | isCompact: false,
|
101 | lastPage: 0,
|
102 | firstPage: 0,
|
103 | pagesTitle: '',
|
104 | pagesTitlePlural: '',
|
105 | toLastPage: 'Go to last page',
|
106 | toNextPage: 'Go to next page',
|
107 | toFirstPage: 'Go to first page',
|
108 | toPreviousPage: 'Go to previous page',
|
109 | currPage: 'Current page',
|
110 | paginationTitle: 'Pagination',
|
111 | ofWord: 'of',
|
112 | onNextClick: () => undefined,
|
113 | onPreviousClick: () => undefined,
|
114 | onFirstClick: () => undefined,
|
115 | onLastClick: () => undefined,
|
116 | onPageInput: () => undefined
|
117 | };
|
118 |
|
\ | No newline at end of file |