UNPKG

formsy-react-bootstrap

Version:

Integration of formsy validation with bootstrap

151 lines (113 loc) 4.14 kB
'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _formsyReact = require('formsy-react'); var _formsyReact2 = _interopRequireDefault(_formsyReact); var _mixins = require('./mixins'); var _mixins2 = _interopRequireDefault(_mixins); var _reactBootstrap = require('react-bootstrap'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var propUtilities = require('./propUtilities'); var TimeInput = _react2.default.createClass({ displayName: 'TimeInput', mixins: [_formsyReact2.default.Mixin, _mixins2.default], statics: { internalValidation: function internalValidation(val) { if (!val || val === undefined) return false; var isValid = true; var charArray = val.split(':').join('').split(''); var regexp = /^\d{0,2}?\:?\d{0,2}$/; var valArr = []; if (!regexp.test(val)) { isValid = false; } // check each character if (charArray[0] && (parseInt(charArray[0], 10) < 0 || parseInt(charArray[0], 10) > 2)) { isValid = false; } if (charArray[2] && (parseInt(charArray[2], 10) < 0 || parseInt(charArray[2], 10) > 5)) { isValid = false; } if (valArr.indexOf(':')) { valArr = val.split(':'); } else { valArr.push(val); } // check mm and HH if (valArr[0] && valArr[0].length && (parseInt(valArr[0], 10) < 0 || parseInt(valArr[0], 10) > 23)) { isValid = false; } if (valArr[1] && valArr[1].length && (parseInt(valArr[1], 10) < 0 || parseInt(valArr[1], 10) > 59)) { isValid = false; } return isValid; } }, getInitialState: function getInitialState() { return { lastVal: '' }; }, componentWillMount: function componentWillMount() { if (!this.constructor.internalValidation(this.props.value)) { this.setValue(''); }; }, changeValue: function changeValue(value) { //If the value didn't really changed we do nothing if (value === this.getValue()) { return false; } // If the first digit isn't 0,1 or 2 we automatically add a 0 before it. if (value.length === 1 && parseInt(value) > 2) { value = '0' + value; } // If the third digit is higher than 5 we automatically add a 0 before it. if (value.length === 4 && parseInt(value.slice(3, 4)) > 5) { value = value.slice(0, 3) + '0' + value.slice(3, 4); } // If the date format is respected if (this.constructor.internalValidation(value) || value.length === 0) { if (value.length === 2 && this.state.lastVal.length !== 3) { value = value + ':'; } if (value.length === 2 && this.state.lastVal.length === 3) { value = value.slice(0, 1); } if (value.length > 5) { return false; } this.setState({ lastVal: value }); this.setValue(value); if (this.props.onChange) { this.props.onChange(value); } if (value.length === 5) { // Eventually add a next focus event } } }, renderElement: function renderElement() { var _this = this; return _react2.default.createElement(_reactBootstrap.FormControl, _extends({}, propUtilities.cleanProps(this.props), { disabled: this.props.disabled, onChange: function onChange(e) { return _this.changeValue(e.target.value); }, ref: function ref(c) { return _this.element = c; }, type: 'time', value: this.getValue() })); }, render: function render() { if (this.props.type === 'hidden' || this.props.elementOnly) { return this.renderElement(); } var Layout = this.getLayout(); return _react2.default.createElement(Layout.TimeInput, { element: this }); } }); module.exports = TimeInput;