availity-reactstrap-validation
Version:
Form validation helpers for reactstrap
326 lines (258 loc) • 11.3 kB
JavaScript
'use strict';
exports.__esModule = true;
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _isUndefined = require('lodash/isUndefined');
var _isUndefined2 = _interopRequireDefault(_isUndefined);
var _isEqual = require('lodash/isEqual');
var _isEqual2 = _interopRequireDefault(_isEqual);
var _get = require('lodash/get');
var _get2 = _interopRequireDefault(_get);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var htmlValidationAttrs = ['min', 'max', 'minLength', 'maxLength', 'pattern', 'required', 'step'];
var htmlValidationTypes = ['email', 'date', 'datetime', 'number', 'tel', 'url'];
var AvBaseInput = function (_Component) {
(0, _inherits3.default)(AvBaseInput, _Component);
function AvBaseInput(props) {
(0, _classCallCheck3.default)(this, AvBaseInput);
var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props));
_this.state = { value: _this.props.multiple ? [] : '' };
_this.validations = {};
_this.value = '';
_this.onKeyUpHandler = _this.onKeyUpHandler.bind(_this);
_this.onInputHandler = _this.onInputHandler.bind(_this);
_this.onBlurHandler = _this.onBlurHandler.bind(_this);
_this.onFocusHandler = _this.onFocusHandler.bind(_this);
_this.onChangeHandler = _this.onChangeHandler.bind(_this);
_this.validate = _this.validate.bind(_this);
return _this;
}
AvBaseInput.prototype.componentWillMount = function componentWillMount() {
this.value = this.props.value || this.getDefaultValue();
this.setState({ value: this.value });
this.updateValidations();
};
AvBaseInput.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {
if (nextProps.name !== this.props.name) {
this.context.FormCtrl.unregister(this);
}
if (nextProps.type === 'checkbox') {
if (nextProps.checked !== this.props.checked) {
if (nextProps.checked) {
this.value = nextProps.trueValue;
} else {
this.value = nextProps.falseValue;
}
this.setState({ value: this.value });
}
} else {
if (nextProps.multiple !== this.props.multiple) {
this.value = nextProps.multiple ? [] : '';
this.setState({ value: this.value });
}
if (nextProps.value !== this.props.value) {
this.value = nextProps.value;
this.setState({ value: nextProps.value });
}
}
if (!(0, _isEqual2.default)(nextProps, this.props)) {
this.updateValidations(nextProps);
}
};
AvBaseInput.prototype.componentDidUpdate = function componentDidUpdate(prevProps) {
if (prevProps.name !== this.props.name) {
this.context.FormCtrl.register(this);
}
};
AvBaseInput.prototype.componentWillUnmount = function componentWillUnmount() {
this.context.FormCtrl.unregister(this);
};
AvBaseInput.prototype.onKeyUpHandler = function onKeyUpHandler(event) {
var badInput = (0, _get2.default)(event, 'target.validity.badInput', false);
if (badInput !== this.context.FormCtrl.isBad(this.props.name)) {
this.context.FormCtrl.setBad(this.props.name, badInput);
this.validate();
}
this.props.onKeyUp && this.props.onKeyUp(event);
};
AvBaseInput.prototype.onInputHandler = function onInputHandler(_value) {
this.value = this.getFieldValue(_value);
this.validateEvent('onInput', _value);
!this.context.FormCtrl.isDirty(this.props.name) && this.context.FormCtrl.setDirty(this.props.name);
};
AvBaseInput.prototype.onBlurHandler = function onBlurHandler(_value) {
this.value = this.getFieldValue(_value);
this.validateEvent('onBlur', _value);
!this.context.FormCtrl.isTouched(this.props.name) && this.context.FormCtrl.setTouched(this.props.name);
};
AvBaseInput.prototype.onFocusHandler = function onFocusHandler(_value) {
this.value = this.getFieldValue(_value);
this.validateEvent('onFocus', _value);
};
AvBaseInput.prototype.onChangeHandler = function onChangeHandler(_value) {
this.value = this.getFieldValue(_value);
this.validateEvent('onChange', _value);
!this.context.FormCtrl.isDirty(this.props.name) && this.context.FormCtrl.setDirty(this.props.name);
};
AvBaseInput.prototype.getDefaultValue = function getDefaultValue() {
var defaultValue = '';
if (this.props.type === 'checkbox' || this.props.type === 'switch') {
if (!(0, _isUndefined2.default)(this.props.defaultChecked)) {
return this.props.defaultChecked ? this.props.trueValue : this.props.falseValue;
}
defaultValue = this.props.falseValue;
}
if (this.props.type === 'select' && this.props.multiple) {
defaultValue = [];
}
var value = this.props.defaultValue || this.context.FormCtrl.getDefaultValue(this.props.name);
if (this.props.type === 'checkbox' && value !== this.props.trueValue) {
value = defaultValue;
}
return (0, _isUndefined2.default)(value) ? defaultValue : value;
};
AvBaseInput.prototype.getFieldValue = function getFieldValue(event) {
if (this.props.type === 'checkbox') {
return event.target.checked ? this.props.trueValue : this.props.falseValue;
}
if (this.props.type === 'select' && this.props.multiple) {
/* // Something about this does not work when transpiled
return [...event.target.options]
.filter(({ selected }) => selected)
.map(({ value }) => value); */
var ret = [];
var options = event.target.options;
for (var i = 0; i < options.length; i++) {
if (options[i].selected) {
ret.push(options[i].value);
}
}
return ret;
}
return event && event.target && !(0, _isUndefined2.default)(event.target.value) ? event.target.value : event;
};
AvBaseInput.prototype.getValidationEvent = function getValidationEvent() {
var validationEvent = this.props.validationEvent ? this.props.validationEvent : this.context.FormCtrl.getValidationEvent();
return Array.isArray(validationEvent) ? validationEvent : [validationEvent];
};
AvBaseInput.prototype.getValidatorProps = function getValidatorProps() {
var _this2 = this;
var validatity = this.context.FormCtrl.getInputState(this.props.name);
var htmlValAttrs = (0, _keys2.default)(this.props.validate || {}).filter(function (val) {
return htmlValidationAttrs.indexOf(val) > -1;
}).reduce(function (result, item) {
result[item] = _this2.props.validate[item].value || _this2.props.validate[item];
return result;
}, {});
var newProps = (0, _extends3.default)({
onKeyUp: this.onKeyUpHandler,
onBlur: this.onBlurHandler,
onInput: this.onInputHandler,
onFocus: this.onFocusHandler,
onChange: this.onChangeHandler,
value: this.value
}, htmlValAttrs);
if (this.props.disabled === undefined && this.context.FormCtrl.isDisabled() !== undefined) {
newProps.disabled = this.context.FormCtrl.isDisabled();
}
if (this.props.readOnly === undefined && this.context.FormCtrl.isReadOnly() !== undefined) {
newProps.readOnly = this.context.FormCtrl.isReadOnly();
}
if (this.props.type === 'checkbox') {
newProps.checked = this.value === this.props.trueValue;
}
if (this.props.state || validatity && validatity.errorMessage) {
newProps.valid = !(validatity && validatity.errorMessage);
}
return newProps;
};
AvBaseInput.prototype.getValue = function getValue() {
return this.value;
};
AvBaseInput.prototype.reset = function reset() {
this.value = this.getDefaultValue();
this.context.FormCtrl.setDirty(this.props.name, false);
this.context.FormCtrl.setTouched(this.props.name, false);
this.context.FormCtrl.setBad(this.props.name, false);
this.setState({ value: this.value });
this.validate();
this.props.onReset && this.props.onReset(this.value);
};
AvBaseInput.prototype.validateEvent = function validateEvent(eventName, _event) {
this.setState({ value: this.value });
if (this.getValidationEvent().indexOf(eventName) > -1) {
this.validate();
}
this.props[eventName] && this.props[eventName](_event, this.value);
};
AvBaseInput.prototype.validate = function validate() {
this.context.FormCtrl.validate(this.props.name);
};
AvBaseInput.prototype.updateValidations = function updateValidations() {
var _this3 = this;
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
this.validations = (0, _assign2.default)({}, props.validate);
if (htmlValidationTypes.indexOf(props.type) > -1) {
this.validations[props.type] = this.validations[props.type] || true;
}
(0, _keys2.default)(props).filter(function (val) {
return htmlValidationAttrs.indexOf(val) > -1;
}).forEach(function (attr) {
if (props[attr]) {
_this3.validations[attr] = _this3.validations[attr] || {
value: props[attr]
};
} else {
delete _this3.validations[attr];
}
});
this.context.FormCtrl && this.context.FormCtrl.register(this);
this.validate();
};
return AvBaseInput;
}(_react.Component);
AvBaseInput.propTypes = {
name: _propTypes2.default.string.isRequired,
validationEvent: _propTypes2.default.oneOfType([_propTypes2.default.oneOf(['', 'onInput', 'onChange', 'onBlur', 'onFocus']), _propTypes2.default.arrayOf(_propTypes2.default.oneOf(['onInput', 'onChange', 'onBlur', 'onFocus']))]),
validate: _propTypes2.default.object,
value: _propTypes2.default.any,
defaultValue: _propTypes2.default.any,
trueValue: _propTypes2.default.any,
falseValue: _propTypes2.default.any,
checked: _propTypes2.default.bool,
defaultChecked: _propTypes2.default.bool,
state: _propTypes2.default.bool,
type: _propTypes2.default.string,
multiple: _propTypes2.default.bool,
disabled: _propTypes2.default.bool,
readOnly: _propTypes2.default.bool,
onKeyUp: _propTypes2.default.func,
onInput: _propTypes2.default.func,
onFocus: _propTypes2.default.func,
onBlur: _propTypes2.default.func,
onChange: _propTypes2.default.func,
onReset: _propTypes2.default.func
};
AvBaseInput.contextTypes = {
FormCtrl: _propTypes2.default.object.isRequired
};
AvBaseInput.defaultProps = {
validationEvent: '',
validate: {},
trueValue: true,
falseValue: false
};
exports.default = AvBaseInput;