UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

448 lines (378 loc) 16.1 kB
'use strict'; exports.__esModule = true; exports.default = undefined; var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _class, _temp; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _icon = require('../icon'); var _icon2 = _interopRequireDefault(_icon); var _util = require('../util'); var _base = require('./base'); var _base2 = _interopRequireDefault(_base); var _group = require('./group'); var _group2 = _interopRequireDefault(_group); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // preventDefault here can stop onBlur to keep focus state function preventDefault(e) { e.preventDefault(); } /** Input */ var Input = (_temp = _class = function (_Base) { (0, _inherits3.default)(Input, _Base); function Input(props) { (0, _classCallCheck3.default)(this, Input); var _this = (0, _possibleConstructorReturn3.default)(this, _Base.call(this, props)); _this.handleKeyDown = function (e) { if (e.keyCode === 13) { _this.props.onPressEnter(e); } _this.onKeyDown(e); }; _this.handleKeyDownFromClear = function (e) { if (e.keyCode === 13) { _this.onClear(e); } }; var value = void 0; if ('value' in props) { value = props.value; } else { value = props.defaultValue; } _this.state = { value: typeof value === 'undefined' ? '' : value }; return _this; } // `Enter` was considered to be two chars in chrome , but one char in ie. // so we make all `Enter` to be two chars Input.prototype.getValueLength = function getValueLength(value) { var nv = '' + value; var strLen = this.props.getValueLength(nv); if (typeof strLen !== 'number') { strLen = nv.length; } return strLen; }; Input.prototype.renderControl = function renderControl() { var _this2 = this; var _props = this.props, hasClear = _props.hasClear, readOnly = _props.readOnly, state = _props.state, prefix = _props.prefix, hint = _props.hint, extra = _props.extra, locale = _props.locale, disabled = _props.disabled, hoverShowClear = _props.hoverShowClear; var lenWrap = this.renderLength(); var stateWrap = null; if (state === 'success') { stateWrap = _react2.default.createElement(_icon2.default, { type: 'success-filling', className: prefix + 'input-success-icon' }); } else if (state === 'loading') { stateWrap = _react2.default.createElement(_icon2.default, { type: 'loading', className: prefix + 'input-loading-icon' }); } else if (state === 'warning') { stateWrap = _react2.default.createElement(_icon2.default, { type: 'warning', className: prefix + 'input-warning-icon' }); } var clearWrap = null; // showClear属性应该与disable属性为互斥状态 var showClear = hasClear && !readOnly && !!('' + this.state.value) && !disabled; if (hint || showClear) { var hintIcon = null; if (hint) { if (typeof hint === 'string') { hintIcon = _react2.default.createElement(_icon2.default, { type: hint, className: prefix + 'input-hint' }); } else if ((0, _react.isValidElement)(hint)) { hintIcon = (0, _react.cloneElement)(hint, { className: (0, _classnames2.default)(hint.props.className, prefix + 'input-hint') }); } else { hintIcon = hint; } } else { var _classNames; var cls = (0, _classnames2.default)((_classNames = {}, _classNames[prefix + 'input-hint'] = true, _classNames[prefix + 'input-clear-icon'] = true, _classNames[prefix + 'input-hover-show'] = hoverShowClear, _classNames)); hintIcon = _react2.default.createElement(_icon2.default, { type: 'delete-filling', role: 'button', tabIndex: '0', className: cls, 'aria-label': locale.clear, onClick: this.onClear.bind(this), onMouseDown: preventDefault, onKeyDown: this.handleKeyDownFromClear }); } clearWrap = _react2.default.createElement( 'span', { className: prefix + 'input-hint-wrap' }, hasClear && hint ? _react2.default.createElement(_icon2.default, { type: 'delete-filling', role: 'button', tabIndex: '0', className: prefix + 'input-clear ' + prefix + 'input-clear-icon', 'aria-label': locale.clear, onClick: this.onClear.bind(this), onMouseDown: preventDefault, onKeyDown: this.handleKeyDownFromClear }) : null, hintIcon ); } if (state === 'loading') { clearWrap = null; } return clearWrap || lenWrap || stateWrap || extra ? _react2.default.createElement( 'span', { onClick: function onClick() { return _this2.focus(); }, className: prefix + 'input-control' }, clearWrap, lenWrap, stateWrap, extra ) : null; }; Input.prototype.renderLabel = function renderLabel() { var _props2 = this.props, label = _props2.label, prefix = _props2.prefix, id = _props2.id; return label ? _react2.default.createElement( 'label', { className: prefix + 'input-label', htmlFor: id }, label ) : null; }; Input.prototype.renderInner = function renderInner(inner, cls) { return inner ? _react2.default.createElement( 'span', { className: cls }, inner ) : null; }; Input.prototype.onClear = function onClear(e) { if (this.props.disabled) { return; } // 非受控模式清空内部数据 if (!('value' in this.props)) { this.setState({ value: '' }); } this.props.onChange('', e, 'clear'); this.focus(); }; Input.prototype.render = function render() { var _classNames2, _classNames3, _classNames4, _classNames5, _classNames6, _classNames7, _classNames8; var _props3 = this.props, size = _props3.size, htmlType = _props3.htmlType, htmlSize = _props3.htmlSize, autoComplete = _props3.autoComplete, autoFocus = _props3.autoFocus, disabled = _props3.disabled, style = _props3.style, innerBefore = _props3.innerBefore, innerAfter = _props3.innerAfter, innerBeforeClassName = _props3.innerBeforeClassName, innerAfterClassName = _props3.innerAfterClassName, className = _props3.className, hasBorder = _props3.hasBorder, prefix = _props3.prefix, isPreview = _props3.isPreview, renderPreview = _props3.renderPreview, addonBefore = _props3.addonBefore, addonAfter = _props3.addonAfter, addonTextBefore = _props3.addonTextBefore, addonTextAfter = _props3.addonTextAfter, inputRender = _props3.inputRender, rtl = _props3.rtl, composition = _props3.composition; var hasAddon = addonBefore || addonAfter || addonTextBefore || addonTextAfter; var cls = (0, _classnames2.default)(this.getClass(), (_classNames2 = {}, _classNames2['' + prefix + size] = true, _classNames2[prefix + 'hidden'] = this.props.htmlType === 'hidden', _classNames2[prefix + 'noborder'] = !hasBorder || this.props.htmlType === 'file', _classNames2[prefix + 'input-group-auto-width'] = hasAddon, _classNames2[prefix + 'disabled'] = disabled, _classNames2[className] = !!className && !hasAddon, _classNames2)); var innerCls = prefix + 'input-inner'; var innerBeforeCls = (0, _classnames2.default)((_classNames3 = {}, _classNames3[innerCls] = true, _classNames3[prefix + 'before'] = true, _classNames3[innerBeforeClassName] = innerBeforeClassName, _classNames3)); var innerAfterCls = (0, _classnames2.default)((_classNames4 = {}, _classNames4[innerCls] = true, _classNames4[prefix + 'after'] = true, _classNames4[prefix + 'input-inner-text'] = typeof innerAfter === 'string', _classNames4[innerAfterClassName] = innerAfterClassName, _classNames4)); var previewCls = (0, _classnames2.default)((_classNames5 = {}, _classNames5[prefix + 'form-preview'] = true, _classNames5[className] = !!className, _classNames5)); var props = this.getProps(); // custom data attributes are assigned to the top parent node // data-类自定义数据属性分配到顶层node节点 var dataProps = _util.obj.pickAttrsWith(this.props, 'data-'); // Custom props are transparently transmitted to the core input node by default // 自定义属性默认透传到核心node节点:input var others = _util.obj.pickOthers((0, _extends3.default)({}, dataProps, Input.propTypes), this.props); if (isPreview) { var value = props.value; var label = this.props.label; if (typeof renderPreview === 'function') { return _react2.default.createElement( 'div', (0, _extends3.default)({}, others, { className: previewCls }), renderPreview(value, this.props) ); } return _react2.default.createElement( 'div', (0, _extends3.default)({}, others, { className: previewCls }), addonBefore || addonTextBefore, label, innerBefore, value, innerAfter, addonAfter || addonTextAfter ); } var compositionProps = {}; if (composition) { compositionProps.onCompositionStart = this.handleCompositionStart; compositionProps.onCompositionEnd = this.handleCompositionEnd; } var inputEl = _react2.default.createElement('input', (0, _extends3.default)({}, others, props, compositionProps, { height: '100%', type: htmlType, size: htmlSize, autoFocus: autoFocus, autoComplete: autoComplete, onKeyDown: this.handleKeyDown, ref: this.saveRef })); var inputWrap = _react2.default.createElement( 'span', (0, _extends3.default)({}, dataProps, { dir: rtl ? 'rtl' : undefined, className: cls, style: hasAddon ? undefined : style }), this.renderLabel(), this.renderInner(innerBefore, innerBeforeCls), inputRender(inputEl), this.renderInner(innerAfter, innerAfterCls), this.renderControl() ); var groupCls = (0, _classnames2.default)((_classNames6 = {}, _classNames6[prefix + 'input-group-text'] = true, _classNames6['' + prefix + size] = !!size, _classNames6[prefix + 'disabled'] = disabled, _classNames6)); var addonBeforeCls = (0, _classnames2.default)((_classNames7 = {}, _classNames7[groupCls] = addonTextBefore, _classNames7)); var addonAfterCls = (0, _classnames2.default)((_classNames8 = {}, _classNames8[groupCls] = addonTextAfter, _classNames8)); if (hasAddon) { return _react2.default.createElement( _group2.default, (0, _extends3.default)({}, dataProps, { prefix: prefix, className: className, style: style, disabled: disabled, addonBefore: addonBefore || addonTextBefore, addonBeforeClassName: addonBeforeCls, addonAfter: addonAfter || addonTextAfter, addonAfterClassName: addonAfterCls }), inputWrap ); } return inputWrap; }; return Input; }(_base2.default), _class.getDerivedStateFromProps = _base2.default.getDerivedStateFromProps, _class.propTypes = (0, _extends3.default)({}, _base2.default.propTypes, { /** * label */ label: _propTypes2.default.node, /** * 是否出现clear按钮 */ hasClear: _propTypes2.default.bool, /** * 是否有边框 */ hasBorder: _propTypes2.default.bool, /** * 状态 * @enumdesc 错误, 校验中, 成功, 警告 */ state: _propTypes2.default.oneOf(['error', 'loading', 'success', 'warning']), /** * 按下回车的回调 */ onPressEnter: _propTypes2.default.func, onClear: _propTypes2.default.func, /** * 原生type */ htmlType: _propTypes2.default.string, htmlSize: _propTypes2.default.string, /** * 水印 (Icon的type类型,和hasClear占用一个地方) */ hint: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.node]), /** * 文字前附加内容 */ innerBefore: _propTypes2.default.node, /** * 文字后附加内容 */ innerAfter: _propTypes2.default.node, /** * 输入框前附加内容 */ addonBefore: _propTypes2.default.node, /** * 输入框后附加内容 */ addonAfter: _propTypes2.default.node, /** * 输入框前附加文字 */ addonTextBefore: _propTypes2.default.node, /** * 输入框后附加文字 */ addonTextAfter: _propTypes2.default.node, /** * (原生input支持) */ autoComplete: _propTypes2.default.string, /** * 自动聚焦(原生input支持) */ autoFocus: _propTypes2.default.bool, inputRender: _propTypes2.default.func, extra: _propTypes2.default.node, innerBeforeClassName: _propTypes2.default.string, innerAfterClassName: _propTypes2.default.string, /** * 是否为预览态 */ isPreview: _propTypes2.default.bool, /** * 预览态模式下渲染的内容 * @param {number} value 评分值 */ renderPreview: _propTypes2.default.func, /** * hover展示clear (配合 hasClear=true使用) * @version 1.24 */ hoverShowClear: _propTypes2.default.bool }), _class.defaultProps = (0, _extends3.default)({}, _base2.default.defaultProps, { autoComplete: 'off', hasBorder: true, isPreview: false, hoverShowClear: false, onPressEnter: _util.func.noop, inputRender: function inputRender(el) { return el; } }), _temp); exports.default = Input; module.exports = exports['default'];