import React, { memo, RefObject, useCallback, useEffect, useState } from 'react'; import BaseForm from 'editorComponents/BasicShop/BasicComponents/Form/BaseForm'; import BasePopoverForm from 'editorComponents/BasicShop/BasicComponents/Form/BasePopoverForm'; import EditorModal from './EditorModal'; import { MinusCircleFilled, EditFilled, PlusOutlined } from '@ant-design/icons'; import styles from './formItems.less'; import { baseFormUnion, TFormItemsDefaultType } from '../types'; import { uuid } from 'editorUtils/tool'; import { Button } from 'antd'; import MyPopover from 'yh-react-popover'; // import { Popconfirm } from 'antd'; const formTpl: TFormItemsDefaultType = [ { id: '1', type: 'Text', label: '文本框', placeholder: '请输入文本', }, { id: '2', type: 'Textarea', label: '长文本框', placeholder: '请输入长文本请输入长文本', }, { id: '3', type: 'Number', label: '数值', placeholder: ' 请输入数值', }, { id: '4', type: 'MyRadio', label: '单选框', options: [ { label: '选项一', value: '1' }, { label: '选项二', value: '2' }, ], }, { id: '5', type: 'MySelect', label: '下拉选择框', options: [ { label: '选项一', value: '1' }, { label: '选项二', value: '2' }, { label: '选项三', value: '3' }, ], }, { id: '6', type: 'Date', label: '日期框', placeholder: '', }, { id: '7', type: 'MyTextTip', label: '纯文本', fontSize: 12, color: 'rgba(0,0,0,1)', }, ]; interface FormItemsProps { formList?: TFormItemsDefaultType; onChange?: (v: TFormItemsDefaultType) => void; data: any; rightPannelRef: RefObject; canAddItem: boolean; } const FormItems = (props: FormItemsProps) => { const { formList, onChange, rightPannelRef, canAddItem } = props; const [formData, setFormData] = useState(formList || []); const [visible, setVisible] = useState(false); const [curItem, setCurItem] = useState(); const [force, setforce] = useState<{ force: Function }>({ force: () => { }, }); const handleAddItem = (item: baseFormUnion) => { let tpl = formTpl.find(v => v.type === item.type); let newData = [...formData, { ...tpl!, id: uuid(6, 10) }]; setFormData(newData); onChange && onChange(newData); force.force(); }; const handleEditItem = (item: baseFormUnion) => { setVisible(true); setCurItem(item); }; const handleDelItem = (item: baseFormUnion) => { let newData = formData.filter(v => v.id !== item.id); setFormData(newData); onChange && onChange(newData); }; const handleDisItem = (data: baseFormUnion) => { data.disabled = !data.disabled; let newData = formData.map(v => (v.id === data.id ? data : v)); setFormData(newData); onChange && onChange(newData); }; const handleSaveItem = (data: baseFormUnion, flag?: boolean) => { let newData = formData.map(v => (v.id === data.id ? data : v)); setFormData(newData); onChange && onChange(newData); if (flag) { setVisible(false); setCurItem(null); } }; const callback = useCallback((v: Function) => { // console.log(v); setforce({ force: v }); }, []); useEffect(() => { let listenner: (e: Event) => void; if (rightPannelRef.current) { listenner = () => { force.force(); }; rightPannelRef.current.addEventListener('scroll', listenner); } return () => { if (rightPannelRef.current) { // eslint-disable-next-line react-hooks/exhaustive-deps rightPannelRef.current.removeEventListener('scroll', listenner); } }; }, [force, rightPannelRef]); const handleChange = useCallback( (item, v) => { formData[item.label] = v; }, [formData], ); return (
表单控件
{formData.map((item: baseFormUnion, i: number) => { let FormItem = BaseForm[item.type]; return (
handleChange(item, v)} {...item} key={item.id} />
handleDisItem(item)}>
handleEditItem(item)}>
); })} {canAddItem &&
{formTpl.map((item, i) => { let FormItem = BasePopoverForm[item.type]; return (
handleAddItem(item)}>
); })}
{/* setFormTplVisible(false)}>Close */} } directions={'LB'} innerConstDomStyle={{ display: 'block' }} constDomStyle={{ display: 'block' }} callback={callback} >
}
); }; export default memo(FormItems);