react-bootstrap
Version:
Bootstrap 3 components build with React
170 lines (133 loc) • 4.64 kB
JavaScript
/* eslint react/prop-types: [2, {ignore: "bsStyle"}] */
/* BootstrapMixin contains `bsStyle` type validation */
'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 _Interpolate = require('./Interpolate');
var _Interpolate2 = _interopRequireDefault(_Interpolate);
var _BootstrapMixin = require('./BootstrapMixin');
var _BootstrapMixin2 = _interopRequireDefault(_BootstrapMixin);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _utilsValidComponentChildren = require('./utils/ValidComponentChildren');
var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
var ProgressBar = _react2['default'].createClass({
displayName: 'ProgressBar',
propTypes: {
min: _react.PropTypes.number,
now: _react.PropTypes.number,
max: _react.PropTypes.number,
label: _react.PropTypes.node,
srOnly: _react.PropTypes.bool,
striped: _react.PropTypes.bool,
active: _react.PropTypes.bool,
children: onlyProgressBar,
className: _react2['default'].PropTypes.string,
interpolateClass: _react.PropTypes.node,
isChild: _react.PropTypes.bool
},
mixins: [_BootstrapMixin2['default']],
getDefaultProps: function getDefaultProps() {
return {
bsClass: 'progress-bar',
min: 0,
max: 100
};
},
getPercentage: function getPercentage(now, min, max) {
var roundPrecision = 1000;
return Math.round((now - min) / (max - min) * 100 * roundPrecision) / roundPrecision;
},
render: function render() {
if (this.props.isChild) {
return this.renderProgressBar();
}
var content = undefined;
if (this.props.children) {
content = _utilsValidComponentChildren2['default'].map(this.props.children, this.renderChildBar);
} else {
content = this.renderProgressBar();
}
return _react2['default'].createElement(
'div',
_extends({}, this.props, { className: _classnames2['default'](this.props.className, 'progress') }),
content
);
},
renderChildBar: function renderChildBar(child, index) {
return _react.cloneElement(child, {
isChild: true,
key: child.key ? child.key : index
});
},
renderProgressBar: function renderProgressBar() {
var percentage = this.getPercentage(this.props.now, this.props.min, this.props.max);
var label = undefined;
if (typeof this.props.label === 'string') {
label = this.renderLabel(percentage);
} else {
label = this.props.label;
}
if (this.props.srOnly) {
label = _react2['default'].createElement(
'span',
{ className: "sr-only" },
label
);
}
var classes = _classnames2['default'](this.props.className, this.getBsClassSet(), {
active: this.props.active,
'progress-bar-striped': this.props.active || this.props.striped
});
return _react2['default'].createElement(
'div',
_extends({}, this.props, {
className: classes,
role: "progressbar",
style: { width: percentage + '%' },
'aria-valuenow': this.props.now,
'aria-valuemin': this.props.min,
'aria-valuemax': this.props.max }),
label
);
},
renderLabel: function renderLabel(percentage) {
var InterpolateClass = this.props.interpolateClass || _Interpolate2['default'];
return _react2['default'].createElement(
InterpolateClass,
{
now: this.props.now,
min: this.props.min,
max: this.props.max,
percent: percentage,
bsStyle: this.props.bsStyle },
this.props.label
);
}
});
/**
* Custom propTypes checker
*/
function onlyProgressBar(props, propName, componentName) {
if (props[propName]) {
var _ret = (function () {
var error = undefined,
childIdentifier = undefined;
_react2['default'].Children.forEach(props[propName], function (child) {
if (child.type !== ProgressBar) {
childIdentifier = child.type.displayName ? child.type.displayName : child.type;
error = new Error('Children of ' + componentName + ' can contain only ProgressBar components. Found ' + childIdentifier);
}
});
return {
v: error
};
})();
if (typeof _ret === 'object') return _ret.v;
}
}
exports['default'] = ProgressBar;
module.exports = exports['default'];