UNPKG

yqcloud-ui

Version:

An enterprise-class UI design language and React-based implementation

622 lines (528 loc) 21.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _Pager = require('./Pager'); var _Pager2 = _interopRequireDefault(_Pager); var _Options = require('./Options'); var _Options2 = _interopRequireDefault(_Options); var _KeyCode = require('./KeyCode'); var _KeyCode2 = _interopRequireDefault(_KeyCode); var _zh_CN = require('./locale/zh_CN'); var _zh_CN2 = _interopRequireDefault(_zh_CN); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function noop() {} function isInteger(value) { return typeof value === 'number' && isFinite(value) && Math.floor(value) === value; } function defaultItemRender(page, type, element) { return element; } var Pagination = function (_React$Component) { (0, _inherits3['default'])(Pagination, _React$Component); function Pagination(props) { (0, _classCallCheck3['default'])(this, Pagination); var _this = (0, _possibleConstructorReturn3['default'])(this, _React$Component.call(this, props)); _initialiseProps.call(_this); var hasOnChange = props.onChange !== noop; var hasCurrent = 'current' in props; if (hasCurrent && !hasOnChange) { console.warn('Warning: You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.'); // eslint-disable-line } var current = props.defaultCurrent; if ('current' in props) { current = props.current; } var pageSize = props.defaultPageSize; if ('pageSize' in props) { pageSize = props.pageSize; } _this.state = { current: current, currentInputValue: current, pageSize: pageSize }; return _this; } Pagination.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if ('current' in nextProps) { this.setState({ current: nextProps.current, currentInputValue: nextProps.current }); } if ('pageSize' in nextProps) { var newState = {}; var current = this.state.current; var newCurrent = this.calculatePage(nextProps.pageSize); current = current > newCurrent ? newCurrent : current; if (!('current' in nextProps)) { newState.current = current; newState.currentInputValue = current; } newState.pageSize = nextProps.pageSize; this.setState(newState); } }; Pagination.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { // When current page change, fix focused style of prev item // A hacky solution of https://github.com/ant-design/ant-design/issues/8948 var prefixCls = this.props.prefixCls; if (prevState.current !== this.state.current && this.paginationNode) { var lastCurrentNode = this.paginationNode.querySelector('.' + prefixCls + '-item-' + prevState.current); if (lastCurrentNode && document.activeElement === lastCurrentNode) { lastCurrentNode.blur(); } } }; Pagination.prototype.getJumpPrevPage = function getJumpPrevPage() { return Math.max(1, this.state.current - (this.props.showLessItems ? 3 : 5)); }; Pagination.prototype.getJumpNextPage = function getJumpNextPage() { return Math.min(this.calculatePage(), this.state.current + (this.props.showLessItems ? 3 : 5)); }; Pagination.prototype.getJumpPrevPage = function getJumpPrevPage() { return Math.max(1, this.state.current - (this.props.showLessItems ? 3 : 5)); }; Pagination.prototype.getJumpNextPage = function getJumpNextPage() { return Math.min(this.calculatePage(), this.state.current + (this.props.showLessItems ? 3 : 5)); }; Pagination.prototype.render = function render() { // When hideOnSinglePage is true and there is only 1 page, hide the pager if (this.props.hideOnSinglePage === true && this.props.total <= this.state.pageSize) { return null; } var props = this.props; var locale = props.locale; var prefixCls = props.prefixCls; var allPages = this.calculatePage(); var pagerList = []; var jumpPrev = null; var jumpNext = null; var firstPager = null; var lastPager = null; var gotoButton = null; var goButton = props.showQuickJumper && props.showQuickJumper.goButton; var pageBufferSize = props.showLessItems ? 1 : 2; var _state = this.state, current = _state.current, pageSize = _state.pageSize; var prevPage = current - 1 > 0 ? current - 1 : 0; var nextPage = current + 1 < allPages ? current + 1 : allPages; if (props.simple) { if (goButton) { if (typeof goButton === 'boolean') { gotoButton = _react2['default'].createElement('button', { type: 'button', onClick: this.handleGoTO, onKeyUp: this.handleGoTO }, locale.jump_to_confirm); } else { gotoButton = _react2['default'].createElement('span', { onClick: this.handleGoTO, onKeyUp: this.handleGoTO }, goButton); } gotoButton = _react2['default'].createElement('li', { title: props.showTitle ? '' + locale.jump_to + this.state.current + '/' + allPages : null, className: prefixCls + '-simple-pager' }, gotoButton); } return _react2['default'].createElement('ul', { className: prefixCls + ' ' + prefixCls + '-simple ' + props.className, style: props.style }, _react2['default'].createElement('li', { title: props.showTitle ? locale.prev_page : null, onClick: this.prev, tabIndex: this.hasPrev() ? 0 : null, onKeyPress: this.runIfEnterPrev, className: (this.hasPrev() ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-prev', 'aria-disabled': !this.hasPrev() }, props.itemRender(prevPage, 'prev', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), !this.hasPrev(), 'small')), _react2['default'].createElement('li', { title: props.showTitle ? this.state.current + '/' + allPages : null, className: prefixCls + '-simple-pager' }, _react2['default'].createElement('input', { type: 'text', value: this.state.currentInputValue, onKeyDown: this.handleKeyDown, onKeyUp: this.handleKeyUp, onChange: this.handleKeyUp, size: '3' }), _react2['default'].createElement('span', { className: prefixCls + '-slash' }, '\uFF0F'), allPages), _react2['default'].createElement('li', { title: props.showTitle ? locale.next_page : null, onClick: this.next, tabIndex: this.hasPrev() ? 0 : null, onKeyPress: this.runIfEnterNext, className: (this.hasNext() ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-next', 'aria-disabled': !this.hasNext() }, props.itemRender(nextPage, 'next', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), !this.hasNext(), 'small')), gotoButton); } if (allPages <= 5 + pageBufferSize * 2) { for (var i = 1; i <= allPages; i++) { var active = this.state.current === i; pagerList.push(_react2['default'].createElement(_Pager2['default'], { size: props.size, locale: locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: i, page: i, active: active, showTitle: props.showTitle, itemRender: props.itemRender })); } } else { var prevItemTitle = props.showLessItems ? locale.prev_3 : locale.prev_5; var nextItemTitle = props.showLessItems ? locale.next_3 : locale.next_5; if (props.showPrevNextJumpers) { jumpPrev = _react2['default'].createElement('li', { title: props.showTitle ? prevItemTitle : null, key: 'prev', onClick: this.jumpPrev, tabIndex: '0', onKeyPress: this.runIfEnterJumpPrev, className: prefixCls + '-jump-prev' }, props.itemRender(this.getJumpPrevPage(), 'jump-prev', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }, '\u2022\u2022\u2022'), props.size)); jumpNext = _react2['default'].createElement('li', { title: props.showTitle ? nextItemTitle : null, key: 'next', tabIndex: '0', onClick: this.jumpNext, onKeyPress: this.runIfEnterJumpNext, className: prefixCls + '-jump-next' }, props.itemRender(this.getJumpNextPage(), 'jump-next', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }, '\u2022\u2022\u2022'), props.size)); } lastPager = _react2['default'].createElement(_Pager2['default'], { size: props.size, locale: props.locale, last: true, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: allPages, page: allPages, active: false, showTitle: props.showTitle, itemRender: props.itemRender }); firstPager = _react2['default'].createElement(_Pager2['default'], { size: props.size, locale: props.locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: 1, page: 1, active: false, showTitle: props.showTitle, itemRender: props.itemRender }); 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++) { var _active = current === _i; pagerList.push(_react2['default'].createElement(_Pager2['default'], { size: props.size, locale: props.locale, rootPrefixCls: prefixCls, onClick: this.handleChange, onKeyPress: this.runIfEnter, key: _i, page: _i, active: _active, showTitle: props.showTitle, itemRender: props.itemRender })); } if (current - 1 >= pageBufferSize * 2 && current !== 1 + 2) { pagerList[0] = _react2['default'].cloneElement(pagerList[0], { className: prefixCls + '-item-after-jump-prev' }); pagerList.unshift(jumpPrev); } if (allPages - current >= pageBufferSize * 2 && current !== allPages - 2) { pagerList[pagerList.length - 1] = _react2['default'].cloneElement(pagerList[pagerList.length - 1], { className: prefixCls + '-item-before-jump-next' }); pagerList.push(jumpNext); } if (left !== 1) { pagerList.unshift(firstPager); } if (right !== allPages) { pagerList.push(lastPager); } } var totalText = null; if (props.showTotal) { totalText = _react2['default'].createElement('li', { className: prefixCls + '-total-text' }, props.showTotal(props.total, [(current - 1) * pageSize + 1, current * pageSize > props.total ? props.total : current * pageSize])); } if (props.tiny) { var fistDisabled = !this.hasPrev(); var lastDisabled = !this.hasNext(); firstPager = _react2['default'].createElement('li', { title: props.showTitle ? locale.first_page : null, onClick: this.first, tabIndex: fistDisabled ? null : 0, onKeyPress: this.runIfEnterFirst, className: (!fistDisabled ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-first', 'aria-disabled': fistDisabled }, props.itemRender(1, 'first', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), fistDisabled, props.size)); lastPager = _react2['default'].createElement('li', { title: props.showTitle ? locale.last_page : null, onClick: this.last, tabIndex: lastDisabled ? null : 0, onKeyPress: this.runIfEnterLast, className: (!lastDisabled ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-last', 'aria-disabled': lastDisabled }, props.itemRender(allPages, 'last', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), lastDisabled, props.size)); } var prevDisabled = !this.hasPrev(); var nextDisabled = !this.hasNext(); var sizeChanger = _react2['default'].createElement(_Options2['default'], { locale: props.locale, rootPrefixCls: prefixCls, selectComponentClass: props.selectComponentClass, selectPrefixCls: props.selectPrefixCls, changeSize: this.props.showSizeChanger ? this.changePageSize : null, current: this.state.current, pageSize: this.state.pageSize, pageSizeOptions: this.props.pageSizeOptions, quickGo: this.props.showQuickJumper ? this.handleChange : null, goButton: goButton, buildOptionText: props.sizeChangerOptionText, changeSizeLabel: this.props.showSizeChangerLabel }); var classString = (0, _classnames2['default'])(prefixCls, props.className, (0, _defineProperty3['default'])({}, prefixCls + '-tiny', props.tiny)); return _react2['default'].createElement('ul', { className: classString, style: props.style, unselectable: 'unselectable', ref: this.savePaginationNode }, props.tiny && sizeChanger, totalText, props.tiny && firstPager, _react2['default'].createElement('li', { title: props.showTitle ? locale.prev_page : null, onClick: this.prev, tabIndex: prevDisabled ? null : 0, onKeyPress: this.runIfEnterPrev, className: (!prevDisabled ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-prev', 'aria-disabled': prevDisabled }, props.itemRender(prevPage, 'prev', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), prevDisabled, props.size)), !props.tiny && pagerList, _react2['default'].createElement('li', { title: props.showTitle ? locale.next_page : null, onClick: this.next, tabIndex: nextDisabled ? null : 0, onKeyPress: this.runIfEnterNext, className: (!nextDisabled ? '' : prefixCls + '-disabled') + ' ' + prefixCls + '-next', 'aria-disabled': nextDisabled }, props.itemRender(nextPage, 'next', _react2['default'].createElement('a', { className: prefixCls + '-item-link' }), nextDisabled, props.size)), props.tiny ? lastPager : sizeChanger); }; return Pagination; }(_react2['default'].Component); Pagination.propTypes = { prefixCls: _propTypes2['default'].string, current: _propTypes2['default'].number, defaultCurrent: _propTypes2['default'].number, total: _propTypes2['default'].number, pageSize: _propTypes2['default'].number, defaultPageSize: _propTypes2['default'].number, onChange: _propTypes2['default'].func, hideOnSinglePage: _propTypes2['default'].bool, showSizeChanger: _propTypes2['default'].bool, showLessItems: _propTypes2['default'].bool, onShowSizeChange: _propTypes2['default'].func, selectComponentClass: _propTypes2['default'].func, showPrevNextJumpers: _propTypes2['default'].bool, showQuickJumper: _propTypes2['default'].oneOfType([_propTypes2['default'].bool, _propTypes2['default'].object]), showTitle: _propTypes2['default'].bool, pageSizeOptions: _propTypes2['default'].arrayOf(_propTypes2['default'].string), showTotal: _propTypes2['default'].func, locale: _propTypes2['default'].object, style: _propTypes2['default'].object, itemRender: _propTypes2['default'].func, tiny: _propTypes2['default'].bool }; Pagination.defaultProps = { defaultCurrent: 1, total: 0, defaultPageSize: 10, onChange: noop, className: '', selectPrefixCls: 'rc-select', prefixCls: 'rc-pagination', selectComponentClass: null, hideOnSinglePage: false, showPrevNextJumpers: true, showQuickJumper: false, showSizeChanger: false, showLessItems: false, showTitle: true, onShowSizeChange: noop, locale: _zh_CN2['default'], style: {}, itemRender: defaultItemRender }; var _initialiseProps = function _initialiseProps() { var _this2 = this; this.savePaginationNode = function (node) { _this2.paginationNode = node; }; this.calculatePage = function (p) { var pageSize = p; if (typeof pageSize === 'undefined') { pageSize = _this2.state.pageSize; } return Math.floor((_this2.props.total - 1) / pageSize) + 1; }; this.isValid = function (page) { return isInteger(page) && page >= 1 && page !== _this2.state.current; }; this.handleKeyDown = function (e) { if (e.keyCode === _KeyCode2['default'].ARROW_UP || e.keyCode === _KeyCode2['default'].ARROW_DOWN) { e.preventDefault(); } }; this.handleKeyUp = function (e) { var inputValue = e.target.value; var currentInputValue = _this2.state.currentInputValue; var value = void 0; if (inputValue === '') { value = inputValue; } else if (isNaN(Number(inputValue))) { value = currentInputValue; } else { value = Number(inputValue); } if (value !== currentInputValue) { _this2.setState({ currentInputValue: value }); } if (e.keyCode === _KeyCode2['default'].ENTER) { _this2.handleChange(value); } else if (e.keyCode === _KeyCode2['default'].ARROW_UP) { _this2.handleChange(value - 1); } else if (e.keyCode === _KeyCode2['default'].ARROW_DOWN) { _this2.handleChange(value + 1); } }; this.changePageSize = function (size) { var current = _this2.state.current; var newCurrent = _this2.calculatePage(size); current = current > newCurrent ? newCurrent : current; if (typeof size === 'number') { if (!('pageSize' in _this2.props)) { _this2.setState({ pageSize: size }); } if (!('current' in _this2.props)) { _this2.setState({ current: current, currentInputValue: current }); } } _this2.props.onShowSizeChange(current, size); }; this.handleChange = function (p) { var page = p; if (_this2.isValid(page)) { if (page > _this2.calculatePage()) { page = _this2.calculatePage(); } if (!('current' in _this2.props)) { _this2.setState({ current: page, currentInputValue: page }); } var pageSize = _this2.state.pageSize; _this2.props.onChange(page, pageSize); return page; } return _this2.state.current; }; this.first = function () { if (_this2.hasPrev()) { _this2.handleChange(1); } }; this.last = function () { if (_this2.hasNext()) { _this2.handleChange(_this2.calculatePage()); } }; this.prev = function () { if (_this2.hasPrev()) { _this2.handleChange(_this2.state.current - 1); } }; this.next = function () { if (_this2.hasNext()) { _this2.handleChange(_this2.state.current + 1); } }; this.jumpPrev = function () { _this2.handleChange(_this2.getJumpPrevPage()); }; this.jumpNext = function () { _this2.handleChange(_this2.getJumpNextPage()); }; this.hasPrev = function () { return _this2.state.current > 1; }; this.hasNext = function () { return _this2.state.current < _this2.calculatePage(); }; this.runIfEnter = function (event, callback) { for (var _len = arguments.length, restParams = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { restParams[_key - 2] = arguments[_key]; } if (event.key === 'Enter' || event.charCode === 13) { callback.apply(undefined, restParams); } }; this.runIfEnterFirst = function (e) { _this2.runIfEnter(e, _this2.first); }; this.runIfEnterLast = function (e) { _this2.runIfEnter(e, _this2.last); }; this.runIfEnterPrev = function (e) { _this2.runIfEnter(e, _this2.prev); }; this.runIfEnterNext = function (e) { _this2.runIfEnter(e, _this2.next); }; this.runIfEnterJumpPrev = function (e) { _this2.runIfEnter(e, _this2.jumpPrev); }; this.runIfEnterJumpNext = function (e) { _this2.runIfEnter(e, _this2.jumpNext); }; this.handleGoTO = function (e) { if (e.keyCode === _KeyCode2['default'].ENTER || e.type === 'click') { _this2.handleChange(_this2.state.currentInputValue); } }; }; exports['default'] = Pagination; module.exports = exports['default'];