2025-04-22 10:22:33 +08:00
|
|
|
|
//获取表单Schema
|
|
|
|
|
|
import {useFormModel} from "@/components/BasicForm/hooks/useFormModel";
|
|
|
|
|
|
import {forEach, isObject, mapValues} from "lodash";
|
|
|
|
|
|
|
|
|
|
|
|
export function ifShow(item: FormsSchema, model: any) {
|
|
|
|
|
|
if (!item.field || item.colSlot) return false
|
|
|
|
|
|
if (typeof item.ifShow == 'undefined') return true
|
|
|
|
|
|
if (typeof item.ifShow == 'boolean') return !item.ifShow
|
|
|
|
|
|
if (typeof item.ifShow == 'function') return !item.ifShow(model)
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function ifTitleShow(item: FormsSchema, model: any) {
|
|
|
|
|
|
if (typeof item.ifShow == 'undefined') return true
|
|
|
|
|
|
if (typeof item.ifShow == 'boolean') return !item.ifShow
|
|
|
|
|
|
if (typeof item.ifShow == 'function') return !item.ifShow(model)
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
* 接收两个参数
|
|
|
|
|
|
* formsProps 参数文档 https://uniapp.dcloud.net.cn/component/uniui/uni-forms.html#forms-props
|
|
|
|
|
|
* schema 表单配置配置如下
|
|
|
|
|
|
* field 数据库字段名,
|
|
|
|
|
|
* label 展示名称
|
|
|
|
|
|
* component 对应组建名称
|
|
|
|
|
|
* required 是否必填
|
|
|
|
|
|
* componentProps 对应组建参数,看各组建文档
|
|
|
|
|
|
* ifShow 是否显示
|
|
|
|
|
|
* slot 输入区域插槽
|
|
|
|
|
|
* colSlot 整排插槽
|
|
|
|
|
|
*
|
|
|
|
|
|
* itemProps 表单item参数,参数如下
|
|
|
|
|
|
* leftIcon 左边图标
|
|
|
|
|
|
* labelWidth label宽度
|
|
|
|
|
|
* labelPosition label位置 top,left
|
|
|
|
|
|
*
|
|
|
|
|
|
* 导出方法
|
|
|
|
|
|
* register register 用于注册 useForm
|
|
|
|
|
|
* getSchema 获取表单配置
|
|
|
|
|
|
* setSchema 修改表单配置
|
|
|
|
|
|
* getValue 获取表单内容
|
|
|
|
|
|
* setValue 设置表单内容
|
|
|
|
|
|
* */
|
|
|
|
|
|
export function useForm(options: FormOptions): UseForm {
|
|
|
|
|
|
const {setFormModel, validate, getModel, closeValue} = useFormModel()
|
|
|
|
|
|
options = reactive(options)
|
|
|
|
|
|
|
|
|
|
|
|
let objs = {}
|
|
|
|
|
|
forEach(options.schema, (value) => {
|
|
|
|
|
|
if (ifShow(value, getModel()) && value.field) {
|
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
objs[value.field] = value['defaultValue'] ? value['defaultValue'] : undefined
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
setFormModel(objs)
|
|
|
|
|
|
|
|
|
|
|
|
options.formModel = getModel()
|
|
|
|
|
|
let formRefs: any
|
|
|
|
|
|
const register = (callback: (i: FormOptions) => void, formRef: any, model: any) => {
|
|
|
|
|
|
formRefs = formRef
|
|
|
|
|
|
callback(options)
|
|
|
|
|
|
setFormModel(model)
|
|
|
|
|
|
}
|
|
|
|
|
|
return [
|
|
|
|
|
|
register,
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
setDisabled: (e: boolean) => {
|
|
|
|
|
|
forEach(options.schema, (v) => {
|
|
|
|
|
|
if (v.componentProps && isObject(v.componentProps)) {
|
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
v.componentProps['disabled'] = e
|
|
|
|
|
|
} else {
|
|
|
|
|
|
v.componentProps = {}
|
|
|
|
|
|
v.componentProps['disabled'] = e
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
if (formRefs && formRefs.value) {
|
|
|
|
|
|
formRefs.value.refreshProps()
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
getSchema: () => {
|
|
|
|
|
|
return options.schema
|
|
|
|
|
|
},
|
|
|
|
|
|
setSchema: (schema: FormsSchema[] | FormsSchema) => {
|
|
|
|
|
|
function algorithm(schemaItem: FormsSchema) {
|
|
|
|
|
|
let upSchemaList: FormsSchema = options.schema.filter(item => item.field === schemaItem.field)[0]
|
|
|
|
|
|
for (const key in schemaItem) {
|
2025-06-22 18:36:25 +08:00
|
|
|
|
//console.log(11,key,schemaItem[key],typeof schemaItem[key])
|
2025-04-22 10:22:33 +08:00
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
if (typeof schemaItem[key] === 'object') {
|
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
for (const ckey in schemaItem[key]) {
|
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
upSchemaList[key][ckey] = schemaItem[key][ckey]
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
|
upSchemaList[key] = schemaItem[key]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (Array.isArray(schema)) {
|
|
|
|
|
|
schema.forEach((schemaItem: FormsSchema) => {
|
|
|
|
|
|
algorithm(schemaItem)
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
algorithm(schema)
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
getValue: async (isValidate: boolean = true) => {
|
|
|
|
|
|
if (formRefs.value) {
|
|
|
|
|
|
if (isValidate) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
return await validate(toRaw(formRefs.value.formRules))
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
throw e
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
let newObj: any = {}
|
|
|
|
|
|
let value = getModel()
|
|
|
|
|
|
for (const key in value) {
|
|
|
|
|
|
if (value[key] != undefined || value[key] != null) {
|
|
|
|
|
|
newObj[key] = value[key]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return newObj
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
closeModel: () => {
|
|
|
|
|
|
let newValue = mapValues(formRefs.value.model, () => undefined)
|
|
|
|
|
|
if (formRefs && formRefs.value) {
|
|
|
|
|
|
formRefs.value.refreshModel(newValue)
|
|
|
|
|
|
}
|
|
|
|
|
|
options.formModel = newValue
|
|
|
|
|
|
closeValue(newValue)
|
|
|
|
|
|
},
|
|
|
|
|
|
setValue: (value: any) => {
|
|
|
|
|
|
let newValue: any = mapValues(value, (v, k) => {
|
|
|
|
|
|
if (k in objs) {
|
|
|
|
|
|
return value[k]
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
if (value['id']) {
|
|
|
|
|
|
newValue['id'] = value['id']
|
|
|
|
|
|
}
|
|
|
|
|
|
if (formRefs && formRefs.value) {
|
|
|
|
|
|
formRefs.value.refreshModel(newValue)
|
|
|
|
|
|
}
|
|
|
|
|
|
options.formModel = Object.assign({}, options.formModel, newValue)
|
|
|
|
|
|
setFormModel(newValue)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
2025-06-22 18:36:25 +08:00
|
|
|
|
}
|