import classNames from 'classnames'; import TextArea from './TextArea'; import omit from 'omit.js'; import inputProps from './inputProps'; import { hasProp, getComponentFromProp } from '../_util/props-util'; import { isIE, isIE9 } from '../_util/env'; import { ConfigConsumerProps } from '../config-provider'; import Password from './Password'; import Icon from '../icon'; import warning from '../_util/warning'; function noop() {} function fixControlledValue(value) { if (typeof value === 'undefined' || value === null) { return ''; } return value; } function hasPrefixSuffix(props) { return 'prefix' in props || props.suffix || props.allowClear; } export default { name: 'AInput', inheritAttrs: false, model: { prop: 'value', event: 'change.value', }, props: { ...inputProps, }, inject: { configProvider: { default: () => ({}) }, }, data() { const { value, defaultValue } = this.$props; return { stateValue: fixControlledValue(!hasProp(this, 'value') ? defaultValue : value), }; }, watch: { value(val) { this.stateValue = fixControlledValue(val); }, }, mounted() { this.$nextTick(() => { if (this.autoFocus) { this.focus(); } }); }, methods: { handleKeyDown(e) { if (e.keyCode === 13) { this.$emit('pressEnter', e); } this.$emit('keydown', e); }, focus() { this.$refs.input.focus(); }, blur() { this.$refs.input.blur(); }, select() { this.$refs.input.select(); }, getInputClassName(prefixCls) { const { size, disabled } = this.$props; return { [`${prefixCls}`]: true, [`${prefixCls}-sm`]: size === 'small', [`${prefixCls}-lg`]: size === 'large', [`${prefixCls}-disabled`]: disabled, }; }, setValue(value, e) { // https://github.com/vueComponent/ant-design-vue/issues/92 if (isIE && !isIE9 && this.stateValue === value) { return; } if (!hasProp(this, 'value')) { this.stateValue = value; } else { this.$forceUpdate(); } if (!e.target.composing) { this.$emit('change.value', value); } this.$emit('change', e); this.$emit('input', e); }, handleReset(e) { this.setValue('', e); }, handleChange(e) { this.setValue(e.target.value, e); }, renderClearIcon(prefixCls) { const { allowClear } = this.$props; const { stateValue } = this; if (!allowClear || stateValue === undefined || stateValue === null || stateValue === '') { return null; } return ( ); }, renderSuffix(prefixCls) { const { allowClear } = this.$props; let suffix = getComponentFromProp(this, 'suffix'); if (suffix || allowClear) { return ( {this.renderClearIcon(prefixCls)} {suffix} ); } return null; }, renderLabeledInput(prefixCls, children) { const props = this.$props; let addonAfter = getComponentFromProp(this, 'addonAfter'); let addonBefore = getComponentFromProp(this, 'addonBefore'); // Not wrap when there is not addons if (!addonBefore && !addonAfter) { return children; } const wrapperClassName = `${prefixCls}-group`; const addonClassName = `${wrapperClassName}-addon`; addonBefore = addonBefore ? {addonBefore} : null; addonAfter = addonAfter ? {addonAfter} : null; const mergedWrapperClassName = { [`${prefixCls}-wrapper`]: true, [wrapperClassName]: addonBefore || addonAfter, }; const mergedGroupClassName = classNames(`${prefixCls}-group-wrapper`, { [`${prefixCls}-group-wrapper-sm`]: props.size === 'small', [`${prefixCls}-group-wrapper-lg`]: props.size === 'large', }); return ( {addonBefore} {children} {addonAfter} ); }, renderLabeledIcon(prefixCls, children) { const { size } = this.$props; let suffix = this.renderSuffix(prefixCls); if (!hasPrefixSuffix(this.$props)) { return children; } let prefix = getComponentFromProp(this, 'prefix'); prefix = prefix ? {prefix} : null; const affixWrapperCls = classNames(`${prefixCls}-affix-wrapper`, { [`${prefixCls}-affix-wrapper-sm`]: size === 'small', [`${prefixCls}-affix-wrapper-lg`]: size === 'large', }); return ( {prefix} {children} {suffix} ); }, renderInput(prefixCls) { const otherProps = omit(this.$props, [ 'prefixCls', 'addonBefore', 'addonAfter', 'prefix', 'suffix', 'value', 'defaultValue', ]); const { stateValue, getInputClassName, handleKeyDown, handleChange, $listeners } = this; const inputProps = { domProps: { value: stateValue, }, attrs: { ...otherProps, ...this.$attrs }, on: { ...$listeners, keydown: handleKeyDown, input: handleChange, change: noop, }, class: getInputClassName(prefixCls), ref: 'input', }; if ($listeners['change.value']) { inputProps.directives = [{ name: 'ant-input' }]; } return this.renderLabeledIcon(prefixCls,); }, }, render() { if (this.$props.type === 'textarea') { const { $listeners } = this; const textareaProps = { props: this.$props, attrs: this.$attrs, on: { ...$listeners, change: this.handleChange, keydown: this.handleKeyDown, }, directives: [ { name: 'ant-input', }, ], }; return