1
0
mirror of https://github.com/alice-lg/alice-lg.git synced 2024-05-11 05:55:03 +00:00

200 lines
5.3 KiB
React
Raw Normal View History

2018-07-20 11:32:48 +02:00
import React from 'react'
import {connect} from 'react-redux'
import {Link} from 'react-router'
2018-07-23 17:09:42 +02:00
import {push} from 'react-router-redux'
2018-07-20 11:32:48 +02:00
2018-08-05 11:35:28 +02:00
import {makeLinkProps} from './urls'
2018-07-23 17:09:42 +02:00
const PageLink = function(props) {
const linkPage = parseInt(props.page);
const label = props.label || (linkPage + 1);
if (props.disabled) {
return <span>{label}</span>;
}
2018-07-23 12:27:37 +02:00
2018-07-23 17:09:42 +02:00
const linkTo = makeLinkProps(props);
2018-07-20 11:32:48 +02:00
return (
2018-07-23 12:27:37 +02:00
<Link to={linkTo}>{label}</Link>
2018-07-20 11:32:48 +02:00
);
}
2018-07-20 11:32:48 +02:00
2018-07-23 17:09:42 +02:00
const PageSelect = (props) => {
const {pages, options} = props;
if (pages.length == 0) {
return null; // nothing to do here.
}
const items = pages.map((p) => (
<option key={p} value={p}>{p + 1}</option>
));
const active = props.page >= pages[0];
let itemClassName = "";
if (active) {
itemClassName = "active";
}
return (
<li className={itemClassName}>
2018-07-23 18:35:29 +02:00
<select className="form-control pagination-select"
2018-07-23 17:09:42 +02:00
value={props.page}
onChange={(e) => props.onChange(e.target.value) }>
{ props.page < pages[0] && <option value={pages[0]}>more...</option> }
{items}
</select>
</li>
);
}
2018-07-20 11:32:48 +02:00
class RoutesPaginatorView extends React.Component {
2018-07-23 17:09:42 +02:00
/*
* 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));
}
2018-07-20 11:32:48 +02:00
render() {
2018-07-23 17:09:42 +02:00
2018-07-20 11:32:48 +02:00
if (this.props.totalPages <= 1) {
return null; // Nothing to paginate
}
2018-07-23 17:09:42 +02:00
const pages = this.makePaginationPages(this.props.totalPages);
const pageLinks = pages.items.map((p) => {
2018-07-23 12:27:37 +02:00
let className = "";
2018-07-23 17:09:42 +02:00
if (p == this.props.page) {
2018-07-23 12:27:37 +02:00
className = "active";
}
2018-07-20 11:32:48 +02:00
return (
2018-07-23 17:09:42 +02:00
<li key={p} className={className}>
<PageLink page={p}
routing={this.props.routing}
anchor={this.props.anchor}
2018-08-03 18:25:28 +02:00
loadNotExported={this.props.loadNotExported}
pageReceived={this.props.pageReceived}
pageFiltered={this.props.pageFiltered}
pageNotExported={this.props.pageNotExported} />
2018-07-20 11:32:48 +02:00
</li>
);
});
2018-07-23 17:09:42 +02:00
2018-07-23 12:27:37 +02:00
let prevLinkClass = "";
if (this.props.page == 0) {
prevLinkClass = "disabled";
}
let nextLinkClass = "";
if (this.props.page + 1 == this.props.totalPages) {
nextLinkClass = "disabled";
}
2018-07-20 11:32:48 +02:00
return (
<nav aria-label="Routes Pagination">
<ul className="pagination">
2018-07-23 12:27:37 +02:00
<li className={prevLinkClass}>
<PageLink page={this.props.page - 1}
label="&laquo;"
disabled={this.props.page == 0}
routing={this.props.routing}
anchor={this.props.anchor}
2018-08-03 18:25:28 +02:00
loadNotExported={this.props.loadNotExported}
2018-07-23 12:27:37 +02:00
pageReceived={this.props.pageReceived}
pageFiltered={this.props.pageFiltered}
pageNotExported={this.props.pageNotExported} />
2018-07-20 11:32:48 +02:00
</li>
{pageLinks}
2018-07-23 17:09:42 +02:00
<PageSelect pages={pages.select}
page={this.props.page}
onChange={(page) => this.navigateToPage(page)} />
{pages.select.length == 0 &&
<li className={nextLinkClass}>
<PageLink page={this.props.page + 1}
disabled={this.props.page + 1 == this.props.totalPages}
label="&raquo;"
routing={this.props.routing}
anchor={this.props.anchor}
2018-08-03 18:25:28 +02:00
loadNotExported={this.props.loadNotExported}
2018-07-23 17:09:42 +02:00
pageReceived={this.props.pageReceived}
pageFiltered={this.props.pageFiltered}
pageNotExported={this.props.pageNotExported} />
</li>}
2018-07-20 11:32:48 +02:00
</ul>
</nav>
);
}
}
export const RoutesPaginator = connect(
2018-07-20 11:32:48 +02:00
(state) => ({
pageReceived: state.routes.receivedPage,
pageFiltered: state.routes.filteredPage,
pageNotExported: state.routes.notExportedPage,
2018-08-03 18:25:28 +02:00
loadNotExported: state.routes.loadNotExported,
2018-07-20 11:32:48 +02:00
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);
2018-07-27 18:18:48 +02:00
if (this.props.totalPages <= 1) {
2018-07-20 11:32:48 +02:00
let routes = "route";
if (totalResults > 1) {
routes = "routes";
}
return (
<div className="routes-pagination-info pull-right">
Showing <b>all</b> of <b>{totalResults}</b> {routes}
</div>
);
}
return (
<div className="routes-pagination-info pull-right">
Showing <b>{start} - {end}</b> of <b>{totalResults}</b> total routes
</div>
);
}
}