Skip to content

Commit 574a314

Browse files
authored
funcaitonal store (#146)
1 parent ff31b2f commit 574a314

File tree

24 files changed

+500
-430
lines changed

24 files changed

+500
-430
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export const getByCurrPage = store => (page, sizePerPage, pageStartIndex) => {
2+
const getNormalizedPage = () => {
3+
const offset = Math.abs(1 - pageStartIndex);
4+
return page + offset;
5+
};
6+
const end = (getNormalizedPage() * sizePerPage) - 1;
7+
const start = end - (sizePerPage - 1);
8+
const dataSize = store.data.length;
9+
10+
const result = [];
11+
for (let i = start; i <= end; i += 1) {
12+
result.push(store.data[i]);
13+
if (i + 1 === dataSize) break;
14+
}
15+
return result;
16+
};

packages/react-bootstrap-table2-paginator/src/wrapper.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import React, { Component } from 'react';
55
import PropTypes from 'prop-types';
66

77
import Const from './const';
8+
import { getByCurrPage } from './page';
89

910
const wrapperFactory = baseElement =>
1011
class PaginationWrapper extends Component {
@@ -98,7 +99,7 @@ const wrapperFactory = baseElement =>
9899

99100
const data = this.isRemote() ?
100101
this.props.data :
101-
store.getByCurrPage(currPage, currSizePerPage, pageStartIndex);
102+
getByCurrPage(store)(currPage, currSizePerPage, pageStartIndex);
102103

103104
const base = baseElement({
104105
...this.props,
@@ -110,7 +111,7 @@ const wrapperFactory = baseElement =>
110111
base,
111112
<Pagination
112113
key="pagination"
113-
dataSize={ options.totalSize || store.getDataSize() }
114+
dataSize={ options.totalSize || store.data.length }
114115
currPage={ currPage }
115116
currSizePerPage={ currSizePerPage }
116117
onPageChange={ this.handleChangePage }
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Store from 'react-bootstrap-table2/src/store';
2+
import { getByCurrPage } from '../src/page';
3+
4+
describe('Page Functions', () => {
5+
let data;
6+
let store;
7+
8+
describe('getByCurrPage', () => {
9+
beforeEach(() => {
10+
data = [];
11+
for (let i = 0; i < 100; i += 1) {
12+
data.push({ id: i, name: `test_name${i}` });
13+
}
14+
store = new Store('id');
15+
store.data = data;
16+
});
17+
18+
it('should always return correct data', () => {
19+
[
20+
// [page, sizePerPage, pageStartIndex]
21+
[1, 10, 1],
22+
[1, 25, 1],
23+
[1, 30, 1],
24+
[3, 30, 1],
25+
[4, 30, 1],
26+
[10, 10, 1],
27+
[0, 10, 0],
28+
[1, 10, 0],
29+
[9, 10, 0]
30+
].forEach(([page, sizePerPage, pageStartIndex]) => {
31+
const rows = getByCurrPage(store)(page, sizePerPage, pageStartIndex);
32+
expect(rows).toBeDefined();
33+
expect(Array.isArray(rows)).toBeTruthy();
34+
expect(rows.every(row => !!row)).toBeTruthy();
35+
});
36+
});
37+
});
38+
});

packages/react-bootstrap-table2-paginator/test/wrapper.test.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { shallow } from 'enzyme';
44

55

66
import BootstrapTable from 'react-bootstrap-table2/src/bootstrap-table';
7-
import Store from 'react-bootstrap-table2/src/store/base';
7+
import Store from 'react-bootstrap-table2/src/store';
88
import paginator from '../src';
99
import wrapperFactory from '../src/wrapper';
1010
import Pagination from '../src/pagination';
@@ -23,19 +23,23 @@ describe('Wrapper', () => {
2323
let wrapper;
2424
let instance;
2525

26-
const createTableProps = (props = {}) => ({
27-
keyField: 'id',
28-
columns: [{
29-
dataField: 'id',
30-
text: 'ID'
31-
}, {
32-
dataField: 'name',
33-
text: 'Name'
34-
}],
35-
data,
36-
pagination: paginator(props.options),
37-
store: new Store({ data })
38-
});
26+
const createTableProps = (props = {}) => {
27+
const tableProps = {
28+
keyField: 'id',
29+
columns: [{
30+
dataField: 'id',
31+
text: 'ID'
32+
}, {
33+
dataField: 'name',
34+
text: 'Name'
35+
}],
36+
data,
37+
pagination: paginator(props.options),
38+
store: new Store('id')
39+
};
40+
tableProps.store.data = data;
41+
return tableProps;
42+
};
3943

4044
const pureTable = props => (<BootstrapTable { ...props } />);
4145

@@ -76,7 +80,7 @@ describe('Wrapper', () => {
7680
it('should rendering Pagination correctly', () => {
7781
const pagination = wrapper.find(Pagination);
7882
expect(pagination.length).toBe(1);
79-
expect(pagination.prop('dataSize')).toEqual(props.store.getDataSize());
83+
expect(pagination.prop('dataSize')).toEqual(props.store.data.length);
8084
expect(pagination.prop('currPage')).toEqual(instance.state.currPage);
8185
expect(pagination.prop('currSizePerPage')).toEqual(instance.state.currSizePerPage);
8286
expect(pagination.prop('onPageChange')).toEqual(instance.handleChangePage);

packages/react-bootstrap-table2/src/bootstrap-table.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Caption from './caption';
99
import Body from './body';
1010
import PropsBaseResolver from './props-resolver';
1111
import Const from './const';
12+
import { isSelectedAll } from './store/selection';
1213

1314
class BootstrapTable extends PropsBaseResolver(Component) {
1415
constructor(props) {
@@ -73,7 +74,7 @@ class BootstrapTable extends PropsBaseResolver(Component) {
7374
const headerCellSelectionInfo = this.resolveSelectRowPropsForHeader({
7475
onAllRowsSelect: this.props.onAllRowsSelect,
7576
selected: store.selected,
76-
allRowsSelected: store.isAllRowsSelected()
77+
allRowsSelected: isSelectedAll(store)
7778
});
7879

7980
return (
@@ -96,7 +97,7 @@ class BootstrapTable extends PropsBaseResolver(Component) {
9697
noDataIndication={ noDataIndication }
9798
cellEdit={ cellEditInfo }
9899
selectRow={ cellSelectionInfo }
99-
selectedRowKeys={ store.getSelectedRowKeys() }
100+
selectedRowKeys={ store.selected }
100101
rowStyle={ rowStyle }
101102
rowClasses={ rowClasses }
102103
rowEvents={ rowEvents }

packages/react-bootstrap-table2/src/container.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint no-return-assign: 0 */
22
/* eslint react/prop-types: 0 */
33
import React, { Component } from 'react';
4-
import Store from './store/base';
4+
import Store from './store';
55

66
import {
77
wrapWithCellEdit,
@@ -16,13 +16,14 @@ const withDataStore = Base =>
1616
class BootstrapTableContainer extends Component {
1717
constructor(props) {
1818
super(props);
19-
this.store = new Store(props);
19+
this.store = new Store(props.keyField);
20+
this.store.data = props.data;
2021
this.handleUpdateCell = this.handleUpdateCell.bind(this);
2122
this.onRemotePageChange = this.onRemotePageChange.bind(this);
2223
}
2324

2425
componentWillReceiveProps(nextProps) {
25-
this.store.set(nextProps.data);
26+
this.store.data = nextProps.data;
2627
}
2728

2829
onRemotePageChange(page, sizePerPage) {

packages/react-bootstrap-table2/src/row-selection/wrapper.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,21 @@ import PropTypes from 'prop-types';
55
import { selectionElement } from '../table-factory';
66

77
import Const from '../const';
8+
import {
9+
isAnySelectedRow,
10+
selectableKeys,
11+
unSelectableKeys,
12+
getSelectedRows
13+
} from '../store/selection';
14+
import { getRowByRowId } from '../store/rows';
815

916
class RowSelectionWrapper extends Component {
1017
constructor(props) {
1118
super(props);
1219
this.handleRowSelect = this.handleRowSelect.bind(this);
1320
this.handleAllRowsSelect = this.handleAllRowsSelect.bind(this);
1421
this.state = {
15-
selectedRowKeys: props.store.getSelectedRowKeys()
22+
selectedRowKeys: props.store.selected
1623
};
1724
}
1825

@@ -25,7 +32,7 @@ class RowSelectionWrapper extends Component {
2532
const { selectRow: { mode, onSelect }, store } = this.props;
2633
const { ROW_SELECT_SINGLE } = Const;
2734

28-
let currSelected = [...store.getSelectedRowKeys()];
35+
let currSelected = [...store.selected];
2936

3037
if (mode === ROW_SELECT_SINGLE) { // when select mode is radio
3138
currSelected = [rowKey];
@@ -35,10 +42,10 @@ class RowSelectionWrapper extends Component {
3542
currSelected = currSelected.filter(value => value !== rowKey);
3643
}
3744

38-
store.setSelectedRowKeys(currSelected);
45+
store.selected = currSelected;
3946

4047
if (onSelect) {
41-
const row = store.getRowByRowId(rowKey);
48+
const row = getRowByRowId(store)(rowKey);
4249
onSelect(row, checked, rowIndex);
4350
}
4451

@@ -56,20 +63,20 @@ class RowSelectionWrapper extends Component {
5663
onSelectAll,
5764
nonSelectable
5865
} } = this.props;
59-
const selected = store.isAnySelectedRow(nonSelectable);
66+
const selected = isAnySelectedRow(store)(nonSelectable);
6067

6168
// set next status of all row selected by store.selected or customizing by user.
6269
const result = option || !selected;
6370

6471
const currSelected = result ?
65-
store.selectAllRows(nonSelectable) :
66-
store.cleanSelectedRows(nonSelectable);
72+
selectableKeys(store)(nonSelectable) :
73+
unSelectableKeys(store)(nonSelectable);
6774

6875

69-
store.setSelectedRowKeys(currSelected);
76+
store.selected = currSelected;
7077

7178
if (onSelectAll) {
72-
onSelectAll(result, store.getSelectedRows());
79+
onSelectAll(result, getSelectedRows(store));
7380
}
7481

7582
this.setState(() => ({

packages/react-bootstrap-table2/src/sort/wrapper.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,15 @@ class SortWrapper extends Component {
3030
const { store } = this.props;
3131
store.sortBy(column);
3232

33-
this.table.setState({
34-
data: store.get()
35-
});
33+
this.table.setState({ data: store.data });
3634
}
3735

3836
render() {
3937
return paginationElement({
4038
...this.props,
4139
ref: node => this.table = node,
4240
onSort: this.handleSort,
43-
data: this.props.store.get()
41+
data: this.props.store.data
4442
});
4543
}
4644
}

packages/react-bootstrap-table2/src/store/base.js

Lines changed: 0 additions & 110 deletions
This file was deleted.

0 commit comments

Comments
 (0)