|
|
|
@ -9,12 +9,12 @@ |
|
|
|
<template v-if="sItem.type === 'input'"> |
|
|
|
<div class="form-title">{{ sItem.label }}</div> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</template> |
|
|
|
<template v-else-if="sItem.type === 'inputNumber'"> |
|
|
|
<div class="form-title">{{ sItem.label }}</div> |
|
|
|
<HandleFormItem type = "inputNumber" @blur="onBlur(key, $event)" :item="sItem" @input = "onInputNumberChange(key, $event)" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</template> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -27,7 +27,7 @@ |
|
|
|
<div class="form-title">{{ sItem.label }}</div> |
|
|
|
<div class="flex "> |
|
|
|
<HandleFormItem type="select" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" /> |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
|
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -36,7 +36,7 @@ |
|
|
|
<div class="form-title">其他</div> |
|
|
|
<div class="flex"> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
@ -54,19 +54,19 @@ |
|
|
|
<div class="form-title" v-if="sItem.label">{{ sItem.label }}</div> |
|
|
|
<div v-if="sItem.type === 'dateTime'" class="flex1"> |
|
|
|
<HandleFormItem type="dateTime" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'select'"> |
|
|
|
<HandleFormItem type="select" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" /> |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'input'"> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'textarea'"> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" type="textarea" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -80,24 +80,24 @@ |
|
|
|
<div class="step-form-title" v-if="sItem.label">{{ sItem.label }}</div> |
|
|
|
<div v-if="sItem.type === 'dateTime'" class="flex1"> |
|
|
|
<HandleFormItem type="dateTime" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'select'" class="flex flex1"> |
|
|
|
<HandleFormItem type="select" :item="sItem" style="width: auto;flex:1" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" /> |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(key, $event)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
<div v-show="isShowOther(formFields[key])" class="flex flex1"> |
|
|
|
<div class="other-title">其他</div> |
|
|
|
<div class="flex"> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" class="sub-select" :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]" @update:error="errors[sItem.otherCode] = false" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'input'" class="flex flex1"> |
|
|
|
<HandleFormItem @blur="onBlur(key, $event)" class="flex1" :item="sItem" v-model="formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
<HandleFormItem v-if="sItem.subType === 'select'" type="select" class="sub-select" :item="getSubItem(sItem)" v-model="formFields[sItem.subKey]" |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" /> |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false" /> |
|
|
|
<div v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div> |
|
|
|
<HandleFormItem v-else-if="sItem.subType === 'clickable'" type="clickable" @clickable="handleClickable(sItem,$event)" class="sub-select" :item="getClickableItem(sItem)" :value="formFields[sItem.subKey]" |
|
|
|
/> |
|
|
|
@ -108,9 +108,9 @@ |
|
|
|
</div> |
|
|
|
<div v-else-if="sItem.type === 'inputNumber'" class="flex flex1"> |
|
|
|
<HandleFormItem type = "inputNumber" @blur="onBlur(key, $event)" class="flex1" :item="sItem" @input = "onInputNumberChange(key, $event)" :value = "formFields[key]" |
|
|
|
@copy="onCopy(sItem, key)" /> |
|
|
|
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false" /> |
|
|
|
<HandleFormItem v-if="sItem.subType === 'select'" type="select" class="sub-select" :item="getSubItem(sItem)" v-model="formFields[sItem.subKey]" |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" /> |
|
|
|
@copy="onCopy(sItem, key)" @change="onSelectChange(sItem.subKey, $event)" :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false" /> |
|
|
|
<div v-else-if="sItem.subType === 'span'">{{ formFields[sItem.subKey] }}</div> |
|
|
|
<HandleFormItem v-else-if="sItem.subType === 'clickable'" @clickable="handleClickable(sItem,$event)" type="clickable" class="sub-select" :item="getClickableItem(sItem)" :value="formFields[sItem.subKey]" |
|
|
|
/> |
|
|
|
@ -152,6 +152,7 @@ export default { |
|
|
|
return { |
|
|
|
formFields: {},//表单绑定字段 |
|
|
|
allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写 |
|
|
|
errors: {},//存储表单错误信息,用于标红提示 |
|
|
|
}; |
|
|
|
}, |
|
|
|
watch: { |
|
|
|
@ -187,13 +188,25 @@ export default { |
|
|
|
}, |
|
|
|
onInputNumberChange(key, val){ |
|
|
|
this.formFields[key] = val; |
|
|
|
// 清除该表单项的错误状态 |
|
|
|
if (this.errors[key]) { |
|
|
|
this.$set(this.errors, key, false); |
|
|
|
} |
|
|
|
}, |
|
|
|
updateFormData(key, value){ |
|
|
|
this.formFields[key] = value; |
|
|
|
// 清除该表单项的错误状态 |
|
|
|
if (this.errors[key]) { |
|
|
|
this.$set(this.errors, key, false); |
|
|
|
} |
|
|
|
}, |
|
|
|
batchUpdateFormData(data){ |
|
|
|
Object.keys(data).forEach(key => { |
|
|
|
this.formFields[key] = data[key]; |
|
|
|
// 清除该表单项的错误状态 |
|
|
|
if (this.errors[key]) { |
|
|
|
this.$set(this.errors, key, false); |
|
|
|
} |
|
|
|
}) |
|
|
|
}, |
|
|
|
handleClickable(sItem,event){ |
|
|
|
@ -272,12 +285,12 @@ export default { |
|
|
|
if (currentConfig.otherCode) { |
|
|
|
const { otherCode } = currentConfig; |
|
|
|
result[otherCode] = formData[otherCode] || ''; |
|
|
|
config[otherCode] = { label: "其他", type: "input" } |
|
|
|
config[otherCode] = { label: "其他", parentKey:key, type: "input",fillType:currentConfig.fillType,otherCode } |
|
|
|
} |
|
|
|
if (currentConfig.subKey) { |
|
|
|
const { subKey } = currentConfig; |
|
|
|
result[subKey] = formData[subKey] || ''; |
|
|
|
config[subKey] = { label: currentConfig.label, type: currentConfig.subType } |
|
|
|
config[subKey] = { label: currentConfig.label,subKey, type: currentConfig.subType,fillType:currentConfig.subFillType || currentConfig.fillType } |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
@ -287,11 +300,9 @@ export default { |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
console.log(result,"initResult") |
|
|
|
// 更新表单字段 |
|
|
|
this.formFields = result; |
|
|
|
this.allFieldsConfig = config; |
|
|
|
console.log(config,"config") |
|
|
|
}, |
|
|
|
//判断是否禁用 |
|
|
|
getDisabled() { |
|
|
|
@ -313,28 +324,46 @@ export default { |
|
|
|
getFormData() { |
|
|
|
const { formFields, allFieldsConfig } = this; |
|
|
|
const { templateStatus } = this.$store.state.template; |
|
|
|
return new Promise((resolve,reject)=>{ |
|
|
|
for (const key in formFields) { |
|
|
|
console.log(key,formFields[key]) |
|
|
|
if (!formFields[key]) { |
|
|
|
const o = allFieldsConfig[key]; |
|
|
|
if (o.fillType == templateStatus && !o.disabled) { |
|
|
|
|
|
|
|
// 重置错误状态 |
|
|
|
this.errors = {}; |
|
|
|
const errors = {}; |
|
|
|
let firstError = null; |
|
|
|
for (const key in allFieldsConfig) { |
|
|
|
if (!formFields[key]) { |
|
|
|
const o = allFieldsConfig[key]; |
|
|
|
if (o.label === "其他" && !this.isShowOther(formFields[o.parentKey])) { |
|
|
|
continue |
|
|
|
} |
|
|
|
if (o.fillType == templateStatus && !o.disabled) { |
|
|
|
// 标记为错误状态 |
|
|
|
errors[key] = true; |
|
|
|
|
|
|
|
if (!firstError) { |
|
|
|
let prefix = ""; |
|
|
|
if (o.type === "input" || o.type === "inputNumber" || o.type === "textarea") { |
|
|
|
prefix = "填写" |
|
|
|
prefix = "填写"; |
|
|
|
} else { |
|
|
|
prefix = "选择" |
|
|
|
prefix = "选择"; |
|
|
|
} |
|
|
|
this.$message.error(`${o.label}还未${prefix}请${prefix}后再提交`); |
|
|
|
reject(`${o.label}还未${prefix}`); |
|
|
|
return; |
|
|
|
firstError = { label: o.label, prefix }; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
resolve(formFields) |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
// 设置错误状态 |
|
|
|
this.errors = errors; |
|
|
|
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
if (Object.keys(errors).length > 0) { |
|
|
|
// 显示第一个错误的提示信息 |
|
|
|
this.$message.error(`表单内容未填完,请填写后再提交`); |
|
|
|
reject(`${firstError.label}还未${firstError.prefix}`); |
|
|
|
} else { |
|
|
|
resolve(formFields); |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
|
getFormDataByKey(key){ |
|
|
|
return this.formFields[key]; |
|
|
|
@ -355,6 +384,10 @@ export default { |
|
|
|
this.formFields[key] = val; |
|
|
|
// } |
|
|
|
this.$emit("select", { key, value: val }); |
|
|
|
// 清除该表单项的错误状态 |
|
|
|
if (this.errors[key]) { |
|
|
|
this.$set(this.errors, key, false); |
|
|
|
} |
|
|
|
}, |
|
|
|
//复制 |
|
|
|
onCopy(config, key) { |
|
|
|
|