华西海圻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.

655 lines
34 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. <template>
  2. <div>
  3. <LineLabel v-if="label" :label="label" />
  4. <div v-for="(item, index) in formConfig" :key="index">
  5. <template v-if="item.type === 'cardItem'">
  6. <div class="grid-container">
  7. <div v-for="(sItem, key) in item.config" class="form-item"
  8. :class="sItem.span == 1 ? 'full-row' : ''" :key="key">
  9. <template v-if="sItem.type === 'input' || sItem.type === 'inputNumber'">
  10. <div class="form-title">{{ $t(sItem.label) }}</div>
  11. <HandleFormItem :field-item-label="fieldItemLabel" @blur="onBlur(key, $event)" :item="sItem"
  12. v-model="formFields[key]" :field-key="prefixKey + '_' + key" @copy="onCopy(sItem, key)"
  13. :error="errors[key]" @update:error="errors[key] = false"
  14. :type="sItem.type"
  15. :orange-bg="orangeBgFields[key]" />
  16. </template>
  17. </div>
  18. </div>
  19. </template>
  20. <template v-else-if="item.type === 'conditionItem'">
  21. <div class="form-item ">
  22. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  23. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  24. <div class="p-r-20">
  25. <div class="form-title">{{ $t(sItem.label) }}</div>
  26. <div class="flex flex1">
  27. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  28. type="select" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  29. @change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
  30. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  31. </div>
  32. </div>
  33. <div class="p-l-20">
  34. <div v-show="isShowOther(formFields[key])">
  35. <div class="form-title" >{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  36. $t("template.common.other") }}</div>
  37. <div class="flex flex1">
  38. <HandleFormItem :field-item-label="fieldItemLabel"
  39. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  40. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  41. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  42. @update:error="errors[sItem.otherCode] = false" />
  43. </div>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. </template>
  49. <template v-else-if="item.type === 'attachment'">
  50. <div class="form-item ">
  51. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  52. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  53. <div class="p-r-20">
  54. <div class="form-title">{{ $t(sItem.label) }}</div>
  55. <div class="flex flex1">
  56. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  57. type="attachment" :item="sItem" :value="formFields[key]" @copy="onCopy(sItem, key)"
  58. @change="(e) => onAttachmentChange(key, e)" :error="errors[key]"
  59. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  60. </div>
  61. </div>
  62. </div>
  63. </div>
  64. </template>
  65. <template v-else-if="item.type === 'cellItem'">
  66. <div class="form-item ">
  67. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  68. <div class="grid-container gap2">
  69. <div v-for="(sItem, key) in item.config" class="c-Item" :class="getSpanClass(sItem)" :key="key">
  70. <div class="form-title" v-if="sItem.label">{{ $t(sItem.label) }}</div>
  71. <div v-if="sItem.type === 'dateTime' || sItem.type === 'datePicker'" class="flex1">
  72. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  73. :type="sItem.type" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  74. :error="errors[key]" @update:error="errors[key] = false"
  75. :orange-bg="orangeBgFields[key]" />
  76. </div>
  77. <div v-else-if="sItem.type === 'select'" class = "flex flex1">
  78. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  79. type="select" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  80. @change="(e, type) => onSelectChange(key, e, type)" :error="errors[key]"
  81. @update:error="errors[key] = false" :orange-bg="orangeBgFields[key]" />
  82. <div v-show="isShowOther(formFields[key])" class="flex flex1 ml-10">
  83. <div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  84. $t("template.common.other") }}</div>
  85. <div class="flex flex1">
  86. <HandleFormItem :field-item-label="fieldItemLabel"
  87. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  88. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  89. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  90. @update:error="errors[sItem.otherCode] = false"
  91. :orange-bg="orangeBgFields[sItem.otherCode]" />
  92. </div>
  93. </div>
  94. </div>
  95. <div v-else-if="sItem.type === 'input'||sItem.type === 'textarea' || sItem.type === 'inputNumber'" class="item-center">
  96. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  97. @blur="onBlur(key, $event)" :item="sItem" v-model="formFields[key]"
  98. :type="sItem.type"
  99. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  100. :ref="key" :orange-bg="orangeBgFields[key]" />
  101. <span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  102. <HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button"
  103. :item="getButtonItem(sItem)" :value="formFields[sItem.subKey]"
  104. @clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
  105. </div>
  106. <div v-else-if="sItem.type === 'clickable'" class="flex1">
  107. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  108. type="clickable" @clickable="handleClickable(sItem, key)" :error="errors[key]"
  109. @update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="sItem"
  110. :value="formFields[key]" />
  111. </div>
  112. <div v-else-if="isRegent(sItem)" class="flex1">
  113. <HandleFormItem
  114. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, key)"
  115. :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  116. :type="sItem.type" sourceFrom="baseInfoFormPackage" :error="errors[key]"
  117. @update:error="errors[key] = false"
  118. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, key, sItem)"
  119. :item="sItem" :value="formFields[key]" />
  120. </div>
  121. <!-- 勾选某些选项时出现其他输入框 -->
  122. <div v-else-if="sItem.type === 'radioAndOther'" class="item-center"
  123. :class="{'form-error-border': errors[key]}"
  124. >
  125. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  126. type="radio" :error="errors[key]" @update:error="errors[key] = false"
  127. @change="(e, type) => onSelectChange(key, e, type)" :item="sItem"
  128. :value="formFields[key]" />
  129. <div v-show="isShowOtherByRadioAndOther(formFields[key], sItem)" class="flex1 ml-10">
  130. <HandleFormItem :field-item-label="fieldItemLabel"
  131. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  132. :item="getRadioOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  133. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  134. @update:error="errors[key] = false"
  135. :orange-bg="orangeBgFields[sItem.otherCode]" />
  136. </div>
  137. </div>
  138. <div v-else-if="sItem.type === 'fqyq'" class="flex1"
  139. :class="{ 'form-error-border': errors[key] }">
  140. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  141. type="fqyq" :item="sItem" :value="formFields[key]"
  142. @change="(e) => onFqyqChange(key, e)" :error="errors[key]"
  143. @update:error="errors[key] = false" />
  144. </div>
  145. </div>
  146. </div>
  147. </div>
  148. </template>
  149. <div class="flex flex-wrap" v-else-if="item.type === 'explainItem'">
  150. <div v-for="(sItem, key) in item.config" :key="key" class="explain-item">
  151. <div v-if="sItem.type === 'input' || sItem.type === 'textarea' || sItem.type === 'inputNumber'" class="m-r-10">
  152. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  153. :type="sItem.type" :item="sItem" style="width: auto;flex:1" :style = "{'width': sItem.formWidth ? sItem.formWidth + 'px' : 'auto'}" v-model="formFields[key]"
  154. @copy="onCopy(sItem, key)" @change="(e, type) => onSelectChange(key, e, type)"
  155. :error="errors[key]" @update:error="errors[key] = false"
  156. :orange-bg="orangeBgFields[key]" />
  157. </div>
  158. <span v-else-if="sItem.type === 'span'" class="explain-title">{{ $t(sItem.label) }}</span>
  159. </div>
  160. </div>
  161. <template v-else-if="item.type === 'step'">
  162. <div class="grid-container gap2">
  163. <div v-for="(sItem, key) in item.config" class="c-Item flex item-center"
  164. :class="getSpanClass(sItem)" :key="key">
  165. <div class="step-form-title"
  166. :style="{ 'width': sItem.labelWidth ? sItem.labelWidth + 'px' : '150px' }"
  167. v-if="sItem.label">
  168. {{ $t(sItem.label) }}</div>
  169. <div v-if="sItem.type === 'span'" class="flex1">
  170. {{ formFields[key] }}
  171. </div>
  172. <div v-if="sItem.type === 'dateTime'" class="flex1">
  173. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  174. type="dateTime" :item="sItem" v-model="formFields[key]" @copy="onCopy(sItem, key)"
  175. :error="errors[key]" @update:error="errors[key] = false"
  176. :orange-bg="orangeBgFields[key]" />
  177. </div>
  178. <div v-else-if="sItem.type === 'select' ||sItem.type === 'radio'" class="flex flex1">
  179. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  180. :type="sItem.type" :item="sItem" style="width: auto;flex:1" v-model="formFields[key]"
  181. @copy="onCopy(sItem, key)" @change="(e, type) => onSelectChange(key, e, type)"
  182. @remoteMethod="(query)=>remoteMethod(query, sItem,key)"
  183. :error="errors[key]" @update:error="errors[key] = false"
  184. :orange-bg="orangeBgFields[key]" />
  185. <div v-show="isShowOther(formFields[key]) || isShowRadioSelect(formFields[key])" class="flex flex1 ml-10">
  186. <div class="other-title" v-if="isShowOtherLabel(sItem) && isShowOther(formFields[key])">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  187. $t("template.common.other") }}</div>
  188. <div class="flex flex1">
  189. <HandleFormItem :field-item-label="fieldItemLabel"
  190. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  191. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  192. :type = "isShowOther(formFields[key]) ? 'input' : 'select'"
  193. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  194. @update:error="errors[sItem.otherCode] = false"
  195. :orange-bg="orangeBgFields[sItem.otherCode]" />
  196. </div>
  197. </div>
  198. </div>
  199. <div v-else-if="sItem.type === 'input' || sItem.type === 'inputNumber'" class="flex flex1">
  200. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  201. :type="sItem.type"
  202. @blur="onBlur(key, $event)" class="flex1" :item="sItem" v-model="formFields[key]"
  203. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  204. :orange-bg="orangeBgFields[key]" />
  205. <HandleFormItem :field-item-label="fieldItemLabel"
  206. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  207. v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
  208. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  209. @change="(e, type) => onSelectChange(sItem.subKey, e, type)"
  210. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  211. :orange-bg="orangeBgFields[sItem.subKey]" />
  212. <HandleFormItem :field-item-label="fieldItemLabel"
  213. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  214. v-if="sItem.subType === 'input'" type="input" :item="getSubItem(sItem)"
  215. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  216. :error="errors[sItem.subKey]" @blur="onBlur(sItem.subKey, $event)"
  217. @update:error="errors[sItem.subKey] = false"
  218. :orange-bg="orangeBgFields[sItem.subKey]" />
  219. <div class="ml-10 item-span" v-else-if="sItem.subType === 'span'">{{
  220. formFields[sItem.subKey] }}</div>
  221. <span v-else-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  222. <HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button"
  223. :item="getButtonItem(sItem)" :value="formFields[sItem.subKey]"
  224. @clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
  225. <HandleFormItem :field-item-label="fieldItemLabel"
  226. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  227. v-else-if="sItem.subType === 'clickable'" type="clickable"
  228. @clickable="handleClickable(sItem, sItem.subKey)" :item="getClickableItem(sItem)"
  229. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  230. @resetRecord="resetRecord(sItem.subKey)" :value="formFields[sItem.subKey]" />
  231. <HandleFormItem :field-item-label="fieldItemLabel"
  232. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  233. v-else-if="isRegent(sItem, 'subType')" :type="sItem.subType"
  234. :item="getRegentItem(sItem, 'subType')" sourceFrom="baseInfoFormPackage"
  235. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, sItem.subKey)"
  236. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, sItem.subKey, sItem)"
  237. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  238. :value="formFields[sItem.subKey]" />
  239. <div v-show="isShowOther(formFields[sItem.subKey])" class="flex flex1 ml-10">
  240. <div class="other-title" v-if="isShowOtherLabel(sItem)">{{ sItem.otherLabel ? $t(sItem.otherLabel) :
  241. $t("template.common.other") }}</div>
  242. <div class="flex flex1">
  243. <HandleFormItem :field-item-label="fieldItemLabel"
  244. :field-key="prefixKey + '_' + sItem.otherCode" @blur="onBlur(key, $event)"
  245. :item="getOtherItem(sItem)" v-model="formFields[sItem.otherCode]"
  246. @copy="onCopy(sItem, key)" :error="errors[sItem.otherCode]"
  247. @update:error="errors[sItem.otherCode] = false"
  248. :orange-bg="orangeBgFields[sItem.otherCode]" />
  249. </div>
  250. </div>
  251. <!-- <div class="clickable" :class="getFillType(sItem.subFillType)" v-else-if = "sItem.subType ==='clickable'" @click="handleClickable(sItem,$event)">
  252. <span v-if="formFields[sItem.subKey]">{{ formFields[sItem.subKey] }}</span>
  253. <span v-else class="default-placeholder-text">请选择</span>
  254. </div> -->
  255. </div>
  256. <!-- <div v-else-if="sItem.type === 'inputNumber'" class="flex flex1">
  257. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  258. type="inputNumber" @blur="onBlur(key, $event)" class="flex1" :item="sItem"
  259. @input="onInputNumberChange(key, $event)" :value="formFields[key]"
  260. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  261. :orange-bg="orangeBgFields[key]" />
  262. <HandleFormItem :field-item-label="fieldItemLabel"
  263. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  264. v-if="sItem.subType === 'select'" type="select" :item="getSubItem(sItem)"
  265. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  266. @change="(e, type) => onSelectChange(sItem.subKey, e, type)"
  267. :error="errors[sItem.subKey]" @update:error="errors[sItem.subKey] = false"
  268. :orange-bg="orangeBgFields[sItem.subKey]" />
  269. <div class="ml-10 item-span" v-else-if="sItem.subType === 'span'">{{
  270. formFields[sItem.subKey] }}</div>
  271. <HandleFormItem class="ml-10" v-else-if="sItem.subType === 'button'" type="button"
  272. :item="getButtonItem(sItem)" :value="formFields[sItem.subKey]"
  273. @clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
  274. <HandleFormItem :field-item-label="fieldItemLabel"
  275. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  276. v-else-if="sItem.subType === 'clickable'"
  277. @clickable="handleClickable(sItem, sItem.subKey)" :error="errors[sItem.subKey]"
  278. type="clickable" @update:error="errors[sItem.subKey] = false"
  279. @resetRecord="resetRecord(sItem.subKey)" :item="getClickableItem(sItem)"
  280. :value="formFields[sItem.subKey]" />
  281. <HandleFormItem :field-item-label="fieldItemLabel"
  282. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  283. v-else-if="isRegent(sItem, 'subType')" sourceFrom="baseInfoFormPackage"
  284. :error="errors[sItem.subKey]" :type="sItem.subType"
  285. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, sItem.subKey)"
  286. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, sItem.subKey, sItem)"
  287. :item="getRegentItem(sItem, 'subType')" :value="formFields[sItem.subKey]" />
  288. </div> -->
  289. <div v-else-if="sItem.type === 'clickable'" class="flex flex1">
  290. <HandleFormItem :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  291. type="clickable" @clickable="handleClickable(sItem, key)" :error="errors[key]"
  292. @update:error="errors[key] = false" @resetRecord="resetRecord(key)" :item="sItem"
  293. :value="formFields[key]" />
  294. </div>
  295. <div v-else-if="isRegent(sItem)" class="flex item-center flex1">
  296. <HandleFormItem :field-item-label="fieldItemLabel" sourceFrom="baseInfoFormPackage"
  297. @beforeReagentSubmit="(data, callback) => onBeforeReagentSubmit(data, callback, key)"
  298. @onRegentSubmit="(data, inputValue) => onRegentSubmit(data, inputValue, key, sItem)"
  299. :field-key="prefixKey + '_' + key" :type="sItem.type" :error="errors[key]"
  300. @update:error="errors[key] = false" :item="getRegentItem(sItem)"
  301. :value="formFields[key]" />
  302. <span v-if="sItem.subType === 'text'" class="sub-text">{{ $t(sItem.subText) }}</span>
  303. <HandleFormItem :field-item-label="fieldItemLabel"
  304. :field-key="prefixKey + '_' + sItem.subKey" class="ml-10"
  305. v-else-if="sItem.subType === 'input' || sItem.subType === 'inputNumber' || sItem.subType === 'select'" :type="sItem.subType" :item="getSubItem(sItem)"
  306. v-model="formFields[sItem.subKey]" @copy="onCopy(sItem, key)"
  307. :error="errors[sItem.subKey]" @blur="onBlur(sItem.subKey, $event)"
  308. @update:error="errors[sItem.subKey] = false"
  309. :orange-bg="orangeBgFields[sItem.subKey]" />
  310. <HandleFormItem :field-item-label="fieldItemLabel"
  311. :field-key="prefixKey + '_' + sItem.thirdKey" class="ml-10"
  312. v-if="sItem.thirdType === 'select' || sItem.thirdType === 'input'" :type="sItem.thirdType" :item="getThirdItem(sItem)"
  313. v-model="formFields[sItem.thirdKey]" @copy="onCopy(sItem, key)"
  314. :error="errors[sItem.thirdKey]" @blur="onBlur(sItem.thirdKey, $event)"
  315. @update:error="errors[sItem.thirdKey] = false"
  316. :orange-bg="orangeBgFields[sItem.thirdKey]" />
  317. <HandleFormItem class="ml-10" v-if="sItem.fourthType === 'button'" type="button"
  318. :item="getFourthButtonItem(sItem)" :value="formFields[sItem.fourthKey]"
  319. @clickButton="(e, val, data) => handleClickButton(e, sItem, val, data)" />
  320. </div>
  321. </div>
  322. </div>
  323. </template>
  324. <template v-else-if="item.type === 'checkboxList'">
  325. <div class="form-item " >
  326. <div class="form-title fs-16" v-if="item.label">{{ $t(item.label) }}</div>
  327. <div v-for="(sItem, key) in item.config" class="c-Item grid-container">
  328. <div class="p-r-20 item-center" :class="sItem.span == 1 ? 'full-row' : ''">
  329. <div class="form-title mr-20 checkboxList-title">{{ $t(sItem.label) }}</div>
  330. <div class="flex flex1">
  331. <HandleFormItem
  332. v-if="sItem.type === 'checkboxTree'"
  333. :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  334. :type="sItem.type" :item="sItem" :value="formFields[key]"
  335. @change="(e) => onAttachmentChange(key, e)"
  336. :error="errors[key]" @update:error="errors[key] = false"
  337. :orange-bg="orangeBgFields[key]" />
  338. <HandleFormItem v-else-if="sItem.type === 'textarea'" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  339. @blur="onBlur(key, $event)" type="textarea" :item="sItem" v-model="formFields[key]"
  340. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  341. :orange-bg="orangeBgFields[key]" />
  342. <HandleFormItem v-else-if="sItem.type === 'input'" :field-item-label="fieldItemLabel" :field-key="prefixKey + '_' + key"
  343. @blur="onBlur(key, $event)" type="input" :item="sItem" v-model="formFields[key]"
  344. @copy="onCopy(sItem, key)" :error="errors[key]" @update:error="errors[key] = false"
  345. :orange-bg="orangeBgFields[key]" />
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. </template>
  351. </div>
  352. </div>
  353. </template>
  354. <script>
  355. import HandleFormItem from "./HandleFormItem.vue";
  356. import LineLabel from "./LineLabel.vue";
  357. import { isShowOther, isShowOtherByRadioAndOther } from "@/utils/formPackageCommon.js";
  358. import { isRegent } from "@/utils/index.js";
  359. import formPackageMixins from '@/components/Template/mixins/formPackageMixins.js'
  360. export default {
  361. inject: ['templateFillType'],
  362. components: {
  363. HandleFormItem,
  364. LineLabel
  365. },
  366. mixins: [formPackageMixins],
  367. props: {
  368. label: {//当前表单的标题
  369. type: String,
  370. default: "",
  371. },
  372. formConfig: {
  373. type: Array,
  374. value: () => [],
  375. },
  376. formData: {
  377. type: Object,
  378. value: () => ({})
  379. },
  380. //主要标识当前表单属于哪个模块,用于传给后端
  381. fieldItemLabel: {
  382. type: String,
  383. default: "",
  384. },
  385. //循环组件的情况下需要用这个来区分字段
  386. prefixKey: {
  387. type: String,
  388. default: "",
  389. }
  390. },
  391. data() {
  392. return {
  393. formFields: {},//表单绑定字段
  394. allFieldsConfig: {},//包含config的所有字段,主要用于校验表单是否填写
  395. errors: {},//存储表单错误信息,用于标红提示
  396. orangeBgFields: {},// 存储需要橙色背景的字段
  397. oldFormFields: {},// 存储旧的表单数据,用于比较变化
  398. isShowOther,
  399. isShowOtherByRadioAndOther,
  400. isRegent
  401. };
  402. },
  403. methods: {
  404. remoteMethod(query, sItem, key){
  405. this.$emit('remoteMethod', { query, sItem, key, formFields: this.formFields })
  406. },
  407. //是否显示radio后的select
  408. isShowRadioSelect(value){
  409. const arr = ["动物种属","细胞系"];
  410. return arr.includes(value)
  411. },
  412. onBeforeReagentSubmit(data, callback, key) {
  413. this.$emit('beforeReagentSubmit', { selectData: data, callback, key, formFields: this.formFields })
  414. },
  415. // 点击按钮
  416. handleClickButton(e, item, val, data) {
  417. if(!item.isClearForm){
  418. this.formFields[item.subKey] = val;
  419. }
  420. this.$emit("clickButton", item, data)
  421. },
  422. // 获取按钮项
  423. getButtonItem(sItem) {
  424. return {
  425. ...sItem,
  426. key: sItem.subKey,
  427. disabled: sItem.subDisabled || sItem.disabled,
  428. fillType: sItem.subFillType || sItem.fillType
  429. }
  430. },
  431. getFourthButtonItem(sItem) {
  432. return {
  433. ...sItem,
  434. key: sItem.fourthKey,
  435. buttonName:sItem.fourthButtonName,
  436. disabled: sItem.fourthDisabled || sItem.disabled,
  437. fillType: sItem.fourthFillType || sItem.fillType
  438. }
  439. },
  440. // 处理fqyq变化
  441. onFqyqChange(key, e) {
  442. console.log(e, key, 'fqyq');
  443. this.formFields[key] = e;
  444. },
  445. //是否显示其他输入框的标题
  446. isShowOtherLabel(sItem){
  447. if (sItem.hasOwnProperty("showOtherLabel")) {
  448. return sItem.showOtherLabel
  449. }
  450. return true
  451. },
  452. }
  453. }
  454. </script>
  455. <style lang="scss">
  456. .grid-container {
  457. display: grid;
  458. grid-template-columns: repeat(2, 1fr);
  459. /* 默认2列 */
  460. gap: 0 20px;
  461. /* 防止网格容器被分割到不同页面 */
  462. page-break-inside: avoid;
  463. break-inside: avoid;
  464. }
  465. .gap2 {
  466. gap: 0 48px;
  467. }
  468. .w-100 {
  469. width: 100%;
  470. }
  471. .form-item {
  472. background: #fff;
  473. padding: 20px;
  474. border-radius: 8px;
  475. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
  476. margin-top: 20px;
  477. padding: 20px;
  478. border-radius: 5px 5px;
  479. page-break-inside: avoid;
  480. }
  481. /* 或者使用 span 语法 */
  482. .full-row {
  483. grid-column: span 2;
  484. }
  485. .three-row {
  486. grid-column: span 3;
  487. }
  488. .c-Item {
  489. // &:not(:last-child) {
  490. // margin-bottom: 16px;
  491. // }
  492. page-break-inside: avoid;
  493. padding: 8px 0px;
  494. }
  495. .eo {
  496. &:nth-child(even) {
  497. padding-left: 20px;
  498. }
  499. &:nth-child(odd) {
  500. padding-right: 20px;
  501. }
  502. }
  503. .default-placeholder-text {
  504. color: #C0C4CC;
  505. }
  506. .form-title {
  507. margin-bottom: 12px;
  508. font-size: 14px;
  509. font-weight: normal;
  510. color: #606266;
  511. }
  512. .step-form-title {
  513. font-size: 14px;
  514. font-weight: normal;
  515. color: #606266;
  516. width: 150px;
  517. text-align: right;
  518. padding-right: 10px;
  519. }
  520. .p-r-20 {
  521. padding-right: 20px;
  522. }
  523. .explain-title{
  524. font-size: 14px;
  525. font-weight: normal;
  526. color: #606266;
  527. padding-right: 10px;
  528. }
  529. .explain-item{
  530. display: flex;
  531. align-items: center;
  532. padding: 10px 0;
  533. }
  534. .flex-wrap{
  535. flex-wrap: wrap;
  536. }
  537. .m-r-10{
  538. margin-right: 10px;
  539. }
  540. .p-l-20 {
  541. padding-left: 20px;
  542. }
  543. .fs-16 {
  544. font-size: 0.96rem;
  545. font-weight: bold;
  546. color: #464647
  547. }
  548. .flex1 {
  549. flex: 1;
  550. }
  551. .flex {
  552. display: flex;
  553. }
  554. .other-title {
  555. width: 50px;
  556. text-align: right;
  557. margin: 0 10px;
  558. font-size: 14px;
  559. font-weight: normal;
  560. color: #606266;
  561. }
  562. .mr-24 {
  563. margin-right: 24px;
  564. }
  565. .sub-select {
  566. width: 100px;
  567. margin-left: 10px;
  568. }
  569. .orange-border {
  570. border-color: #f9c588;
  571. }
  572. .green-border {
  573. border-color: green;
  574. }
  575. .blue-border {
  576. border-color: #4ea2ff;
  577. }
  578. .ml-10 {
  579. margin-left: 10px;
  580. }
  581. .item-span {
  582. color: #606266;
  583. font-size: 14px;
  584. }
  585. .item-center {
  586. display: flex;
  587. align-items: center;
  588. }
  589. .ml-5 {
  590. margin-left: 5px;
  591. }
  592. .sub-text {
  593. color: #606266;
  594. font-size: 14px;
  595. margin-left: 5px;
  596. }
  597. .mr-20 {
  598. margin-right: 20px;
  599. }
  600. .form-error-border {
  601. box-shadow: 0 0 6px #ffc3c3;
  602. padding: 8px;
  603. border-radius: 4px;
  604. border: 1px solid #ff5d5d;
  605. }
  606. .checkboxList-title{
  607. width: 120px;
  608. text-align: center;
  609. }
  610. </style>