UNPKG

plasod

Version:

An enterprise-class UI design language and React components implementation

273 lines (272 loc) 12.3 kB
"use strict"; "use client"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.triggerFocus = triggerFocus; var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); var _rcInput = _interopRequireDefault(require("rc-input")); var _ref = require("rc-util/lib/ref"); var _getAllowClear = _interopRequireDefault(require("../_util/getAllowClear")); var _statusUtils = require("../_util/statusUtils"); var _warning = require("../_util/warning"); var _configProvider = require("../config-provider"); var _DisabledContext = _interopRequireDefault(require("../config-provider/DisabledContext")); var _useCSSVarCls = _interopRequireDefault(require("../config-provider/hooks/useCSSVarCls")); var _useSize = _interopRequireDefault(require("../config-provider/hooks/useSize")); var _context = require("../form/context"); var _useVariants = _interopRequireDefault(require("../form/hooks/useVariants")); var _Compact = require("../space/Compact"); var _useRemovePasswordTimeout = _interopRequireDefault(require("./hooks/useRemovePasswordTimeout")); var _style = _interopRequireDefault(require("./style")); var _utils = require("./utils"); var __rest = void 0 && (void 0).__rest || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; function triggerFocus(element, option) { if (!element) { return; } element.focus(option); // Selection content const { cursor } = option || {}; if (cursor) { const len = element.value.length; switch (cursor) { case 'start': element.setSelectionRange(0, 0); break; case 'end': element.setSelectionRange(len, len); break; default: element.setSelectionRange(0, len); break; } } } const Input = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => { var _a; const { prefixCls: customizePrefixCls, bordered = true, status: customStatus, size: customSize, disabled: customDisabled, onBlur, onFocus, suffix, allowClear, addonAfter, addonBefore, className, style, styles, rootClassName, onChange, classNames: classes, doubleByte = false, defaultValue, value = defaultValue, maxLength, variant: customVariant, count } = props, rest = __rest(props, ["prefixCls", "bordered", "status", "size", "disabled", "onBlur", "onFocus", "suffix", "allowClear", "addonAfter", "addonBefore", "className", "style", "styles", "rootClassName", "onChange", "classNames", "doubleByte", "defaultValue", "value", "maxLength", "variant", "count"]); if (process.env.NODE_ENV !== 'production') { const { deprecated } = (0, _warning.devUseWarning)('Input'); deprecated(!('bordered' in props), 'bordered', 'variant'); } const { getPrefixCls, direction, input } = _react.default.useContext(_configProvider.ConfigContext); const prefixCls = getPrefixCls('input', customizePrefixCls); const inputRef = (0, _react.useRef)(null); // Style const rootCls = (0, _useCSSVarCls.default)(prefixCls); const [wrapCSSVar, hashId, cssVarCls] = (0, _style.default)(prefixCls, rootCls); // ===================== Compact Item ===================== const { compactSize, compactItemClassnames } = (0, _Compact.useCompactItemContext)(prefixCls, direction); // ===================== Size ===================== const mergedSize = (0, _useSize.default)(ctx => { var _a; return (_a = customSize !== null && customSize !== void 0 ? customSize : compactSize) !== null && _a !== void 0 ? _a : ctx; }); // ===================== Disabled ===================== const disabled = _react.default.useContext(_DisabledContext.default); const mergedDisabled = customDisabled !== null && customDisabled !== void 0 ? customDisabled : disabled; // ===================== Status ===================== const { status: contextStatus, hasFeedback, feedbackIcon } = (0, _react.useContext)(_context.FormItemInputContext); const mergedStatus = (0, _statusUtils.getMergedStatus)(contextStatus, customStatus); // ===================== Focus warning ===================== const inputHasPrefixSuffix = (0, _utils.hasPrefixSuffix)(props) || !!hasFeedback; const prevHasPrefixSuffix = (0, _react.useRef)(inputHasPrefixSuffix); /* eslint-disable react-hooks/rules-of-hooks */ if (process.env.NODE_ENV !== 'production') { const warning = (0, _warning.devUseWarning)('Input'); (0, _react.useEffect)(() => { var _a; if (inputHasPrefixSuffix && !prevHasPrefixSuffix.current) { process.env.NODE_ENV !== "production" ? warning(document.activeElement === ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.input), 'usage', `When Input is focused, dynamic add or remove prefix / suffix will make it lose focus caused by dom structure change. Read more: https://ant.design/components/input/#FAQ`) : void 0; } prevHasPrefixSuffix.current = inputHasPrefixSuffix; }, [inputHasPrefixSuffix]); } /* eslint-enable */ // ===================== Remove Password value ===================== const removePasswordTimeout = (0, _useRemovePasswordTimeout.default)(inputRef, true); const handleBlur = e => { removePasswordTimeout(); onBlur === null || onBlur === void 0 ? void 0 : onBlur(e); }; const handleFocus = e => { removePasswordTimeout(); onFocus === null || onFocus === void 0 ? void 0 : onFocus(e); }; // doubleByte maxLength const [insideValue, setInsideValue] = (0, _react.useState)(value); const isComposition = (0, _react.useRef)(false); (0, _react.useEffect)(() => { setInsideValue(value); }, [value]); const countStringLength = function (inputString) { let countDoubleByte = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var _a; const doubleByteLength = ((_a = inputString.match(/[\u4e00-\u9fa5]/g)) === null || _a === void 0 ? void 0 : _a.length) || 0; const singleByteLength = inputString.length - doubleByteLength; const length = doubleByteLength * (countDoubleByte ? 2 : 1) + singleByteLength; return length; }; const cutStringByByte = (str, L) => { let result = ''; const strlen = str.length; // 字符串长度 const chrlen = str.replace(/[^0-\xff]/g, '**').length; // 字节长度 if (chrlen <= L) { return str; } for (let i = 0, j = 0; i < strlen; i++) { const chr = str.charAt(i); if (/[0-\xff]/.test(chr)) { j++; // ascii码为0-255,一个字符就是一个字节的长度 } else { j += 2; // ascii码为0-255以外,一个字符就是两个字节的长度 } if (j <= L) { // 当加上当前字符以后,如果总字节长度小于等于L,则将当前字符真实的+在result后 result += chr; } else { // 反之则说明result已经是不拆分字符的情况下最接近L的值了,直接返回 return result; } } }; const handleChange = e => { removePasswordTimeout(); if (isComposition.current) { setInsideValue(e.target.value); onChange === null || onChange === void 0 ? void 0 : onChange(e); } else if (maxLength && countStringLength(e.target.value, doubleByte) > maxLength) { let resValue = ''; if (doubleByte) { resValue = cutStringByByte(e.target.value, maxLength); } else { resValue = e.target.value.substring(0, maxLength); } setInsideValue(resValue); const simulateEvent = Object.assign({}, e); simulateEvent.target.value = resValue; onChange === null || onChange === void 0 ? void 0 : onChange(e); } else { setInsideValue(e.target.value); onChange === null || onChange === void 0 ? void 0 : onChange(e); } }; const handleComposition = ev => { if (ev.type === 'compositionend') { isComposition.current = false; handleChange(ev); } else { isComposition.current = true; } }; const suffixNode = (hasFeedback || suffix) && ( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, suffix, hasFeedback && feedbackIcon)); const mergedAllowClear = (0, _getAllowClear.default)(allowClear !== null && allowClear !== void 0 ? allowClear : input === null || input === void 0 ? void 0 : input.allowClear); const [variant, enableVariantCls] = (0, _useVariants.default)(customVariant, bordered); return wrapCSSVar( /*#__PURE__*/_react.default.createElement(_rcInput.default, Object.assign({ ref: (0, _ref.composeRef)(ref, inputRef), prefixCls: prefixCls, autoComplete: input === null || input === void 0 ? void 0 : input.autoComplete }, rest, { count: count, maxLength: maxLength, disabled: mergedDisabled, onBlur: handleBlur, onFocus: handleFocus, style: Object.assign(Object.assign({}, input === null || input === void 0 ? void 0 : input.style), style), styles: Object.assign(Object.assign({}, input === null || input === void 0 ? void 0 : input.styles), styles), suffix: suffixNode, allowClear: mergedAllowClear, className: (0, _classnames.default)(className, rootClassName, (count === null || count === void 0 ? void 0 : count.noError) ? `${prefixCls}-noError` : null, cssVarCls, rootCls, compactItemClassnames, input === null || input === void 0 ? void 0 : input.className), onChange: handleChange, // @ts-ignore onCompositionStart: handleComposition, // @ts-ignore onCompositionEnd: handleComposition, value: insideValue, addonAfter: addonAfter && ( /*#__PURE__*/_react.default.createElement(_Compact.NoCompactStyle, null, /*#__PURE__*/_react.default.createElement(_context.NoFormStyle, { override: true, status: true }, addonAfter))), addonBefore: addonBefore && ( /*#__PURE__*/_react.default.createElement(_Compact.NoCompactStyle, null, /*#__PURE__*/_react.default.createElement(_context.NoFormStyle, { override: true, status: true }, addonBefore))), classNames: Object.assign(Object.assign(Object.assign({}, classes), input === null || input === void 0 ? void 0 : input.classNames), { input: (0, _classnames.default)({ [`${prefixCls}-sm`]: mergedSize === 'small', [`${prefixCls}-lg`]: mergedSize === 'large', [`${prefixCls}-rtl`]: direction === 'rtl' }, classes === null || classes === void 0 ? void 0 : classes.input, (_a = input === null || input === void 0 ? void 0 : input.classNames) === null || _a === void 0 ? void 0 : _a.input, hashId), variant: (0, _classnames.default)({ [`${prefixCls}-${variant}`]: enableVariantCls }, (0, _statusUtils.getStatusClassNames)(prefixCls, mergedStatus)), affixWrapper: (0, _classnames.default)({ [`${prefixCls}-affix-wrapper-sm`]: mergedSize === 'small', [`${prefixCls}-affix-wrapper-lg`]: mergedSize === 'large', [`${prefixCls}-affix-wrapper-rtl`]: direction === 'rtl' }, hashId), wrapper: (0, _classnames.default)({ [`${prefixCls}-group-rtl`]: direction === 'rtl' }, hashId), groupWrapper: (0, _classnames.default)({ [`${prefixCls}-group-wrapper-sm`]: mergedSize === 'small', [`${prefixCls}-group-wrapper-lg`]: mergedSize === 'large', [`${prefixCls}-group-wrapper-rtl`]: direction === 'rtl', [`${prefixCls}-group-wrapper-${variant}`]: enableVariantCls }, (0, _statusUtils.getStatusClassNames)(`${prefixCls}-group-wrapper`, mergedStatus, hasFeedback), hashId) }) }))); }); var _default = exports.default = Input;