Input.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import _typeof from "@babel/runtime/helpers/esm/typeof";
  2. import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
  3. import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
  4. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  5. import { resolveDirective as _resolveDirective, Fragment as _Fragment, createVNode as _createVNode } from "vue";
  6. import { getCurrentInstance, onBeforeUnmount, onMounted, watch, ref, defineComponent, nextTick, withDirectives } from 'vue';
  7. import antInputDirective from '../_util/antInputDirective';
  8. import classNames from '../_util/classNames';
  9. import inputProps from './inputProps';
  10. import { getInputClassName } from './util';
  11. import ClearableLabeledInput from './ClearableLabeledInput';
  12. import { useInjectFormItemContext } from '../form/FormItemContext';
  13. import omit from '../_util/omit';
  14. import useConfigInject from '../_util/hooks/useConfigInject';
  15. export function fixControlledValue(value) {
  16. if (typeof value === 'undefined' || value === null) {
  17. return '';
  18. }
  19. return String(value);
  20. }
  21. export function resolveOnChange(target, e, onChange, targetValue) {
  22. if (!onChange) {
  23. return;
  24. }
  25. var event = e;
  26. if (e.type === 'click') {
  27. Object.defineProperty(event, 'target', {
  28. writable: true
  29. });
  30. Object.defineProperty(event, 'currentTarget', {
  31. writable: true
  32. });
  33. // click clear icon
  34. //event = Object.create(e);
  35. var currentTarget = target.cloneNode(true);
  36. event.target = currentTarget;
  37. event.currentTarget = currentTarget;
  38. // change target ref value cause e.target.value should be '' when clear input
  39. currentTarget.value = '';
  40. onChange(event);
  41. return;
  42. }
  43. // Trigger by composition event, this means we need force change the input value
  44. if (targetValue !== undefined) {
  45. Object.defineProperty(event, 'target', {
  46. writable: true
  47. });
  48. Object.defineProperty(event, 'currentTarget', {
  49. writable: true
  50. });
  51. event.target = target;
  52. event.currentTarget = target;
  53. target.value = targetValue;
  54. onChange(event);
  55. return;
  56. }
  57. onChange(event);
  58. }
  59. export function triggerFocus(element, option) {
  60. if (!element) return;
  61. element.focus(option);
  62. // Selection content
  63. var _ref = option || {},
  64. cursor = _ref.cursor;
  65. if (cursor) {
  66. var len = element.value.length;
  67. switch (cursor) {
  68. case 'start':
  69. element.setSelectionRange(0, 0);
  70. break;
  71. case 'end':
  72. element.setSelectionRange(len, len);
  73. break;
  74. default:
  75. element.setSelectionRange(0, len);
  76. }
  77. }
  78. }
  79. export default defineComponent({
  80. compatConfig: {
  81. MODE: 3
  82. },
  83. name: 'AInput',
  84. inheritAttrs: false,
  85. props: inputProps(),
  86. setup: function setup(props, _ref2) {
  87. var slots = _ref2.slots,
  88. attrs = _ref2.attrs,
  89. expose = _ref2.expose,
  90. emit = _ref2.emit;
  91. var inputRef = ref();
  92. var clearableInputRef = ref();
  93. var removePasswordTimeout;
  94. var formItemContext = useInjectFormItemContext();
  95. var _useConfigInject = useConfigInject('input', props),
  96. direction = _useConfigInject.direction,
  97. prefixCls = _useConfigInject.prefixCls,
  98. size = _useConfigInject.size,
  99. autocomplete = _useConfigInject.autocomplete;
  100. var stateValue = ref(props.value === undefined ? props.defaultValue : props.value);
  101. var focused = ref(false);
  102. watch(function () {
  103. return props.value;
  104. }, function () {
  105. stateValue.value = props.value;
  106. });
  107. watch(function () {
  108. return props.disabled;
  109. }, function () {
  110. if (props.value !== undefined) {
  111. stateValue.value = props.value;
  112. }
  113. if (props.disabled) {
  114. focused.value = false;
  115. }
  116. });
  117. var clearPasswordValueAttribute = function clearPasswordValueAttribute() {
  118. // https://github.com/ant-design/ant-design/issues/20541
  119. removePasswordTimeout = setTimeout(function () {
  120. var _inputRef$value;
  121. if (((_inputRef$value = inputRef.value) === null || _inputRef$value === void 0 ? void 0 : _inputRef$value.getAttribute('type')) === 'password' && inputRef.value.hasAttribute('value')) {
  122. inputRef.value.removeAttribute('value');
  123. }
  124. });
  125. };
  126. var focus = function focus(option) {
  127. triggerFocus(inputRef.value, option);
  128. };
  129. var blur = function blur() {
  130. var _inputRef$value2;
  131. (_inputRef$value2 = inputRef.value) === null || _inputRef$value2 === void 0 ? void 0 : _inputRef$value2.blur();
  132. };
  133. var setSelectionRange = function setSelectionRange(start, end, direction) {
  134. var _inputRef$value3;
  135. (_inputRef$value3 = inputRef.value) === null || _inputRef$value3 === void 0 ? void 0 : _inputRef$value3.setSelectionRange(start, end, direction);
  136. };
  137. var select = function select() {
  138. var _inputRef$value4;
  139. (_inputRef$value4 = inputRef.value) === null || _inputRef$value4 === void 0 ? void 0 : _inputRef$value4.select();
  140. };
  141. expose({
  142. focus: focus,
  143. blur: blur,
  144. input: inputRef,
  145. stateValue: stateValue,
  146. setSelectionRange: setSelectionRange,
  147. select: select
  148. });
  149. var onFocus = function onFocus(e) {
  150. var onFocus = props.onFocus;
  151. focused.value = true;
  152. onFocus === null || onFocus === void 0 ? void 0 : onFocus(e);
  153. nextTick(function () {
  154. clearPasswordValueAttribute();
  155. });
  156. };
  157. var onBlur = function onBlur(e) {
  158. var onBlur = props.onBlur;
  159. focused.value = false;
  160. onBlur === null || onBlur === void 0 ? void 0 : onBlur(e);
  161. formItemContext.onFieldBlur();
  162. nextTick(function () {
  163. clearPasswordValueAttribute();
  164. });
  165. };
  166. var triggerChange = function triggerChange(e) {
  167. emit('update:value', e.target.value);
  168. emit('change', e);
  169. emit('input', e);
  170. formItemContext.onFieldChange();
  171. };
  172. var instance = getCurrentInstance();
  173. var setValue = function setValue(value, callback) {
  174. if (stateValue.value === value) {
  175. return;
  176. }
  177. if (props.value === undefined) {
  178. stateValue.value = value;
  179. } else {
  180. nextTick(function () {
  181. if (inputRef.value.value !== stateValue.value) {
  182. instance.update();
  183. }
  184. });
  185. }
  186. nextTick(function () {
  187. callback && callback();
  188. });
  189. };
  190. var handleReset = function handleReset(e) {
  191. resolveOnChange(inputRef.value, e, triggerChange);
  192. setValue('', function () {
  193. focus();
  194. });
  195. };
  196. var handleChange = function handleChange(e) {
  197. var _e$target = e.target,
  198. value = _e$target.value,
  199. composing = _e$target.composing;
  200. // https://github.com/vueComponent/ant-design-vue/issues/2203
  201. if ((e.isComposing || composing) && props.lazy || stateValue.value === value) return;
  202. var newVal = e.target.value;
  203. resolveOnChange(inputRef.value, e, triggerChange);
  204. setValue(newVal, function () {
  205. clearPasswordValueAttribute();
  206. });
  207. };
  208. var handleKeyDown = function handleKeyDown(e) {
  209. if (e.keyCode === 13) {
  210. emit('pressEnter', e);
  211. }
  212. emit('keydown', e);
  213. };
  214. onMounted(function () {
  215. clearPasswordValueAttribute();
  216. });
  217. onBeforeUnmount(function () {
  218. clearTimeout(removePasswordTimeout);
  219. });
  220. var renderInput = function renderInput() {
  221. var _otherProps$id;
  222. var _props$addonBefore = props.addonBefore,
  223. addonBefore = _props$addonBefore === void 0 ? slots.addonBefore : _props$addonBefore,
  224. _props$addonAfter = props.addonAfter,
  225. addonAfter = _props$addonAfter === void 0 ? slots.addonAfter : _props$addonAfter,
  226. disabled = props.disabled,
  227. _props$bordered = props.bordered,
  228. bordered = _props$bordered === void 0 ? true : _props$bordered,
  229. _props$valueModifiers = props.valueModifiers,
  230. valueModifiers = _props$valueModifiers === void 0 ? {} : _props$valueModifiers,
  231. htmlSize = props.htmlSize;
  232. var otherProps = omit(props, ['prefixCls', 'onPressEnter', 'addonBefore', 'addonAfter', 'prefix', 'suffix', 'allowClear',
  233. // Input elements must be either controlled or uncontrolled,
  234. // specify either the value prop, or the defaultValue prop, but not both.
  235. 'defaultValue', 'size', 'bordered', 'htmlSize', 'lazy', 'showCount', 'valueModifiers']);
  236. var inputProps = _objectSpread(_objectSpread(_objectSpread({}, otherProps), attrs), {}, {
  237. autocomplete: autocomplete.value,
  238. onChange: handleChange,
  239. onInput: handleChange,
  240. onFocus: onFocus,
  241. onBlur: onBlur,
  242. onKeydown: handleKeyDown,
  243. class: classNames(getInputClassName(prefixCls.value, bordered, size.value, disabled, direction.value), _defineProperty({}, attrs.class, attrs.class && !addonBefore && !addonAfter)),
  244. ref: inputRef,
  245. key: 'ant-input',
  246. size: htmlSize,
  247. id: (_otherProps$id = otherProps.id) !== null && _otherProps$id !== void 0 ? _otherProps$id : formItemContext.id.value
  248. });
  249. if (valueModifiers.lazy) {
  250. delete inputProps.onInput;
  251. }
  252. if (!inputProps.autofocus) {
  253. delete inputProps.autofocus;
  254. }
  255. var inputNode = _createVNode("input", omit(inputProps, ['size']), null);
  256. return withDirectives(inputNode, [[antInputDirective]]);
  257. };
  258. var renderShowCountSuffix = function renderShowCountSuffix() {
  259. var _slots$suffix;
  260. var value = stateValue.value;
  261. var maxlength = props.maxlength,
  262. _props$suffix = props.suffix,
  263. suffix = _props$suffix === void 0 ? (_slots$suffix = slots.suffix) === null || _slots$suffix === void 0 ? void 0 : _slots$suffix.call(slots) : _props$suffix,
  264. showCount = props.showCount;
  265. // Max length value
  266. var hasMaxLength = Number(maxlength) > 0;
  267. if (suffix || showCount) {
  268. var valueLength = _toConsumableArray(fixControlledValue(value)).length;
  269. var dataCount = null;
  270. if (_typeof(showCount) === 'object') {
  271. dataCount = showCount.formatter({
  272. count: valueLength,
  273. maxlength: maxlength
  274. });
  275. } else {
  276. dataCount = "".concat(valueLength).concat(hasMaxLength ? " / ".concat(maxlength) : '');
  277. }
  278. return _createVNode(_Fragment, null, [!!showCount && _createVNode("span", {
  279. "class": classNames("".concat(prefixCls.value, "-show-count-suffix"), _defineProperty({}, "".concat(prefixCls.value, "-show-count-has-suffix"), !!suffix))
  280. }, [dataCount]), suffix]);
  281. }
  282. return null;
  283. };
  284. return function () {
  285. var inputProps = _objectSpread(_objectSpread(_objectSpread({}, attrs), props), {}, {
  286. prefixCls: prefixCls.value,
  287. inputType: 'input',
  288. value: fixControlledValue(stateValue.value),
  289. handleReset: handleReset,
  290. focused: focused.value && !props.disabled
  291. });
  292. return _createVNode(ClearableLabeledInput, _objectSpread(_objectSpread({}, omit(inputProps, ['element', 'valueModifiers', 'suffix', 'showCount'])), {}, {
  293. "ref": clearableInputRef
  294. }), _objectSpread(_objectSpread({}, slots), {}, {
  295. element: renderInput,
  296. suffix: renderShowCountSuffix
  297. }));
  298. };
  299. }
  300. });