import React, {useCallback, useMemo} from 'react'; import { Form, Button, Space, Row, Col, } from 'antd'; import { useTranslation } from 'react-i18next'; import type { SearchFormProps, SubmitterButton } from './typings'; import type { FormItemProps } from 'antd'; import type { FormColumn } from "@/components/XinFormField/FieldRender"; import FieldRender from '@/components/XinFormField/FieldRender'; import { pick } from 'lodash'; /** * SearchForm - JSON 配置动态搜索表单组件 */ function SearchForm = any>(props: SearchFormProps) { const { columns, handleSearch, submitter, form: formRef, grid = true, rowProps = { gutter: [20, 20], wrap: true }, colProps = { xs: 24, sm: 12, md: 12, lg: 8, xl: 6, xxl: 4 }, ...formProps } = props; const { t } = useTranslation(); const [form] = Form.useForm(formRef); // 渲染表单项 const renderFormItem = useCallback((column: FormColumn, index: number): React.ReactNode => { const { dataIndex, valueType, title = '', fieldProps = {}, fieldRender } = column; // Form.Item 允许的属性列表 const formItemPropKeys = [ 'colon', 'extra', 'getValueFromEvent', 'help', 'htmlFor', 'initialValue', 'labelAlign', 'labelCol', 'name', 'normalize', 'noStyle', 'tooltip', 'wrapperCol', 'layout' ]; const formItemProps = pick(column, formItemPropKeys); const key = String(dataIndex) || `form-item-${index}`; const defaultFieldRender = ( ); const formItemContent = ( {fieldRender ? fieldRender(form) : defaultFieldRender} ); return grid ? {formItemContent} : formItemContent; }, [form, grid, colProps]); // 渲染提交按钮 const renderSubmitter = useMemo(() => { if (submitter?.render === false) return null; const submitButton = ( ); const resetButton = ( ); const buttons: SubmitterButton = { search: submitButton, reset: resetButton }; if (typeof submitter?.render === 'function') { return submitter.render(buttons); } return ( {buttons.reset} {buttons.search} ); }, [form, submitter, t]); // 表单内容 return (
{grid ? ( {columns.map((column, index) => renderFormItem(column, index))} {renderSubmitter} ) : ( <> {columns.map((column, index) => renderFormItem(column, index))} {renderSubmitter} )}
) } export default SearchForm; export type { SearchFormProps };