import { tag, WeElement, h, extractClass } from 'omi' import * as css from './index.scss' //@ts-ignore import '../theme.ts' interface Props { total: number, pageSize: number, numDisplay: number, currentPage: number, numEdge: number, linkTo: string, prevText: string, nextText: string, ellipseText: string, prevShow: boolean, nextShow: boolean } interface Data { } @tag('m-pagination') export default class Pagination extends WeElement{ static css = css static defaultProps = { total: 0, pageSize: 10, numDisplay: 5, currentPage: 0, numEdge: 3, linkTo: '#', prevText: 'Prev', nextText: 'Next', ellipseText: '...', prevShow: true, nextShow: true } static propTypes = { total: Number, pageSize: Number, numDisplay: Number, currentPage: Number, numEdge: Number, linkTo: String, prevText: String, nextText: String, ellipseText: String, prevShow: Boolean, nextShow: Boolean } pageNum: number beforeRender() { this.pageNum = Math.ceil(this.props.total / this.props.pageSize) } installed(){ this.addEventListener('change', function (evt:CustomEvent) { this.setAttribute('current-page',evt.detail) }) } goto(index) { this.props.currentPage = index this.fire('change', index) this.update() } render(props) { let arr = [] let interval = this.getInterval() if (interval[0] > 0 && props.numEdge > 0) { let end = Math.min(props.numEdge, interval[0]) for (var i = 0; i < end; i++) { arr.push(this.getItem(i, i + 1)) } if (props.numEdge < interval[0] && props.ellipseText) { arr.push(
  • ) } } for (var i = interval[0]; i < interval[1]; i++) { arr.push(this.getItem(i, i + 1)) } if (interval[1] < this.pageNum && props.numEdge > 0) { if (this.pageNum - props.numEdge > interval[1] && props.ellipseText) { arr.push(
  • ) } let begin = Math.max(this.pageNum - props.numEdge, interval[1]) for (var i = begin; i < this.pageNum; i++) { arr.push(this.getItem(i, i + 1)) } } return (
    {props.prevShow && this.getPrev()}{' '}
      {arr.map(p => { return p })}
    {' '} {props.nextShow && this.getNext()}
    ) } getInterval() { let ne_half = Math.ceil(this.props.numDisplay / 2) let upper_limit = this.pageNum - this.props.numDisplay let start = this.props.currentPage > ne_half ? Math.max(Math.min(this.props.currentPage - ne_half, upper_limit), 0) : 0 let end = this.props.currentPage > ne_half ? Math.min(this.props.currentPage + ne_half, this.pageNum) : Math.min(this.props.numDisplay, this.pageNum) return [start, end] } getPrev() { if (this.props.currentPage === 0) { return ( ) } return ( ) } getNext() { if (this.props.currentPage === this.pageNum - 1) { return ( ) } return ( ) } getItem(pageIndex, text) { if (this.props.currentPage === pageIndex) { return
  • {text}
  • } return (
  • { this.goto(pageIndex) }} > {text}
  • ) } }