import { StateManage } from "../../../service/state"
import React from "react"
import { Form, Row, Col } from "antd"
import { defaultClassName, IFormItem } from "../../../@types/Form"
import { PropertyService } from "../../../service/property"
import { observer } from 'mobx-react'
import { BaseService } from "../../base"
import cloneDeep from "lodash/cloneDeep"
import { PopMessage } from "../../common/pop-message"
import { PopTip } from "../../common/pop-tip"
import { sortBy } from "lodash"
import { EventHandlerParams } from "../../../@types/Base"
import * as ZionUI from "../../../index"
import { InfoCircleOutlined } from "@ant-design/icons"
export class Service extends BaseService {
formData: any = {}
formControlMobxProps: any = {}
formControlInitProps: any = {}
formLabelMobxProps: any = {}
formLabelInitMobxProps: any = {}
formControlTemplate: any = {}
defaultLabelProps: any = {}
constructor(props: Object, isPureComponent?: boolean) {
super(props, isPureComponent)
this.formData = {}
this.defaultLabelProps = {
validateStatus: "",
help: null,
extra: null,
required: false,
label: ""
}
this.init()
}
/**
* @description 获取类名
*/
getClassName() {
const { className } = this.getProps()
let nextClassName = super.getClassName(defaultClassName)
if (className) {
nextClassName.push(className)
}
return nextClassName
}
/**
* @description 事件处理
*/
eventHandler(params: EventHandlerParams) {
const { ev, eventName } = params
const { disabled, loading } = this.getProps()
ev && ev.stopPropagation && ev.stopPropagation()
if (disabled || loading) return;
(this as any)[eventName]({ ev, eventName })
}
init() {
let { formItemConfig, formConfig, status } = this.getProps()
// formItemConfig = formItemConfig.filter(item => item["show"] !== false)
formItemConfig.map((item: IFormItem) => {
let { field, labelProps = {}, controlProps: { type, props = {} } } = item as any;
if (formConfig.layout === "inline") {
props.style = { ...(props.style || {}), margin: "5px 5px" }
}
if (status === "detail") {
props.disabled = true
}
const initLabelProps = { ...this.defaultLabelProps, ...labelProps }
this.formLabelInitMobxProps[field] = PropertyService.getObservableObj(initLabelProps)
this.formLabelMobxProps[field] = PropertyService.getObservableObj(initLabelProps)
let TargetControl, targetProps;
if (typeof type === "string") {
type = ZionUI[type.replace("[[", "").replace("]]", "")]
}
[targetProps, TargetControl] = type(props, false);
this.formControlInitProps[field] = {
controlProps: cloneDeep(props),
labelProps: cloneDeep(labelProps)
}
this.formControlMobxProps[field] = targetProps
this.formControlTemplate[field] = TargetControl
this.setProps({
setFormControlProps: this.setFormControlProps.bind(this),
setFormLabelProps: this.setFormLabelProps.bind(this),
resetForm: this.resetForm.bind(this),
getFormData: this.getFormData.bind(this),
setFormData: this.setFormData.bind(this)
})
})
}
/**
* @description 设置单个控件的props
* @param field
* @param nextProps
*/
setFormControlProps(field: string, nextProps: object) {
StateManage.set(this.formControlMobxProps[field], { ...nextProps })
}
/**
* @description 设置表单控件的label相关的props
* @param field
* @param nextProps
*/
setFormLabelProps(field: string, nextProps: object) {
StateManage.set(this.formLabelMobxProps[field], { ...nextProps })
}
/**
* @description 重置表单,恢复表单至最初的状态
*/
resetForm() {
Object.keys(this.formControlInitProps).forEach(field => {
const initProps = this.formControlInitProps[field]["controlProps"]
StateManage.set(this.formControlMobxProps[field], initProps)
})
Object.keys(this.formControlInitProps).forEach(field => {
const initProps = this.formControlInitProps[field]["labelProps"]
StateManage.set(this.formLabelMobxProps[field], initProps)
})
return this.getFormData(false)
}
/**
* @description 获取单个表单控件的模板
* @param field
*/
getFormItemTemplate(field: string) {
const self = this
let { formConfig: { columns = 0 }, formItemConfig } = this.getProps()
formItemConfig = formItemConfig.filter(item => item["show"] !== false)
return observer(function () {
const { validateStatus, help, extra, label, required, labelCol, show, tail, tip } = StateManage.get(self.formLabelMobxProps[field])
if (show === false) return null
const TargetControl = self.formControlTemplate[field]
const props: any = {
validateStatus,
hasFeedback: true,
extra,
help,
required,
key: field || "&&KEY",
label: tip ? {label}