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

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