|
@ -2,7 +2,7 @@ |
|
|
<div> |
|
|
<div> |
|
|
<q-form ref="formRef" :autofocus="false" :greedy="true" v-bind="attrs"> |
|
|
<q-form ref="formRef" :autofocus="false" :greedy="true" v-bind="attrs"> |
|
|
<div class="grid" :class="formLayoutComputed"> |
|
|
<div class="grid" :class="formLayoutComputed"> |
|
|
<template v-for="(field, index) in fields as any" :key="String(index)"> |
|
|
<template v-for="(field, index) in fields_ as any" :key="String(index)"> |
|
|
<div |
|
|
<div |
|
|
:class=" |
|
|
:class=" |
|
|
(field.colsFirst ? 'col-start-1 ' : ' ') + |
|
|
(field.colsFirst ? 'col-start-1 ' : ' ') + |
|
@ -19,6 +19,7 @@ |
|
|
v-model="formData[field.name]" |
|
|
v-model="formData[field.name]" |
|
|
v-bind="field" |
|
|
v-bind="field" |
|
|
:form-data="formData" |
|
|
:form-data="formData" |
|
|
|
|
|
@update:model-value="updateModelValue(field.name, formData[field.name])" |
|
|
></component> |
|
|
></component> |
|
|
<component :is="fiedType[field.type] || field.type" v-else :form-ref="formRef" v-bind="field" :form-data="formData"></component> |
|
|
<component :is="fiedType[field.type] || field.type" v-else :form-ref="formRef" v-bind="field" :form-data="formData"></component> |
|
|
</div> |
|
|
</div> |
|
@ -51,7 +52,8 @@ const props = defineProps({ |
|
|
const formRef = ref(); |
|
|
const formRef = ref(); |
|
|
const formStatus = ref(PageStatusEnum.新增); |
|
|
const formStatus = ref(PageStatusEnum.新增); |
|
|
const formModel: any = {}; |
|
|
const formModel: any = {}; |
|
|
const formFieldsMap = new Map(); |
|
|
const formFields = {}; |
|
|
|
|
|
const fields_ = ref([...props.fields]); |
|
|
// 不同屏幕尺寸下 colsNum 为 0 时一行显示的字段个数 |
|
|
// 不同屏幕尺寸下 colsNum 为 0 时一行显示的字段个数 |
|
|
const screenCols = { xs: 1, sm: 2, md: 3, lg: 4, xl: 6 }; |
|
|
const screenCols = { xs: 1, sm: 2, md: 3, lg: 4, xl: 6 }; |
|
|
const fiedType = { |
|
|
const fiedType = { |
|
@ -75,23 +77,23 @@ const defaultValueHandler = (field) => { |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
watch( |
|
|
watch( |
|
|
() => props.fields, |
|
|
() => fields_.value, |
|
|
(newVal, oldVal) => { |
|
|
(newVal, oldVal) => { |
|
|
if (newVal) { |
|
|
if (newVal) { |
|
|
for (const field of props.fields as any) { |
|
|
for (const field of fields_.value as any) { |
|
|
if (field.name) { |
|
|
if (field.name) { |
|
|
formModel[field.name] = defaultValueHandler(field); |
|
|
formModel[field.name] = defaultValueHandler(field); |
|
|
formFieldsMap.set(field.name, field); |
|
|
formFields[field.name] = field; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
for (const field of props.fields as any) { |
|
|
for (const field of fields_.value as any) { |
|
|
if (field.name) { |
|
|
if (field.name) { |
|
|
formModel[field.name] = defaultValueHandler(field); |
|
|
formModel[field.name] = defaultValueHandler(field); |
|
|
formFieldsMap.set(field.name, field); |
|
|
formFields[field.name] = field; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -118,6 +120,13 @@ const formLayoutComputed = computed(() => { |
|
|
return className; |
|
|
return className; |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const updateModelValue = (name, value) => { |
|
|
|
|
|
if (formFields[name].error) { |
|
|
|
|
|
formFields[name].error = false; |
|
|
|
|
|
formFields[name].errorMessage = undefined; |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 对外暴露方法-获取form所有数据 |
|
|
* 对外暴露方法-获取form所有数据 |
|
|
*/ |
|
|
*/ |
|
@ -130,7 +139,7 @@ const getData = () => { |
|
|
* @param data 数据对象(JSON格式) |
|
|
* @param data 数据对象(JSON格式) |
|
|
*/ |
|
|
*/ |
|
|
const setData = (data) => { |
|
|
const setData = (data) => { |
|
|
for (const field of props.fields as any) { |
|
|
for (const field of fields_.value as any) { |
|
|
formData[field.name] = data[field.name]; |
|
|
formData[field.name] = data[field.name]; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
@ -139,7 +148,7 @@ const setData = (data) => { |
|
|
*/ |
|
|
*/ |
|
|
const reset = () => { |
|
|
const reset = () => { |
|
|
Object.keys(formData).forEach((key) => { |
|
|
Object.keys(formData).forEach((key) => { |
|
|
formData[key] = defaultValueHandler(formFieldsMap.get(key)); |
|
|
formData[key] = defaultValueHandler(formFields[key]); |
|
|
}); |
|
|
}); |
|
|
}; |
|
|
}; |
|
|
const formValidate = async () => { |
|
|
const formValidate = async () => { |
|
@ -164,8 +173,7 @@ const validate = async () => { |
|
|
* @param value 字段值 |
|
|
* @param value 字段值 |
|
|
*/ |
|
|
*/ |
|
|
const setFieldValue = (fieldName, value) => { |
|
|
const setFieldValue = (fieldName, value) => { |
|
|
const field = formFieldsMap.get(fieldName); |
|
|
formData[fieldName] = value; |
|
|
formData[field.name] = value; |
|
|
|
|
|
}; |
|
|
}; |
|
|
/** |
|
|
/** |
|
|
* 对外暴露方法-获取字段值 |
|
|
* 对外暴露方法-获取字段值 |
|
@ -194,9 +202,44 @@ const getRowColsNum = () => { |
|
|
return screenColsNumComputed.value; |
|
|
return screenColsNumComputed.value; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 错误消息类型 |
|
|
|
|
|
* |
|
|
|
|
|
* @param fieldName 字段名 |
|
|
|
|
|
* @param errorMessage 错误消息 |
|
|
|
|
|
*/ |
|
|
|
|
|
type errorType = { |
|
|
|
|
|
fieldName: string; |
|
|
|
|
|
errorMessage: string; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 对外暴露方法-设置后台校验错误信息 |
|
|
|
|
|
* @param errors 错误消息集合 |
|
|
|
|
|
*/ |
|
|
|
|
|
const setValidationErrors = (errors: errorType[]) => { |
|
|
|
|
|
if (errors && errors.length > 0) { |
|
|
|
|
|
const grouped = {}; |
|
|
|
|
|
errors.map(({ fieldName, ...rest }) => { |
|
|
|
|
|
grouped[fieldName] = grouped[fieldName] || []; |
|
|
|
|
|
grouped[fieldName].push(rest); |
|
|
|
|
|
}); |
|
|
|
|
|
for (let name in grouped) { |
|
|
|
|
|
if (formFields[name]) { |
|
|
|
|
|
formFields[name].error = true; |
|
|
|
|
|
formFields[name].errorMessage = grouped[name] |
|
|
|
|
|
.map((obj) => { |
|
|
|
|
|
return obj.errorMessage; |
|
|
|
|
|
}) |
|
|
|
|
|
.join('、'); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
defineExpose({ |
|
|
defineExpose({ |
|
|
data: formData, |
|
|
data: formData, |
|
|
fieldsMap: formFieldsMap, |
|
|
fields: formFields, |
|
|
getData, |
|
|
getData, |
|
|
setData, |
|
|
setData, |
|
|
reset, |
|
|
reset, |
|
@ -206,5 +249,6 @@ defineExpose({ |
|
|
setStatus, |
|
|
setStatus, |
|
|
getStatus, |
|
|
getStatus, |
|
|
getRowColsNum, |
|
|
getRowColsNum, |
|
|
|
|
|
setValidationErrors, |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
</script> |
|
|