Merge pull request #7614 from vjanssens/5626-add-item-count

Add pagination/item count to DataListToolbar

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
This commit is contained in:
softwarefactory-project-zuul[bot]
2020-07-31 14:58:29 +00:00
committed by GitHub
4 changed files with 35 additions and 2 deletions

View File

@@ -20,6 +20,7 @@ import { SearchColumns, SortColumns, QSConfig } from '../../types';
class DataListToolbar extends React.Component { class DataListToolbar extends React.Component {
render() { render() {
const { const {
itemCount,
clearAllFilters, clearAllFilters,
searchColumns, searchColumns,
sortColumns, sortColumns,
@@ -36,6 +37,7 @@ class DataListToolbar extends React.Component {
additionalControls, additionalControls,
i18n, i18n,
qsConfig, qsConfig,
pagination,
} = this.props; } = this.props;
const showExpandCollapse = onCompact && onExpand; const showExpandCollapse = onCompact && onExpand;
@@ -90,6 +92,9 @@ class DataListToolbar extends React.Component {
<ToolbarItem key={control.key}>{control}</ToolbarItem> <ToolbarItem key={control.key}>{control}</ToolbarItem>
))} ))}
</ToolbarGroup> </ToolbarGroup>
{pagination && itemCount > 0 && (
<ToolbarItem variant="pagination">{pagination}</ToolbarItem>
)}
</ToolbarContent> </ToolbarContent>
</Toolbar> </Toolbar>
); );
@@ -97,6 +102,7 @@ class DataListToolbar extends React.Component {
} }
DataListToolbar.propTypes = { DataListToolbar.propTypes = {
itemCount: PropTypes.number,
clearAllFilters: PropTypes.func, clearAllFilters: PropTypes.func,
qsConfig: QSConfig.isRequired, qsConfig: QSConfig.isRequired,
searchColumns: SearchColumns.isRequired, searchColumns: SearchColumns.isRequired,
@@ -114,6 +120,7 @@ DataListToolbar.propTypes = {
}; };
DataListToolbar.defaultProps = { DataListToolbar.defaultProps = {
itemCount: 0,
clearAllFilters: null, clearAllFilters: null,
showSelectAll: false, showSelectAll: false,
isAllSelected: false, isAllSelected: false,

View File

@@ -98,6 +98,7 @@ class ListHeader extends React.Component {
renderToolbar, renderToolbar,
qsConfig, qsConfig,
location, location,
pagination,
} = this.props; } = this.props;
const params = parseQueryString(qsConfig, location.search); const params = parseQueryString(qsConfig, location.search);
const isEmpty = itemCount === 0 && Object.keys(params).length === 0; const isEmpty = itemCount === 0 && Object.keys(params).length === 0;
@@ -118,6 +119,7 @@ class ListHeader extends React.Component {
) : ( ) : (
<Fragment> <Fragment>
{renderToolbar({ {renderToolbar({
itemCount,
searchColumns, searchColumns,
sortColumns, sortColumns,
onSearch: this.handleSearch, onSearch: this.handleSearch,
@@ -126,6 +128,7 @@ class ListHeader extends React.Component {
onRemove: this.handleRemove, onRemove: this.handleRemove,
clearAllFilters: this.handleRemoveAll, clearAllFilters: this.handleRemoveAll,
qsConfig, qsConfig,
pagination,
})} })}
</Fragment> </Fragment>
)} )}

View File

@@ -121,6 +121,28 @@ class PaginatedDataList extends React.Component {
); );
} }
const ToolbarPagination = (
<Pagination
isCompact
dropDirection="down"
itemCount={itemCount}
page={queryParams.page || 1}
perPage={queryParams.page_size}
perPageOptions={
showPageSizeOptions
? [
{ title: '5', value: 5 },
{ title: '10', value: 10 },
{ title: '20', value: 20 },
{ title: '50', value: 50 },
]
: []
}
onSetPage={this.handleSetPage}
onPerPageSelect={this.handleSetPageSize}
/>
);
return ( return (
<Fragment> <Fragment>
<ListHeader <ListHeader
@@ -130,6 +152,7 @@ class PaginatedDataList extends React.Component {
searchColumns={searchColumns} searchColumns={searchColumns}
sortColumns={sortColumns} sortColumns={sortColumns}
qsConfig={qsConfig} qsConfig={qsConfig}
pagination={ToolbarPagination}
/> />
{Content} {Content}
{items.length ? ( {items.length ? (

View File

@@ -55,7 +55,7 @@ describe('<PaginatedDataList />', () => {
{ context: { router: { history } } } { context: { router: { history } } }
); );
const pagination = wrapper.find('Pagination'); const pagination = wrapper.find('Pagination').at(1);
pagination.prop('onSetPage')(null, 2); pagination.prop('onSetPage')(null, 2);
expect(history.location.search).toEqual('?item.page=2'); expect(history.location.search).toEqual('?item.page=2');
wrapper.update(); wrapper.update();
@@ -82,7 +82,7 @@ describe('<PaginatedDataList />', () => {
{ context: { router: { history } } } { context: { router: { history } } }
); );
const pagination = wrapper.find('Pagination'); const pagination = wrapper.find('Pagination').at(1);
pagination.prop('onPerPageSelect')(null, 25, 2); pagination.prop('onPerPageSelect')(null, 25, 2);
expect(history.location.search).toEqual('?item.page=2&item.page_size=25'); expect(history.location.search).toEqual('?item.page=2&item.page_size=25');
wrapper.update(); wrapper.update();