application/components/common/paginator.js
import React from 'react';
import {Link} from 'react-router';
import Request from './../../util/request';
import URI from 'urijs';
/**
* Pagination component. Currently, updates the URL for each
* page change. Use the onPaginate parameter to watch for changes.
* Expects pagination property to be API standard.
*/
class Paginator extends React.Component {
constructor(props) {
super(props);
this.onPaginate = this.onPaginate.bind(this);
}
onPaginate(...params) {
if (this.props.onPaginate) {
this.props.onPaginate(...params);
}
}
render() {
if (!this.props.data.size) {
return (
<ul className="pagination"></ul>
);
}
let pages = [];
let url = '';
if (this.props.url) {
url = this.props.url;
} else {
url = Request.getPath();
}
let previousClass = 'waves-effect';
if (parseInt(this.props.data.get('before')) === parseInt(this.props.data.get('current'))) {
previousClass = 'disabled';
}
let nextClass = '';
if (parseInt(this.props.data.get('current')) === parseInt(this.props.data.get('last'))) {
nextClass = 'disabled';
}
const prevQuery = Request.setQuery({'page': this.props.data.get('before')});
const nextQuery = Request.setQuery({'page': this.props.data.get('next')});
const previous = (
<li className={previousClass}>
<Link to={url + '?' + prevQuery} onClick={this.onPaginate.bind(this, this.props.data.get('before'))}><i className='fa fa-chevron-left'></i></Link>
</li>
);
const next = (
<li className={nextClass}>
<Link to={url + '?' + nextQuery} onClick={this.onPaginate.bind(this, this.props.data.get('next'))}><i className='fa fa-chevron-right'></i></Link>
</li>
);
const total = parseInt(this.props.data.get('total_pages'));
const current = parseInt(this.props.data.get('current'));
if (total <= 8) {
for (let i = 0; i < total; i++) {
const newQuery = Request.setQuery({'page': (i+1)});
pages.push((
<li key={(i+1)} className={((i+1) === current) ? 'active' : 'waves-effect'}>
<Link to={url + '?' + newQuery} onClick={this.onPaginate.bind(this, (i+1))}>{(i+1)}</Link>
</li>
));
}
} else {
let start = 1;
if (current > 6) {
start = current - 5;
}
let max = start+10;
if (total <= 10) {
max = total;
}
for (let i = start; i < max; i++) {
const newQuery = Request.setQuery({'page': i});
pages.push((
<li key={i} className={(i === current) ? 'active' : 'waves-effect'}>
<Link to={url + '?' + newQuery} onClick={this.onPaginate.bind(this, i)}>{i}</Link>
</li>
));
}
}
return (
<ul className="pagination">
{previous}
{pages}
{next}
</ul>
);
}
}
export default Paginator;