Pagination is implemented as an encapsulated view system, accepting an array of items as input.
Component Instance Methods
When using Pagination
in your project, you may call the following methods on a rendered
instance of the component. Use [refs
](https:// * facebook.github.io/react/docs/refs-and-the-dom.html)
to get the instance.
Installation
npm i boundless-pagination --save
Then use it like:
import { createElement, PureComponent } from 'react';
import Pagination from 'boundless-pagination';
export default class PaginationDemo extends PureComponent {
state = {
items: require('./fixture.json'),
identifier: 'rolodex1000',
}
itemToJSX = (data) => (
<div
onFocus={() => console.log('focused id: ' + data.id)}
onKeyDown={(e) => console.log('pressed ' + e.key + ' on id: ' + data.id)}>
<div className='card-left'>
<strong>{data.first_name} {data.last_name}</strong><br/>
<em>{data.job_title}</em>
</div>
<div className='card-right'>
{data.address1}<br/>
{data.city}, {data.country}<br/>
<strong>p:</strong> {data.phone}<br/>
<strong>e:</strong> {data.email}
</div>
</div>
)
handleItemRequest = (index) => {
if (index >= 10) {
return new Promise((resolve) => {
window.setTimeout((setIndex) => {
resolve(this.state.items[setIndex]);
}, 2000, index);
});
}
return this.state.items[index];
}
render() {
return (
<Pagination
className='demo-pagination'
customControlContent='Your custom content'
getItem={this.handleItemRequest}
identifier={this.state.identifier}
itemToJSXConverter={this.itemToJSX}
jumpToFirstPageControlContent='⇤'
jumpToLastPageControlContent='⇥'
jumpToNextPageControlContent='→'
jumpToPreviousPageControlContent='←'
numItemsPerPage={5}
showPaginationState={true}
totalItems={this.state.items.length} />
);
}
}
Pagination can also just be directly used from the main Boundless library. This is recommended when you're getting started to avoid maintaining the package versions of several components:
npm i boundless --save
the ES6 import
statement then becomes like:
import { Pagination } from 'boundless';
Props
Note: only top-level props are in the README, for the full list check out the website.
Required Props
-
getItem
· called with a desired item index when that item comes into view;
accepts a Promise
if you need to fetch the row asynchronously
-
identifier
· a unique name for the data source being consumed; pass a
different name to cause the view to fully reset and pull fresh data
-
totalItems
· the total number of items to be displayed in the view
Optional Props
-
*
· any React-supported attribute
-
after
· arbitrary content to be rendered after the items in the DOM
-
before
· arbitrary content to be rendered before the items in the DOM
-
controlWrapperProps
-
customControlContent
· allows for arbitrary content to be rendered into the control area
-
hidePagerIfNotNeeded
· does not render the paging controls if the number of items supplied
to the view is less-than-or-equal-to the number of items to show
per page via props.numItemsPerPage
-
initialPage
· the (one-indexed) number of the page that should be initially
displayed; must be a positive integer less than or equal to
the total number of pages
-
itemLoadingContent
· allows for arbitrary content to be rendered into pagination items
as they're loading if the backing data is a Promise
-
itemToJSXConverter
· an function to specify how an item should be converted
to JSX, if it is not already renderable by React
const getItem = () => ({id: 1234, text: 'foo'});
const objToJSX = ({id, text}) => <div data-id={id}>{text}</div>;
<Pagination
getItem={getItem}
identifer='foo'
itemToJSXConverter={objToJSX}
totalItems={1} />
-
itemWrapperProps
-
jumpToFirstPageControlContent
· content to be displayed inside of the "First page" control button
-
jumpToLastPageControlContent
· content to be displayed inside of the "Last page" control button
-
jumpToNextPageControlContent
· content to be displayed inside of the "Next page" control button
-
jumpToPreviousPageControlContent
· content to be displayed inside of the "Previous page" control button
-
numItemsPerPage
· the maximum number of items to be displayed on each page; must be
greater than zero
-
numPageToggles
· the maximum number of pages to be displayed in the control bar at
one time
-
position
· determines whether the pagination controls are displayed above,
below, or both above and below the content
Pagination.position.ABOVE or Pagination.position.BELOW or Pagination.position.BOTH | Pagination.position.ABOVE |
-
showJumpToFirstPageControl
· whether the "first page" control button should be displayed
-
showJumpToLastPageControl
· whether the "last page" control button should be displayed
-
showJumpToNextPageControl
· whether the "next page" control button should be displayed
-
showJumpToPreviousPageControl
· whether the "previous page" control button should be displayed
-
showPaginationState
· renders an element called .b-pagination-control-state
that
contains the current state of the pagination like "1 of 10";
alternatively, this prop also accepts a function that it will
call with the currentPage and totalPages for you to format:
showPaginatedState={
(currentPage, totalPages) => (
<div className='foo'>
You're on page {currentPage} of {totalPages} pages!
</div>
)
}
Reference Styles
Stylus
You can see what variables are available to override in variables.styl.
// Redefine any variables as desired, e.g:
color-accent = royalblue
// Bring in the component styles; they will be autoconfigured based on the above
@require "node_modules/boundless-pagination/style"
CSS
If desired, a precompiled plain CSS stylesheet is available for customization at /build/style.css
, based on Boundless's default variables.