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]
}