import React from 'react'; import {Renderer, RendererProps} from '../factory'; import {autobind} from '../utils/helper'; import {Icon} from '../components/icons'; import {BaseSchema, SchemaClassName} from '../Schema'; export interface PaginationSchema extends BaseSchema { type: 'pagination'; className?: SchemaClassName; /** * 是否显示快速跳转输入框 */ showPageInput?: boolean; /** * 模式,默认显示多个分页数字,如果只想简单显示可以配置成 `simple`。 */ mode?: 'simple' | 'normal'; /** * 最多显示多少个分页按钮。 * * @default 5 */ maxButtons?: number; } export interface PaginationProps extends RendererProps, Omit { activePage: number; lastPage: number; hasNext: boolean; maxButtons: number; onPageChange: (page: number, perPage?: number) => void; } export interface PaginationState { pageNum: string; } export default class Pagination extends React.Component< PaginationProps, PaginationState > { static defaultProps = { activePage: 1, lastPage: 1, maxButtons: 5, mode: 'normal', hasNext: false, showPageInput: false }; state = { pageNum: String(this.props.activePage) || '' }; componentWillReceiveProps(nextProps: PaginationProps) { if (this.props.activePage !== nextProps.activePage) { this.setState({ pageNum: String(nextProps.activePage) || '' }); } } renderSimple() { const {activePage, hasNext, onPageChange, classnames: cx} = this.props; return ( ); } @autobind handlePageChange(e: React.ChangeEvent) { const {lastPage} = this.props; let value = e.currentTarget.value; if (/^\d+$/.test(value) && parseInt(value, 10) > lastPage) { value = String(lastPage); } this.setState({pageNum: value}); } renderNormal() { let { activePage, lastPage, maxButtons, onPageChange, classnames: cx, showPageInput, className, translate: __ } = this.props; const pageNum = this.state.pageNum; let pageButtons: any = []; let startPage: number; let endPage: number; if (activePage < (maxButtons - 1) / 2 + 2) { maxButtons = activePage + (maxButtons - 1) / 2; } if (lastPage - activePage < (maxButtons - 1) / 2 + 2) { maxButtons = lastPage - activePage + (maxButtons - 1) / 2 + 1; } if (maxButtons && maxButtons < lastPage) { startPage = Math.max( Math.min( activePage - Math.floor(maxButtons / 2), lastPage - maxButtons + 1 ), 1 ); endPage = startPage + maxButtons - 1; } else { startPage = 1; endPage = lastPage; } for (let page = startPage; page <= endPage; ++page) { pageButtons.push(
  • onPageChange(page)} key={page} className={cx({ 'is-active': page === activePage })} > {page}
  • ); } if (startPage > 1) { if (startPage > 2) { pageButtons.unshift(
  • onPageChange(startPage - 1)} key="prev-ellipsis"> ...
  • ); } pageButtons.unshift(
  • onPageChange(1)} key={1} className={cx({ 'is-active': 1 === activePage })} > {1}
  • ); } if (endPage < lastPage) { if (lastPage - endPage > 1) { pageButtons.push(
  • onPageChange(endPage + 1)} key="next-ellipsis" > ...
  • ); } pageButtons.push(
  • onPageChange(lastPage)} key={lastPage} className={cx({ 'is-active': lastPage === activePage })} > {lastPage}
  • ); } pageButtons.unshift(
  • e.preventDefault() : () => onPageChange(activePage - 1) } key="prev" >
  • ); pageButtons.push(
  • e.preventDefault() : () => onPageChange(activePage + 1) } key="next" >
  • ); return (
      {pageButtons}
    {showPageInput === true || lastPage > 9 ? (
    {__('CRUD.paginationGoText')} e.currentTarget.select()} onKeyUp={(e: any) => e.keyCode == 13 && onPageChange(parseInt(e.currentTarget.value, 10)) } value={pageNum} /> {__('CRUD.paginationPageText')}
    ) : null}
    ); } render() { const {mode} = this.props; return mode === 'simple' ? this.renderSimple() : this.renderNormal(); } } @Renderer({ test: /(^|\/)(?:pagination|pager)$/, name: 'pagination' }) export class PaginationRenderer extends Pagination {}