import React from 'react' import {connect} from 'react-redux' import {Link} from 'react-router' import {push} from 'react-router-redux' const makeLinkProps = function(props) { const linkPage = parseInt(props.page); let pr = props.pageReceived; let pf = props.pageFiltered; let pn = props.pageNotExported; // This here can be surely more elegant. switch(props.anchor) { case "routes-received": pr = linkPage; break; case "routes-filtered": pf = linkPage; break; case "routes-not-exported": pn = linkPage; break; } const query = props.routing.query.q || ""; const search = `?pr=${pr}&pf=${pf}&pn=${pn}&q=${query}`; const hash = `#${props.anchor}`; const linkTo = { pathname: props.routing.pathname, hash: hash, search: search, }; return linkTo; } const PageLink = function(props) { const linkPage = parseInt(props.page); const label = props.label || (linkPage + 1); if (props.disabled) { return {label}; } const linkTo = makeLinkProps(props); return ( {label} ); } const PageSelect = (props) => { const {pages, options} = props; if (pages.length == 0) { return null; // nothing to do here. } const items = pages.map((p) => ( )); const active = props.page >= pages[0]; let itemClassName = ""; if (active) { itemClassName = "active"; } return (
  • ); } class RoutesPaginatorView extends React.Component { /* * Create an array of page "ids" we can use to map our * pagination items. * Split result into items for direct link access and * select for a dropdown like access. */ makePaginationPages(numPages) { const MAX_ITEMS = 12; const pages = Array.from(Array(numPages), (_, i) => i); return { items: pages.slice(0, MAX_ITEMS), select: pages.slice(MAX_ITEMS) } } /* * Dispatch navigation event and go to page */ navigateToPage(page) { const linkProps = makeLinkProps(Object.assign({}, this.props, { page: page })); this.props.dispatch(push(linkProps)); } render() { if (this.props.totalPages <= 1) { return null; // Nothing to paginate } const pages = this.makePaginationPages(this.props.totalPages); const pageLinks = pages.items.map((p) => { let className = ""; if (p == this.props.page) { className = "active"; } return (
  • ); }); let prevLinkClass = ""; if (this.props.page == 0) { prevLinkClass = "disabled"; } let nextLinkClass = ""; if (this.props.page + 1 == this.props.totalPages) { nextLinkClass = "disabled"; } return ( ); } } export const RoutesPaginator = connect( (state) => ({ pageReceived: state.routes.receivedPage, pageFiltered: state.routes.filteredPage, pageNotExported: state.routes.notExportedPage, routing: state.routing.locationBeforeTransitions }) )(RoutesPaginatorView); export class RoutesPaginationInfo extends React.Component { render() { const totalResults = this.props.totalResults; const perPage = this.props.pageSize; const start = this.props.page * perPage + 1; const end = Math.min(start + perPage - 1, totalResults); if (this.props.totalPages == 1) { let routes = "route"; if (totalResults > 1) { routes = "routes"; } return (
    Showing all of {totalResults} {routes}
    ); } return (
    Showing {start} - {end} of {totalResults} total routes
    ); } }