choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
401 lines (350 loc) • 13.2 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _extends from "@babel/runtime/helpers/extends";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _createClass from "@babel/runtime/helpers/createClass";
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
import _inherits from "@babel/runtime/helpers/inherits";
import _createSuper from "@babel/runtime/helpers/createSuper";
import React, { isValidElement, cloneElement, Children, Component } from 'react';
import { findDOMNode } from 'react-dom';
import flatMap from 'lodash/flatMap';
import classNames from 'classnames';
import Col from '../grid/col';
import warning from '../_util/warning';
import { FIELD_DATA_PROP, FIELD_META_PROP } from './constants';
import PureRenderMixin from '../rc-components/util/PureRenderMixin';
import Animate from '../animate';
import Row from '../grid/row';
import { FormItemValidateStatus } from './enum';
import FormContext from './FormContext';
function intersperse(arr, inter) {
return flatMap(arr, function (a, i) {
return i ? [inter, a] : [a];
});
}
var FormItem = /*#__PURE__*/function (_Component) {
_inherits(FormItem, _Component);
var _super = _createSuper(FormItem);
function FormItem() {
var _this;
_classCallCheck(this, FormItem);
_this = _super.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
_this.onLabelClick = function (e) {
var _this$props = _this.props,
label = _this$props.label,
propId = _this$props.id;
var id = propId || _this.getId();
if (!id) {
return;
}
var controls = document.querySelectorAll("[id=\"".concat(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 control = findDOMNode(_assertThisInitialized(_this)).querySelector("[id=\"".concat(id, "\"]"));
if (control && control.focus) {
control.focus();
}
}
};
return _this;
}
_createClass(FormItem, [{
key: "componentDidMount",
value: function componentDidMount() {
var children = this.props.children;
warning(this.getControls(children, true).length <= 1, '`Form.Item` cannot generate `validateStatus` and `help` automatically, ' + 'while there are more than one `getFieldDecorator` in it.');
}
}, {
key: "shouldComponentUpdate",
value: function shouldComponentUpdate() {
for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {
args[_key2] = arguments[_key2];
}
return PureRenderMixin.shouldComponentUpdate.apply(this, args);
}
}, {
key: "getHelpMsg",
value: function getHelpMsg() {
var help = this.props.help;
if (help === undefined && this.getOnlyControl()) {
var errors = this.getField().errors;
if (errors) {
return intersperse(errors.map(function (e, index) {
return /*#__PURE__*/isValidElement(e.message) ? /*#__PURE__*/cloneElement(e.message, {
key: index
}) : e.message;
}), ' ');
}
return '';
}
return help;
}
}, {
key: "getControls",
value: function getControls(children, recursively) {
var controls = [];
var childrenArray = 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' || child.type.__FORM_ITEM)) {
continue;
}
if (!child.props) {
continue;
}
if (FIELD_META_PROP in child.props) {
// And means FIELD_DATA_PROP in chidl.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 children = this.props.children;
var child = this.getControls(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(FIELD_META_PROP);
}
}, {
key: "getField",
value: function getField() {
return this.getChildProp(FIELD_DATA_PROP);
}
}, {
key: "getPrefixCls",
value: function getPrefixCls() {
var prefixCls = this.props.prefixCls;
var getPrefixCls = this.context.getPrefixCls;
return getPrefixCls('form', prefixCls);
}
}, {
key: "renderHelp",
value: function renderHelp() {
var _this$props$helpTrans = this.props.helpTransitionName,
helpTransitionName = _this$props$helpTrans === void 0 ? 'show-error' : _this$props$helpTrans;
var prefixCls = this.getPrefixCls();
var help = this.getHelpMsg();
var children = help ? /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-explain"),
key: "help"
}, help) : null;
if (children) {
this.helpShow = !!children;
}
return /*#__PURE__*/React.createElement(Animate, {
transitionName: helpTransitionName,
component: "",
transitionAppear: true,
key: "help",
onEnd: this.onHelpAnimEnd
}, children);
}
}, {
key: "renderExtra",
value: function renderExtra() {
var extra = this.props.extra;
var prefixCls = this.getPrefixCls();
return extra ? /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-extra")
}, extra) : null;
}
}, {
key: "getValidateStatus",
value: function getValidateStatus() {
var onlyControl = this.getOnlyControl();
if (onlyControl) {
var field = this.getField();
if (field.validating) {
return FormItemValidateStatus.validating;
}
if (field.errors) {
return FormItemValidateStatus.error;
}
var fieldValue = 'value' in field ? field.value : this.getMeta().initialValue;
if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
return FormItemValidateStatus.success;
}
}
}
}, {
key: "renderValidateWrapper",
value: function renderValidateWrapper(c1, c2, c3) {
var props = this.props;
var prefixCls = this.getPrefixCls();
var onlyControl = this.getOnlyControl();
var validateStatus = props.validateStatus === undefined && onlyControl ? this.getValidateStatus() : props.validateStatus;
var classes = "".concat(prefixCls, "-item-control");
if (validateStatus) {
classes = classNames("".concat(prefixCls, "-item-control"), {
'has-feedback': props.hasFeedback || validateStatus === FormItemValidateStatus.validating,
'has-success': validateStatus === FormItemValidateStatus.success,
'has-warning': validateStatus === FormItemValidateStatus.warning,
'has-error': validateStatus === FormItemValidateStatus.error,
'is-validating': validateStatus === FormItemValidateStatus.validating
});
} // 必输字段,输入框加黄色背景, 解决表格行内编辑,没有label的情况下没有提示必输标示的问题
var required = this.isRequired();
if (required) {
classes = classNames(classes, ["".concat(prefixCls, "-item-required")]);
}
return /*#__PURE__*/React.createElement("div", {
className: classes
}, /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-item-children")
}, c1), c2, c3);
}
}, {
key: "renderWrapper",
value: function renderWrapper(children) {
var _this$props2 = this.props,
wrapperCol = _this$props2.wrapperCol,
labelLayout = _this$props2.labelLayout,
colPrefixCls = _this$props2.colPrefixCls;
var prefixCls = this.getPrefixCls();
var required = this.isRequired();
var isHorizontal = labelLayout === 'horizontal';
var className = classNames("".concat(prefixCls, "-item-control-wrapper"), wrapperCol && wrapperCol.className, {
'is-required': isHorizontal ? undefined : required
});
return isHorizontal ? /*#__PURE__*/React.createElement(Col, _extends({
prefixCls: colPrefixCls
}, wrapperCol, {
className: className,
key: "wrapper"
}), children) : /*#__PURE__*/React.createElement("div", {
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 _this$props3 = this.props,
prefixCls = _this$props3.prefixCls,
label = _this$props3.label,
labelCol = _this$props3.labelCol,
colon = _this$props3.colon,
id = _this$props3.id,
colPrefixCls = _this$props3.colPrefixCls;
var context = this.context;
var required = this.isRequired();
var labelColClassName = classNames("".concat(prefixCls, "-item-label"), labelCol && labelCol.className);
var labelClassName = classNames(_defineProperty({}, "".concat(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 ? /*#__PURE__*/React.createElement(Col, _extends({
prefixCls: colPrefixCls
}, labelCol, {
className: labelColClassName,
key: "label"
}), /*#__PURE__*/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 _this$props4 = this.props,
children = _this$props4.children,
labelLayout = _this$props4.labelLayout;
return [labelLayout === 'horizontal' && 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 = this.getPrefixCls();
var style = props.style;
var itemClassName = (_itemClassName = {}, _defineProperty(_itemClassName, "".concat(prefixCls, "-item"), true), _defineProperty(_itemClassName, "".concat(prefixCls, "-item-with-help"), this.helpShow), _defineProperty(_itemClassName, "".concat(prefixCls, "-item-no-colon"), !props.colon), _defineProperty(_itemClassName, "".concat(props.className), !!props.className), _itemClassName);
return props.labelLayout === 'horizontal' ? /*#__PURE__*/React.createElement(Row, {
prefixCls: props.rowPrefixCls,
className: classNames(itemClassName),
style: style
}, children) : /*#__PURE__*/React.createElement("div", {
className: classNames(itemClassName),
style: style
}, children);
}
}, {
key: "render",
value: function render() {
var children = this.renderChildren();
return this.renderFormItem(children);
}
}], [{
key: "contextType",
get: function get() {
return FormContext;
}
}]);
return FormItem;
}(Component);
export { FormItem as default };
FormItem.displayName = 'FormItem';
FormItem.defaultProps = {
hasFeedback: false,
colon: true,
labelLayout: 'float'
};
FormItem.__FORM_ITEM = true;
//# sourceMappingURL=FormItem.js.map