2024-08-20 23:25:37 +04:00

448 lines
17 KiB
JavaScript

import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _extends from "@babel/runtime/helpers/esm/extends";
import _typeof from "@babel/runtime/helpers/esm/typeof";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import classNames from 'classnames';
import useMergedState from "rc-util/es/hooks/useMergedState";
import KeyCode from "rc-util/es/KeyCode";
import pickAttrs from "rc-util/es/pickAttrs";
import warning from "rc-util/es/warning";
import React, { useEffect } from 'react';
import zhCN from "./locale/zh_CN";
import Options from "./Options";
import Pager from "./Pager";
var defaultItemRender = function defaultItemRender(page, type, element) {
return element;
};
function noop() {}
function isInteger(v) {
var value = Number(v);
return typeof value === 'number' && !Number.isNaN(value) && isFinite(value) && Math.floor(value) === value;
}
function calculatePage(p, pageSize, total) {
var _pageSize = typeof p === 'undefined' ? pageSize : p;
return Math.floor((total - 1) / _pageSize) + 1;
}
var Pagination = function Pagination(props) {
var _classNames5;
var _props$prefixCls = props.prefixCls,
prefixCls = _props$prefixCls === void 0 ? 'rc-pagination' : _props$prefixCls,
_props$selectPrefixCl = props.selectPrefixCls,
selectPrefixCls = _props$selectPrefixCl === void 0 ? 'rc-select' : _props$selectPrefixCl,
className = props.className,
selectComponentClass = props.selectComponentClass,
currentProp = props.current,
_props$defaultCurrent = props.defaultCurrent,
defaultCurrent = _props$defaultCurrent === void 0 ? 1 : _props$defaultCurrent,
_props$total = props.total,
total = _props$total === void 0 ? 0 : _props$total,
pageSizeProp = props.pageSize,
_props$defaultPageSiz = props.defaultPageSize,
defaultPageSize = _props$defaultPageSiz === void 0 ? 10 : _props$defaultPageSiz,
_props$onChange = props.onChange,
onChange = _props$onChange === void 0 ? noop : _props$onChange,
hideOnSinglePage = props.hideOnSinglePage,
align = props.align,
_props$showPrevNextJu = props.showPrevNextJumpers,
showPrevNextJumpers = _props$showPrevNextJu === void 0 ? true : _props$showPrevNextJu,
showQuickJumper = props.showQuickJumper,
showLessItems = props.showLessItems,
_props$showTitle = props.showTitle,
showTitle = _props$showTitle === void 0 ? true : _props$showTitle,
_props$onShowSizeChan = props.onShowSizeChange,
onShowSizeChange = _props$onShowSizeChan === void 0 ? noop : _props$onShowSizeChan,
_props$locale = props.locale,
locale = _props$locale === void 0 ? zhCN : _props$locale,
style = props.style,
_props$totalBoundaryS = props.totalBoundaryShowSizeChanger,
totalBoundaryShowSizeChanger = _props$totalBoundaryS === void 0 ? 50 : _props$totalBoundaryS,
disabled = props.disabled,
simple = props.simple,
showTotal = props.showTotal,
showSizeChangerProp = props.showSizeChanger,
pageSizeOptions = props.pageSizeOptions,
_props$itemRender = props.itemRender,
itemRender = _props$itemRender === void 0 ? defaultItemRender : _props$itemRender,
jumpPrevIcon = props.jumpPrevIcon,
jumpNextIcon = props.jumpNextIcon,
prevIcon = props.prevIcon,
nextIcon = props.nextIcon;
var paginationRef = React.useRef(null);
var _useMergedState = useMergedState(10, {
value: pageSizeProp,
defaultValue: defaultPageSize
}),
_useMergedState2 = _slicedToArray(_useMergedState, 2),
pageSize = _useMergedState2[0],
setPageSize = _useMergedState2[1];
var _useMergedState3 = useMergedState(1, {
value: currentProp,
defaultValue: defaultCurrent,
postState: function postState(c) {
return Math.max(1, Math.min(c, calculatePage(undefined, pageSize, total)));
}
}),
_useMergedState4 = _slicedToArray(_useMergedState3, 2),
current = _useMergedState4[0],
setCurrent = _useMergedState4[1];
var _React$useState = React.useState(current),
_React$useState2 = _slicedToArray(_React$useState, 2),
internalInputVal = _React$useState2[0],
setInternalInputVal = _React$useState2[1];
useEffect(function () {
setInternalInputVal(current);
}, [current]);
var hasOnChange = onChange !== noop;
var hasCurrent = ('current' in props);
if (process.env.NODE_ENV !== 'production') {
warning(hasCurrent ? hasOnChange : true, 'You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.');
}
var jumpPrevPage = Math.max(1, current - (showLessItems ? 3 : 5));
var jumpNextPage = Math.min(calculatePage(undefined, pageSize, total), current + (showLessItems ? 3 : 5));
function getItemIcon(icon, label) {
var iconNode = icon || /*#__PURE__*/React.createElement("button", {
type: "button",
"aria-label": label,
className: "".concat(prefixCls, "-item-link")
});
if (typeof icon === 'function') {
iconNode = /*#__PURE__*/React.createElement(icon, _objectSpread({}, props));
}
return iconNode;
}
function getValidValue(e) {
var inputValue = e.target.value;
var allPages = calculatePage(undefined, pageSize, total);
var value;
if (inputValue === '') {
value = inputValue;
} else if (Number.isNaN(Number(inputValue))) {
value = internalInputVal;
} else if (inputValue >= allPages) {
value = allPages;
} else {
value = Number(inputValue);
}
return value;
}
function isValid(page) {
return isInteger(page) && page !== current && isInteger(total) && total > 0;
}
var shouldDisplayQuickJumper = total > pageSize ? showQuickJumper : false;
/**
* prevent "up arrow" key reseting cursor position within textbox
* @see https://stackoverflow.com/a/1081114
*/
function handleKeyDown(event) {
if (event.keyCode === KeyCode.UP || event.keyCode === KeyCode.DOWN) {
event.preventDefault();
}
}
function handleKeyUp(event) {
var value = getValidValue(event);
if (value !== internalInputVal) {
setInternalInputVal(value);
}
switch (event.keyCode) {
case KeyCode.ENTER:
handleChange(value);
break;
case KeyCode.UP:
handleChange(value - 1);
break;
case KeyCode.DOWN:
handleChange(value + 1);
break;
default:
break;
}
}
function handleBlur(event) {
handleChange(getValidValue(event));
}
function changePageSize(size) {
var newCurrent = calculatePage(size, pageSize, total);
var nextCurrent = current > newCurrent && newCurrent !== 0 ? newCurrent : current;
setPageSize(size);
setInternalInputVal(nextCurrent);
onShowSizeChange === null || onShowSizeChange === void 0 || onShowSizeChange(current, size);
setCurrent(nextCurrent);
onChange === null || onChange === void 0 || onChange(nextCurrent, size);
}
function handleChange(page) {
if (isValid(page) && !disabled) {
var currentPage = calculatePage(undefined, pageSize, total);
var newPage = page;
if (page > currentPage) {
newPage = currentPage;
} else if (page < 1) {
newPage = 1;
}
if (newPage !== internalInputVal) {
setInternalInputVal(newPage);
}
setCurrent(newPage);
onChange === null || onChange === void 0 || onChange(newPage, pageSize);
return newPage;
}
return current;
}
var hasPrev = current > 1;
var hasNext = current < calculatePage(undefined, pageSize, total);
var showSizeChanger = showSizeChangerProp !== null && showSizeChangerProp !== void 0 ? showSizeChangerProp : total > totalBoundaryShowSizeChanger;
function prevHandle() {
if (hasPrev) handleChange(current - 1);
}
function nextHandle() {
if (hasNext) handleChange(current + 1);
}
function jumpPrevHandle() {
handleChange(jumpPrevPage);
}
function jumpNextHandle() {
handleChange(jumpNextPage);
}
function runIfEnter(event, callback) {
if (event.key === 'Enter' || event.charCode === KeyCode.ENTER || event.keyCode === KeyCode.ENTER) {
for (var _len = arguments.length, restParams = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
restParams[_key - 2] = arguments[_key];
}
callback.apply(void 0, restParams);
}
}
function runIfEnterPrev(event) {
runIfEnter(event, prevHandle);
}
function runIfEnterNext(event) {
runIfEnter(event, nextHandle);
}
function runIfEnterJumpPrev(event) {
runIfEnter(event, jumpPrevHandle);
}
function runIfEnterJumpNext(event) {
runIfEnter(event, jumpNextHandle);
}
function renderPrev(prevPage) {
var prevButton = itemRender(prevPage, 'prev', getItemIcon(prevIcon, 'prev page'));
return /*#__PURE__*/React.isValidElement(prevButton) ? /*#__PURE__*/React.cloneElement(prevButton, {
disabled: !hasPrev
}) : prevButton;
}
function renderNext(nextPage) {
var nextButton = itemRender(nextPage, 'next', getItemIcon(nextIcon, 'next page'));
return /*#__PURE__*/React.isValidElement(nextButton) ? /*#__PURE__*/React.cloneElement(nextButton, {
disabled: !hasNext
}) : nextButton;
}
function handleGoTO(event) {
if (event.type === 'click' || event.keyCode === KeyCode.ENTER) {
handleChange(internalInputVal);
}
}
var jumpPrev = null;
var dataOrAriaAttributeProps = pickAttrs(props, {
aria: true,
data: true
});
var totalText = showTotal && /*#__PURE__*/React.createElement("li", {
className: "".concat(prefixCls, "-total-text")
}, showTotal(total, [total === 0 ? 0 : (current - 1) * pageSize + 1, current * pageSize > total ? total : current * pageSize]));
var jumpNext = null;
var allPages = calculatePage(undefined, pageSize, total);
// ================== Render ==================
// When hideOnSinglePage is true and there is only 1 page, hide the pager
if (hideOnSinglePage && total <= pageSize) {
return null;
}
var pagerList = [];
var pagerProps = {
rootPrefixCls: prefixCls,
onClick: handleChange,
onKeyPress: runIfEnter,
showTitle: showTitle,
itemRender: itemRender,
page: -1
};
var prevPage = current - 1 > 0 ? current - 1 : 0;
var nextPage = current + 1 < allPages ? current + 1 : allPages;
var goButton = showQuickJumper && showQuickJumper.goButton;
// ================== Simple ==================
// FIXME: ts type
var isReadOnly = _typeof(simple) === 'object' ? simple.readOnly : !simple;
var gotoButton = goButton;
var simplePager = null;
if (simple) {
// ====== Simple quick jump ======
if (goButton) {
if (typeof goButton === 'boolean') {
gotoButton = /*#__PURE__*/React.createElement("button", {
type: "button",
onClick: handleGoTO,
onKeyUp: handleGoTO
}, locale.jump_to_confirm);
} else {
gotoButton = /*#__PURE__*/React.createElement("span", {
onClick: handleGoTO,
onKeyUp: handleGoTO
}, goButton);
}
gotoButton = /*#__PURE__*/React.createElement("li", {
title: showTitle ? "".concat(locale.jump_to).concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager")
}, gotoButton);
}
simplePager = /*#__PURE__*/React.createElement("li", {
title: showTitle ? "".concat(current, "/").concat(allPages) : null,
className: "".concat(prefixCls, "-simple-pager")
}, isReadOnly ? internalInputVal : /*#__PURE__*/React.createElement("input", {
type: "text",
value: internalInputVal,
disabled: disabled,
onKeyDown: handleKeyDown,
onKeyUp: handleKeyUp,
onChange: handleKeyUp,
onBlur: handleBlur,
size: 3
}), /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-slash")
}, "/"), allPages);
}
// ====================== Normal ======================
var pageBufferSize = showLessItems ? 1 : 2;
if (allPages <= 3 + pageBufferSize * 2) {
if (!allPages) {
pagerList.push( /*#__PURE__*/React.createElement(Pager, _extends({}, pagerProps, {
key: "noPager",
page: 1,
className: "".concat(prefixCls, "-item-disabled")
})));
}
for (var i = 1; i <= allPages; i += 1) {
pagerList.push( /*#__PURE__*/React.createElement(Pager, _extends({}, pagerProps, {
key: i,
page: i,
active: current === i
})));
}
} else {
var prevItemTitle = showLessItems ? locale.prev_3 : locale.prev_5;
var nextItemTitle = showLessItems ? locale.next_3 : locale.next_5;
var jumpPrevContent = itemRender(jumpPrevPage, 'jump-prev', getItemIcon(jumpPrevIcon, 'prev page'));
var jumpNextContent = itemRender(jumpNextPage, 'jump-next', getItemIcon(jumpNextIcon, 'next page'));
if (showPrevNextJumpers) {
jumpPrev = jumpPrevContent ? /*#__PURE__*/React.createElement("li", {
title: showTitle ? prevItemTitle : null,
key: "prev",
onClick: jumpPrevHandle,
tabIndex: 0,
onKeyDown: runIfEnterJumpPrev,
className: classNames("".concat(prefixCls, "-jump-prev"), _defineProperty({}, "".concat(prefixCls, "-jump-prev-custom-icon"), !!jumpPrevIcon))
}, jumpPrevContent) : null;
jumpNext = jumpNextContent ? /*#__PURE__*/React.createElement("li", {
title: showTitle ? nextItemTitle : null,
key: "next",
onClick: jumpNextHandle,
tabIndex: 0,
onKeyDown: runIfEnterJumpNext,
className: classNames("".concat(prefixCls, "-jump-next"), _defineProperty({}, "".concat(prefixCls, "-jump-next-custom-icon"), !!jumpNextIcon))
}, jumpNextContent) : null;
}
var left = Math.max(1, current - pageBufferSize);
var right = Math.min(current + pageBufferSize, allPages);
if (current - 1 <= pageBufferSize) {
right = 1 + pageBufferSize * 2;
}
if (allPages - current <= pageBufferSize) {
left = allPages - pageBufferSize * 2;
}
for (var _i = left; _i <= right; _i += 1) {
pagerList.push( /*#__PURE__*/React.createElement(Pager, _extends({}, pagerProps, {
key: _i,
page: _i,
active: current === _i
})));
}
if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) {
pagerList[0] = /*#__PURE__*/React.cloneElement(pagerList[0], {
className: classNames("".concat(prefixCls, "-item-after-jump-prev"), pagerList[0].props.className)
});
pagerList.unshift(jumpPrev);
}
if (allPages - current >= pageBufferSize * 2 && current !== allPages - 2) {
var lastOne = pagerList[pagerList.length - 1];
pagerList[pagerList.length - 1] = /*#__PURE__*/React.cloneElement(lastOne, {
className: classNames("".concat(prefixCls, "-item-before-jump-next"), lastOne.props.className)
});
pagerList.push(jumpNext);
}
if (left !== 1) {
pagerList.unshift( /*#__PURE__*/React.createElement(Pager, _extends({}, pagerProps, {
key: 1,
page: 1
})));
}
if (right !== allPages) {
pagerList.push( /*#__PURE__*/React.createElement(Pager, _extends({}, pagerProps, {
key: allPages,
page: allPages
})));
}
}
var prev = renderPrev(prevPage);
if (prev) {
var prevDisabled = !hasPrev || !allPages;
prev = /*#__PURE__*/React.createElement("li", {
title: showTitle ? locale.prev_page : null,
onClick: prevHandle,
tabIndex: prevDisabled ? null : 0,
onKeyDown: runIfEnterPrev,
className: classNames("".concat(prefixCls, "-prev"), _defineProperty({}, "".concat(prefixCls, "-disabled"), prevDisabled)),
"aria-disabled": prevDisabled
}, prev);
}
var next = renderNext(nextPage);
if (next) {
var nextDisabled, nextTabIndex;
if (simple) {
nextDisabled = !hasNext;
nextTabIndex = hasPrev ? 0 : null;
} else {
nextDisabled = !hasNext || !allPages;
nextTabIndex = nextDisabled ? null : 0;
}
next = /*#__PURE__*/React.createElement("li", {
title: showTitle ? locale.next_page : null,
onClick: nextHandle,
tabIndex: nextTabIndex,
onKeyDown: runIfEnterNext,
className: classNames("".concat(prefixCls, "-next"), _defineProperty({}, "".concat(prefixCls, "-disabled"), nextDisabled)),
"aria-disabled": nextDisabled
}, next);
}
var cls = classNames(prefixCls, className, (_classNames5 = {}, _defineProperty(_classNames5, "".concat(prefixCls, "-start"), align === 'start'), _defineProperty(_classNames5, "".concat(prefixCls, "-center"), align === 'center'), _defineProperty(_classNames5, "".concat(prefixCls, "-end"), align === 'end'), _defineProperty(_classNames5, "".concat(prefixCls, "-simple"), simple), _defineProperty(_classNames5, "".concat(prefixCls, "-disabled"), disabled), _classNames5));
return /*#__PURE__*/React.createElement("ul", _extends({
className: cls,
style: style,
ref: paginationRef
}, dataOrAriaAttributeProps), totalText, prev, simple ? simplePager : pagerList, next, /*#__PURE__*/React.createElement(Options, {
locale: locale,
rootPrefixCls: prefixCls,
disabled: disabled,
selectComponentClass: selectComponentClass,
selectPrefixCls: selectPrefixCls,
changeSize: showSizeChanger ? changePageSize : null,
pageSize: pageSize,
pageSizeOptions: pageSizeOptions,
quickGo: shouldDisplayQuickJumper ? handleChange : null,
goButton: gotoButton
}));
};
if (process.env.NODE_ENV !== 'production') {
Pagination.displayName = 'Pagination';
}
export default Pagination;