ItemHolder.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. "use strict";
  2. "use client";
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  5. Object.defineProperty(exports, "__esModule", {
  6. value: true
  7. });
  8. exports.default = ItemHolder;
  9. var React = _interopRequireWildcard(require("react"));
  10. var _classnames = _interopRequireDefault(require("classnames"));
  11. var _isVisible = _interopRequireDefault(require("rc-util/lib/Dom/isVisible"));
  12. var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
  13. var _omit = _interopRequireDefault(require("rc-util/lib/omit"));
  14. var _grid = require("../../grid");
  15. var _context = require("../context");
  16. var _FormItemInput = _interopRequireDefault(require("../FormItemInput"));
  17. var _FormItemLabel = _interopRequireDefault(require("../FormItemLabel"));
  18. var _useDebounce = _interopRequireDefault(require("../hooks/useDebounce"));
  19. var _util = require("../util");
  20. var _StatusProvider = _interopRequireDefault(require("./StatusProvider"));
  21. var __rest = void 0 && (void 0).__rest || function (s, e) {
  22. var t = {};
  23. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  24. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  25. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  26. }
  27. return t;
  28. };
  29. function ItemHolder(props) {
  30. const {
  31. prefixCls,
  32. className,
  33. rootClassName,
  34. style,
  35. help,
  36. errors,
  37. warnings,
  38. validateStatus,
  39. meta,
  40. hasFeedback,
  41. hidden,
  42. children,
  43. fieldId,
  44. required,
  45. isRequired,
  46. onSubItemMetaChange,
  47. layout: propsLayout,
  48. name
  49. } = props,
  50. restProps = __rest(props, ["prefixCls", "className", "rootClassName", "style", "help", "errors", "warnings", "validateStatus", "meta", "hasFeedback", "hidden", "children", "fieldId", "required", "isRequired", "onSubItemMetaChange", "layout", "name"]);
  51. const itemPrefixCls = `${prefixCls}-item`;
  52. const {
  53. requiredMark,
  54. layout: formLayout
  55. } = React.useContext(_context.FormContext);
  56. const layout = propsLayout || formLayout;
  57. const vertical = layout === 'vertical';
  58. // ======================== Margin ========================
  59. const itemRef = React.useRef(null);
  60. const debounceErrors = (0, _useDebounce.default)(errors);
  61. const debounceWarnings = (0, _useDebounce.default)(warnings);
  62. const hasHelp = help !== undefined && help !== null;
  63. const hasError = !!(hasHelp || errors.length || warnings.length);
  64. const isOnScreen = !!itemRef.current && (0, _isVisible.default)(itemRef.current);
  65. const [marginBottom, setMarginBottom] = React.useState(null);
  66. (0, _useLayoutEffect.default)(() => {
  67. if (hasError && itemRef.current) {
  68. // The element must be part of the DOMTree to use getComputedStyle
  69. // https://stackoverflow.com/questions/35360711/getcomputedstyle-returns-a-cssstyledeclaration-but-all-properties-are-empty-on-a
  70. const itemStyle = getComputedStyle(itemRef.current);
  71. setMarginBottom(parseInt(itemStyle.marginBottom, 10));
  72. }
  73. }, [hasError, isOnScreen]);
  74. const onErrorVisibleChanged = nextVisible => {
  75. if (!nextVisible) {
  76. setMarginBottom(null);
  77. }
  78. };
  79. // ======================== Status ========================
  80. const getValidateState = (isDebounce = false) => {
  81. const _errors = isDebounce ? debounceErrors : meta.errors;
  82. const _warnings = isDebounce ? debounceWarnings : meta.warnings;
  83. return (0, _util.getStatus)(_errors, _warnings, meta, '', !!hasFeedback, validateStatus);
  84. };
  85. const mergedValidateStatus = getValidateState();
  86. // ======================== Render ========================
  87. const itemClassName = (0, _classnames.default)(itemPrefixCls, className, rootClassName, {
  88. [`${itemPrefixCls}-with-help`]: hasHelp || debounceErrors.length || debounceWarnings.length,
  89. // Status
  90. [`${itemPrefixCls}-has-feedback`]: mergedValidateStatus && hasFeedback,
  91. [`${itemPrefixCls}-has-success`]: mergedValidateStatus === 'success',
  92. [`${itemPrefixCls}-has-warning`]: mergedValidateStatus === 'warning',
  93. [`${itemPrefixCls}-has-error`]: mergedValidateStatus === 'error',
  94. [`${itemPrefixCls}-is-validating`]: mergedValidateStatus === 'validating',
  95. [`${itemPrefixCls}-hidden`]: hidden,
  96. // Layout
  97. [`${itemPrefixCls}-${layout}`]: layout
  98. });
  99. return /*#__PURE__*/React.createElement("div", {
  100. className: itemClassName,
  101. style: style,
  102. ref: itemRef
  103. }, /*#__PURE__*/React.createElement(_grid.Row, Object.assign({
  104. className: `${itemPrefixCls}-row`
  105. }, (0, _omit.default)(restProps, ['_internalItemRender', 'colon', 'dependencies', 'extra', 'fieldKey', 'getValueFromEvent', 'getValueProps', 'htmlFor', 'id',
  106. // It is deprecated because `htmlFor` is its replacement.
  107. 'initialValue', 'isListField', 'label', 'labelAlign', 'labelCol', 'labelWrap', 'messageVariables', 'name', 'normalize', 'noStyle', 'preserve', 'requiredMark', 'rules', 'shouldUpdate', 'trigger', 'tooltip', 'validateFirst', 'validateTrigger', 'valuePropName', 'wrapperCol', 'validateDebounce'])), /*#__PURE__*/React.createElement(_FormItemLabel.default, Object.assign({
  108. htmlFor: fieldId
  109. }, props, {
  110. requiredMark: requiredMark,
  111. required: required !== null && required !== void 0 ? required : isRequired,
  112. prefixCls: prefixCls,
  113. vertical: vertical
  114. })), /*#__PURE__*/React.createElement(_FormItemInput.default, Object.assign({}, props, meta, {
  115. errors: debounceErrors,
  116. warnings: debounceWarnings,
  117. prefixCls: prefixCls,
  118. status: mergedValidateStatus,
  119. help: help,
  120. marginBottom: marginBottom,
  121. onErrorVisibleChanged: onErrorVisibleChanged
  122. }), /*#__PURE__*/React.createElement(_context.NoStyleItemContext.Provider, {
  123. value: onSubItemMetaChange
  124. }, /*#__PURE__*/React.createElement(_StatusProvider.default, {
  125. prefixCls: prefixCls,
  126. meta: meta,
  127. errors: meta.errors,
  128. warnings: meta.warnings,
  129. hasFeedback: hasFeedback,
  130. // Already calculated
  131. validateStatus: mergedValidateStatus,
  132. name: name
  133. }, children)))), !!marginBottom && (/*#__PURE__*/React.createElement("div", {
  134. className: `${itemPrefixCls}-margin-offset`,
  135. style: {
  136. marginBottom: -marginBottom
  137. }
  138. })));
  139. }