diff --git a/packages/react-bootstrap-table2-paginator/src/bootstrap.js b/packages/react-bootstrap-table2-paginator/src/bootstrap.js
new file mode 100644
index 0000000..1ee0db1
--- /dev/null
+++ b/packages/react-bootstrap-table2-paginator/src/bootstrap.js
@@ -0,0 +1,6 @@
+import React from 'react';
+
+// consider to have a common lib?1
+export const BootstrapContext = React.createContext({
+ bootstrap4: false
+});
diff --git a/packages/react-bootstrap-table2-paginator/src/context.js b/packages/react-bootstrap-table2-paginator/src/context.js
index 7f508a3..10d72ff 100644
--- a/packages/react-bootstrap-table2-paginator/src/context.js
+++ b/packages/react-bootstrap-table2-paginator/src/context.js
@@ -5,6 +5,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import Const from './const';
+import { BootstrapContext } from './bootstrap';
import Pagination from './pagination';
import { getByCurrPage, alignPage } from './page';
@@ -123,7 +124,7 @@ export default (
render() {
let { data } = this.props;
- const { pagination: { options } } = this.props;
+ const { pagination: { options }, bootstrap4 } = this.props;
const { currPage, currSizePerPage } = this;
const withFirstAndLast = typeof options.withFirstAndLast === 'undefined' ?
Const.With_FIRST_AND_LAST : options.withFirstAndLast;
@@ -148,31 +149,33 @@ export default (
return (
{ this.props.children }
-
+
+
+
);
}
diff --git a/packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown.js b/packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown.js
index 5ae4298..2d8fcc4 100644
--- a/packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown.js
+++ b/packages/react-bootstrap-table2-paginator/src/size-per-page-dropdown.js
@@ -1,6 +1,7 @@
import React from 'react';
import cs from 'classnames';
import PropTypes from 'prop-types';
+import { BootstrapContext } from './bootstrap';
import SizePerPageOption from './size-per-page-option';
const sizePerPageDefaultClass = 'react-bs-table-sizePerPage-dropdown';
@@ -20,44 +21,60 @@ const SizePerPageDropDown = (props) => {
} = props;
const dropDownStyle = { visibility: hidden ? 'hidden' : 'visible' };
+ const openClass = open ? 'open show' : '';
const dropdownClasses = cs(
- open ? 'open show' : '',
+ openClass,
sizePerPageDefaultClass,
variation,
className,
);
return (
-
-
-
- {
- options.map(option => (
-
- ))
- }
-
-
+
+ {
+ ({ bootstrap4 }) => (
+
+
+
+ {
+ options.map(option => (
+
+ ))
+ }
+
+
+ )
+ }
+
);
};
diff --git a/packages/react-bootstrap-table2-paginator/src/size-per-page-option.js b/packages/react-bootstrap-table2-paginator/src/size-per-page-option.js
index eba6ca6..a01a360 100644
--- a/packages/react-bootstrap-table2-paginator/src/size-per-page-option.js
+++ b/packages/react-bootstrap-table2-paginator/src/size-per-page-option.js
@@ -5,9 +5,28 @@ import PropTypes from 'prop-types';
const SizePerPageOption = ({
text,
page,
- onSizePerPageChange
-}) => (
-
+ onSizePerPageChange,
+ bootstrap4
+}) => (bootstrap4 ? (
+ {
+ e.preventDefault();
+ onSizePerPageChange(page);
+ } }
+ >
+ { text }
+
+) : (
+
-);
+));
SizePerPageOption.propTypes = {
text: PropTypes.string.isRequired,
page: PropTypes.number.isRequired,
- onSizePerPageChange: PropTypes.func.isRequired
+ onSizePerPageChange: PropTypes.func.isRequired,
+ bootstrap4: PropTypes.bool
+};
+
+SizePerPageOption.defaultProps = {
+ bootstrap4: false
};
export default SizePerPageOption;
diff --git a/packages/react-bootstrap-table2-paginator/test/size-per-page-dropdown.test.js b/packages/react-bootstrap-table2-paginator/test/size-per-page-dropdown.test.js
index 21e11cc..fdf55bd 100644
--- a/packages/react-bootstrap-table2-paginator/test/size-per-page-dropdown.test.js
+++ b/packages/react-bootstrap-table2-paginator/test/size-per-page-dropdown.test.js
@@ -5,6 +5,12 @@ import { shallow } from 'enzyme';
import SizePerPageOption from '../src/size-per-page-option';
import SizePerPageDropDown from '../src/size-per-page-dropdown';
+const shallowWithContext = (elem, context = {}) => {
+ const wrapper = shallow(elem);
+ const Children = wrapper.props().children(context);
+ return shallow(Children);
+};
+
describe('SizePerPageDropDown', () => {
let wrapper;
const currSizePerPage = '25';
@@ -28,8 +34,9 @@ describe('SizePerPageDropDown', () => {
describe('default SizePerPageDropDown component', () => {
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
@@ -47,6 +54,7 @@ describe('SizePerPageDropDown', () => {
const option = options[i];
expect(sizePerPage.prop('text')).toEqual(option.text);
expect(sizePerPage.prop('page')).toEqual(option.page);
+ expect(sizePerPage.prop('bootstrap4')).toBeFalsy();
expect(sizePerPage.prop('onSizePerPageChange')).toEqual(onSizePerPageChange);
});
});
@@ -61,10 +69,52 @@ describe('SizePerPageDropDown', () => {
});
});
+ describe('when bootstrap4 context is true', () => {
+ beforeEach(() => {
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: true }
+ );
+ });
+
+ it('should rendering SizePerPageDropDown correctly', () => {
+ expect(wrapper.length).toBe(1);
+ expect(wrapper.find('button').length).toBe(1);
+ expect(wrapper.find('button').text()).toEqual(`${currSizePerPage} `);
+ });
+
+ it('should rendering SizePerPageOption successfully', () => {
+ expect(wrapper.find('ul.dropdown-menu').length).toBe(1);
+ const sizePerPageOptions = wrapper.find(SizePerPageOption);
+ expect(sizePerPageOptions.length).toBe(options.length);
+ sizePerPageOptions.forEach((sizePerPage, i) => {
+ const option = options[i];
+ expect(sizePerPage.prop('text')).toEqual(option.text);
+ expect(sizePerPage.prop('page')).toEqual(option.page);
+ expect(sizePerPage.prop('bootstrap4')).toBeTruthy();
+ expect(sizePerPage.prop('onSizePerPageChange')).toEqual(onSizePerPageChange);
+ });
+ });
+
+ it('no need to render caret', () => {
+ expect(wrapper.find('.caret')).toHaveLength(0);
+ });
+
+ it('default variation is dropdown', () => {
+ expect(wrapper.hasClass('dropdown')).toBeTruthy();
+ });
+
+ it('default dropdown is not open', () => {
+ expect(wrapper.hasClass('open show')).toBeFalsy();
+ expect(wrapper.find('[aria-expanded=false]').length).toBe(1);
+ });
+ });
+
describe('when open prop is true', () => {
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
@@ -76,8 +126,9 @@ describe('SizePerPageDropDown', () => {
describe('when hidden prop is true', () => {
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
@@ -89,8 +140,9 @@ describe('SizePerPageDropDown', () => {
describe('when btnContextual prop is defined', () => {
const contextual = 'btn-warning';
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
@@ -102,8 +154,9 @@ describe('SizePerPageDropDown', () => {
describe('when variation prop is defined', () => {
const variation = 'dropup';
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
@@ -115,8 +168,9 @@ describe('SizePerPageDropDown', () => {
describe('when className prop is defined', () => {
const className = 'custom-class';
beforeEach(() => {
- wrapper = shallow(
-
+ wrapper = shallowWithContext(
+ ,
+ { bootstrap4: false }
);
});
diff --git a/packages/react-bootstrap-table2-paginator/test/size-per-page-option.test.js b/packages/react-bootstrap-table2-paginator/test/size-per-page-option.test.js
index 8e4daeb..f24abd2 100644
--- a/packages/react-bootstrap-table2-paginator/test/size-per-page-option.test.js
+++ b/packages/react-bootstrap-table2-paginator/test/size-per-page-option.test.js
@@ -11,29 +11,64 @@ describe('SizePerPageOption', () => {
const onSizePerPageChange = sinon.stub();
beforeEach(() => {
- const props = { text, page, onSizePerPageChange };
- wrapper = shallow(
-
- );
+ onSizePerPageChange.reset();
});
- it('should render SizePerPageOption correctly', () => {
- expect(wrapper.length).toBe(1);
- expect(wrapper.find('.dropdown-item').length).toBe(1);
- expect(wrapper.find(`[data-page=${page}]`).length).toBe(1);
- expect(wrapper.text()).toEqual(text);
- });
-
- describe('when MouseDown event happen', () => {
- const preventDefault = sinon.stub();
+ describe('when bootstrap4 prop is true', () => {
beforeEach(() => {
- wrapper.find('a').simulate('mousedown', { preventDefault });
+ const props = { text, page, onSizePerPageChange };
+ wrapper = shallow(
+
+ );
});
- it('should calling props.onSizePerPageChange correctly', () => {
- expect(preventDefault.calledOnce).toBeTruthy();
- expect(onSizePerPageChange.calledOnce).toBeTruthy();
- expect(onSizePerPageChange.calledWith(page)).toBeTruthy();
+ it('should render SizePerPageOption correctly', () => {
+ expect(wrapper.length).toBe(1);
+ expect(wrapper.find('li.dropdown-item').length).toBe(1);
+ expect(wrapper.find(`[data-page=${page}]`).length).toBe(1);
+ expect(wrapper.text()).toEqual(text);
+ });
+
+ describe('when MouseDown event happen', () => {
+ const preventDefault = sinon.stub();
+ beforeEach(() => {
+ wrapper.find('a').simulate('mousedown', { preventDefault });
+ });
+
+ it('should calling props.onSizePerPageChange correctly', () => {
+ expect(preventDefault.calledOnce).toBeTruthy();
+ expect(onSizePerPageChange.calledOnce).toBeTruthy();
+ expect(onSizePerPageChange.calledWith(page)).toBeTruthy();
+ });
+ });
+ });
+
+ describe('when bootstrap4 prop is true', () => {
+ beforeEach(() => {
+ const props = { text, page, onSizePerPageChange };
+ wrapper = shallow(
+
+ );
+ });
+
+ it('should render SizePerPageOption correctly', () => {
+ expect(wrapper.length).toBe(1);
+ expect(wrapper.find('a.dropdown-item').length).toBe(1);
+ expect(wrapper.find(`[data-page=${page}]`).length).toBe(1);
+ expect(wrapper.text()).toEqual(text);
+ });
+
+ describe('when MouseDown event happen', () => {
+ const preventDefault = sinon.stub();
+ beforeEach(() => {
+ wrapper.find('a').simulate('mousedown', { preventDefault });
+ });
+
+ it('should calling props.onSizePerPageChange correctly', () => {
+ expect(preventDefault.calledOnce).toBeTruthy();
+ expect(onSizePerPageChange.calledOnce).toBeTruthy();
+ expect(onSizePerPageChange.calledWith(page)).toBeTruthy();
+ });
});
});
});
diff --git a/packages/react-bootstrap-table2/src/contexts/index.js b/packages/react-bootstrap-table2/src/contexts/index.js
index 63f959c..049c288 100644
--- a/packages/react-bootstrap-table2/src/contexts/index.js
+++ b/packages/react-bootstrap-table2/src/contexts/index.js
@@ -155,6 +155,7 @@ const withContext = Base =>
ref={ n => this.paginationContext = n }
pagination={ this.props.pagination }
data={ rootProps.getData(filterProps, searchProps, sortProps) }
+ bootstrap4={ this.props.bootstrap4 }
>
{