import _extends from 'babel-runtime/helpers/extends'; import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; import _inherits from 'babel-runtime/helpers/inherits'; var _class, _temp; import React from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import Grid from '../grid'; import RGrid from '../responsive-grid'; import { obj } from '../util'; import Error from './error'; import { getFieldInitCfg } from './enhance'; var Row = Grid.Row, Col = Grid.Col; var Cell = RGrid.Cell; var isNil = obj.isNil; /** Form.Item * @description 手动传递了 wrapCol labelCol 会使用 Grid 辅助布局; labelAlign='top' 会强制禁用 Grid * @order 1 */ var Item = (_temp = _class = function (_React$Component) { _inherits(Item, _React$Component); function Item() { _classCallCheck(this, Item); return _possibleConstructorReturn(this, _React$Component.apply(this, arguments)); } /** * 从子元素里面提取表单组件 */ Item.prototype.getNames = function getNames() { var children = React.Children.toArray(this.props.children); return children.filter(function (c) { return c.props && ('name' in c.props || 'data-meta' in c.props); }).map(function (c) { return c.props.name || c.props.id; }); }; Item.prototype.getHelper = function getHelper() { var help = this.props.help; var _formField = this.context._formField; return React.createElement( Error, { name: help === undefined ? this.getNames() : undefined, field: _formField }, help ); }; Item.prototype.getState = function getState() { var validateState = this.props.validateState; if (validateState) { return validateState; } if (this.context._formField) { var getState = this.context._formField.getState; var names = this.getNames(); if (!names.length) { return ''; } // get first name return getState(names[0]); } return undefined; }; Item.prototype.getSize = function getSize() { return this.props.size || this.context._formSize; }; Item.prototype.getIsPreview = function getIsPreview() { return 'isPreview' in this.props ? this.props.isPreview : this.context._formPreview; }; Item.prototype.getFullWidth = function getFullWidth() { return isNil(this.props.fullWidth) ? !!this.context._formFullWidth : this.props.fullWidth; }; Item.prototype.getItemLabel = function getItemLabel() { var _classNames; var _props = this.props, id = _props.id, required = _props.required, _props$asterisk = _props.asterisk, asterisk = _props$asterisk === undefined ? required : _props$asterisk, label = _props.label, labelCol = _props.labelCol, wrapperCol = _props.wrapperCol, prefix = _props.prefix, responsive = _props.responsive, labelWidth = _props.labelWidth, labelTextAlign = _props.labelTextAlign; var labelAlign = this.getLabelAlign(this.props.labelAlign, this.props.device); if (!label) { return null; } var ele = React.createElement( 'label', { htmlFor: id || this.getNames()[0], required: asterisk, key: 'label' }, label ); var cls = classNames((_classNames = {}, _classNames[prefix + 'form-item-label'] = true, _classNames[prefix + 'left'] = labelTextAlign === 'left', _classNames)); if (responsive && labelWidth && labelAlign !== 'top') { return React.createElement( 'div', { className: cls, style: { width: labelWidth } }, ele ); } if ((wrapperCol || labelCol) && labelAlign !== 'top') { return React.createElement( Col, _extends({}, labelCol, { className: cls }), ele ); } return React.createElement( 'div', { className: cls }, ele ); }; Item.prototype.getItemWrapper = function getItemWrapper() { var _this2 = this; var _props2 = this.props, hasFeedback = _props2.hasFeedback, labelCol = _props2.labelCol, wrapperCol = _props2.wrapperCol, children = _props2.children, extra = _props2.extra, prefix = _props2.prefix, renderPreview = _props2.renderPreview; var labelAlign = this.getLabelAlign(this.props.labelAlign, this.props.device); var state = this.getState(); var isPreview = this.getIsPreview(); var childrenProps = { size: this.getSize() }; if (isPreview) { childrenProps.isPreview = true; } if ('renderPreview' in this.props && typeof renderPreview === 'function') { childrenProps.renderPreview = renderPreview; } if (state && (state === 'error' || hasFeedback)) { childrenProps.state = state; } if (labelAlign === 'inset') { childrenProps.label = this.getItemLabel(); } var childrenNode = children; if (typeof children === 'function' && this.context._formField) { childrenNode = children(this.context._formField.getValues()); } var ele = React.Children.map(childrenNode, function (child) { if (child && typeof child.type === 'function' && child.type._typeMark !== 'form_item' && child.type._typeMark !== 'form_error') { var extraProps = childrenProps; if (_this2.context._formField && 'name' in child.props && !('data-meta' in child.props)) { extraProps = _this2.context._formField.init(child.props.name, _extends({}, getFieldInitCfg(_this2.props, child.type.displayName), { props: _extends({}, child.props, { ref: child.ref }) }), childrenProps); } else { extraProps = _extends({}, child.props, extraProps); } return React.cloneElement(child, extraProps); } return child; }); var help = this.getHelper(); if ((wrapperCol || labelCol) && labelAlign !== 'top') { return React.createElement( Col, _extends({}, wrapperCol, { className: prefix + 'form-item-control', key: 'item' }), ele, ' ', help, ' ', extra ); } return React.createElement( 'div', { className: prefix + 'form-item-control' }, ele, ' ', help, ' ', extra ); }; Item.prototype.getLabelAlign = function getLabelAlign(labelAlign, device) { if (device === 'phone') { return 'top'; } return labelAlign; }; Item.prototype.render = function render() { var _classNames2; var _props3 = this.props, className = _props3.className, style = _props3.style, prefix = _props3.prefix, wrapperCol = _props3.wrapperCol, labelCol = _props3.labelCol, responsive = _props3.responsive; var labelAlign = this.getLabelAlign(this.props.labelAlign, this.props.device); var state = this.getState(); var size = this.getSize(); var fullWidth = this.getFullWidth(); var itemClassName = classNames((_classNames2 = {}, _classNames2[prefix + 'form-item'] = true, _classNames2['' + prefix + labelAlign] = labelAlign, _classNames2['has-' + state] = !!state, _classNames2['' + prefix + size] = !!size, _classNames2[prefix + 'form-item-fullwidth'] = fullWidth, _classNames2['' + className] = !!className, _classNames2)); // 垂直模式并且左对齐才用到 var Tag = responsive ? Cell : (wrapperCol || labelCol) && labelAlign !== 'top' ? Row : 'div'; var label = labelAlign === 'inset' ? null : this.getItemLabel(); return React.createElement( Tag, _extends({}, obj.pickOthers(Item.propTypes, this.props), { className: itemClassName, style: style }), label, this.getItemWrapper() ); }; return Item; }(React.Component), _class.propTypes = { /** * 样式前缀 */ prefix: PropTypes.string, rtl: PropTypes.bool, /** * label 标签的文本 */ label: PropTypes.node, /** * label 标签布局,通 `