Skip to content

Commit 97d7924

Browse files
committed
Add option to show all rows
1 parent 47da3ab commit 97d7924

File tree

6 files changed

+41
-30
lines changed

6 files changed

+41
-30
lines changed

src/PartialTable.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ export default class PartialTable extends Component {
2727
onChange={onPageSizeChange}
2828
>
2929
{pageLengthOptions.map(opt =>
30-
<option key={opt} value={opt}>{opt}</option>
30+
<option key={opt} value={opt}>
31+
{opt === 0 ? 'All' : opt}
32+
</option>
3133
)}
3234
</select>
3335
</div>

src/__tests__/dataReducer-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ describe('dataReducer', () => {
4646
...state,
4747
page: data.slice(1, 2),
4848
pageNumber: 1,
49+
totalPages: 2,
4950
};
5051

5152
expect(dataReducer(state, action)).toEqual(expected);

src/actions.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @flow
33
*/
44

5-
import type {Action, SortBy} from './types';
5+
import type {Action, SortBy, Value, Filters} from './types';
66

77
export const ActionTypes = {
88
DATA_LOADED: 'DATA_LOADED',
@@ -31,8 +31,8 @@ export function dataLoaded(value: Array<any>): Action {
3131
// Probably a bad idea to send down `filters` here.
3232
export function dataFilter(
3333
key: string,
34-
value: string | number,
35-
filters: { [name: string]: (a: any, b: any) => Boolean }
34+
value: Value,
35+
filters: Filters
3636
): Action {
3737
return { value: {key, value, filters}, type: ActionTypes.DATA_FILTER };
3838
}

src/dataReducer.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,37 @@ const initialState: State = {
1818
};
1919

2020
function calculatePage(data, pageSize, pageNumber) {
21+
if (pageSize === 0) {
22+
return { page: data, totalPages: 0 };
23+
}
24+
2125
const start = pageSize * pageNumber;
22-
return data.slice(start, start + pageSize);
26+
27+
return {
28+
page: data.slice(start, start + pageSize),
29+
totalPages: Math.ceil(data.length / pageSize),
30+
};
2331
}
2432

2533
function pageNumberChange(state, {value: pageNumber}) {
2634
return {
2735
...state,
36+
...calculatePage(state.data, state.pageSize, pageNumber),
2837
pageNumber,
29-
page: calculatePage(state.data, state.pageSize, pageNumber),
3038
};
3139
}
3240

3341
function pageSizeChange(state, action) {
3442
const newPageSize = Number(action.value);
3543
const {pageNumber, pageSize} = state;
36-
const newPageNumber = Math.floor((pageNumber * pageSize) / newPageSize);
44+
const newPageNumber = newPageSize ?
45+
Math.floor((pageNumber * pageSize) / newPageSize) : 0;
3746

3847
return {
3948
...state,
40-
page: calculatePage(state.data, newPageSize, newPageNumber),
49+
...calculatePage(state.data, newPageSize, newPageNumber),
4150
pageSize: newPageSize,
4251
pageNumber: newPageNumber,
43-
totalPages: Math.ceil(state.data.length / newPageSize),
4452
};
4553
}
4654

@@ -49,9 +57,9 @@ function dataSort(state, {value: sortBy}) {
4957

5058
return {
5159
...state,
60+
...calculatePage(data, state.pageSize, state.pageNumber),
5261
sortBy,
5362
data,
54-
page: calculatePage(data, state.pageSize, state.pageNumber),
5563
};
5664
}
5765

@@ -65,11 +73,10 @@ function dataFilter(state, {value: {key, value, filters}}) {
6573

6674
return {
6775
...state,
76+
...calculatePage(data, state.pageSize, state.pageNumber),
6877
data,
6978
filterValues: newFilterValues,
70-
page: calculatePage(data, state.pageSize, state.pageNumber),
7179
pageNumber: 0,
72-
totalPages: Math.ceil(data.length / state.pageSize),
7380
};
7481
}
7582

@@ -84,10 +91,9 @@ function dataLoaded(state, {value: data}) {
8491

8592
return {
8693
...filledState,
94+
...calculatePage(data, pageSize, pageNumber),
8795
data,
8896
initialData: data,
89-
page: calculatePage(data, pageSize, pageNumber),
90-
totalPages: Math.ceil(data.length / pageSize),
9197
};
9298
}
9399

src/types.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
import {ActionTypes} from './actions';
66

7+
export type Value = string | number;
8+
9+
export type Filters = {
10+
[name: string]: {
11+
filter: (a: Value, b: Value) => Boolean;
12+
};
13+
};
14+
715
export type Row = {[key: string]: string} | Array<string>;
816

917
export type AppData = Array<Row>;
@@ -27,6 +35,6 @@ export type Action = {
2735
};
2836

2937
export type SortBy = {
30-
prop: string | number;
38+
prop: Value;
3139
order: 'ascending' | 'descending';
3240
};

src/utils.js

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,28 @@
11
import {orderBy, some} from 'lodash';
2-
import type {SortBy, AppData} from './types';
2+
import type {SortBy, AppData, Value, Filters} from './types';
33

44
export function sort({prop, order}: SortBy, data: AppData) {
55
return orderBy(data, prop, order === 'descending' ? 'desc' : 'asc');
66
}
77

8-
export function filter(filters, filterValues, data) {
8+
export function filter(filters: Filters, filterValues, data: AppData) {
99
const filterAndVals = {};
1010
for (let key in filterValues) {
1111
filterAndVals[key] = {
1212
value: filterValues[key],
1313
filter: filters[key].filter,
14+
prop: filters[key].prop,
1415
};
1516
}
1617

17-
return data.filter(
18-
row => some(
19-
filterAndVals,
20-
({filter, value, prop}) => {
21-
if (!prop) {
22-
return some(row, filter.bind(null, value));
23-
} else {
24-
return filter(value, row[key]);
25-
}
26-
}
27-
)
28-
);
18+
return data.filter((row) => some(
19+
filterAndVals,
20+
({filter, value, prop}) =>
21+
!prop ? some(row, filter.bind(null, value)) : filter(value, row[key])
22+
));
2923
}
3024

31-
export function containsIgnoreCase(a, b) {
25+
export function containsIgnoreCase(a: Value, b: Value) {
3226
a = String(a).toLowerCase().trim();
3327
b = String(b).toLowerCase().trim();
3428
return b.indexOf(a) >= 0;

0 commit comments

Comments
 (0)