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
);
}
}