UNPKG

7.33 kBJavaScriptView Raw
1import { __rest } from "tslib";
2import * as React from 'react';
3import styles from '@patternfly/react-styles/css/components/Pagination/pagination';
4import { css } from '@patternfly/react-styles';
5import AngleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-left-icon';
6import AngleDoubleLeftIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-left-icon';
7import AngleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-right-icon';
8import AngleDoubleRightIcon from '@patternfly/react-icons/dist/esm/icons/angle-double-right-icon';
9import { Button, ButtonVariant } from '../Button';
10import { pluralize } from '../../helpers';
11import { KEY_CODES } from '../../helpers/constants';
12export 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 // eslint-disable-next-line radix
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 // eslint-disable-next-line @typescript-eslint/no-unused-vars
53 perPage,
54 // eslint-disable-next-line @typescript-eslint/no-unused-vars
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}
96Navigation.displayName = 'Navigation';
97Navigation.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//# sourceMappingURL=Navigation.js.map
\No newline at end of file