import * as React from 'react'; import { getPaginationRange } from 'mmviz'; import { MmuiCommonComponent, MmuiProps, MmuiState } from '../common'; export interface MmuiPaginationRangeProps extends MmuiProps { rangeSize?: number; pageNumber?: number; totalPages: number; } export interface MmuiPaginationRangeState extends MmuiState { rangeSize: number; pageNumber: number; totalPages: number; } export class MmuiPaginationRangeComponent< P extends MmuiPaginationRangeProps, S extends MmuiPaginationRangeState > extends MmuiCommonComponent { /** * Constructor * @param props * props.summaryRenderMode: Options "text" or "token". * Specifying "text" the summary of selected choices is display as text. * Specifying "token" the summary of selected choices is display as tokens. */ constructor(props) { super(props); } getInitialComponentState(): any { const state: any = { rangeSize: 7, pageNumber: 1, }; if (this.props.rangeSize !== undefined) { state.rangeSize = this.props.rangeSize; } if (this.props.pageNumber !== undefined) { state.pageNumber = this.props.pageNumber; } state.totalPages = this.props.totalPages; return state; } pageClick(e: React.SyntheticEvent) { e.preventDefault(); const pageLinkElmt = e.target as HTMLElement, pageNumber = parseInt(pageLinkElmt.dataset.page); this.mergeComponentState({ pageNumber: pageNumber, updatedAt: new Date() }); } onPageClick = (e: React.SyntheticEvent) => { this.pageClick(e); }; /** * Render the Component */ render() { let state = this.getComponentState(), firstElmt, prevElmt, nextElmt, lastElmt, pageRangeElements, rangeArray = []; if (state.pageNumber && state.totalPages) { rangeArray = getPaginationRange( state.totalPages, state.rangeSize, state.pageNumber ); pageRangeElements = rangeArray.map((r) => { let elmt, key = `page-link-${r}`; if (r === state.pageNumber) { elmt = (
  • {r}
  • ); } else { elmt = (
  • {r}
  • ); } return elmt; }); // show first if (rangeArray[0] > 1) { firstElmt = (
  • 1
  • ); } // show previous const prevPageNumber = state.pageNumber - 1; if (prevPageNumber > 0) { prevElmt = (
  • ); } // show next const nextPageNumber = state.pageNumber + 1; if (nextPageNumber <= state.totalPages) { nextElmt = (
  • ); } // show last if (rangeArray[rangeArray.length - 1] < state.totalPages) { lastElmt = (
  • {state.totalPages}
  • ); } } return ( ); } }