import React from "react" import { StateManage, Collapse, PropertyService, observer, Form, Input, Utils, Switch, Button } from "../../" import { dataSource } from "./dataSource" import { FormItem } from "./FormItem" import { CloseCircleFilled, EditFilled, CopyFilled } from "@ant-design/icons" import { set, cloneDeep } from "lodash" import { formConfig } from "./formConfig" export const Content = ({ config }) => { const state = PropertyService.getObservableObj({ type: "[[Form]]", props: config || { "controlKey": "Form$$" + Utils.uuid(), "formConfig": { "columns": 1, "layout": "vertical", "labelCol": { "span": 24 }, "wrapperCol": { "span": 24 } }, "formItemConfig": [] } }) const { controlKey, formConfig: formProps, style, className } = StateManage.get(state, "props") // 添加表单元素 const addItem = (data) => { const { key, props = {}, label } = data const { formItemConfig } = StateManage.get(state, "props") const controlKey = key + "$$" + Utils.uuid().replace(/\-/g, "") formItemConfig.push({ field: "field$" + (Math.random() * 10000).toFixed(0), labelProps: { label }, controlProps: { type: "[[" + key + "]]", props: { controlKey, ...props } } }) StateManage.set(state, { "props.formItemConfig": formItemConfig }) } // 预览区 const PreviewForm = observer(() => { const config = StateManage.get(state) return
{PropertyService.getReactElementFromJSON(cloneDeep(config))}
}) // 字段展示 const FieldList = observer(() => { const config = StateManage.get(state) let formItemConfig = config["props"]["formItemConfig"] const onChangeAttr = ({ key, value, item }) => { formItemConfig.forEach(data => { if (data["controlProps"]["props"]["controlKey"] === item["controlProps"]["props"]["controlKey"]) { set(data, key, value) } }) StateManage.set(state, { "props.formItemConfig": formItemConfig }) } return
{formItemConfig.map((item, index) => { return
{ onChangeAttr({ key: "labelProps.label", value, item }) }} /> { onChangeAttr({ key: "field", value, item }) }} /> { onChangeAttr({ key: "labelProps.required", value, item }) }} /> { ev.stopPropagation() const newItem = cloneDeep(item) newItem["field"] = "field$" + (Math.random() * 10000).toFixed(0) const key = newItem["controlProps"]["type"].replace("[[", "").replace("]]", "") const controlKey = key + "$$" + Utils.uuid() newItem["controlProps"]["props"]["controlKey"] = controlKey const { formItemConfig } = StateManage.get(state, "props") formItemConfig.push(newItem) StateManage.set(state, { "props.formItemConfig": formItemConfig }) }} /> { ev.stopPropagation() FormItem({ config: item, onOk: ({ value }) => { formItemConfig[index] = value StateManage.set(state, { "props.formItemConfig": formItemConfig }) } }) }} /> { ev.stopPropagation() formItemConfig = formItemConfig.filter(data => data["field"] !== item["field"]) StateManage.set(state, { "props.formItemConfig": formItemConfig }) }} />
})}
}) // 表单属性 const [formState, FormTpl] = Form(formConfig({ controlKey, formConfig: formProps, style, className, onChangeAttr: ({ key, value }) => { const config = StateManage.get(state, "props") set(config, key, value) StateManage.set(state, { "props": config }) } }) as any, false) const Template = () => { return
表单控件【{dataSource.length}】
{dataSource.map((item, index) => { return addItem(item)} style={{ color: "#1890ff", position: "relative", display: "inline-block", padding: "3px 0px 3px 8px", width: "120px", boxSizing: "border-box", margin: "5px", background: "rgba(44,144,255,.1)", cursor: "pointer" }} key={item.key}> {item.label} })}
} // StateManage.get(state) 可获取表单设计器的返回值 return [state, Template] }