import { InfoCircleOutlined } from "@ant-design/icons"; import { Checkbox, Col, DatePicker, Divider, Form, Input, InputNumber, Radio, Select, Tooltip, } from "antd"; import dayjs from "dayjs"; import { FORM_ITEM_RENDER_ENUM } from "../../enum/formItemRender"; const { TextArea } = Input; const { RangePicker } = DatePicker; /** * 表单项渲染器组件 */ const FormItemsRenderer = ({ options, span = 12, collapse = false, useAutoGenerateRequired = true, }) => { const form = Form.useFormInstance(); // 获取传给组件的属性 const getComponentProps = (option) => { return typeof option.componentProps === "function" ? option.componentProps(form.getFieldsValue()) : (option.componentProps || {}); }; // 获取传给formItem的属性 const getFormItemProps = (option) => { const formItemProps = typeof option.formItemProps === "function" ? option.formItemProps(form.getFieldsValue()) : (option.formItemProps || {}); // 为日期组件添加特殊处理 if ([ FORM_ITEM_RENDER_ENUM.DATE, FORM_ITEM_RENDER_ENUM.DATE_MONTH, FORM_ITEM_RENDER_ENUM.DATE_YEAR, FORM_ITEM_RENDER_ENUM.DATETIME, ].includes(option.render)) { formItemProps.getValueFromEvent = (_, dateString) => dateString; formItemProps.getValueProps = value => ({ value: value ? dayjs(value) : undefined }); } // 为日期周组件添加特殊处理 if ([ FORM_ITEM_RENDER_ENUM.DATE_WEEK, ].includes(option.render)) { formItemProps.getValueFromEvent = (_, dateString) => dateString; formItemProps.getValueProps = value => ({ value: value ? dayjs(value, "YYYY-wo") : undefined }); } // 为日期范围组件添加特殊处理 if ([ FORM_ITEM_RENDER_ENUM.DATE_RANGE, FORM_ITEM_RENDER_ENUM.DATETIME_RANGE, ].includes(option.render)) { formItemProps.getValueFromEvent = (_, dateString) => dateString; formItemProps.getValueProps = value => ({ value: Array.isArray(value) ? value.map(v => v ? dayjs(v) : undefined) : undefined }); } return formItemProps; }; // 获取items里的value和label字段key const getItemsFieldKey = (option) => { return { valueKey: option?.itemsField?.valueKey || "value", labelKey: option?.itemsField?.labelKey || "label", }; }; // 获取验证规则 const getRules = (option) => { if (!useAutoGenerateRequired) return option.rules ? (Array.isArray(option.rules) ? option.rules : [option.rules]) : []; if (option.render === FORM_ITEM_RENDER_ENUM.DIVIDER) return []; // 支持动态计算 required const required = typeof option.required === "function" ? option.required(form.getFieldsValue()) : (option.required || true); if (required) { const isBlurTrigger = !option.render || [ FORM_ITEM_RENDER_ENUM.INPUT, FORM_ITEM_RENDER_ENUM.TEXTAREA, FORM_ITEM_RENDER_ENUM.INPUT_NUMBER, FORM_ITEM_RENDER_ENUM.NUMBER, ].includes(option.render); const rules = [ { required: true, message: `${isBlurTrigger ? "请输入" : "请选择"}${option.label}`, }, ]; if (option.rules) { if (Array.isArray(option.rules)) { rules.push(...option.rules); } else { rules.push(option.rules); } } return rules; } return option.rules ? (Array.isArray(option.rules) ? option.rules : [option.rules]) : []; }; // 渲染表单控件 const renderFormControl = (option) => { const componentProps = getComponentProps(option); const itemsFieldKey = getItemsFieldKey(option); /** @type {string | Function} */ const render = option.render || FORM_ITEM_RENDER_ENUM.INPUT; const placeholder = option.placeholder || `请${render === FORM_ITEM_RENDER_ENUM.SELECT || render === FORM_ITEM_RENDER_ENUM.RADIO || render === FORM_ITEM_RENDER_ENUM.CHECKBOX ? "选择" : "输入"}${option.label}`; switch (render) { case FORM_ITEM_RENDER_ENUM.INPUT: return ; case FORM_ITEM_RENDER_ENUM.TEXTAREA: return