refine row selection

* adjust propType order

* rename for resolving selectRow prop

* refine row selection

* refine document
This commit is contained in:
Allen
2017-10-18 01:13:06 -05:00
committed by GitHub
parent f52baa47ea
commit 4f7a3d7eaf
14 changed files with 60 additions and 57 deletions
+4 -1
View File
@@ -38,4 +38,7 @@ Same as `.table-hover` class for adding a hover effect (grey background color) o
Same as `.table-condensed` class for makeing a table more compact by cutting cell padding in half
### <a name='cellEdit'>cellEdit - [Object]</a>
`cellEdit` props accept an object, please see [cellEdit definition](./cell-edit-prop.md) for more detail.
`cellEdit` allow you to enable cell editing on table, please see [cellEdit definition](./cell-edit.md) for more detail.
### <a name='selectRow'>selectRow - [Object]</a>
`selectRow` allow you to have a mechanism to select rows, please see [selectRow definition](./row-selection.md) for more detail.
+4 -4
View File
@@ -1,6 +1,6 @@
# Row selection
`react-bootstrap-table2` supports the row selection feature. By passing prop `selectRow ` to enable row selection. When you enable this feature, `react-bootstrap-table2` will append a new selection column at first.
`react-bootstrap-table2` supports the row selection feature. By passing prop `selectRow` to enable row selection. When you enable this feature, `react-bootstrap-table2` will append a new selection column at first.
## Available properties
@@ -8,7 +8,7 @@
The following are available properties in `selectRow`:
#### Required
* [mode (required)](#mode)
* [mode (**required**)](#mode)
#### Optional
@@ -23,7 +23,7 @@ Specifying the selection way for `single(radio)` or `multiple(checkbox)`. If `ra
#### examples
```js
const selectRowProp = {
const selectRow = {
mode: 'radio' // single row selection
};
<BootstrapTable
@@ -35,7 +35,7 @@ const selectRowProp = {
```
```js
const selectRowProp = {
const selectRow = {
mode: 'checkbox' // multiple row selection
};
+8 -8
View File
@@ -52,11 +52,11 @@ class BootstrapTable extends PropsBaseResolver(Component) {
currEditCell: this.props.currEditCell
});
const cellSelectionInfo = this.resolveCellSelectionProps({
const cellSelectionInfo = this.resolveSelectRowProps({
onRowSelect: this.props.onRowSelect
});
const headerCellSelectionInfo = this.resolveHeaderCellSelectionProps({
const headerCellSelectionInfo = this.resolveSelectRowPropsForHeader({
onAllRowsSelect: this.props.onAllRowsSelect,
selected: store.selected,
allRowsSelected: store.isAllRowsSelected()
@@ -117,11 +117,6 @@ BootstrapTable.propTypes = {
timeToCloseMessage: PropTypes.number,
errorMessage: PropTypes.string
}),
selectRow: PropTypes.shape({
mode: PropTypes.oneOf([Const.ROW_SELECT_SINGLE, Const.ROW_SELECT_MULTIPLE]).isRequired
}),
onRowSelect: PropTypes.func,
onAllRowsSelect: PropTypes.func,
onCellUpdate: PropTypes.func,
onStartEditing: PropTypes.func,
onEscapeEditing: PropTypes.func,
@@ -130,7 +125,12 @@ BootstrapTable.propTypes = {
cidx: PropTypes.number,
message: PropTypes.string,
editing: PropTypes.bool
})
}),
selectRow: PropTypes.shape({
mode: PropTypes.oneOf([Const.ROW_SELECT_SINGLE, Const.ROW_SELECT_MULTIPLE]).isRequired
}),
onRowSelect: PropTypes.func,
onAllRowsSelect: PropTypes.func
};
BootstrapTable.defaultProps = {
@@ -47,7 +47,7 @@ export default ExtendBase =>
* @returns {Object} result - props for cell selections
* @returns {String} result.mode - input type of row selection or disabled.
*/
resolveCellSelectionProps(options) {
resolveSelectRowProps(options) {
const { selectRow } = this.props;
const { ROW_SELECT_DISABLED } = Const;
@@ -71,7 +71,7 @@ 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 = {}) {
resolveSelectRowPropsForHeader(options = {}) {
const { selectRow } = this.props;
const { allRowsSelected, selected = [], ...rest } = options;
const {
@@ -1,7 +1,7 @@
/* eslint react/require-default-props: 0 */
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import Constant from '../const';
import Const from '../const';
export const CheckBox = ({ checked, indeterminate }) => (
<input
@@ -36,7 +36,7 @@ export default class SelectionHeaderCell extends Component {
* 2. status was not changed.
*/
shouldComponentUpdate(nextProps) {
const { ROW_SELECT_SINGLE } = Constant;
const { ROW_SELECT_SINGLE } = Const;
const { mode, checkedStatus } = this.props;
if (mode === ROW_SELECT_SINGLE) return false;
@@ -53,7 +53,7 @@ export default class SelectionHeaderCell extends Component {
render() {
const {
CHECKBOX_STATUS_CHECKED, CHECKBOX_STATUS_INDETERMINATE, ROW_SELECT_SINGLE
} = Constant;
} = Const;
const { mode, checkedStatus } = this.props;
@@ -6,7 +6,7 @@ import Body from '../src/body';
import Row from '../src/row';
import Const from '../src/const';
import RowSection from '../src/row-section';
import mockBodyResolvedProps from '../test/mock-data/body-resolved-props';
import mockBodyResolvedProps from './test-helpers/mock/body-resolved-props';
describe('Body', () => {
let wrapper;
@@ -5,7 +5,7 @@ import HeaderCell from '../src/header-cell';
import SelectionHeaderCell from '../src//row-selection/selection-header-cell';
import Header from '../src/header';
import Const from '../src/const';
import mockHeaderResolvedProps from '../test/mock-data/header-resolved-props';
import mockHeaderResolvedProps from './test-helpers/mock/header-resolved-props';
describe('Header', () => {
let wrapper;
@@ -1,11 +0,0 @@
import Const from '../../src/const';
const { ROW_SELECT_DISABLED } = Const;
export const headerCellSelectionResolvedProps = {
mode: ROW_SELECT_DISABLED
};
export default {
selectRow: headerCellSelectionResolvedProps
};
@@ -131,7 +131,7 @@ describe('TableResolver', () => {
});
});
describe('resolveCellSelectionProps', () => {
describe('resolveSelectRowProps', () => {
let cellSelectionInfo;
let selectRow;
@@ -141,7 +141,7 @@ describe('TableResolver', () => {
data, keyField, columns
}, null);
wrapper = shallow(mockElement);
cellSelectionInfo = wrapper.instance().resolveCellSelectionProps();
cellSelectionInfo = wrapper.instance().resolveSelectRowProps();
});
it('should return object', () => {
@@ -162,7 +162,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectRow
}, null);
wrapper = shallow(mockElement);
cellSelectionInfo = wrapper.instance().resolveCellSelectionProps();
cellSelectionInfo = wrapper.instance().resolveSelectRowProps();
expect(cellSelectionInfo).toBeDefined();
expect(cellSelectionInfo.constructor).toEqual(Object);
@@ -175,7 +175,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectRow
}, null);
wrapper = shallow(mockElement);
cellSelectionInfo = wrapper.instance().resolveCellSelectionProps();
cellSelectionInfo = wrapper.instance().resolveSelectRowProps();
expect(cellSelectionInfo).toBeDefined();
expect(cellSelectionInfo.constructor).toEqual(Object);
@@ -194,7 +194,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectRow
}, null);
wrapper = shallow(mockElement);
cellSelectionInfo = wrapper.instance().resolveCellSelectionProps(mockOptions);
cellSelectionInfo = wrapper.instance().resolveSelectRowProps(mockOptions);
});
it('should return object which contain options', () => {
@@ -207,7 +207,7 @@ describe('TableResolver', () => {
});
});
describe('resolveHeaderCellSelectionProps', () => {
describe('resolveSelectRowPropsForHeader', () => {
let headerCellSelectionInfo;
let selectRow;
@@ -216,7 +216,7 @@ describe('TableResolver', () => {
data, keyField, columns
}, null);
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader();
});
describe('if selectRow was not defined', () => {
@@ -239,7 +239,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectedRowKeys, selectRow
}, null);
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader();
expect(headerCellSelectionInfo).toBeDefined();
expect(headerCellSelectionInfo.constructor).toEqual(Object);
@@ -253,7 +253,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectedRowKeys, selectRow
}, null);
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps();
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader();
expect(headerCellSelectionInfo).toBeDefined();
expect(headerCellSelectionInfo.constructor).toEqual(Object);
@@ -275,7 +275,7 @@ describe('TableResolver', () => {
data, keyField, columns, selectedRowKeys, selectRow
}, null);
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps(mockOptions);
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader(mockOptions);
});
it('should return object which contain specified options', () => {
@@ -304,7 +304,7 @@ describe('TableResolver', () => {
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader({
allRowsSelected: true,
selected: selectedRowKeys
});
@@ -326,7 +326,7 @@ describe('TableResolver', () => {
}, null);
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader({
allRowsSelected: false,
selected: selectedRowKeys
});
@@ -349,7 +349,7 @@ describe('TableResolver', () => {
wrapper = shallow(mockElement);
headerCellSelectionInfo = wrapper.instance().resolveHeaderCellSelectionProps({
headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader({
allRowsSelected: false,
selected: selectedRowKeys
});
@@ -2,7 +2,7 @@ import React from 'react';
import { shallow } from 'enzyme';
import sinon from 'sinon';
import Constant from '../../src/const';
import Const from '../../src/const';
import SelectionHeaderCell, { CheckBox } from '../../src/row-selection/selection-header-cell';
let wrapper;
@@ -20,7 +20,7 @@ describe('<SelectionHeaderCell />', () => {
describe('when props.mode is checkbox', () => {
describe('if checkedStatus prop has not been changed', () => {
it('should not update component', () => {
const checkedStatus = Constant.CHECKBOX_STATUS_CHECKED;
const checkedStatus = Const.CHECKBOX_STATUS_CHECKED;
const nextProps = { checkedStatus };
wrapper = shallow(
@@ -32,7 +32,7 @@ describe('<SelectionHeaderCell />', () => {
describe('if checkedStatus prop has been changed', () => {
it('should update component', () => {
const { CHECKBOX_STATUS_INDETERMINATE, CHECKBOX_STATUS_CHECKED } = Constant;
const { CHECKBOX_STATUS_INDETERMINATE, CHECKBOX_STATUS_CHECKED } = Const;
const checkedStatus = CHECKBOX_STATUS_CHECKED;
const nextProps = { checkedStatus };
@@ -60,7 +60,7 @@ describe('<SelectionHeaderCell />', () => {
wrapper = shallow(
<SelectionHeaderCell
mode="radio"
checkedStatus={Constant.CHECKBOX_STATUS_CHECKED}
checkedStatus={Const.CHECKBOX_STATUS_CHECKED}
onAllRowsSelect={mockOnAllRowsSelect}
/>);
});
@@ -78,7 +78,7 @@ describe('<SelectionHeaderCell />', () => {
wrapper = shallow(
<SelectionHeaderCell
mode="checkbox"
checkedStatus={Constant.CHECKBOX_STATUS_CHECKED}
checkedStatus={Const.CHECKBOX_STATUS_CHECKED}
onAllRowsSelect={mockOnAllRowsSelect}
/>);
});
@@ -96,7 +96,7 @@ describe('<SelectionHeaderCell />', () => {
describe('render', () => {
describe('when props.mode is radio', () => {
beforeEach(() => {
const checkedStatus = Constant.CHECKBOX_STATUS_CHECKED;
const checkedStatus = Const.CHECKBOX_STATUS_CHECKED;
wrapper = shallow(<SelectionHeaderCell mode="radio" checkedStatus={checkedStatus} />);
});
@@ -109,15 +109,15 @@ describe('<SelectionHeaderCell />', () => {
});
describe('when props.mode is checkbox', () => {
const checkedStatus = Constant.CHECKBOX_STATUS_CHECKED;
const checkedStatus = Const.CHECKBOX_STATUS_CHECKED;
beforeEach(() => {
wrapper = shallow(<SelectionHeaderCell mode="checkbox" checkedStatus={checkedStatus} />);
});
it('should render checkbox', () => {
const checked = checkedStatus === Constant.CHECKBOX_STATUS_CHECKED;
const indeterminate = checkedStatus === Constant.CHECKBOX_STATUS_INDETERMINATE;
const checked = checkedStatus === Const.CHECKBOX_STATUS_CHECKED;
const indeterminate = checkedStatus === Const.CHECKBOX_STATUS_INDETERMINATE;
expect(wrapper.find('th').length).toBe(1);
expect(wrapper.find('th[data-row-selection]').length).toBe(1);
@@ -7,7 +7,7 @@ import Row from '../src/row';
import Const from '../src/const';
import EditingCell from '../src/cell-edit/editing-cell';
import SelectionCell from '../src//row-selection/selection-cell';
import mockBodyResolvedProps from '../test/mock-data/body-resolved-props';
import mockBodyResolvedProps from './test-helpers/mock/body-resolved-props';
const defaultColumns = [{
dataField: 'id',
@@ -1,8 +1,8 @@
import Const from '../../src/const';
import Const from '../../../src/const';
const { ROW_SELECT_DISABLED, UNABLE_TO_CELL_EDIT } = Const;
export const cellSelectionResolvedProps = {
export const rowSelectionResolvedProps = {
mode: ROW_SELECT_DISABLED
};
@@ -12,5 +12,5 @@ export const cellEditResolvedProps = {
export default {
cellEdit: cellEditResolvedProps,
selectRow: cellSelectionResolvedProps
selectRow: rowSelectionResolvedProps
};
@@ -0,0 +1,11 @@
import Const from '../../../src/const';
const { ROW_SELECT_DISABLED } = Const;
export const rowSelectionResolvedProps = {
mode: ROW_SELECT_DISABLED
};
export default {
selectRow: rowSelectionResolvedProps
};