1
import {DataLoader, DropDownMenu} from 'argo-ui';
3
import * as React from 'react';
4
import ReactPaginate from 'react-paginate';
5
import {services} from '../../services';
7
require('./paginate.scss');
9
export interface SortOption<T> {
11
compare: (a: T, b: T) => number;
14
export interface PaginateProps<T> {
16
onPageChange: (page: number) => any;
17
children: (data: T[]) => React.ReactNode;
19
emptyState?: () => React.ReactNode;
20
preferencesKey?: string;
21
header?: React.ReactNode;
23
sortOptions?: SortOption<T>[];
26
export function Paginate<T>({page, onPageChange, children, data, emptyState, preferencesKey, header, showHeader, sortOptions}: PaginateProps<T>) {
28
<DataLoader load={() => services.viewPreferences.getPreferences()}>
30
preferencesKey = preferencesKey || 'default';
31
const pageSize = pref.pageSizes[preferencesKey] || 10;
32
const sortOption = sortOptions ? (pref.sortOptions && pref.sortOptions[preferencesKey]) || sortOptions[0].title : '';
33
const pageCount = pageSize === -1 ? 1 : Math.ceil(data.length / pageSize);
34
if (pageCount <= page) {
38
function paginator() {
40
<div style={{marginBottom: '0.5em'}}>
41
<div style={{display: 'flex', alignItems: 'center', marginBottom: '0.5em', paddingLeft: '1em'}}>
44
containerClassName='paginate__paginator'
47
pageRangeDisplayed={5}
48
marginPagesDisplayed={2}
49
onPageChange={item => onPageChange(item.selected)}
52
<div className='paginate__size-menu'>
58
Sort: {sortOption.toLowerCase()} <i className='fa fa-caret-down' />
63
items={sortOptions.map(so => ({
66
// sortOptions might not be set in the browser storage
67
if (!pref.sortOptions) {
68
pref.sortOptions = {};
70
pref.sortOptions[preferencesKey] = so.title;
71
services.viewPreferences.updatePreferences(pref);
79
Items per page: {pageSize === -1 ? 'all' : pageSize} <i className='fa fa-caret-down' />
82
items={[5, 10, 15, 20, -1].map(count => ({
83
title: count === -1 ? 'all' : count.toString(),
85
pref.pageSizes[preferencesKey] = count;
86
services.viewPreferences.updatePreferences(pref);
92
{showHeader && header}
98
.filter(o => o.title === sortOption)
100
data.sort(so.compare);
105
<div className='paginate'>{paginator()}</div>
106
{data.length === 0 && emptyState ? emptyState() : children(pageSize === -1 ? data : data.slice(pageSize * page, pageSize * (page + 1)))}
107
<div className='paginate'>{pageCount > 1 && paginator()}</div>