华西海圻ELN前端工程
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

146 lines
5.7 KiB

<template>
<div>
<div v-for="(item, index) in formConfig" :key="index" class="step-form-package">
<div v-for="(sItem, key) in item.config" class="step-item" :key="key">
<template v-if="sItem.type === 'input'">
<HandleFormItem class="step-row" :field-item-label="fieldItemLabel" @blur="onBlur(key, $event)"
:item="sItem" v-model="formFields[key]" :field-key="prefixKey + '_' + key"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
</template>
<template v-else-if="sItem.type === 'inputNumber'">
<HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="inputNumber" @blur="onBlur(key, $event)" :item="sItem"
@input="onInputNumberChange(key, $event)" v-model="formFields[key]" @copy="onCopy(sItem, key)"
:error="errors[key]" @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
</template>
<template v-else-if="sItem.type === 'select'">
<HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="select" @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
@copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
:orange-bg="orangeBgFields[key]" />
</template>
<!-- 仪器 -->
<template v-else-if="sItem.type === 'instrument'">
<HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="clickable" @clickable="handleClickInstrument(key,'instrument')" :error="errors[key]"
@update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="getClickableItem(sItem)"
:value="formFields[key]" />
</template>
<!-- 仪器 -->
<template v-else-if="sItem.type === 'regent'">
<HandleFormItem class="step-row" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
type="clickable" @clickable="handleClickInstrument(key,'regent')" :error="errors[key]"
@update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="getClickableItem(sItem)"
:value="formFields[key]" />
</template>
<template v-else-if="sItem.type === 'text'">
<span>{{ sItem.label }}</span>
</template>
<template v-else-if="sItem.type === 'span'">
<span>{{ formFields[key] }}</span>
</template>
</div>
</div>
</div>
</template>
<script>
import HandleFormItem from '@/components/Template/HandleFormItem.vue'
import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
import { isShowOther } from "@/utils/formPackageCommon.js";
import { EventBus } from "@/utils/eventBus";
import { getuuid } from "@/utils/index.js";
export default {
inject: ['templateFillType','templateData'],
components: {
HandleFormItem,
},
mixins: [formPackageMixins],
props: {
formConfig: {
type: Array,
default: []
},
formData: {
type: Object,
value: () => ({})
},
//主要标识当前表单属于哪个模块,用于传给后端
fieldItemLabel: {
type: String,
default: "",
},
prefixKey: {
type: String,
default: ""
}
},
mounted() {
EventBus.$on("onReagentSubmit",this.onReagentSubmit)
},
unmounted() {
EventBus.$off("onReagentSubmit",this.onReagentSubmit)
},
data() {
return {
formFields: {},//表单绑定字段
allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
errors: {},//存储表单错误信息,用于标红提示
orangeBgFields: {},// 存储需要橙色背景的字段
isShowOther,
currentClickKey: "",//当前点击的字段key
uuid:getuuid(),
}
},
methods: {
// 处理选择试剂提交
onReagentSubmit(data){
if(data.uuid !== this.uuid) return;
this.formFields[this.currentClickKey] = data.selectedId;
},
getClickableItem(sItem) {
return {
...sItem,
type:"clickable"
}
},
handleClickInstrument(key,type) {
this.currentClickKey = key;
if(type === 'regent'){
EventBus.$emit("showSelectReagentDialog",{
studyFormId:this.templateData.id,
uuid:this.uuid,
})
}else if(type === 'instrument'){
EventBus.$emit("showSelectInstrumentDialog",{
studyFormId:this.templateData.id,
uuid:this.uuid,
})
}
},
onSelectReagentSubmit(reagent){
this.formFields[this.currentClickKey] = reagent
},
}
}
</script>
<style lang="scss" scoped>
.step-form-package {
display: flex;
align-items: center;
font-size: 14px;
}
.step-row {
min-width: 180px;
}
.step-item {
display: flex;
align-items: center;
margin-left: 5px;
}
</style>