react-bootstrap
Version:
Bootstrap 3 components build with React
231 lines (196 loc) • 6.25 kB
JavaScript
'use strict';
var _extends = require('babel-runtime/helpers/extends')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
exports.__esModule = true;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _BootstrapMixin = require('./BootstrapMixin');
var _BootstrapMixin2 = _interopRequireDefault(_BootstrapMixin);
var _PaginationButton = require('./PaginationButton');
var _PaginationButton2 = _interopRequireDefault(_PaginationButton);
var _utilsCustomPropTypes = require('./utils/CustomPropTypes');
var _utilsCustomPropTypes2 = _interopRequireDefault(_utilsCustomPropTypes);
var _SafeAnchor = require('./SafeAnchor');
var _SafeAnchor2 = _interopRequireDefault(_SafeAnchor);
var Pagination = _react2['default'].createClass({
displayName: 'Pagination',
mixins: [_BootstrapMixin2['default']],
propTypes: {
activePage: _react2['default'].PropTypes.number,
items: _react2['default'].PropTypes.number,
maxButtons: _react2['default'].PropTypes.number,
ellipsis: _react2['default'].PropTypes.bool,
first: _react2['default'].PropTypes.bool,
last: _react2['default'].PropTypes.bool,
prev: _react2['default'].PropTypes.bool,
next: _react2['default'].PropTypes.bool,
onSelect: _react2['default'].PropTypes.func,
/**
* You can use a custom element for the buttons
*/
buttonComponentClass: _utilsCustomPropTypes2['default'].elementType
},
getDefaultProps: function getDefaultProps() {
return {
activePage: 1,
items: 1,
maxButtons: 0,
first: false,
last: false,
prev: false,
next: false,
ellipsis: true,
buttonComponentClass: _SafeAnchor2['default'],
bsClass: 'pagination'
};
},
renderPageButtons: function renderPageButtons() {
var pageButtons = [];
var startPage = undefined,
endPage = undefined,
hasHiddenPagesAfter = undefined;
var _props = this.props;
var maxButtons = _props.maxButtons;
var activePage = _props.activePage;
var items = _props.items;
var onSelect = _props.onSelect;
var ellipsis = _props.ellipsis;
var buttonComponentClass = _props.buttonComponentClass;
if (maxButtons) {
var hiddenPagesBefore = activePage - parseInt(maxButtons / 2);
startPage = hiddenPagesBefore > 1 ? hiddenPagesBefore : 1;
hasHiddenPagesAfter = startPage + maxButtons <= items;
if (!hasHiddenPagesAfter) {
endPage = items;
startPage = items - maxButtons + 1;
if (startPage < 1) {
startPage = 1;
}
} else {
endPage = startPage + maxButtons - 1;
}
} else {
startPage = 1;
endPage = items;
}
for (var pagenumber = startPage; pagenumber <= endPage; pagenumber++) {
pageButtons.push(_react2['default'].createElement(
_PaginationButton2['default'],
{
key: pagenumber,
eventKey: pagenumber,
active: pagenumber === activePage,
onSelect: onSelect,
buttonComponentClass: buttonComponentClass },
pagenumber
));
}
if (maxButtons && hasHiddenPagesAfter && ellipsis) {
pageButtons.push(_react2['default'].createElement(
_PaginationButton2['default'],
{
key: 'ellipsis',
disabled: true,
buttonComponentClass: buttonComponentClass },
_react2['default'].createElement(
'span',
{ 'aria-label': 'More' },
'...'
)
));
}
return pageButtons;
},
renderPrev: function renderPrev() {
if (!this.props.prev) {
return null;
}
return _react2['default'].createElement(
_PaginationButton2['default'],
{
key: 'prev',
eventKey: this.props.activePage - 1,
disabled: this.props.activePage === 1,
onSelect: this.props.onSelect,
buttonComponentClass: this.props.buttonComponentClass },
_react2['default'].createElement(
'span',
{ 'aria-label': 'Previous' },
'‹'
)
);
},
renderNext: function renderNext() {
if (!this.props.next) {
return null;
}
return _react2['default'].createElement(
_PaginationButton2['default'],
{
key: 'next',
eventKey: this.props.activePage + 1,
disabled: this.props.activePage >= this.props.items,
onSelect: this.props.onSelect,
buttonComponentClass: this.props.buttonComponentClass },
_react2['default'].createElement(
'span',
{ 'aria-label': 'Next' },
'›'
)
);
},
renderFirst: function renderFirst() {
if (!this.props.first) {
return null;
}
return _react2['default'].createElement(
_PaginationButton2['default'],
{
key: 'first',
eventKey: 1,
disabled: this.props.activePage === 1,
onSelect: this.props.onSelect,
buttonComponentClass: this.props.buttonComponentClass },
_react2['default'].createElement(
'span',
{ 'aria-label': 'First' },
'«'
)
);
},
renderLast: function renderLast() {
if (!this.props.last) {
return null;
}
return _react2['default'].createElement(
_PaginationButton2['default'],
{
key: 'last',
eventKey: this.props.items,
disabled: this.props.activePage >= this.props.items,
onSelect: this.props.onSelect,
buttonComponentClass: this.props.buttonComponentClass },
_react2['default'].createElement(
'span',
{ 'aria-label': 'Last' },
'»'
)
);
},
render: function render() {
return _react2['default'].createElement(
'ul',
_extends({}, this.props, {
className: _classnames2['default'](this.props.className, this.getBsClassSet()) }),
this.renderFirst(),
this.renderPrev(),
this.renderPageButtons(),
this.renderNext(),
this.renderLast()
);
}
});
exports['default'] = Pagination;
module.exports = exports['default'];