import { ReactVisualEditorBlock, ReactVisualEditorConfig, ReactVisualEditorValue, } from './ReactVisualEditor.utils'; import React, { useEffect, useState } from 'react'; import deepcopy from 'deepcopy'; import styles from './ReactVisualEditor.less'; import { Button, Form, Input, InputNumber, Select } from 'antd'; import { ReactVisualEditorProps, ReactVisualEditorPropsType, createColorProp, } from './ReactVisualEditor.props'; import { SketchPicker } from 'react-color'; import { TablePropEditor } from './TablePropEditor/TablePropEditor'; import { getHookState } from './../hook/getHookState'; const { TextArea } = Input; export const ReactVisualOperator: React.FC<{ selectBlock?: ReactVisualEditorBlock; value: ReactVisualEditorValue; config: ReactVisualEditorConfig; updateValue: (val: ReactVisualEditorValue) => void; updateBlock: (newBlock: ReactVisualEditorBlock, oldBlock: ReactVisualEditorBlock) => void; }> = (props) => { const [editData, setEditData] = useState({} as any); const [form] = Form.useForm(); useEffect(() => methods.reset(), [props.selectBlock]); const methods = { apply: async () => { const editData: any = await getHookState(setEditData); if (!props.selectBlock) { /*更新value*/ props.updateValue({ ...props.value, container: { ...editData, themeColor: editData.props?.containerThemeColor?.hex }, }); } else { /*更新block*/ props.updateBlock(deepcopy(editData), props.selectBlock); } }, reset: () => { let data: any; if (!props.selectBlock) { data = deepcopy(props.value.container); } else { data = deepcopy(props.selectBlock); } setEditData(data); form.resetFields(); form.setFieldsValue(data); }, onFormValuesChange: (changeValues: any, values: any) => { setEditData({ ...editData, ...values, }); }, }; let render: JSX.Element[] = []; if (!props.selectBlock) { /*编辑容器属性*/ // render.push( // // // , // ); // render.push( // // // , // ); // /**主题色 */ // render.push(renderEditor('containerThemeColor', createColorProp('主题色'), methods.apply)); render.push( 主题背景图} name="backgroundImage" key="container-themeImage"> , ); } else { /*编辑block属性*/ const component = props.config.componentMap[props.selectBlock.componentKey]; if (component) { // render.push( // // // , // ); render.push( ...Object.entries(component.props || {}).map(([propName, propConfig]) => renderEditor(propName, propConfig, methods.apply), ), ); render.push( ...Object.entries(component.model || {}).map(([modelProp, modelName]) => ( )), ); } } return (
{!!props.selectBlock ? '编辑元素' : '编辑容器'}
{render}
); }; function renderEditor(propsName: string, propsConfig: ReactVisualEditorProps, apply: () => void) { switch (propsConfig.type) { case ReactVisualEditorPropsType.text: return ( {propsConfig.name}} name={['props', propsName]} key={`props_${propsName}`}> ); case ReactVisualEditorPropsType.textarea: return ( {propsConfig.name}} name={['props', propsName]} key={`props_${propsName}`}>