UNPKG

@ant-design/pro-form

Version:
181 lines (177 loc) 7.29 kB
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties"; var _excluded = ["columns", "layoutType", "type", "action", "shouldUpdate", "formRef"]; import { LabelIconTip, omitUndefined, runFunction, stringify, useDeepCompareMemo, useLatest, useReactiveRef, useRefFunction } from '@ant-design/pro-utils'; import { Form } from 'antd'; import React, { useCallback, useImperativeHandle, useRef, useState } from 'react'; import { DrawerForm } from "../../layouts/DrawerForm"; import { LightFilter } from "../../layouts/LightFilter"; import { ModalForm } from "../../layouts/ModalForm"; import { ProForm } from "../../layouts/ProForm"; import { QueryFilter } from "../../layouts/QueryFilter"; import { StepsForm as ProStepsForm } from "../../layouts/StepsForm"; import { Embed, StepsForm } from "./layoutType"; import { renderValueType } from "./valueType"; import { jsx as _jsx } from "react/jsx-runtime"; export * from "./typing"; var FormLayoutType = { DrawerForm: DrawerForm, QueryFilter: QueryFilter, LightFilter: LightFilter, StepForm: ProStepsForm.StepForm, StepsForm: StepsForm, ModalForm: ModalForm, Embed: Embed, Form: ProForm }; /** * 此组件可以根据 Json Schema 来生成相应的表单,大部分配置与 antd 的 table 列配置相同 * * @see 此组件仍为 beta 版本,api 可能发生变化 */ function BetaSchemaForm(props) { var columns = props.columns, _props$layoutType = props.layoutType, layoutType = _props$layoutType === void 0 ? 'Form' : _props$layoutType, _props$type = props.type, type = _props$type === void 0 ? 'form' : _props$type, action = props.action, _props$shouldUpdate = props.shouldUpdate, shouldUpdate = _props$shouldUpdate === void 0 ? function (pre, next) { return stringify(pre) !== stringify(next); } : _props$shouldUpdate, propsFormRef = props.formRef, restProps = _objectWithoutProperties(props, _excluded); var FormRenderComponents = FormLayoutType[layoutType] || ProForm; var _Form$useForm = Form.useForm(), _Form$useForm2 = _slicedToArray(_Form$useForm, 1), form = _Form$useForm2[0]; var formInstance = Form.useFormInstance(); var _useState = useState([]), _useState2 = _slicedToArray(_useState, 2), forceUpdate = _useState2[1]; var _useState3 = useState(function () { return []; }), _useState4 = _slicedToArray(_useState3, 2), formDomsDeps = _useState4[0], updatedFormDoms = _useState4[1]; var formRef = useReactiveRef(props.form || formInstance || form); var oldValuesRef = useRef(); var propsRef = useLatest(props); /** * 生成子项,方便被 table 接入 * * @param items */ var genItems = useRefFunction(function (items) { return items.filter(function (originItem) { return !(originItem.hideInForm && type === 'form'); }).sort(function (a, b) { if (b.order || a.order) { return (b.order || 0) - (a.order || 0); } return (b.index || 0) - (a.index || 0); }).map(function (originItem, index) { var title = runFunction(originItem.title, originItem, 'form', /*#__PURE__*/_jsx(LabelIconTip, { label: originItem.title //@ts-expect-error , tooltip: originItem.tooltip || originItem.tip })); var item = omitUndefined({ title: title, label: title, name: originItem.name, valueType: runFunction(originItem.valueType, {}), key: originItem.key || originItem.dataIndex || index, columns: originItem.columns, valueEnum: originItem.valueEnum, dataIndex: originItem.dataIndex || originItem.key, initialValue: originItem.initialValue, width: originItem.width, index: originItem.index, readonly: originItem.readonly, colSize: originItem.colSize, colProps: originItem.colProps, rowProps: originItem.rowProps, className: originItem.className, //@ts-expect-error tooltip: originItem.tooltip || originItem.tip, dependencies: originItem.dependencies, proFieldProps: originItem.proFieldProps, ignoreFormItem: originItem.ignoreFormItem, getFieldProps: originItem.fieldProps ? function () { return runFunction(originItem.fieldProps, formRef.current, originItem); } : undefined, getFormItemProps: originItem.formItemProps ? function () { return runFunction(originItem.formItemProps, formRef.current, originItem); } : undefined, render: originItem.render, renderFormItem: originItem.renderFormItem, renderText: originItem.renderText, request: originItem.request, params: originItem.params, transform: originItem.transform, convertValue: originItem.convertValue, debounceTime: originItem.debounceTime, defaultKeyWords: originItem.defaultKeyWords }); return renderValueType(item, { action: action, type: type, originItem: originItem, formRef: formRef, genItems: genItems }); }).filter(function (field) { return Boolean(field); }); }); var onValuesChange = useCallback(function (changedValues, values) { var propsOnValuesChange = propsRef.current.onValuesChange; if (shouldUpdate === true || typeof shouldUpdate === 'function' && shouldUpdate(values, oldValuesRef.current)) { updatedFormDoms([]); } oldValuesRef.current = values; propsOnValuesChange === null || propsOnValuesChange === void 0 || propsOnValuesChange(changedValues, values); }, [propsRef, shouldUpdate]); var formChildrenDoms = useDeepCompareMemo(function () { if (!formRef.current) return; // like StepsForm's columns but not only for StepsForm if (columns.length && Array.isArray(columns[0])) return; return genItems(columns); // eslint-disable-next-line react-hooks/exhaustive-deps }, [columns, restProps === null || restProps === void 0 ? void 0 : restProps.open, action, type, formDomsDeps, !!formRef.current]); /** * Append layoutType component specific props */ var specificProps = useDeepCompareMemo(function () { if (layoutType === 'StepsForm') { return { forceUpdate: forceUpdate, columns: columns }; } return {}; }, [columns, layoutType]); useImperativeHandle(propsFormRef, function () { return formRef.current; }, [formRef.current]); return /*#__PURE__*/_jsx(FormRenderComponents, _objectSpread(_objectSpread(_objectSpread({}, specificProps), restProps), {}, { onInit: function onInit(_, initForm) { var _restProps$onInit; if (propsFormRef) { propsFormRef.current = initForm; } restProps === null || restProps === void 0 || (_restProps$onInit = restProps.onInit) === null || _restProps$onInit === void 0 || _restProps$onInit.call(restProps, _, initForm); formRef.current = initForm; }, form: props.form || form, formRef: formRef, onValuesChange: onValuesChange, children: formChildrenDoms })); } export default BetaSchemaForm;