oui-antd
Version:
An enterprise-class UI design language and React-based implementation
388 lines (339 loc) • 14.5 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var React = _interopRequireWildcard(_react);
var _reactDom = require('react-dom');
var ReactDOM = _interopRequireWildcard(_reactDom);
var _propTypes = require('prop-types');
var PropTypes = _interopRequireWildcard(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _intersperse = require('intersperse');
var _intersperse2 = _interopRequireDefault(_intersperse);
var _rcAnimate = require('rc-animate');
var _rcAnimate2 = _interopRequireDefault(_rcAnimate);
var _row = require('../grid/row');
var _row2 = _interopRequireDefault(_row);
var _col = require('../grid/col');
var _col2 = _interopRequireDefault(_col);
var _warning = require('../_util/warning');
var _warning2 = _interopRequireDefault(_warning);
var _constants = require('./constants');
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var FormItem = function (_React$Component) {
(0, _inherits3['default'])(FormItem, _React$Component);
function FormItem() {
(0, _classCallCheck3['default'])(this, FormItem);
var _this = (0, _possibleConstructorReturn3['default'])(this, (FormItem.__proto__ || Object.getPrototypeOf(FormItem)).apply(this, arguments));
_this.helpShow = false;
_this.onHelpAnimEnd = function (_key, helpShow) {
_this.helpShow = helpShow;
if (!helpShow) {
_this.setState({});
}
};
// Resolve duplicated ids bug between different forms
// https://github.com/ant-design/ant-design/issues/7351
_this.onLabelClick = function (e) {
var label = _this.props.label;
var id = _this.props.id || _this.getId();
if (!id) {
return;
}
var controls = document.querySelectorAll('[id="' + id + '"]');
if (controls.length !== 1) {
// Only prevent in default situation
// Avoid preventing event in `label={<a href="xx">link</a>}``
if (typeof label === 'string') {
e.preventDefault();
}
var formItemNode = ReactDOM.findDOMNode(_this);
var control = formItemNode.querySelector('[id="' + id + '"]');
if (control && control.focus) {
control.focus();
}
}
};
return _this;
}
(0, _createClass3['default'])(FormItem, [{
key: 'componentDidMount',
value: function componentDidMount() {
(0, _warning2['default'])(this.getControls(this.props.children, true).length <= 1, '`Form.Item` cannot generate `validateStatus` and `help` automatically, ' + 'while there are more than one `getFieldDecorator` in it.');
}
}, {
key: 'getHelpMessage',
value: function getHelpMessage() {
var help = this.props.help;
if (help === undefined && this.getOnlyControl()) {
var errors = this.getField().errors;
if (errors) {
return (0, _intersperse2['default'])(errors.map(function (e, index) {
return React.isValidElement(e.message) ? React.cloneElement(e.message, { key: index }) : e.message;
}), ' ');
}
return '';
}
return help;
}
}, {
key: 'getControls',
value: function getControls(children, recursively) {
var controls = [];
var childrenArray = React.Children.toArray(children);
for (var i = 0; i < childrenArray.length; i++) {
if (!recursively && controls.length > 0) {
break;
}
var child = childrenArray[i];
if (child.type && (child.type === FormItem || child.type.displayName === 'FormItem')) {
continue;
}
if (!child.props) {
continue;
}
if (_constants.FIELD_META_PROP in child.props) {
// And means FIELD_DATA_PROP in child.props, too.
controls.push(child);
} else if (child.props.children) {
controls = controls.concat(this.getControls(child.props.children, recursively));
}
}
return controls;
}
}, {
key: 'getOnlyControl',
value: function getOnlyControl() {
var child = this.getControls(this.props.children, false)[0];
return child !== undefined ? child : null;
}
}, {
key: 'getChildProp',
value: function getChildProp(prop) {
var child = this.getOnlyControl();
return child && child.props && child.props[prop];
}
}, {
key: 'getId',
value: function getId() {
return this.getChildProp('id');
}
}, {
key: 'getMeta',
value: function getMeta() {
return this.getChildProp(_constants.FIELD_META_PROP);
}
}, {
key: 'getField',
value: function getField() {
return this.getChildProp(_constants.FIELD_DATA_PROP);
}
}, {
key: 'renderHelp',
value: function renderHelp() {
var prefixCls = this.props.prefixCls;
var help = this.getHelpMessage();
var children = help ? React.createElement(
'div',
{ className: prefixCls + '-explain', key: 'help' },
help
) : null;
if (children) {
this.helpShow = !!children;
}
return React.createElement(
_rcAnimate2['default'],
{ transitionName: 'show-help', component: '', transitionAppear: true, key: 'help', onEnd: this.onHelpAnimEnd },
children
);
}
}, {
key: 'renderExtra',
value: function renderExtra() {
var _props = this.props,
prefixCls = _props.prefixCls,
extra = _props.extra;
return extra ? React.createElement(
'div',
{ className: prefixCls + '-extra' },
extra
) : null;
}
}, {
key: 'getValidateStatus',
value: function getValidateStatus() {
var onlyControl = this.getOnlyControl();
if (!onlyControl) {
return '';
}
var field = this.getField();
if (field.validating) {
return 'validating';
}
if (field.errors) {
return 'error';
}
var fieldValue = 'value' in field ? field.value : this.getMeta().initialValue;
if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
return 'success';
}
return '';
}
}, {
key: 'renderValidateWrapper',
value: function renderValidateWrapper(c1, c2, c3) {
var props = this.props;
var onlyControl = this.getOnlyControl;
var validateStatus = props.validateStatus === undefined && onlyControl ? this.getValidateStatus() : props.validateStatus;
var classes = this.props.prefixCls + '-item-control';
if (validateStatus) {
classes = (0, _classnames2['default'])(this.props.prefixCls + '-item-control', {
'has-feedback': props.hasFeedback || validateStatus === 'validating',
'has-success': validateStatus === 'success',
'has-warning': validateStatus === 'warning',
'has-error': validateStatus === 'error',
'is-validating': validateStatus === 'validating'
});
}
return React.createElement(
'div',
{ className: classes },
React.createElement(
'span',
{ className: this.props.prefixCls + '-item-children' },
c1
),
c2,
c3
);
}
}, {
key: 'renderWrapper',
value: function renderWrapper(children) {
var _props2 = this.props,
prefixCls = _props2.prefixCls,
wrapperCol = _props2.wrapperCol;
var className = (0, _classnames2['default'])(prefixCls + '-item-control-wrapper', wrapperCol && wrapperCol.className);
return React.createElement(
_col2['default'],
(0, _extends3['default'])({}, wrapperCol, { className: className, key: 'wrapper' }),
children
);
}
}, {
key: 'isRequired',
value: function isRequired() {
var required = this.props.required;
if (required !== undefined) {
return required;
}
if (this.getOnlyControl()) {
var meta = this.getMeta() || {};
var validate = meta.validate || [];
return validate.filter(function (item) {
return !!item.rules;
}).some(function (item) {
return item.rules.some(function (rule) {
return rule.required;
});
});
}
return false;
}
}, {
key: 'renderLabel',
value: function renderLabel() {
var _props3 = this.props,
prefixCls = _props3.prefixCls,
label = _props3.label,
labelCol = _props3.labelCol,
colon = _props3.colon,
id = _props3.id;
var context = this.context;
var required = this.isRequired();
var labelColClassName = (0, _classnames2['default'])(prefixCls + '-item-label', labelCol && labelCol.className);
var labelClassName = (0, _classnames2['default'])((0, _defineProperty3['default'])({}, prefixCls + '-item-required', required));
var labelChildren = label;
// Keep label is original where there should have no colon
var haveColon = colon && !context.vertical;
// Remove duplicated user input colon
if (haveColon && typeof label === 'string' && label.trim() !== '') {
labelChildren = label.replace(/[:|:]\s*$/, '');
}
return label ? React.createElement(
_col2['default'],
(0, _extends3['default'])({}, labelCol, { className: labelColClassName, key: 'label' }),
React.createElement(
'label',
{ htmlFor: id || this.getId(), className: labelClassName, title: typeof label === 'string' ? label : '', onClick: this.onLabelClick },
labelChildren
)
) : null;
}
}, {
key: 'renderChildren',
value: function renderChildren() {
var children = this.props.children;
return [this.renderLabel(), this.renderWrapper(this.renderValidateWrapper(children, this.renderHelp(), this.renderExtra()))];
}
}, {
key: 'renderFormItem',
value: function renderFormItem(children) {
var _itemClassName;
var props = this.props;
var prefixCls = props.prefixCls;
var style = props.style;
var itemClassName = (_itemClassName = {}, (0, _defineProperty3['default'])(_itemClassName, prefixCls + '-item', true), (0, _defineProperty3['default'])(_itemClassName, prefixCls + '-item-with-help', this.helpShow), (0, _defineProperty3['default'])(_itemClassName, prefixCls + '-item-no-colon', !props.colon), (0, _defineProperty3['default'])(_itemClassName, '' + props.className, !!props.className), _itemClassName);
return React.createElement(
_row2['default'],
{ className: (0, _classnames2['default'])(itemClassName), style: style },
children
);
}
}, {
key: 'render',
value: function render() {
var children = this.renderChildren();
return this.renderFormItem(children);
}
}]);
return FormItem;
}(React.Component);
exports['default'] = FormItem;
FormItem.defaultProps = {
hasFeedback: false,
prefixCls: 'ant-form',
colon: true
};
FormItem.propTypes = {
prefixCls: PropTypes.string,
label: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
labelCol: PropTypes.object,
help: PropTypes.oneOfType([PropTypes.node, PropTypes.bool]),
validateStatus: PropTypes.oneOf(['', 'success', 'warning', 'error', 'validating']),
hasFeedback: PropTypes.bool,
wrapperCol: PropTypes.object,
className: PropTypes.string,
id: PropTypes.string,
children: PropTypes.node,
colon: PropTypes.bool
};
FormItem.contextTypes = {
vertical: PropTypes.bool
};
module.exports = exports['default'];