ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
379 lines (305 loc) • 12.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.fixControlledValue = fixControlledValue;
exports.resolveOnChange = resolveOnChange;
exports.triggerFocus = triggerFocus;
var _vue = require("vue");
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _antInputDirective = _interopRequireDefault(require("../_util/antInputDirective"));
var _classNames3 = _interopRequireDefault(require("../_util/classNames"));
var _inputProps = _interopRequireDefault(require("./inputProps"));
var _util = require("./util");
var _ClearableLabeledInput = _interopRequireDefault(require("./ClearableLabeledInput"));
var _FormItemContext = require("../form/FormItemContext");
var _omit = _interopRequireDefault(require("../_util/omit"));
var _useConfigInject2 = _interopRequireDefault(require("../_util/hooks/useConfigInject"));
function fixControlledValue(value) {
if (typeof value === 'undefined' || value === null) {
return '';
}
return String(value);
}
function resolveOnChange(target, e, onChange, targetValue) {
if (!onChange) {
return;
}
var event = e;
if (e.type === 'click') {
Object.defineProperty(event, 'target', {
writable: true
});
Object.defineProperty(event, 'currentTarget', {
writable: true
}); // click clear icon
//event = Object.create(e);
var currentTarget = target.cloneNode(true);
event.target = currentTarget;
event.currentTarget = currentTarget; // change target ref value cause e.target.value should be '' when clear input
currentTarget.value = '';
onChange(event);
return;
} // Trigger by composition event, this means we need force change the input value
if (targetValue !== undefined) {
Object.defineProperty(event, 'target', {
writable: true
});
Object.defineProperty(event, 'currentTarget', {
writable: true
});
event.target = target;
event.currentTarget = target;
target.value = targetValue;
onChange(event);
return;
}
onChange(event);
}
function triggerFocus(element, option) {
if (!element) return;
element.focus(option); // Selection content
var _ref = option || {},
cursor = _ref.cursor;
if (cursor) {
var 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);
}
}
}
var _default = (0, _vue.defineComponent)({
name: 'AInput',
inheritAttrs: false,
props: (0, _inputProps.default)(),
setup: function setup(props, _ref2) {
var slots = _ref2.slots,
attrs = _ref2.attrs,
expose = _ref2.expose,
emit = _ref2.emit;
var inputRef = (0, _vue.ref)();
var clearableInputRef = (0, _vue.ref)();
var removePasswordTimeout;
var formItemContext = (0, _FormItemContext.useInjectFormItemContext)();
var _useConfigInject = (0, _useConfigInject2.default)('input', props),
direction = _useConfigInject.direction,
prefixCls = _useConfigInject.prefixCls,
size = _useConfigInject.size,
autocomplete = _useConfigInject.autocomplete;
var stateValue = (0, _vue.ref)(props.value === undefined ? props.defaultValue : props.value);
var focused = (0, _vue.ref)(false);
(0, _vue.watch)(function () {
return props.value;
}, function () {
stateValue.value = props.value;
});
(0, _vue.watch)(function () {
return props.disabled;
}, function () {
if (props.value !== undefined) {
stateValue.value = props.value;
}
if (props.disabled) {
focused.value = false;
}
});
var clearPasswordValueAttribute = function clearPasswordValueAttribute() {
// https://github.com/ant-design/ant-design/issues/20541
removePasswordTimeout = setTimeout(function () {
var _a;
if (((_a = inputRef.value) === null || _a === void 0 ? void 0 : _a.getAttribute('type')) === 'password' && inputRef.value.hasAttribute('value')) {
inputRef.value.removeAttribute('value');
}
});
};
var focus = function focus(option) {
triggerFocus(inputRef.value, option);
};
var blur = function blur() {
var _a;
(_a = inputRef.value) === null || _a === void 0 ? void 0 : _a.blur();
};
var setSelectionRange = function setSelectionRange(start, end, direction) {
var _a;
(_a = inputRef.value) === null || _a === void 0 ? void 0 : _a.setSelectionRange(start, end, direction);
};
var select = function select() {
var _a;
(_a = inputRef.value) === null || _a === void 0 ? void 0 : _a.select();
};
expose({
focus: focus,
blur: blur,
input: inputRef,
stateValue: stateValue,
setSelectionRange: setSelectionRange,
select: select
});
var onFocus = function onFocus(e) {
var onFocus = props.onFocus;
focused.value = true;
onFocus === null || onFocus === void 0 ? void 0 : onFocus(e);
(0, _vue.nextTick)(function () {
clearPasswordValueAttribute();
});
};
var onBlur = function onBlur(e) {
var onBlur = props.onBlur;
focused.value = false;
onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);
formItemContext.onFieldBlur();
(0, _vue.nextTick)(function () {
clearPasswordValueAttribute();
});
};
var triggerChange = function triggerChange(e) {
emit('update:value', e.target.value);
emit('change', e);
emit('input', e);
formItemContext.onFieldChange();
};
var instance = (0, _vue.getCurrentInstance)();
var setValue = function setValue(value, callback) {
if (stateValue.value === value) {
return;
}
if (props.value === undefined) {
stateValue.value = value;
} else {
(0, _vue.nextTick)(function () {
if (inputRef.value.value !== stateValue.value) {
instance.update();
}
});
}
(0, _vue.nextTick)(function () {
callback && callback();
});
};
var handleReset = function handleReset(e) {
resolveOnChange(inputRef.value, e, triggerChange);
setValue('', function () {
focus();
});
};
var handleChange = function handleChange(e) {
var _e$target = e.target,
value = _e$target.value,
composing = _e$target.composing; // https://github.com/vueComponent/ant-design-vue/issues/2203
if ((e.isComposing || composing) && props.lazy || stateValue.value === value) return;
var newVal = e.target.value;
resolveOnChange(inputRef.value, e, triggerChange);
setValue(newVal, function () {
clearPasswordValueAttribute();
});
};
var handleKeyDown = function handleKeyDown(e) {
if (e.keyCode === 13) {
emit('pressEnter', e);
}
emit('keydown', e);
};
(0, _vue.onMounted)(function () {
if (process.env.NODE_ENV === 'test') {
if (props.autofocus) {
focus();
}
}
clearPasswordValueAttribute();
});
(0, _vue.onBeforeUnmount)(function () {
clearTimeout(removePasswordTimeout);
});
var renderInput = function renderInput() {
var _a;
var _props$addonBefore = props.addonBefore,
addonBefore = _props$addonBefore === void 0 ? slots.addonBefore : _props$addonBefore,
_props$addonAfter = props.addonAfter,
addonAfter = _props$addonAfter === void 0 ? slots.addonAfter : _props$addonAfter,
disabled = props.disabled,
_props$bordered = props.bordered,
bordered = _props$bordered === void 0 ? true : _props$bordered,
_props$valueModifiers = props.valueModifiers,
valueModifiers = _props$valueModifiers === void 0 ? {} : _props$valueModifiers,
htmlSize = props.htmlSize;
var otherProps = (0, _omit.default)(props, ['prefixCls', 'onPressEnter', 'addonBefore', 'addonAfter', 'prefix', 'suffix', 'allowClear', // Input elements must be either controlled or uncontrolled,
// specify either the value prop, or the defaultValue prop, but not both.
'defaultValue', 'size', 'bordered', 'htmlSize', 'lazy', 'showCount', 'valueModifiers']);
var inputProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({}, otherProps), attrs), {
autocomplete: autocomplete.value,
onChange: handleChange,
onInput: handleChange,
onFocus: onFocus,
onBlur: onBlur,
onKeydown: handleKeyDown,
class: (0, _classNames3.default)((0, _util.getInputClassName)(prefixCls.value, bordered, size.value, disabled, direction.value), (0, _defineProperty2.default)({}, attrs.class, attrs.class && !addonBefore && !addonAfter)),
ref: inputRef,
key: 'ant-input',
size: htmlSize,
id: (_a = otherProps.id) !== null && _a !== void 0 ? _a : formItemContext.id.value
});
if (valueModifiers.lazy) {
delete inputProps.onInput;
}
if (!inputProps.autofocus) {
delete inputProps.autofocus;
}
var inputNode = (0, _vue.createVNode)("input", (0, _omit.default)(inputProps, ['size']), null);
return (0, _vue.withDirectives)(inputNode, [[_antInputDirective.default]]);
};
var renderShowCountSuffix = function renderShowCountSuffix() {
var _a;
var value = stateValue.value;
var maxlength = props.maxlength,
_props$suffix = props.suffix,
suffix = _props$suffix === void 0 ? (_a = slots.suffix) === null || _a === void 0 ? void 0 : _a.call(slots) : _props$suffix,
showCount = props.showCount; // Max length value
var hasMaxLength = Number(maxlength) > 0;
if (suffix || showCount) {
var valueLength = (0, _toConsumableArray2.default)(fixControlledValue(value)).length;
var dataCount = null;
if ((0, _typeof2.default)(showCount) === 'object') {
dataCount = showCount.formatter({
count: valueLength,
maxlength: maxlength
});
} else {
dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxlength) : '');
}
return (0, _vue.createVNode)(_vue.Fragment, null, [!!showCount && (0, _vue.createVNode)("span", {
"class": (0, _classNames3.default)("".concat(prefixCls.value, "-show-count-suffix"), (0, _defineProperty2.default)({}, "".concat(prefixCls.value, "-show-count-has-suffix"), !!suffix))
}, [dataCount]), suffix]);
}
return null;
};
return function () {
var inputProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({}, attrs), props), {
prefixCls: prefixCls.value,
inputType: 'input',
value: fixControlledValue(stateValue.value),
handleReset: handleReset,
focused: focused.value && !props.disabled
});
return (0, _vue.createVNode)(_ClearableLabeledInput.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _omit.default)(inputProps, ['element', 'valueModifiers', 'suffix', 'showCount'])), {}, {
"ref": clearableInputRef
}), (0, _extends2.default)((0, _extends2.default)({}, slots), {
element: renderInput,
suffix: renderShowCountSuffix
}));
};
}
});
exports.default = _default;
;