UNPKG

@uiw/react-form

Version:
274 lines (272 loc) 10.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _react = _interopRequireWildcard(require("react")); var _FormItem = _interopRequireDefault(require("./FormItem")); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["prefixCls", "className", "fields", "children", "resetOnSubmit", "onSubmitError", "onChange", "onSubmit", "afterSubmit"], _excluded2 = ["children", "validator", "name", "help", "label", "labelFor", "labelClassName", "labelStyle", "inline", "initialValue"]; function newFormState(fields, cb) { var state = { initial: {}, current: {}, submitting: false, errors: {} }; for (var name in fields) { var props = fields[name]; if (!props) continue; var _cb = cb((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, props), {}, { name: name })), initialValue = _cb.initialValue, _currentValue = _cb.currentValue; state.initial[name] = Array.isArray(initialValue) ? (0, _toConsumableArray2["default"])(initialValue) : initialValue; state.current[name] = _currentValue; } return state; } function newInitialValue(value) { return value === null || value === undefined ? '' : value; } var isPromise = function isPromise(promise) { return promise && typeof promise.then === 'function'; }; function Form(props, ref) { var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'w-form' : _props$prefixCls, className = props.className, fields = props.fields, children = props.children, resetOnSubmit = props.resetOnSubmit, onSubmitError = props.onSubmitError, onChange = props.onChange, onSubmit = props.onSubmit, afterSubmit = props.afterSubmit, others = (0, _objectWithoutProperties2["default"])(props, _excluded); var initData = (0, _react.useMemo)(function () { return newFormState(fields, function (_ref) { var initialValue = _ref.initialValue; initialValue = newInitialValue(initialValue); return { initialValue: initialValue, currentValue: initialValue }; }); }, []); var _useState = (0, _react.useState)(initData), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), data = _useState2[0], setData = _useState2[1]; (0, _react.useImperativeHandle)(ref, function () { return { onSubmit: handleSubmit, resetForm: handleReset, getFieldValues: function getFieldValues() { return data.current; }, getError: function getError() { return data.errors; }, setFields: setFields, setFieldValue: setFieldValue }; }, [data]); var formUnits = {}; for (var name in fields) { var itemProps = fields[name]; if (!itemProps) continue; var error = data.errors[name]; if (typeof itemProps.initialValue === 'boolean') { itemProps.checked = itemProps.initialValue; } var childField = controlField((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, itemProps), {}, { name: name })); var help = error || itemProps.help; var labelFor = itemProps.labelFor; formUnits[name] = /*#__PURE__*/(0, _react.createElement)(_FormItem["default"], (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, itemProps), {}, { key: name, children: childField, help: help, labelFor: labelFor, name: name, hasError: !!error })); } function setFields(fields) { var tempData = (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), {}, { current: fields }); setData(tempData); } function setFieldValue(fieldName, value) { var tempData = (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), {}, { current: (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data.current), {}, (0, _defineProperty2["default"])({}, fieldName, value)) }); setData(tempData); } function handleChange(name, validator, element, cb) { return function (env, list) { var value = env && env.target && 'value' in env.target ? env.target.value : env; // 控件 Checkbox.Group 多选值的处理 value = list || value; // 控件 Checkbox 值的处理 if (!list && element && env && env.target && /(radio)/.test(env.target.type)) { // 控件 Switch/Radio/Checkbox 值的处理 value = env.target.value ? env.target.value : env.target.checked; } if (!list && element && env && env.target && /(checkbox)/.test(env.target.type)) { // 控件 Switch/Radio/Checkbox 值的处理 value = env.target.checked; } var nextState = { current: (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data.current), {}, (0, _defineProperty2["default"])({}, name, value)) }; var error = validator && validator(value); if (!error) { nextState.errors = (0, _objectSpread4["default"])({}, data.errors); delete nextState.errors[name]; } if (env && env.persist && typeof env.persist === 'function') env.persist(); setData((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), nextState)); if (cb) { cb(env); } onChange && onChange((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), nextState)); }; } function handleSubmit(e) { e && e.preventDefault(); var initial = data.initial, current = data.current; setData((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), {}, { submitting: true })); var nextState = { submitting: false }; var onError = function onError(evn) { return setData((0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), nextState), {}, { errors: onSubmitError && onSubmitError(evn) || {} })); }; var onSuccess = function onSuccess(response) { if (resetOnSubmit) { nextState.current = initial; } setData((0, _objectSpread4["default"])((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), nextState), {}, { errors: {} })); afterSubmit && afterSubmit({ state: data, response: response, reset: handleReset }); }; try { var afterSubmitPromise = onSubmit ? onSubmit({ initial: initial, current: current }, e) : undefined; if (afterSubmitPromise && isPromise(afterSubmitPromise)) { return afterSubmitPromise.then(onSuccess)["catch"](onError); } else { return onSuccess(afterSubmitPromise); } } catch (evn) { onError(evn); } } function canSubmit() { var submitting = data.submitting, _data$current = data.current, current = _data$current === void 0 ? {} : _data$current; var passesValidators = true; for (var _name in fields) { if (Object.prototype.hasOwnProperty.call(fields, _name)) { var fieldsProps = fields[_name]; if (!fieldsProps) continue; if (fieldsProps.validator && fieldsProps.validator(current[_name])) { passesValidators = false; break; } } } return !submitting && passesValidators; } function handleReset() { var initial = data.initial; var initials = (0, _objectSpread4["default"])({}, initial); Object.entries(initials).map(function (_ref2) { var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2), key = _ref3[0], value = _ref3[1]; if (Array.isArray(value)) { initials[key] = (0, _toConsumableArray2["default"])(value); } }); setData((0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, data), {}, { initial: initial, current: initials, errors: {} })); } function controlField(_ref4) { var children = _ref4.children, validator = _ref4.validator, name = _ref4.name, help = _ref4.help, label = _ref4.label, labelFor = _ref4.labelFor, labelClassName = _ref4.labelClassName, labelStyle = _ref4.labelStyle, inline = _ref4.inline, initialValue = _ref4.initialValue, other = (0, _objectWithoutProperties2["default"])(_ref4, _excluded2); var element = typeof children !== 'function' ? children : children({ onChange: handleChange(name, validator), onSubmit: handleSubmit, canSubmit: canSubmit }); if (!element || _react["default"].Children.count(element) !== 1 || !name) return element; var props = (0, _objectSpread4["default"])({ name: element.props.name || name }, other); var hasCurrentValue = Object.prototype.hasOwnProperty.call(data.current, name); props.id = element.props.id; props.value = hasCurrentValue ? data.current && data.current[name] : props.value; // : element.props.value; var type = element.props.type; if (type === 'checkbox' || type === 'switch' || typeof props.value === 'boolean') { props.checked = !!props.value; delete props.value; } props.onChange = handleChange(name, validator, element, element.props.onChange); return /*#__PURE__*/_react["default"].cloneElement(element, props); } return /*#__PURE__*/(0, _jsxRuntime.jsx)("form", (0, _objectSpread4["default"])((0, _objectSpread4["default"])({}, others), {}, { className: [prefixCls, className].filter(Boolean).join(' ').trim(), onSubmit: handleSubmit, children: /*#__PURE__*/(0, _jsxRuntime.jsx)("fieldset", { disabled: data.submitting, children: typeof children === 'function' ? children({ fields: formUnits, state: data, resetForm: handleReset, canSubmit: canSubmit }) : children }) })); } var _default = exports["default"] = /*#__PURE__*/_react["default"].forwardRef(Form); module.exports = exports.default;