Skip to content
Prev Previous commit
fix bug produced by rebasing lol
  • Loading branch information
AllenFang committed Oct 17, 2017
commit e587d53d045f2c1e636f33390a212ec7e4fb14e3
25 changes: 12 additions & 13 deletions packages/react-bootstrap-table2/src/bootstrap-table.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,11 @@ class BootstrapTable extends PropsBaseResolver(Component) {
this.validateProps();

this.handleSort = this.handleSort.bind(this);
this.startEditing = this.startEditing.bind(this);
this.escapeEditing = this.escapeEditing.bind(this);
this.completeEditing = this.completeEditing.bind(this);
this.handleRowSelect = this.handleRowSelect.bind(this);
this.handleAllRowsSelect = this.handleAllRowsSelect.bind(this);
this.handleCellUpdate = this.handleCellUpdate.bind(this);
this.state = {
data: this.store.get(),
selectedRowKeys: this.store.getSelectedRowKeys()
data: props.store.get(),
selectedRowKeys: props.store.getSelectedRowKeys()
};
}

Expand Down Expand Up @@ -65,7 +61,9 @@ class BootstrapTable extends PropsBaseResolver(Component) {
});

const headerCellSelectionInfo = this.resolveHeaderCellSelectionProps({
onAllRowsSelect: this.handleAllRowsSelect
onAllRowsSelect: this.handleAllRowsSelect,
selected: store.selected,
allRowsSelected: store.isAllRowsSelected()
});

return (
Expand Down Expand Up @@ -101,10 +99,10 @@ class BootstrapTable extends PropsBaseResolver(Component) {
* @param {Boolean} checked - next checked status of input button.
*/
handleRowSelect(rowKey, checked) {
const { mode } = this.props.selectRow;
const { selectRow: { mode }, store } = this.props;
const { ROW_SELECT_SINGLE } = Const;

let currSelected = [...this.store.getSelectedRowKeys()];
let currSelected = [...store.getSelectedRowKeys()];

if (mode === ROW_SELECT_SINGLE) { // when select mode is radio
currSelected = [rowKey];
Expand All @@ -114,7 +112,7 @@ class BootstrapTable extends PropsBaseResolver(Component) {
currSelected = currSelected.filter(value => value !== rowKey);
}

this.store.setSelectedRowKeys(currSelected);
store.setSelectedRowKeys(currSelected);

this.setState(() => ({
selectedRowKeys: currSelected
Expand All @@ -126,14 +124,15 @@ class BootstrapTable extends PropsBaseResolver(Component) {
* @param {Boolean} option - customized result for all rows selection
*/
handleAllRowsSelect(option) {
const selected = this.store.isAnySelectedRow();
const { store } = this.props;
const selected = store.isAnySelectedRow();

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

const currSelected = result ? this.store.selectAllRowKeys() : [];
const currSelected = result ? store.selectAllRowKeys() : [];

this.store.setSelectedRowKeys(currSelected);
store.setSelectedRowKeys(currSelected);

this.setState(() => ({
selectedRowKeys: currSelected
Expand Down
8 changes: 3 additions & 5 deletions packages/react-bootstrap-table2/src/props-resolver/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ export default ExtendBase =>
* @returns {String} result.mode - input type of row selection or disabled.
* @returns {String} result.checkedStatus - checkbox status depending on selected rows counts
*/
resolveHeaderCellSelectionProps(options) {
const { selected } = this.store;
resolveHeaderCellSelectionProps(options = {}) {
const { selectRow } = this.props;
const { allRowsSelected, selected = [], ...rest } = options;
const {
ROW_SELECT_DISABLED, CHECKBOX_STATUS_CHECKED,
CHECKBOX_STATUS_INDETERMINATE, CHECKBOX_STATUS_UNCHECKED
Expand All @@ -82,16 +82,14 @@ export default ExtendBase =>
if (_.isDefined(selectRow)) {
let checkedStatus;

const allRowsSelected = this.store.isAllRowsSelected();

// checkbox status depending on selected rows counts
if (allRowsSelected) checkedStatus = CHECKBOX_STATUS_CHECKED;
else if (selected.length === 0) checkedStatus = CHECKBOX_STATUS_UNCHECKED;
else checkedStatus = CHECKBOX_STATUS_INDETERMINATE;

return {
...selectRow,
...options,
...rest,
checkedStatus
};
}
Expand Down
9 changes: 6 additions & 3 deletions packages/react-bootstrap-table2/test/bootstrap-table.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ describe('BootstrapTable', () => {
wrapper = shallow(
<BootstrapTable
keyField="id"
store={ store }
columns={ columns }
data={ data }
selectRow={{ mode: 'radio' }}
Expand All @@ -191,6 +192,7 @@ describe('BootstrapTable', () => {
wrapper = shallow(
<BootstrapTable
keyField="id"
store={ store }
columns={ columns }
data={ data }
selectRow={{ mode: 'checkbox' }}
Expand Down Expand Up @@ -220,6 +222,7 @@ describe('BootstrapTable', () => {
wrapper = shallow(
<BootstrapTable
keyField="id"
store={ store }
columns={ columns }
data={ data }
/>
Expand All @@ -229,7 +232,7 @@ describe('BootstrapTable', () => {
describe('when customized option was not given', () => {
describe('when nothing was selected', () => {
it('should select all rows', () => {
wrapper.instance().store.setSelectedRowKeys([]);
store.setSelectedRowKeys([]);

wrapper.instance().handleAllRowsSelect();

Expand All @@ -239,7 +242,7 @@ describe('BootstrapTable', () => {

describe('when one or more than one row was selected', () => {
it('should unselect all rows', () => {
wrapper.instance().store.setSelectedRowKeys([1]);
store.setSelectedRowKeys([1]);

wrapper.instance().handleAllRowsSelect();

Expand All @@ -259,7 +262,7 @@ describe('BootstrapTable', () => {

describe('when option is falsy', () => {
it('should unselect all rows', () => {
wrapper.instance().store.setSelectedRowKeys([1]);
store.setSelectedRowKeys([1]);

wrapper.instance().handleAllRowsSelect(false);

Expand Down
39 changes: 27 additions & 12 deletions packages/react-bootstrap-table2/test/props-resolver/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ describe('TableResolver', () => {
const expectNonEditableRows = [1, 2];
const cellEdit = {
mode: Const.DBCLICK_TO_CELL_EDIT,
onEditing: sinon.stub(),
onUpdate: sinon.stub(),
blurToSave: true,
beforeSaveCell: sinon.stub(),
afterSaveCell: sinon.stub(),
Expand All @@ -110,10 +110,8 @@ describe('TableResolver', () => {
it('should resolve a cellEdit correctly', () => {
const cellEditInfo = wrapper.instance().resolveCellEditProps();
expect(cellEditInfo).toBeDefined();
expect(cellEditInfo.ridx).toBeNull();
expect(cellEditInfo.cidx).toBeNull();
expect(cellEditInfo.mode).toEqual(cellEdit.mode);
expect(cellEditInfo.onEditing).toEqual(cellEdit.onEditing);
expect(cellEditInfo.onUpdate).toEqual(cellEdit.onUpdate);
expect(cellEditInfo.blurToSave).toEqual(cellEdit.blurToSave);
expect(cellEditInfo.beforeSaveCell).toEqual(cellEdit.beforeSaveCell);
expect(cellEditInfo.afterSaveCell).toEqual(cellEdit.afterSaveCell);
Expand Down Expand Up @@ -268,7 +266,9 @@ describe('TableResolver', () => {
selectRow = {};
const mockOptions = {
foo: 'test',
bar: sinon.stub()
bar: sinon.stub(),
allRowsSelected: false,
selected: []
};
const selectedRowKeys = [];
const mockElement = React.createElement(BootstrapTableMock, {
Expand All @@ -278,12 +278,20 @@ describe('TableResolver', () => {
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps(mockOptions);
});

it('should return object which contain options', () => {
it('should return object which contain specified options', () => {
expect(headerCellSelectionInfo).toEqual(expect.objectContaining({
foo: 'test',
bar: expect.any(Function)
}));
});

it('should return object which can not contain allRowsSelected option', () => {
expect(headerCellSelectionInfo.allRowsSelected).not.toBeDefined();
});

it('should return object which can not contain allRowsSelected option', () => {
expect(headerCellSelectionInfo.selected).not.toBeDefined();
});
});

describe('if all rows were selected', () => {
Expand All @@ -295,9 +303,11 @@ describe('TableResolver', () => {
}, null);

wrapper = shallow(mockElement);
wrapper.instance().store.setSelectedRowKeys(selectedRowKeys);

headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
allRowsSelected: true,
selected: selectedRowKeys
});
});

it('should return checkedStatus which eqauls to checked', () => {
Expand All @@ -306,6 +316,7 @@ describe('TableResolver', () => {
}));
});
});

describe('if part of rows were selected', () => {
beforeEach(() => {
selectRow = {};
Expand All @@ -315,8 +326,10 @@ describe('TableResolver', () => {
}, null);

wrapper = shallow(mockElement);
wrapper.instance().store.setSelectedRowKeys(selectedRowKeys);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
allRowsSelected: false,
selected: selectedRowKeys
});
});

it('should return checkedStatus which eqauls to indeterminate', () => {
Expand All @@ -335,9 +348,11 @@ describe('TableResolver', () => {
}, null);

wrapper = shallow(mockElement);
wrapper.instance().store.setSelectedRowKeys(selectedRowKeys);

headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
allRowsSelected: false,
selected: selectedRowKeys
});
});

it('should return checkedStatus which eqauls to unchecked', () => {
Expand Down