Skip to content

Commit 02d3464

Browse files
dunglasmysiar
authored andcommitted
Improve the pagination system (#47)
* Improve the pagination system * Take review into account
1 parent dedd8dd commit 02d3464

File tree

5 files changed

+42
-90
lines changed

5 files changed

+42
-90
lines changed

templates/react-common/actions/foo/list.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ export function loading(loading) {
88
return {type: '{{{ uc }}}_LIST_LOADING', loading};
99
}
1010

11-
export function success(items) {
12-
return {type: '{{{ uc }}}_LIST_SUCCESS', items};
11+
export function success(data) {
12+
return {type: '{{{ uc }}}_LIST_SUCCESS', data};
1313
}
1414

15-
export function view(items) {
16-
return { type: '{{{ uc }}}_LIST_VIEW', items};
17-
}
18-
19-
export function page(page) {
15+
export function list(page = '/{{{ name }}}') {
2016
return (dispatch) => {
2117
dispatch(loading(true));
2218
dispatch(error(''));
@@ -25,8 +21,7 @@ export function page(page) {
2521
.then(response => response.json())
2622
.then(data => {
2723
dispatch(loading(false));
28-
dispatch(success(data['{{{ hydraPrefix }}}member']));
29-
dispatch(view(data['{{{ hydraPrefix }}}view']));
24+
dispatch(success(data));
3025
})
3126
.catch(e => {
3227
dispatch(loading(false));
@@ -35,10 +30,6 @@ export function page(page) {
3530
};
3631
}
3732

38-
export function list() {
39-
return page('/{{{ name }}}');
40-
}
41-
4233
export function reset() {
4334
return {type: '{{{ uc }}}_LIST_RESET'};
4435
}

templates/react-common/reducers/foo/list.js

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,17 @@ export function loading(state = false, action) {
2626
}
2727
}
2828

29-
export function items(state = [], action) {
29+
export function data(state = {}, action) {
3030
switch (action.type) {
3131
case '{{{ uc }}}_LIST_SUCCESS':
32-
return action.items;
32+
return action.data;
3333

3434
case '{{{ uc }}}_LIST_RESET':
35-
return [];
35+
return {};
3636

3737
default:
3838
return state;
3939
}
4040
}
4141

42-
export function view(state = [], action) {
43-
switch (action.type) {
44-
case '{{{ uc }}}_LIST_VIEW':
45-
return action.items;
46-
47-
default:
48-
return state;
49-
}
50-
}
51-
52-
export default combineReducers({error, loading, items, view});
42+
export default combineReducers({error, loading, data});

templates/react/components/foo/List.js

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,56 +2,26 @@ import React, {Component} from 'react';
22
import { connect } from 'react-redux';
33
import { Link } from 'react-router-dom';
44
import PropTypes from 'prop-types';
5-
import { list, reset, page } from '../../actions/{{{ lc }}}/list';
5+
import { list, reset } from '../../actions/{{{ lc }}}/list';
66
import { success } from '../../actions/{{{ lc }}}/delete';
7-
import { paginationRoute, itemToLinks } from '../../utils/helpers';
7+
import { itemToLinks } from '../../utils/helpers';
88

99
class List extends Component {
1010
static propTypes = {
1111
error: PropTypes.string,
1212
loading: PropTypes.bool.isRequired,
13-
items: PropTypes.array.isRequired,
13+
data: PropTypes.object.isRequired,
1414
deletedItem: PropTypes.object,
1515
list: PropTypes.func.isRequired,
1616
reset: PropTypes.func.isRequired,
17-
page: PropTypes.func.isRequired,
1817
};
1918

20-
pagination() {
21-
return (
22-
<span>
23-
<button
24-
type="button"
25-
className="btn btn-basic btn-sm"
26-
onClick={() => this.props.page(paginationRoute(this.props.view['{{{ hydraPrefix }}}first']))}
27-
disabled={!this.props.view['{{{ hydraPrefix }}}previous']}
28-
>First</button>
29-
&nbsp;
30-
<button
31-
type="button"
32-
className="btn btn-basic btn-sm"
33-
onClick={() => this.props.page(paginationRoute(this.props.view['{{{ hydraPrefix }}}previous']))}
34-
disabled={!this.props.view['{{{ hydraPrefix }}}previous']}
35-
>Previous</button>
36-
&nbsp;
37-
<button
38-
type="button" className="btn btn-basic btn-sm"
39-
onClick={() => this.props.page(paginationRoute(this.props.view['{{{ hydraPrefix }}}next']))}
40-
disabled={!this.props.view['{{{ hydraPrefix }}}next']}
41-
>Next</button>
42-
&nbsp;
43-
<button
44-
type="button" className="btn btn-basic btn-sm"
45-
onClick={() => this.props.page(paginationRoute(this.props.view['{{{ hydraPrefix }}}last']))}
46-
disabled={!this.props.view['{{{ hydraPrefix }}}next']}
47-
>Last</button>
48-
&nbsp;
49-
</span>
50-
);
19+
componentDidMount() {
20+
this.props.list(this.props.match.params.page && decodeURIComponent(this.props.match.params.page));
5121
}
5222

53-
componentDidMount() {
54-
this.props.list();
23+
componentWillReceiveProps(nextProps) {
24+
if (this.props.match.params.page !== nextProps.match.params.page) nextProps.list(nextProps.match.params.page && decodeURIComponent(nextProps.match.params.page));
5525
}
5626

5727
componentWillUnmount() {
@@ -65,7 +35,8 @@ class List extends Component {
6535
{this.props.loading && <div className="alert alert-info">Loading...</div>}
6636
{this.props.deletedItem && <div className="alert alert-success">{this.props.deletedItem['@id']} deleted.</div>}
6737
{this.props.error && <div className="alert alert-danger">{this.props.error}</div>}
68-
{this.pagination()}
38+
39+
<p><Link to="create" className="btn btn-default">Create</Link></p>
6940

7041
<div className="table-responsive">
7142
<table className="table table-striped table-hover">
@@ -80,7 +51,7 @@ class List extends Component {
8051
</tr>
8152
</thead>
8253
<tbody>
83-
{this.props.items.map(item =>
54+
{this.props.data['{{{ hydraPrefix }}}member'] && this.props.data['{{{ hydraPrefix }}}member'].map(item =>
8455
<tr className={item['@id']} key={item['@id']}>
8556
<td><Link to={`show/${encodeURIComponent(item['@id'])}`}>{item['@id']}</Link></td>
8657
{{#each fields}}
@@ -104,25 +75,37 @@ class List extends Component {
10475
</table>
10576
</div>
10677

107-
<Link to="create" className="btn btn-default">Create</Link>
78+
{this.pagination()}
10879
</div>;
10980
}
81+
82+
pagination() {
83+
const view = this.props.data['hydra:view'];
84+
if (!view) return;
85+
86+
const {'{{{ hydraPrefix }}}first': first, '{{{ hydraPrefix }}}previous': previous,'{{{ hydraPrefix }}}next': next, '{{{ hydraPrefix }}}last': last} = view;
87+
88+
return <nav aria-label="Page navigation">
89+
<Link to='.' className={`btn btn-default${previous ? '' : ' disabled'}`}><span aria-hidden="true">&lArr;</span> First</Link>
90+
<Link to={!previous || previous === first ? '.' : encodeURIComponent(previous)} className={`btn btn-default${previous ? '' : ' disabled'}`}><span aria-hidden="true">&larr;</span> Previous</Link>
91+
<Link to={next ? encodeURIComponent(next) : '#'} className={`btn btn-default${next ? '' : ' disabled'}`}>Next <span aria-hidden="true">&rarr;</span></Link>
92+
<Link to={last ? encodeURIComponent(last) : '#'} className={`btn btn-default${next ? '' : ' disabled'}`}>Last <span aria-hidden="true">&rArr;</span></Link>
93+
</nav>;
94+
}
11095
}
11196

11297
const mapStateToProps = (state) => {
11398
return {
114-
items: state.{{{ lc }}}.list.items,
99+
data: state.{{{ lc }}}.list.data,
115100
error: state.{{{ lc }}}.list.error,
116101
loading: state.{{{ lc }}}.list.loading,
117102
deletedItem: state.{{{ lc }}}.del.deleted,
118-
view: state.{{{ lc }}}.list.view,
119103
};
120104
};
121105

122106
const mapDispatchToProps = (dispatch) => {
123107
return {
124-
list: () => dispatch(list()),
125-
page: (arg) => dispatch(page(arg)),
108+
list: (page) => dispatch(list(page)),
126109
reset: () => {
127110
dispatch(reset());
128111
dispatch(success(null));

templates/react/routes/foo.js

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
11
import React from 'react';
22
import {Route} from 'react-router-dom';
3+
import {List,Create, Update, Show} from '../components/{{{lc}}}/';
34

4-
import {
5-
List as {{{titleUcFirst}}}List,
6-
Create as {{{titleUcFirst}}}Create,
7-
Update as {{{titleUcFirst}}}Update,
8-
Show as {{{titleUcFirst}}}Show
9-
} from '../components/{{{lc}}}/';
10-
11-
export default (
12-
[
13-
<Route path='/{{{name}}}/' component={ {{{titleUcFirst}}}List } exact={true} strict={true} key='{{{titleUcFirst}}}List'/>,
14-
<Route path='/{{{name}}}/create' component={ {{{titleUcFirst}}}Create } exact={true} key='{{{titleUcFirst}}}Create'/>,
15-
<Route path="/{{{name}}}/edit/:id" component={ {{{titleUcFirst}}}Update } exact={true} key='{{{titleUcFirst}}}Update'/>,
16-
<Route path="/{{{name}}}/show/:id" component={ {{{titleUcFirst}}}Show } exact={true} key='{{{titleUcFirst}}}Show'/>
17-
]
18-
);
5+
export default [
6+
<Route path='/{{{name}}}/create' component={Create} exact={true} key='create'/>,
7+
<Route path='/{{{name}}}/edit/:id' component={Update} exact={true} key='update'/>,
8+
<Route path='/{{{name}}}/show/:id' component={Show} exact={true} key='show'/>,
9+
<Route path='/{{{name}}}/:page?' component={List} strict={true} key='list'/>,
10+
];

templates/react/utils/helpers.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,3 @@ function createLink(item) {
1717

1818
return <div><Link key={item} to={`/${route}/show/${encodeURIComponent(item)}`}>{item}</Link></div>;
1919
}
20-
21-
export function paginationRoute(item) {
22-
return '/' + item.split('/').splice(-1, 1);
23-
}

0 commit comments

Comments
 (0)