shineout
Version:
Shein 前端组件库
323 lines (265 loc) • 11.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _config = _interopRequireDefault(require("../config"));
var _styles = require("../InputTitle/styles");
var _cleanProps = _interopRequireDefault(require("../utils/cleanProps"));
var _clear = _interopRequireDefault(require("./clear"));
var _styles2 = require("./styles");
var _InputTitle = _interopRequireDefault(require("../InputTitle"));
function regLength(size) {
return /\d+/.test(String(size)) && size > 0 ? "{0," + size + "}" : '*';
}
function fillNumber(val) {
return val.replace(/^(-)?(\.\d+)(?!=\.).*/g, '$10$2') // eslint-disable-next-line no-useless-escape
.replace(/(-|^)0+(?=0\.?|[^0\.])/g, '$1').replace(/\.$/, '');
}
var DefaultValue = {
type: 'text'
};
var Input =
/*#__PURE__*/
function (_PureComponent) {
(0, _inheritsLoose2.default)(Input, _PureComponent);
function Input(props) {
var _this;
_this = _PureComponent.call(this, props) || this;
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "enterLock", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "ref", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "enterPress", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "defaultInfo", function (value) {
if (!value || value.length === 0) return null;
var info = _this.props.info;
var text = value.length + " / " + info;
if (typeof info === 'number' && value.length <= info) return text;
return new Error(text);
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "getTrim", function () {
var trim = _this.props.trim;
if (trim !== undefined) return trim;
if (_config.default.trim !== undefined) return _config.default.trim;
return false;
});
_this.enterLock = false;
_this.handleChange = _this.handleChange.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleKeyDown = _this.handleKeyDown.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleKeyUp = _this.handleKeyUp.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleBlur = _this.handleBlur.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleAutoSelect = _this.handleAutoSelect.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.bindRef = _this.bindRef.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
return _this;
}
var _proto = Input.prototype;
_proto.bindRef = function bindRef(el) {
var forwardedRef = this.props.forwardedRef;
this.ref = el;
if (forwardedRef) forwardedRef(el);
};
_proto.isValidNumber = function isValidNumber(val) {
var numType = this.props.numType;
var noNeg = numType === 'non-negative' || numType === 'positive';
var regExp = new RegExp("^(" + (noNeg ? '' : '-') + ")?\\d*\\.?\\d*$", 'g');
return regExp.test(val);
};
_proto.formatValue = function formatValue(val) {
var value = val;
var _this$props = this.props,
type = _this$props.type,
digits = _this$props.digits,
integerLimit = _this$props.integerLimit,
numType = _this$props.numType;
var noNeg = numType === 'non-negative' || numType === 'positive';
if (type !== 'number') return value;
var regExp = new RegExp("^(" + (noNeg ? '' : '-') + ")?(\\d" + regLength(integerLimit) + ")(" + (digits !== 0 ? "\\.\\d" + regLength(digits) : '') + ")?.*$", 'g');
value = value.replace(regExp, '$1$2$3');
return value;
};
_proto.fixValue = function fixValue(val) {
var _this$props2 = this.props,
type = _this$props2.type,
digits = _this$props2.digits,
autoFix = _this$props2.autoFix,
numType = _this$props2.numType;
if (type !== 'number' || val === '') return val;
if (/^[.-]+$/.test(val)) return '';
var fixVal = fillNumber(val);
if (numType === 'positive' && Number(fixVal) <= 0) return '';
if (digits !== undefined && autoFix) {
if (digits > 0) {
fixVal = parseFloat(fixVal).toFixed(digits);
} else {
fixVal = parseInt(fixVal, 10).toString();
}
}
return fixVal;
};
_proto.invalidNumber = function invalidNumber(value) {
var _this$props3 = this.props,
digits = _this$props3.digits,
type = _this$props3.type,
integerLimit = _this$props3.integerLimit;
if (type !== 'number') return false;
var reg = '^-?';
if (!integerLimit) {
reg += "\\d*";
} else if (integerLimit > 0) {
reg += "\\d{0," + integerLimit + "}";
}
if (digits === undefined) {
reg += '\\.?\\d*';
} else if (digits >= 0) {
reg += "\\.?\\d{0," + digits + "}";
}
reg += '$';
reg = new RegExp(reg);
return !reg.test(value);
};
_proto.handleChange = function handleChange(e, clearClick) {
var _this$props4 = this.props,
type = _this$props4.type,
clearable = _this$props4.clearable,
coin = _this$props4.coin;
if (clearClick) {
this.ref.focus();
if (typeof clearable === 'function') clearable();
}
var value = e.target.value;
if (clearClick && this.props.clearToUndefined) {
this.props.onChange(value);
return;
}
if (type === 'number') {
if (typeof value !== 'number') {
value = String(value).replace(/。/g, '.');
if (coin) {
value = value.replace(/,/g, '');
}
}
if (!this.isValidNumber(value)) {
return;
}
value = this.formatValue(value);
}
this.props.onChange(value);
};
_proto.handleKeyDown = function handleKeyDown(e) {
var onKeyDown = this.props.onKeyDown;
if (e.keyCode === 13) this.enterPress = true;
if (onKeyDown) onKeyDown(e);
};
_proto.handleKeyUp = function handleKeyUp(e) {
var _this$props5 = this.props,
onKeyUp = _this$props5.onKeyUp,
onEnterPress = _this$props5.onEnterPress;
if (this.enterPress && e.keyCode === 13 && onEnterPress) {
onEnterPress(e.target.value, e);
this.enterPress = false;
}
if (onKeyUp) onKeyUp(e);
};
_proto.handleBlur = function handleBlur(e) {
var value = e.target.value;
var _this$props6 = this.props,
forceChange = _this$props6.forceChange,
onChange = _this$props6.onChange,
onBlur = _this$props6.onBlur,
clearToUndefined = _this$props6.clearToUndefined;
var newVal = this.fixValue(value);
var shouldKeepUndefined = clearToUndefined && newVal === '' && this.props.value === undefined;
if (!shouldKeepUndefined && !this.invalidNumber(newVal)) {
if (this.getTrim()) newVal = newVal.trim();
var change = forceChange || onChange; // @ts-ignore cancelBlurChange 内部属性
if (!this.props.cancelBlurChange) change(newVal);
e.target.value = newVal;
}
if (onBlur) onBlur(e);
};
_proto.handleAutoSelect = function handleAutoSelect(event) {
var onFocus = this.props.onFocus;
var autoSelect = this.props.autoSelect;
if (autoSelect) {
;
event.currentTarget.select();
}
if (typeof onFocus === 'function') {
onFocus(event);
}
};
_proto.renderInfo = function renderInfo() {
var info = this.props.info;
var notNumber = typeof info !== 'number';
if (typeof info !== 'function' && notNumber) return null;
var textInfo = notNumber ? info : this.defaultInfo;
var res = textInfo(this.props.value); // empty
if (!res) return null;
var isError = res instanceof Error;
var text = isError ? res.message : res;
return _react.default.createElement("div", {
key: "info",
style: {
minWidth: 'auto'
},
className: (0, _styles2.inputClass)('bottom-right', isError ? 'error' : 'tip')
}, text);
};
_proto.render = function render() {
var _this$props7 = this.props,
type = _this$props7.type,
defaultValue = _this$props7.defaultValue,
digits = _this$props7.digits,
className = _this$props7.className,
clearable = _this$props7.clearable,
htmlName = _this$props7.htmlName,
forceChange = _this$props7.forceChange,
onEnterPress = _this$props7.onEnterPress,
forwardedRef = _this$props7.forwardedRef,
innerTitle = _this$props7.innerTitle,
inputFocus = _this$props7.inputFocus,
clearToUndefined = _this$props7.clearToUndefined,
placeholder = _this$props7.placeholder,
coin = _this$props7.coin,
cancelBlurChange = _this$props7.cancelBlurChange,
other = (0, _objectWithoutPropertiesLoose2.default)(_this$props7, ["type", "defaultValue", "digits", "className", "clearable", "htmlName", "forceChange", "onEnterPress", "forwardedRef", "innerTitle", "inputFocus", "clearToUndefined", "placeholder", "coin", "cancelBlurChange"]);
var value = this.props.value == null || this.props.value === undefined ? '' : this.props.value;
var needClearUndefined = clearToUndefined && this.props.value !== undefined;
var showClear = !other.disabled && clearable && (value !== '' || needClearUndefined);
var mc = (0, _classnames.default)(className, showClear && (0, _styles2.inputClass)('clearable'), innerTitle && (0, _styles.inputTitleClass)('hidable', 'item'));
var isNumber = className && className.indexOf((0, _styles2.inputClass)('number')) > -1;
return [_react.default.createElement(_InputTitle.default, {
className: isNumber ? (0, _styles2.inputClass)('number-title-box') : undefined,
key: "input",
innerTitle: innerTitle,
open: !!inputFocus || !!value
}, _react.default.createElement("input", (0, _extends2.default)({}, (0, _cleanProps.default)(other), {
placeholder: needClearUndefined ? '' : placeholder,
className: mc || undefined,
name: other.name || htmlName,
type: type === 'password' ? type : 'text',
value: value,
ref: this.bindRef,
key: "input",
onChange: this.handleChange,
onKeyDown: this.handleKeyDown,
onKeyUp: this.handleKeyUp,
onBlur: this.handleBlur,
onFocus: this.handleAutoSelect
}))), showClear && _react.default.createElement(_clear.default, {
onClick: this.handleChange,
key: "close",
clearResult: needClearUndefined ? undefined : ''
}), this.renderInfo()];
};
return Input;
}(_react.PureComponent);
(0, _defineProperty2.default)(Input, "defaultProps", DefaultValue);
var _default = Input;
exports.default = _default;