UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

484 lines (423 loc) 14.4 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _KeyboardArrowRight = _interopRequireDefault(require("@material-ui/icons/KeyboardArrowRight")); var _KeyboardArrowLeft = _interopRequireDefault(require("@material-ui/icons/KeyboardArrowLeft")); var _FirstPage = _interopRequireDefault(require("@material-ui/icons/FirstPage")); var _LastPage = _interopRequireDefault(require("@material-ui/icons/LastPage")); var _Input = _interopRequireDefault(require("../Input")); var _MenuItem = _interopRequireDefault(require("../MenuItem")); var _Typography = _interopRequireDefault(require("../Typography")); var _IconButton = _interopRequireDefault(require("../IconButton")); var _SelectStandalone = _interopRequireDefault(require("../Select/SelectStandalone")); var _LocaleProvider = require("../LocaleProvider"); var _withStyles = _interopRequireDefault(require("../styles/withStyles")); /** * @ignore - do not document. */ var styles = function styles(theme) { return { root: { fontSize: theme.typography.pxToRem(12), '&:last-child': { padding: 0 } }, toolbar: { height: 56, minHeight: 56, paddingRight: 2, position: 'relative', display: 'flex', alignItems: 'center' }, spacer: { flex: '1 1 100%' }, menuItem: {}, caption: { flexShrink: 0 }, firstpage: { cursor: 'pointer', marginLeft: 10 }, lastpage: { cursor: 'pointer', marginRight: 10 }, input: { fontSize: 'inherit', flexShrink: 0 }, pageinput: { fontSize: 12, width: 50, height: 28, cursor: 'text', color: '#666', padding: '0 7px', border: 'solid 1px #d9d9d9', borderRadius: 6, margin: '0 8px', '&:focus': { borderColor: 'blue', transition: 'all 0.3s' }, '&:hove': { transition: 'all 0.3s', borderColor: 'blue' } }, selectRoot: { marginRight: theme.spacing(4), marginLeft: theme.spacing(1), color: theme.palette.text.secondary }, select: { paddingLeft: theme.spacing(1), paddingRight: theme.spacing(2) }, jump: { lineHeight: '28px' }, selectIcon: { top: 1 }, actions: { flexShrink: 0, color: theme.palette.text.secondary, marginLeft: theme.spacing(2.5) }, textbutton: { fontSize: '0.75rem', fontWeight: 400 } }; }; var Pagination = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(Pagination, _Component); function Pagination(props) { var _this; (0, _classCallCheck2.default)(this, Pagination); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Pagination).call(this, props)); _this.state = { minwidth: true, value: 1 }; return _this; } (0, _createClass2.default)(Pagination, [{ key: "componentDidMount", value: function componentDidMount() { // 分页的宽度小于200px时,只显示前后页按钮 if (this.div.clientWidth < 250) { this.setState({ minwidth: false }); } this.props.onChangePage(this.props.page); } }, { key: "componentDidUpdate", value: function componentDidUpdate() { var _this$props = this.props, count = _this$props.count, onChangePage = _this$props.onChangePage, page = _this$props.page, rowsPerPage = _this$props.rowsPerPage; var newLastPage = Math.max(0, Math.ceil(count / rowsPerPage) - 1); if (page > newLastPage) { onChangePage(newLastPage); } } }, { key: "createPage", value: function createPage() { var _this2 = this; var _this$props2 = this.props, classes = _this$props2.classes, page = _this$props2.page, rowsPerPage = _this$props2.rowsPerPage, count = _this$props2.count, backIconButtonProps = _this$props2.backIconButtonProps, nextIconButtonProps = _this$props2.nextIconButtonProps, labelDisplayedRows = _this$props2.labelDisplayedRows, labelRowsPerPage = _this$props2.labelRowsPerPage, onChangeRowsPerPage = _this$props2.onChangeRowsPerPage, rowsPerPageOptions = _this$props2.rowsPerPageOptions, SelectProps = _this$props2.SelectProps, showSizeChanger = _this$props2.showSizeChanger, showQuickJumper = _this$props2.showQuickJumper, showTwoEnds = _this$props2.showTwoEnds, homePage = _this$props2.homePage, lastPage = _this$props2.lastPage, prePage = _this$props2.prePage, nextPage = _this$props2.nextPage, jumpTo = _this$props2.jumpTo, pageName = _this$props2.pageName, noIcon = _this$props2.noIcon; var _this$state = this.state, minwidth = _this$state.minwidth, value = _this$state.value; var totalPage = Math.ceil(count / rowsPerPage); return _react.default.createElement("div", { className: classes.root, ref: function ref(div) { return _this2.div = div; } }, _react.default.createElement("div", { className: classes.toolbar }, _react.default.createElement("div", { className: classes.spacer }), rowsPerPageOptions.length > 1 && showSizeChanger && _react.default.createElement(_Typography.default, { variant: "caption", className: classes.caption }, labelRowsPerPage), rowsPerPageOptions.length > 1 && showSizeChanger && _react.default.createElement(_SelectStandalone.default, (0, _extends2.default)({ classes: { root: classes.selectRoot, select: classes.select, icon: classes.selectIcon }, input: _react.default.createElement(_Input.default, { className: classes.input, disableUnderline: true }), value: rowsPerPage, onChange: onChangeRowsPerPage }, SelectProps), rowsPerPageOptions.map(function (rowsPerPageOption) { return _react.default.createElement(_MenuItem.default, { className: classes.menuItem, key: rowsPerPageOption, value: rowsPerPageOption }, rowsPerPageOption); })), _react.default.createElement(_Typography.default, { variant: "caption", className: classes.caption }, minwidth ? labelDisplayedRows({ from: count === 0 ? 0 : page * rowsPerPage + 1, to: Math.min(count, (page + 1) * rowsPerPage), count: count, page: page }) : null), showTwoEnds ? _react.default.createElement(_IconButton.default, { onClick: this.goEnd.bind(this, 'first'), disabled: page === 0, "aria-label": "Last Page" }, noIcon ? _react.default.createElement("span", { className: classes.textbutton }, homePage) : _react.default.createElement(_FirstPage.default, null)) : null, _react.default.createElement(_IconButton.default, (0, _extends2.default)({ onClick: this.prePageHandeler.bind(this), disabled: page === 0 }, backIconButtonProps), noIcon ? _react.default.createElement("span", { className: classes.textbutton }, prePage) : _react.default.createElement(_KeyboardArrowLeft.default, null)), _react.default.createElement(_IconButton.default, (0, _extends2.default)({ onClick: this.nextPageHandeler.bind(this), disabled: page >= totalPage - 1 }, nextIconButtonProps), noIcon ? _react.default.createElement("span", { className: classes.textbutton }, nextPage) : _react.default.createElement(_KeyboardArrowRight.default, null)), showTwoEnds ? _react.default.createElement(_IconButton.default, { onClick: this.goEnd.bind(this, 'last'), disabled: page >= totalPage - 1, "aria-label": "Last Page" }, noIcon ? _react.default.createElement("span", { className: classes.textbutton }, lastPage) : _react.default.createElement(_LastPage.default, null)) : null, showQuickJumper ? _react.default.createElement(_Typography.default, { variant: "caption", className: "".concat(classes.caption, " ").concat(classes.jump) }, jumpTo, _react.default.createElement(_Input.default, { className: classes.pageinput, disableUnderline: true, type: "number", value: value, onChange: this.jumpTo.bind(this) }), pageName) : null)); } }, { key: "pageClick", value: function pageClick(page) { var getCurrentPage = this.props.onChangePage; // 将当前页码返回父组件 getCurrentPage(page); } }, { key: "prePageHandeler", value: function prePageHandeler() { var page = this.props.page; if (--page === -1) { return false; } this.pageClick(page); } }, { key: "nextPageHandeler", value: function nextPageHandeler() { var _this$props3 = this.props, page = _this$props3.page, count = _this$props3.count, rowsPerPage = _this$props3.rowsPerPage; var totalPage = Math.ceil(count / rowsPerPage); if (++page > totalPage) { return false; } this.pageClick(page); } }, { key: "goEnd", value: function goEnd(param) { var _this$props4 = this.props, rowsPerPage = _this$props4.rowsPerPage, count = _this$props4.count, onChangePage = _this$props4.onChangePage; var totalPage = Math.ceil(count / rowsPerPage); var getCurrentPage = onChangePage; if (param === 'first') { getCurrentPage(0); } if (param === 'last') { getCurrentPage(totalPage - 1); } } }, { key: "jumpTo", value: function jumpTo(e) { var _this3 = this; var _this$props5 = this.props, rowsPerPage = _this$props5.rowsPerPage, count = _this$props5.count, onChangePage = _this$props5.onChangePage; var totalPage = Math.ceil(count / rowsPerPage); this.setState({ value: e.target.value }, function () { var value = _this3.state.value; if (value < 1) { onChangePage(0); _this3.setState({ value: 1 }); } if (value > 0 && value <= totalPage) { onChangePage(value - 1); } if (value > totalPage) { onChangePage(totalPage - 1); _this3.setState({ value: totalPage }); } }); } }, { key: "render", value: function render() { return this.createPage(); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(nextProps, prevState) { if (nextProps !== prevState.preProps) { return { value: nextProps.page + 1, preProps: nextProps }; } return null; } }]); return Pagination; }(_react.Component); Pagination.propTypes = { /** * Properties applied to the back arrow `IconButton` component. */ backIconButtonProps: _propTypes.default.object, /** * Override or extend the styles applied to the component. * See [CSS API](#css-api) below for more details. */ classes: _propTypes.default.object.isRequired, /** * This is total count of pagination */ count: _propTypes.default.number, /** * Useful to customize the rows per page label. Invoked with a { from, to, count, page } object. */ labelDisplayedRows: _propTypes.default.func, /** * Customize the displayed rows label. */ labelRowsPerPage: _propTypes.default.node, /** * Properties applied to the next arrow `IconButton` element. */ nextIconButtonProps: _propTypes.default.object, /** * Customizes the options of the rows per page select field. If less than two options are available, no select field will be displayed. */ noIcon: _propTypes.default.bool, /** * This is call current page back to parent component */ onChangePage: _propTypes.default.func.isRequired, /** * Callback fired when the number of rows per page is changed. */ onChangeRowsPerPage: _propTypes.default.func, /** * The zero-based index of the current page. */ page: _propTypes.default.number, /** * This is page size of pagination */ rowsPerPage: _propTypes.default.number, /** * Use text alternative icon for next page、pre page、last page and first page */ rowsPerPageOptions: _propTypes.default.array, /** * show quick jumper ,jump to xx page. */ showQuickJumper: _propTypes.default.bool, /** * show jump to first and last page button. */ showSizeChanger: _propTypes.default.bool, /** * Whether to show buttons(first and last page) or not? */ showTwoEnds: _propTypes.default.bool }; Pagination.defaultProps = { page: 0, rowsPerPage: 5, count: 0, labelRowsPerPage: 'Rows per page:', rowsPerPageOptions: [5, 10, 25], labelDisplayedRows: function labelDisplayedRows(_ref) { var from = _ref.from, to = _ref.to, count = _ref.count; return "".concat(from, "-").concat(to, " of ").concat(count); } }; var _default = (0, _withStyles.default)(styles, { name: 'RMPagination' })((0, _LocaleProvider.withLocale)({ name: 'Pagination' })(Pagination)); exports.default = _default;