Pagination funcionando bien

This commit is contained in:
Daniel Cortes
2020-06-01 21:54:02 -04:00
parent 094cac9310
commit 4a78534870
4 changed files with 80 additions and 55 deletions

View File

@@ -22,41 +22,48 @@ const range = (from, to, step = 1) => {
export class Paginate extends Component {
constructor(props) {
super(props);
const {totalRecords = null, pageLimit = 30, pageNeighbours = 0} = props;
const {totalRecords = 0, pageLimit = 30, pageNeighbours = 0, currentPage = 1} = props;
this.pageLimit = typeof pageLimit === 'number' ? pageLimit : 30;
this.totalRecords = typeof totalRecords === 'number' ? totalRecords : 0;
this.pageNeighbours = typeof pageNeighbours === 'number' ? Math.max(0, Math.min(pageNeighbours, 2)) : 0;
this.totalPages = Math.ceil(this.totalRecords / this.pageLimit);
this.state = {currentPage: 1};
this.currentPage = typeof currentPage === 'number' ? currentPage : 1
this.state = {currentPage: this.currentPage};
this.gotoPage = this.gotoPage.bind(this);
this.handleClick = this.handleClick.bind(this);
this.handleMoveLeft = this.handleMoveLeft.bind(this);
this.handleMoveRight = this.handleMoveRight.bind(this);
this.makePageLink = this.makePageLink.bind(this);
this.fetchPageNumbers = this.fetchPageNumbers.bind(this);
}
componentDidMount() {
//this.gotoPage(1);
}
gotoPage = page => {
gotoPage(page) {
const {onPageChanged = f => f} = this.props;
const currentPage = Math.max(0, Math.min(page, this.totalPages));
this.setState({currentPage}, () => onPageChanged(this.makePageLink(currentPage)));
this.setState({currentPage: currentPage}, () => onPageChanged(this.makePageLink(currentPage)));
}
handleClick = page => evt => {
handleClick(page) {
return (evt) => {
evt.preventDefault();
this.gotoPage(page);
}
handleMoveLeft = evt => {
evt.preventDefault();
this.gotoPage(this.state.currentPage - (this.pageNeighbours * 2) - 1);
}
handleMoveRight = evt => {
handleMoveLeft(evt) {
evt.preventDefault();
this.gotoPage(this.state.currentPage + (this.pageNeighbours * 2) + 1);
this.gotoPage(this.state.currentPage - 1);
}
makePageLink = page => {
handleMoveRight(evt) {
evt.preventDefault();
this.gotoPage(this.state.currentPage + 1);
}
makePageLink(page) {
const {makeLink = f => f} = this.props;
return makeLink(page);
}
@@ -72,7 +79,7 @@ export class Paginate extends Component {
* [x] => represents current page
* {...x} => represents page neighbours
*/
fetchPageNumbers = () => {
fetchPageNumbers() {
const totalPages = this.totalPages;
const currentPage = this.state.currentPage;
const pageNeighbours = this.pageNeighbours;
@@ -134,29 +141,24 @@ export class Paginate extends Component {
render() {
if (!this.totalRecords || this.totalPages === 1) return null;
const {currentPage} = this.state;
const currentPage = this.state.currentPage;
const pages = this.fetchPageNumbers();
return (
<Fragment>
<nav aria-label="Countries Pagination">
<ul className="pagination">
{pages.map((page, index) => {
if (page === LEFT_PAGE) return (
<li key={index} className="page-item">
<a className="page-link" href={this.makePageLink(index)} aria-label="Previous"
onClick={this.handleMoveLeft}>
<span aria-hidden="true">&laquo;</span>
<span className="sr-only">Previous</span>
<a className="page-link" href={this.makePageLink(this.state.currentPage - 1)} onClick={this.handleMoveLeft}>
<span>&laquo;</span>
</a>
</li>
);
if (page === RIGHT_PAGE) return (
<li key={index} className="page-item">
<a className="page-link" href={this.makePageLink(index)} aria-label="Next"
onClick={this.handleMoveRight}>
<span aria-hidden="true">&raquo;</span>
<span className="sr-only">Next</span>
<a className="page-link" href={this.makePageLink(this.state.currentPage + 1)} onClick={this.handleMoveRight}>
<span>&raquo;</span>
</a>
</li>
);
@@ -168,7 +170,6 @@ export class Paginate extends Component {
);
})}
</ul>
</nav>
</Fragment>
);

View File

@@ -70,6 +70,7 @@ export class Search extends React.Component {
render() {
if (this.state.artists) {
const total = this.state.artists.paginate.total;
const currentPage = this.state.artists.paginate.current_page;
const pageLimit = this.state.artists.paginate.per_page;
return (
@@ -77,7 +78,7 @@ export class Search extends React.Component {
<h1>Busqueda</h1>
<SearchBar query={this.getParams().query}/>
<SearchList artists={this.state.artists.artists}/>
<Paginate totalRecords={total} pageLimit={pageLimit} pageNeighbours={1} onPageChanged={this.handlePageChange} makeLink={this.makeLink}/>
<Paginate totalRecords={total} pageLimit={pageLimit} currentPage={currentPage} pageNeighbours={1} onPageChanged={this.handlePageChange} makeLink={this.makeLink}/>
<ReactJson src={this.state.artists} enableClipboard={false} displayDataTypes={false}/>
</main>
);

View File

@@ -2,10 +2,10 @@ import React from 'react';
import ReactDOM from 'react-dom';
import {Main, NoRoute} from "./app";
import {Search} from './components/Search';
import {Router} from "@reach/router";
import './styles/reset.css';
import './styles/main.css';
import {Router} from "@reach/router";
const App = () => (
<Router>

View File

@@ -1,6 +1,7 @@
:root {
--gray: hsl(0, 0%, 85%);
}
body {
max-width: 75em;
margin: 0 auto;
@@ -33,6 +34,26 @@ button {
margin-left: 1em;
}
ul.pagination {
display: flex;
margin: 1em auto;
justify-content: center;
}
.page-item {
border: 1px solid var(--gray);
}
.page-link {
color: black;
text-decoration: none;
padding: 0 1em;
}
.page-item.active a{
color: blue;
}
.full-width {
width: 100%;
}
@@ -50,3 +71,5 @@ button {
background: white;
}