import * as React from 'react'; import { Select, Input, InputNumber, Form, Switch, Checkbox, DatePicker, Radio, Upload, Button, Icon, Tooltip } from 'component/antd'; import Monacoeditor from 'component/editor/monacoEditor'; import { searchProps } from 'constants/table'; import { version } from 'store/version'; import './index.less'; const TextArea = Input.TextArea; const { RangePicker } = DatePicker; export enum FormItemType { input = 'input', inputPassword = 'input_password', inputNumber = 'input_number', textArea = 'text_area', select = 'select', _switch = '_switch', custom = 'custom', checkBox = 'check_box', datePicker = 'date_picker', rangePicker = 'range_picker', radioGroup = 'radio_group', upload = 'upload', monacoEditor = 'monaco_editor', } export interface IFormItem { key: string; label: string; type: FormItemType; value?: string; // 内部组件属性注入 attrs?: any; // form属性注入 formAttrs?: any; defaultValue?: string | number | any[]; rules?: any[]; invisible?: boolean; renderExtraElement?: () => JSX.Element; } export interface IFormSelect extends IFormItem { options: Array<{ key?: string | number, value: string | number, label: string, text?: string }>; } interface IFormCustom extends IFormItem { customFormItem: React.Component; } interface IXFormProps { formMap: IFormItem[]; formData: any; form: any; formLayout?: any; layout?: 'inline' | 'horizontal' | 'vertical'; } class XForm extends React.Component { private defaultFormLayout = { labelCol: { span: 6 }, wrapperCol: { span: 16 }, }; public onUploadFileChange = (e: any) => { if (Array.isArray(e)) { return e; } return e && e.fileList; } public handleFormItem(formItem: any, formData: any) { let initialValue = formData[formItem.key] === 0 ? 0 : (formData[formItem.key] || formItem.defaultValue || ''); let valuePropName = 'value'; if (formItem.type === FormItemType.datePicker) { initialValue = initialValue || null; } // if (formItem.type === FormItemType.checkBox) { // initialValue = formItem.defaultValue ? [formItem.defaultValue] : []; // } if (formItem.type === FormItemType._switch) { initialValue = false; } // if (formItem.type === FormItemType.select && formItem.attrs // && ['tags'].includes(formItem.attrs.mode)) { // initialValue = formItem.defaultValue ? [formItem.defaultValue] : []; // } if (formItem.type === FormItemType._switch) { valuePropName = 'checked'; } if (formItem.type === FormItemType.upload) { valuePropName = 'fileList'; } return { initialValue, valuePropName }; } public render() { const { form, formData, formMap, formLayout, layout } = this.props; const { getFieldDecorator } = form; return (
({})}> {formMap.map(formItem => { const { initialValue, valuePropName } = this.handleFormItem(formItem, formData); const getFieldValue = { initialValue, rules: formItem.rules || [{ required: false, message: '' }], valuePropName, }; if (formItem.type === FormItemType.upload) { Object.assign(getFieldValue, { getValueFromEvent: this.onUploadFileChange, }); } return ( !formItem.invisible && {getFieldDecorator(formItem.key, getFieldValue)( this.renderFormItem(formItem), )} {formItem.renderExtraElement ? formItem.renderExtraElement() : null} {/* 添加保存时间提示文案 */} {formItem.attrs?.prompttype ? {formItem.attrs.prompttype} : null} ); })}
); } public renderFormItem(item: IFormItem) { switch (item.type) { default: case FormItemType.input: return ; case FormItemType.inputPassword: return ; case FormItemType.inputNumber: return ; case FormItemType.textArea: return