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 ( - - - - + + { + ({ bootstrap4 }) => ( + + + + + ) + } + ); }; 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( -