mirror of
https://github.com/MrXujiang/h5-Dooring.git
synced 2025-12-11 17:32:50 +00:00
177 lines
5.3 KiB
TypeScript
177 lines
5.3 KiB
TypeScript
import React, { memo, RefObject, useEffect } from 'react';
|
|
import { Form, Select, InputNumber, Input, Switch, Radio, Button } from 'antd';
|
|
import Upload from '../Upload';
|
|
import DataList from '../DataList';
|
|
import MutiText from '../MutiText';
|
|
import Color from '../Color';
|
|
import CardPicker from '../CardPicker';
|
|
import Table from '../Table';
|
|
import Pos from '../Pos';
|
|
import { Store } from 'antd/lib/form/interface';
|
|
import FormItems from '../FormItems';
|
|
// import styles from './index.less';
|
|
const normFile = (e: any) => {
|
|
console.log('Upload event:', e);
|
|
if (Array.isArray(e)) {
|
|
//待修改
|
|
return e;
|
|
}
|
|
return e && e.fileList;
|
|
};
|
|
|
|
const { Option } = Select;
|
|
const { TextArea } = Input;
|
|
|
|
const formItemLayout = {
|
|
labelCol: { span: 6 },
|
|
wrapperCol: { span: 16 },
|
|
};
|
|
|
|
interface FormEditorProps {
|
|
uid: string;
|
|
onSave: Function;
|
|
onDel: Function;
|
|
defaultValue: { [key: string]: any };
|
|
config: Array<any>;
|
|
rightPannelRef: RefObject<HTMLDivElement>;
|
|
}
|
|
|
|
const FormEditor = (props: FormEditorProps) => {
|
|
const { config, defaultValue, onSave, onDel, uid, rightPannelRef } = props;
|
|
const onFinish = (values: Store) => {
|
|
onSave && onSave(values);
|
|
};
|
|
const handleDel = () => {
|
|
onDel && onDel(uid);
|
|
};
|
|
|
|
const [form] = Form.useForm();
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
form.resetFields();
|
|
};
|
|
}, [uid, form]);
|
|
|
|
const handlechange = () => {
|
|
onFinish(form.getFieldsValue());
|
|
};
|
|
|
|
return (
|
|
<Form
|
|
form={form}
|
|
name={`form_editor`}
|
|
{...formItemLayout}
|
|
onFinish={onFinish}
|
|
initialValues={defaultValue}
|
|
onValuesChange={handlechange}
|
|
>
|
|
{config.map((item, i) => {
|
|
return (
|
|
<React.Fragment key={i}>
|
|
{item.type === 'Number' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<InputNumber max={item.range && item.range[1]} />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Text' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<Input />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'TextArea' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<TextArea rows={4} />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'MutiText' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<MutiText />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'DataList' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<DataList />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Color' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<Color />
|
|
</Form.Item>
|
|
)}
|
|
|
|
{item.type === 'Select' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<Select placeholder="请选择">
|
|
{item.range.map((v: any, i: number) => {
|
|
return (
|
|
<Option value={v.key} key={i}>
|
|
{v.text}
|
|
</Option>
|
|
);
|
|
})}
|
|
</Select>
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Radio' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<Radio.Group>
|
|
{item.range.map((v: any, i: number) => {
|
|
return (
|
|
<Radio value={v.key} key={i}>
|
|
{v.text}
|
|
</Radio>
|
|
);
|
|
})}
|
|
</Radio.Group>
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Switch' && (
|
|
<Form.Item label={item.name} name={item.key} valuePropName="checked">
|
|
<Switch />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Upload' && (
|
|
<Form.Item
|
|
label={item.name}
|
|
name={item.key}
|
|
valuePropName="fileList"
|
|
getValueFromEvent={normFile}
|
|
>
|
|
<Upload cropRate={item.cropRate} isCrop={item.isCrop} />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'CardPicker' && (
|
|
<Form.Item label={item.name} name={item.key} valuePropName="type">
|
|
<CardPicker icons={item.icons} type={defaultValue['type']} />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Table' && (
|
|
<Form.Item label={item.name} name={item.key} valuePropName="data">
|
|
<Table data={item.data} />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'Pos' && (
|
|
<Form.Item label={item.name} name={item.key}>
|
|
<Pos />
|
|
</Form.Item>
|
|
)}
|
|
{item.type === 'FormItems' && (
|
|
<Form.Item name={item.key} valuePropName="formList">
|
|
<FormItems data={item.data} rightPannelRef={rightPannelRef} />
|
|
</Form.Item>
|
|
)}
|
|
</React.Fragment>
|
|
);
|
|
})}
|
|
{/* <div style={{position: 'fixed', bottom: '0px'}}>
|
|
<Button danger style={{ width: '251px' }} block onClick={handleDel}>
|
|
删除
|
|
</Button>
|
|
</div> */}
|
|
</Form>
|
|
);
|
|
};
|
|
|
|
export default memo(FormEditor);
|