GenerateForm.vue 60 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816
  1. <template>
  2. <div :style="{width: formData.config && formData.config.width}" class="fm-form"
  3. :class="{
  4. ['fm-'+formStyleKey]: true,
  5. 'is-print': printRead
  6. }"
  7. >
  8. <el-form :ref="formRef"
  9. :key="formKey"
  10. v-if="formShow"
  11. :class="{
  12. [formData.config && formData.config.customClass]: (formData.config && formData.config.customClass) ? true : false,
  13. 'no-label-form': formData.config && (formData.config.labelWidth == 0)
  14. }"
  15. :size="formSize"
  16. :model="models"
  17. :rules="rules"
  18. :label-position="formData.config && formData.config.labelPosition"
  19. :disabled="!edit"
  20. :label-width="formData.config && formData.config.labelWidth + 'px'"
  21. :label-suffix="formData.config?.labelSuffix ? ' : ' : ' '"
  22. >
  23. <template v-for="item in formData.list">
  24. <generate-col-item
  25. v-if="item.type == 'grid'"
  26. :key="item.key"
  27. :model="models"
  28. :rules="rules"
  29. :element="item"
  30. :remote="remote"
  31. :blanks="blanks"
  32. :display="displayFields"
  33. @input-change="onInputChange"
  34. :edit="edit"
  35. :remote-option="remoteOption"
  36. :platform="platform"
  37. :preview="preview"
  38. :container-key="containerKey"
  39. :data-source-value="dataSourceValue"
  40. :event-function="eventFunction"
  41. :print-read="printRead"
  42. :form-component="$refs[formRef]"
  43. :group="''"
  44. :field-node="''"
  45. >
  46. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  47. <slot :name="blank.name" :model="scope.model"></slot>
  48. </template>
  49. </generate-col-item>
  50. <generate-tab-item
  51. v-else-if="item.type == 'tabs'"
  52. :key="item.key"
  53. :model="models"
  54. :rules="rules"
  55. :element="item"
  56. :remote="remote"
  57. :blanks="blanks"
  58. :display="displayFields"
  59. @input-change="onInputChange"
  60. :edit="edit"
  61. :remote-option="remoteOption"
  62. :platform="platform"
  63. :preview="preview"
  64. :container-key="containerKey"
  65. :data-source-value="dataSourceValue"
  66. :event-function="eventFunction"
  67. :print-read="printRead"
  68. :form-component="$refs[formRef]"
  69. :group="''"
  70. :field-node="''"
  71. >
  72. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  73. <slot :name="blank.name" :model="scope.model"></slot>
  74. </template>
  75. </generate-tab-item>
  76. <generate-collapse
  77. v-else-if="item.type == 'collapse'"
  78. :key="item.key"
  79. :model="models"
  80. :rules="rules"
  81. :element="item"
  82. :remote="remote"
  83. :blanks="blanks"
  84. :display="displayFields"
  85. @input-change="onInputChange"
  86. :edit="edit"
  87. :remote-option="remoteOption"
  88. :platform="platform"
  89. :preview="preview"
  90. :container-key="containerKey"
  91. :data-source-value="dataSourceValue"
  92. :event-function="eventFunction"
  93. :print-read="printRead"
  94. :form-component="$refs[formRef]"
  95. :group="''"
  96. :field-node="''"
  97. >
  98. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  99. <slot :name="blank.name" :model="scope.model"></slot>
  100. </template>
  101. </generate-collapse>
  102. <generate-report
  103. v-else-if="item.type == 'report'"
  104. :key="item.key"
  105. :model="models"
  106. :rules="rules"
  107. :element="item"
  108. :remote="remote"
  109. :blanks="blanks"
  110. :display="displayFields"
  111. @input-change="onInputChange"
  112. :edit="edit"
  113. :remote-option="remoteOption"
  114. :platform="platform"
  115. :preview="preview"
  116. :container-key="containerKey"
  117. :data-source-value="dataSourceValue"
  118. :event-function="eventFunction"
  119. :print-read="printRead"
  120. :form-component="$refs[formRef]"
  121. :group="''"
  122. :field-node="''"
  123. >
  124. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  125. <slot :name="blank.name" :model="scope.model"></slot>
  126. </template>
  127. </generate-report>
  128. <generate-inline
  129. v-else-if="item.type == 'inline'"
  130. :key="item.key"
  131. :model="models"
  132. :rules="rules"
  133. :element="item"
  134. :remote="remote"
  135. :blanks="blanks"
  136. :display="displayFields"
  137. @input-change="onInputChange"
  138. :edit="edit"
  139. :remote-option="remoteOption"
  140. :platform="platform"
  141. :preview="preview"
  142. :container-key="containerKey"
  143. :data-source-value="dataSourceValue"
  144. :event-function="eventFunction"
  145. :print-read="printRead"
  146. :form-component="$refs[formRef]"
  147. :group="''"
  148. :field-node="''"
  149. >
  150. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  151. <slot :name="blank.name" :model="scope.model"></slot>
  152. </template>
  153. </generate-inline>
  154. <generate-dialog
  155. v-else-if="item.type == 'dialog'"
  156. :key="item.key"
  157. :models.sync="models"
  158. :rules="rules"
  159. :element="item"
  160. :remote="remote"
  161. :blanks="blanks"
  162. :edit="edit"
  163. :remote-option="remoteOption"
  164. :platform="platform"
  165. :preview="preview"
  166. :container-key="containerKey"
  167. :data-source-value="dataSourceValue"
  168. :event-function="eventFunction"
  169. :print-read="printRead"
  170. :form-component="$refs[formRef]"
  171. :component-instance="instanceObject"
  172. :group="''"
  173. :field-node="''"
  174. >
  175. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  176. <slot :name="blank.name" :model="scope.model"></slot>
  177. </template>
  178. </generate-dialog>
  179. <generate-card
  180. v-else-if="item.type == 'card'"
  181. :key="item.key"
  182. :model="models"
  183. :rules="rules"
  184. :element="item"
  185. :remote="remote"
  186. :blanks="blanks"
  187. :display="displayFields"
  188. @input-change="onInputChange"
  189. :edit="edit"
  190. :remote-option="remoteOption"
  191. :platform="platform"
  192. :preview="preview"
  193. :container-key="containerKey"
  194. :data-source-value="dataSourceValue"
  195. :event-function="eventFunction"
  196. :print-read="printRead"
  197. :form-component="$refs[formRef]"
  198. :group="''"
  199. :field-node="''"
  200. >
  201. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  202. <slot :name="blank.name" :model="scope.model"></slot>
  203. </template>
  204. </generate-card>
  205. <generate-form-item
  206. v-else
  207. :key="item.key"
  208. :models="models"
  209. :rules="rules"
  210. :widget="item"
  211. :remote="remote"
  212. :blanks="blanks"
  213. :display="displayFields"
  214. @input-change="onInputChange"
  215. :edit="edit"
  216. :remote-option="remoteOption"
  217. :platform="platform"
  218. :preview="preview"
  219. :container-key="containerKey"
  220. :data-source-value="dataSourceValue"
  221. :event-function="eventFunction"
  222. :print-read="printRead"
  223. :form-component="$refs[formRef]"
  224. :group="''"
  225. :field-node="''"
  226. >
  227. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  228. <slot :name="blank.name" :model="scope.model"></slot>
  229. </template>
  230. </generate-form-item>
  231. </template>
  232. </el-form>
  233. </div>
  234. </template>
  235. <script>
  236. import GenerateFormItem from './GenerateFormItem'
  237. import GenerateColItem from './GenerateColItem'
  238. import GenerateTabItem from './GenerateTabItem'
  239. import GenerateReport from './GenerateReport'
  240. import GenerateInline from './GenerateInline'
  241. import GenerateCollapse from './GenerateCollapse.vue'
  242. import GenerateDialog from './GenerateDialog.vue'
  243. import GenerateCard from './GenerateCard.vue'
  244. import {loadJs, updateStyleSheets, splitStyleSheets, clearStyleSheets, consoleError, getBindModels } from '../util/index.js'
  245. import { updateClassName } from '../util/reuse-methods.js'
  246. import { EventBus } from '../util/event-bus.js'
  247. import _ from 'lodash'
  248. import axios from 'axios'
  249. import { exportPDF } from '../util/export.js'
  250. import { ruleToFunction } from '../util/rule-funcs.js'
  251. import { isExpression, extractExpression, executeExpression } from '../util/expression'
  252. export default {
  253. name: 'fm-generate-form',
  254. components: {
  255. GenerateFormItem,
  256. GenerateColItem,
  257. GenerateTabItem,
  258. GenerateReport,
  259. GenerateInline,
  260. GenerateCollapse,
  261. GenerateDialog,
  262. GenerateCard
  263. },
  264. props: {
  265. data: {
  266. type: Object,
  267. default: () => ({
  268. "list": [],
  269. "config": {
  270. "labelWidth": 100,
  271. "labelPosition": "right",
  272. "size": "small",
  273. "customClass": "",
  274. "ui": "element",
  275. "layout": "horizontal"
  276. }
  277. })
  278. },
  279. remote: {
  280. type: Object,
  281. default: () => ({})
  282. },
  283. value: {
  284. type: Object,
  285. default: () => ({})
  286. },
  287. edit: {
  288. type: Boolean,
  289. default: true
  290. },
  291. printRead: {
  292. type: Boolean,
  293. default: false
  294. },
  295. remoteOption: {
  296. type: Object,
  297. default: () => ({})
  298. },
  299. preview: {
  300. type: Boolean,
  301. default: false
  302. },
  303. platform: {
  304. type: String,
  305. default: 'mobile'
  306. }
  307. },
  308. data () {
  309. return {
  310. formData: {},
  311. models: {},
  312. rules: {},
  313. blanks: [],
  314. displayFields: {},
  315. dataBindFields: {},
  316. generateShow: false,
  317. resetModels: {},
  318. formKey: Math.random().toString(36).slice(-8),
  319. formStyleKey: Math.random().toString(36).slice(-8),
  320. formValue: this.value,
  321. formShow: false,
  322. formRef: Math.random().toString(36).slice(-8) + 'Form',
  323. containerKey: Math.random().toString(36).slice(-8),
  324. dataSourceValue: [],
  325. eventFunction: {},
  326. instanceObject: {},
  327. dataSourceInterface: [],
  328. dynamicHideFields: {},
  329. dynamicValueData: [],
  330. dynamicValueFxInterface: {},
  331. dynamicOptionFxInterface: {},
  332. formItemContexts: {},
  333. }
  334. },
  335. computed: {
  336. formSize () {
  337. switch (this.data && this.formData.config && this.formData.config.size){
  338. case 'large': return 'large'
  339. case 'default': return 'small'
  340. case 'small': return 'mini'
  341. default: return 'small'
  342. }
  343. },
  344. },
  345. created () {
  346. this._initForm()
  347. },
  348. mounted () {
  349. this.$nextTick(() => {
  350. this.eventFunction.mounted && this.eventFunction['mounted']({})
  351. })
  352. },
  353. beforeDestroy () {
  354. let head = '.fm-' + this.formStyleKey + ' '
  355. clearStyleSheets(head)
  356. },
  357. provide() {
  358. return {
  359. 'generateComponentInstance': this.generateComponentInstance,
  360. 'deleteComponentInstance': this.deleteComponentInstance,
  361. 'eventScriptConfig': this.getEventScriptConfig,
  362. 'getFormComponent': this.getFormComponent,
  363. 'onChange': this._changeFormValue,
  364. 'onFormDisabled': this.disabled,
  365. 'dynamicHideFields': this.dynamicHideFields,
  366. 'onFormHide': this.hide,
  367. 'onFormDisplay': this.display,
  368. 'dynamicValueData': this.dynamicValueData,
  369. 'dynamicOptionData': this.dynamicOptionData,
  370. 'formContext': this,
  371. 'generateFormItemContext': this.generateFormItemContext,
  372. 'deleteFormItemContext': this.deleteFormItemContext,
  373. 'sendRequest': this.sendRequest
  374. }
  375. },
  376. methods: {
  377. getFormComponent () {
  378. return this.$refs[this.formRef]
  379. },
  380. _changeFormValue (value, field) {
  381. this.models[field] = value
  382. this.$emit('on-change', field, value, this.models)
  383. this.$emit(`on-${field}-change`, value)
  384. },
  385. _initForm () {
  386. this.formShow = false
  387. this.formData = _.cloneDeep(this.data)
  388. this.models = {}
  389. this.rules = {}
  390. this.blanks = []
  391. this.displayFields = {}
  392. this.dataBindFields = {}
  393. this.resetModels = {}
  394. this.dataSourceValue = []
  395. this.eventFunction = []
  396. this.dataSourceInterface = []
  397. this.dynamicValueData.splice(0, this.dynamicValueData.length)
  398. Object.keys(this.dynamicHideFields).forEach(key => delete this.dynamicHideFields[key])
  399. this.dynamicValueFxInterface = {}
  400. this.dynamicOptionFxInterface = {}
  401. if (Object.keys(this.data).length) {
  402. this.generateModel(this.formData.list)
  403. } else {
  404. this.generateModel([])
  405. }
  406. this.models = {...this.models}
  407. return new Promise((resolve) => {
  408. this.$nextTick(() => {
  409. this.formShow = true
  410. if (this.formData.config && this.formData.config.styleSheets) {
  411. let head = '.fm-' + this.formStyleKey + ' '
  412. console.log('----head', head)
  413. updateStyleSheets(splitStyleSheets(this.formData.config.styleSheets), head)
  414. }
  415. this.loadDataSource()
  416. this.loadDynamicValueFx()
  417. this.loadEvents()
  418. this.$nextTick(() => {
  419. this.eventFunction['refresh'] && this.eventFunction['refresh']({})
  420. this.resetModels = _.cloneDeep(this.models)
  421. resolve()
  422. })
  423. })
  424. })
  425. },
  426. getEventScriptConfig () {
  427. return this.data?.config?.eventScript || []
  428. },
  429. loadEvents () {
  430. if (this.formData.config && this.formData.config.eventScript) {
  431. for (let i = 0; i < this.formData.config.eventScript.length; i++) {
  432. let currentScript = this.formData.config.eventScript[i]
  433. if (currentScript.type === 'rule') {
  434. // 加载异步方法
  435. console.log(ruleToFunction(currentScript.rules))
  436. this.eventFunction[currentScript.key] = new Function(`return (async () => {${ruleToFunction(currentScript.rules)}})()`).bind(this)
  437. } else {
  438. this.eventFunction[currentScript.key] = Function(currentScript.func).bind(this)
  439. }
  440. }
  441. }
  442. },
  443. triggerEvent (eventName, args) {
  444. if (this.formData.config && this.formData.config.eventScript) {
  445. let eventScript = this.formData.config.eventScript.find(item => item.name == eventName)
  446. if (eventScript) {
  447. return this.eventFunction[eventScript.key](args)
  448. }
  449. }
  450. },
  451. refreshDynamicValueAll () {
  452. this.refreshDynamicValue()
  453. },
  454. refreshDynamicValue (fields, args) {
  455. if (fields === undefined) {
  456. let refreshItems = []
  457. Object.keys(this.dynamicValueFxInterface).forEach(field => {
  458. if (this.formItemContexts[field]) {
  459. if (Array.isArray(this.formItemContexts[field])) {
  460. this.formItemContexts[field].forEach(fItem => {
  461. refreshItems.push(fItem)
  462. })
  463. } else {
  464. refreshItems.push(this.formItemContexts[field])
  465. }
  466. } else {
  467. let groupFormItems = []
  468. Object.keys(this.formItemContexts).forEach(key => {
  469. if (Array.isArray(this.formItemContexts[key])) {
  470. this.formItemContexts[key].forEach(fItem => {
  471. if (fItem.groupNode == field) {
  472. groupFormItems.push(fItem)
  473. }
  474. })
  475. } else {
  476. if (this.formItemContexts[key].groupNode == field) {
  477. groupFormItems.push(this.formItemContexts[key])
  478. }
  479. }
  480. })
  481. groupFormItems.forEach(fItem => {
  482. refreshItems.push(fItem)
  483. })
  484. }
  485. })
  486. for (let i = 0; i < this.dataSourceInterface.length; i++) {
  487. let curRequest = this.dataSourceInterface[i]
  488. if (curRequest.dynamicValueFields.length) {
  489. curRequest.dynamicValueFields.forEach(({field, struct}) => {
  490. if (this.formItemContexts[field]) {
  491. if (Array.isArray(this.formItemContexts[field])) {
  492. this.formItemContexts[field].forEach(fItem => {
  493. refreshItems.push(fItem)
  494. })
  495. } else {
  496. refreshItems.push(this.formItemContexts[field])
  497. }
  498. } else {
  499. let groupFormItems = []
  500. Object.keys(this.formItemContexts).forEach(key => {
  501. if (Array.isArray(this.formItemContexts[key])) {
  502. this.formItemContexts[key].forEach(fItem => {
  503. if (fItem.groupNode == field) {
  504. groupFormItems.push(fItem)
  505. }
  506. })
  507. } else {
  508. if (this.formItemContexts[key].groupNode == field) {
  509. groupFormItems.push(this.formItemContexts[key])
  510. }
  511. }
  512. })
  513. groupFormItems.forEach(fItem => {
  514. refreshItems.push(fItem)
  515. })
  516. }
  517. })
  518. }
  519. }
  520. return new Promise((resolve, reject) => {
  521. Promise.all(refreshItems.map(item => item.refreshDynamicValue())).then(values => {
  522. resolve(values)
  523. }).catch(e => {
  524. reject(e)
  525. })
  526. })
  527. }
  528. if (typeof fields === 'string') {
  529. fields = [fields]
  530. }
  531. let refreshItems = []
  532. const curArgs = (args && typeof args === 'object') ? {...args} : {}
  533. fields.forEach(field => {
  534. if (this.formItemContexts[field]) {
  535. if (Array.isArray(this.formItemContexts[field])) {
  536. this.formItemContexts[field].forEach(fItem => {
  537. refreshItems.push(fItem)
  538. })
  539. } else {
  540. refreshItems.push(this.formItemContexts[field])
  541. }
  542. } else {
  543. let groupFormItems = []
  544. Object.keys(this.formItemContexts).forEach(key => {
  545. if (this.formItemContexts[key].groupNode == field) {
  546. groupFormItems.push(this.formItemContexts[key])
  547. }
  548. })
  549. groupFormItems.forEach(fItem => {
  550. refreshItems.push(fItem)
  551. })
  552. }
  553. })
  554. return new Promise((resolve, reject) => {
  555. Promise.all(refreshItems.map(item => item.refreshDynamicValue(curArgs))).then(values => {
  556. resolve(values)
  557. }).catch(e => {
  558. reject(e)
  559. })
  560. })
  561. },
  562. loadDataSource () {
  563. for (let i = 0; i < this.dataSourceInterface.length; i++) {
  564. let curRequest = this.dataSourceInterface[i]
  565. let requestObj = this.formData.config.dataSource.find(item => item.key == curRequest.key)
  566. if (requestObj && requestObj.auto)
  567. requestObj.name && this.sendRequest(requestObj.name, {...curRequest.args}).then(data => {
  568. let curArgs = {...curRequest.args}
  569. for (let key in curArgs) {
  570. if (isExpression(curArgs[key])) {
  571. curArgs[key] = executeExpression(extractExpression(curArgs[key]), {}, this)
  572. }
  573. }
  574. curRequest.fields.forEach(field => {
  575. let curKey = field + '.' + curRequest.key
  576. let sourceValue = this.dataSourceValue.find(item => item.key === curKey)
  577. if (sourceValue) {
  578. sourceValue.value = data
  579. } else {
  580. this.dataSourceValue.push({
  581. key: curKey,
  582. args: curArgs,
  583. value: data
  584. })
  585. }
  586. })
  587. curRequest.dynamicValueFields.forEach(({field, struct}) => {
  588. let curKey = field + '.' + curRequest.key
  589. let sourceValue = this.dynamicValueData.find(item => item.key === curKey)
  590. if (sourceValue) {
  591. sourceValue.value = data
  592. } else {
  593. this.dynamicValueData.push({
  594. key: curKey,
  595. args: curArgs,
  596. value: data
  597. })
  598. }
  599. })
  600. })
  601. }
  602. // 处理需要初始化请求但没有进行绑定的数据源
  603. if (this.formData.config?.dataSource?.length > 0) {
  604. for (let i = 0; i < this.formData.config.dataSource.length; i++) {
  605. let currentDataSource = this.formData.config.dataSource[i]
  606. if (currentDataSource.auto && this.dataSourceInterface.findIndex(item => item.key == currentDataSource.key) < 0) {
  607. this.sendRequest(currentDataSource.name, {})
  608. }
  609. }
  610. }
  611. },
  612. loadDynamicValueFx () {
  613. Object.keys(this.dynamicValueFxInterface).forEach(field => {
  614. if (this.formItemContexts[field]) {
  615. if (Array.isArray(this.formItemContexts[field])) {
  616. this.formItemContexts[field].forEach(fItem => {
  617. fItem.refreshDynamicValue()
  618. })
  619. } else {
  620. this.formItemContexts[field].refreshDynamicValue()
  621. }
  622. } else {
  623. let groupFormItems = []
  624. Object.keys(this.formItemContexts).forEach(key => {
  625. if (this.formItemContexts[key].groupNode == field) {
  626. groupFormItems.push(this.formItemContexts[key])
  627. }
  628. })
  629. groupFormItems.forEach(fItem => {
  630. fItem.refreshDynamicValue()
  631. })
  632. }
  633. })
  634. },
  635. refreshFieldOptionData (fields, args) {
  636. if (fields === undefined) return Promise.resolve([])
  637. if (typeof fields === 'string') {
  638. fields = [fields]
  639. }
  640. let refreshInstances = []
  641. const curArgs = (args && typeof args === 'object') ? {...args} : {}
  642. fields.forEach(field => {
  643. if (this.instanceObject[field]) {
  644. if (Array.isArray(this.instanceObject[field])) {
  645. this.instanceObject[field].forEach(fItem => {
  646. fItem?.$parent && refreshInstances.push(fItem?.$parent)
  647. })
  648. } else {
  649. this.instanceObject[field]?.$parent && refreshInstances.push(this.instanceObject[field]?.$parent)
  650. }
  651. } else {
  652. let groupFormItems = []
  653. Object.keys(this.instanceObject).forEach(key => {
  654. if (Array.isArray(this.instanceObject[key])) {
  655. this.instanceObject[key].forEach(fItem => {
  656. if (fItem?.$parent?.groupNode == field) {
  657. groupFormItems.push(fItem)
  658. }
  659. })
  660. } else {
  661. if (this.instanceObject[key]?.$parent?.groupNode == field) {
  662. groupFormItems.push(this.instanceObject[key])
  663. }
  664. }
  665. })
  666. console.log('groupFormItems', groupFormItems)
  667. groupFormItems.forEach(fItem => {
  668. fItem?.$parent && refreshInstances.push(fItem?.$parent)
  669. })
  670. }
  671. })
  672. return new Promise((resolve, reject) => {
  673. Promise.all(refreshInstances.map(item => item.refreshOptionData(curArgs))).then(values => {
  674. resolve(values)
  675. }).catch(e => {
  676. reject(e)
  677. })
  678. })
  679. },
  680. refreshFieldDataSource (field, args) {
  681. let curRequest = this.dataSourceInterface.find(item => item.fields.includes(field))
  682. return new Promise((resolve) => {
  683. if (curRequest) {
  684. let requestName = this.formData.config.dataSource.find(item => item.key == curRequest.key)?.name
  685. requestName && this.sendRequest(requestName, {...curRequest.args, ...args}).then(data => {
  686. let curKey = field + '.' + curRequest.key
  687. let sourceValue = this.dataSourceValue.find(item => item.key === curKey)
  688. if (sourceValue) {
  689. sourceValue.value = data
  690. } else {
  691. this.dataSourceValue.push({
  692. key: curKey,
  693. value: data
  694. })
  695. }
  696. resolve(data)
  697. })
  698. } else {
  699. resolve()
  700. }
  701. })
  702. },
  703. getFieldDataSource (field) {
  704. let curRequest = this.dataSourceInterface.find(item => item.fields.includes(field))
  705. if (curRequest) {
  706. let curKey = field + '.' + curRequest.key
  707. let sourceValue = this.dataSourceValue.find(item => item.key === curKey)
  708. if (sourceValue) {
  709. return sourceValue.value
  710. }
  711. }
  712. return null
  713. },
  714. sendRequest(name, args = {}) {
  715. return new Promise((resolve, reject) => {
  716. let currentDataSource = this.formData.config.dataSource.find(item => item.name === name)
  717. if (!currentDataSource) {
  718. currentDataSource = this.formData.config.dataSource.find(item => item.key === name)
  719. }
  720. if (currentDataSource) {
  721. for (let key in args) {
  722. if (isExpression(args[key])) {
  723. args[key] = executeExpression(extractExpression(args[key]), {}, this)
  724. }
  725. }
  726. let options = {
  727. method: currentDataSource.method,
  728. url: currentDataSource.url,
  729. headers: {},
  730. params: {},
  731. data: {}
  732. }
  733. console.log(currentDataSource,'headers')
  734. let optionsHeaders = {}
  735. currentDataSource.headers && Object.keys(currentDataSource.headers).forEach(key => {
  736. if (isExpression(currentDataSource.headers[key])) {
  737. optionsHeaders[key] = executeExpression(extractExpression(currentDataSource.headers[key]),args, this)
  738. } else {
  739. optionsHeaders[key] = currentDataSource.headers[key]
  740. }
  741. })
  742. Object.keys(optionsHeaders).length && (options['headers'] = optionsHeaders)
  743. let optionsParams = {}
  744. currentDataSource.params && Object.keys(currentDataSource.params).forEach(key => {
  745. if (isExpression(currentDataSource.params[key])) {
  746. optionsParams[key] = executeExpression(extractExpression(currentDataSource.params[key]),args, this)
  747. } else {
  748. optionsParams[key] = currentDataSource.params[key]
  749. }
  750. })
  751. if (options.method === 'POST' || options.method === 'PUT') {
  752. options['data'] = optionsParams
  753. } else {
  754. options['params'] = optionsParams
  755. }
  756. //请求发送前处理函数
  757. if (currentDataSource.requestFunc) {
  758. const requestDynamicFunc = Function('config', 'args', currentDataSource.requestFunc).bind(this)
  759. options = requestDynamicFunc(options, args)
  760. }
  761. axios(options).then(res => {
  762. let data = res
  763. if (currentDataSource.responseFunc) {
  764. const dynamicFunc = Function('res', 'args', currentDataSource.responseFunc).bind(this)
  765. data = dynamicFunc(res.data, args)
  766. resolve(data)
  767. } else {
  768. resolve(res.data)
  769. }
  770. }).catch((error) => {
  771. //请求错误处理函数
  772. if (currentDataSource.errorFunc) {
  773. const errorDynamicFunc = Function('error', currentDataSource.errorFunc).bind(this)
  774. errorDynamicFunc(error)
  775. }
  776. reject(error)
  777. })
  778. }
  779. })
  780. },
  781. generateSubformModel (subName, genList, dataBindFields) {
  782. for (let i = 0; i < genList.length; i++) {
  783. if (genList[i].type === 'grid') {
  784. genList[i].columns.forEach(item => {
  785. this.generateSubformModel(subName, item.list, dataBindFields)
  786. })
  787. } else if (genList[i].type === 'tabs') {
  788. genList[i].tabs.forEach(item => {
  789. this.generateSubformModel(subName, item.list, dataBindFields)
  790. })
  791. } else if (genList[i].type === 'collapse') {
  792. genList[i].tabs.forEach(item => {
  793. this.generateSubformModel(subName, item.list, dataBindFields)
  794. })
  795. } else if (genList[i].type === 'report') {
  796. genList[i].rows.forEach(row => {
  797. row.columns.forEach(column => {
  798. this.generateSubformModel(subName, column.list, dataBindFields)
  799. })
  800. })
  801. } else if (genList[i].type === 'inline') {
  802. this.generateSubformModel(subName, genList[i].list, dataBindFields)
  803. } else if (genList[i].type === 'card') {
  804. this.generateSubformModel(subName, genList[i].list, dataBindFields)
  805. } else {
  806. if (genList[i].type === 'blank') {
  807. this.blanks.push({
  808. name: genList[i].model
  809. })
  810. }
  811. if (genList[i].options.dataBind) {
  812. if (['subform', 'group', 'table'].includes(genList[i].type)) {
  813. dataBindFields[genList[i].model] = {}
  814. } else {
  815. dataBindFields[genList[i].model] = true
  816. }
  817. }
  818. genList[i].tableColumns && genList[i].tableColumns.length && genList[i].tableColumns.forEach(item => {
  819. if (item.type === 'blank') {
  820. this.blanks.push({
  821. name: item.model
  822. })
  823. }
  824. if (item.options.dataBind && genList[i].options.dataBind) {
  825. dataBindFields[genList[i].model][item.model] = true
  826. }
  827. // 处理 rules
  828. this._generateRules(`${subName}.${genList[i].model}.${item.model}`, item.rules)
  829. // 处理子表单中的DataSource
  830. this._generateDataSource(item, `${subName}.${genList[i].model}.${item.model}`)
  831. })
  832. if (genList[i].type == 'subform') {
  833. this.generateSubformModel(`${subName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  834. }
  835. if (genList[i].type == 'group') {
  836. this.generateGroupModel(`${subName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  837. }
  838. // 处理 rules
  839. this._generateRules(`${subName}.${genList[i].model}`, genList[i].rules)
  840. // 处理子表单中的DataSource
  841. this._generateDataSource(genList[i], `${subName}.${genList[i].model}`)
  842. }
  843. }
  844. },
  845. generateDialogModel (dialogName, genList, dataBindFields) {
  846. for (let i = 0; i < genList.length; i++) {
  847. if (genList[i].type === 'grid') {
  848. genList[i].columns.forEach(item => {
  849. this.generateDialogModel(dialogName, item.list, dataBindFields)
  850. })
  851. } else if (genList[i].type === 'tabs') {
  852. genList[i].tabs.forEach(item => {
  853. this.generateDialogModel(dialogName, item.list, dataBindFields)
  854. })
  855. } else if (genList[i].type === 'collapse') {
  856. genList[i].tabs.forEach(item => {
  857. this.generateDialogModel(dialogName, item.list, dataBindFields)
  858. })
  859. } else if (genList[i].type === 'report') {
  860. genList[i].rows.forEach(row => {
  861. row.columns.forEach(column => {
  862. this.generateDialogModel(dialogName, column.list, dataBindFields)
  863. })
  864. })
  865. } else if (genList[i].type === 'inline') {
  866. this.generateDialogModel(dialogName, genList[i].list, dataBindFields)
  867. } else if (genList[i].type === 'card') {
  868. this.generateDialogModel(dialogName, genList[i].list, dataBindFields)
  869. } else {
  870. if (genList[i].type === 'blank') {
  871. this.blanks.push({
  872. name: genList[i].model
  873. })
  874. }
  875. if (genList[i].options.dataBind) {
  876. if (['subform', 'group', 'table'].includes(genList[i].type)) {
  877. dataBindFields[genList[i].model] = {}
  878. } else {
  879. dataBindFields[genList[i].model] = true
  880. }
  881. }
  882. if (genList[i].type == 'subform') {
  883. this.generateSubformModel(`${dialogName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  884. }
  885. if (genList[i].type == 'group') {
  886. this.generateGroupModel(`${dialogName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  887. }
  888. genList[i].tableColumns && genList[i].tableColumns.length && genList[i].tableColumns.forEach(item => {
  889. if (item.type === 'blank') {
  890. this.blanks.push({
  891. name: item.model
  892. })
  893. }
  894. if (item.options.dataBind && genList[i].options.dataBind) {
  895. dataBindFields[genList[i].model][item.model] = true
  896. }
  897. // 处理 rules
  898. this._generateRules(`${dialogName}.${genList[i].model}.${item.model}`, item.rules)
  899. // 处理子表单中的DataSource
  900. this._generateDataSource(item, `${dialogName}.${genList[i].model}.${item.model}`)
  901. })
  902. this._generateRules(`${dialogName}.${genList[i].model}`, genList[i].rules)
  903. // 处理弹框中的DataSource
  904. this._generateDataSource(genList[i], `${dialogName}.${genList[i].model}`)
  905. }
  906. }
  907. },
  908. generateGroupModel (groupName, genList, dataBindFields) {
  909. for (let i = 0; i < genList.length; i++) {
  910. if (genList[i].type === 'grid') {
  911. genList[i].columns.forEach(item => {
  912. this.generateGroupModel(groupName, item.list, dataBindFields)
  913. })
  914. } else if (genList[i].type === 'tabs') {
  915. genList[i].tabs.forEach(item => {
  916. this.generateGroupModel(groupName, item.list, dataBindFields)
  917. })
  918. } else if (genList[i].type === 'collapse') {
  919. genList[i].tabs.forEach(item => {
  920. this.generateGroupModel(groupName, item.list, dataBindFields)
  921. })
  922. } else if (genList[i].type === 'report') {
  923. genList[i].rows.forEach(row => {
  924. row.columns.forEach(column => {
  925. this.generateGroupModel(groupName, column.list, dataBindFields)
  926. })
  927. })
  928. } else if (genList[i].type === 'inline') {
  929. this.generateGroupModel(groupName, genList[i].list, dataBindFields)
  930. } else if (genList[i].type === 'card') {
  931. this.generateGroupModel(groupName, genList[i].list, dataBindFields)
  932. } else {
  933. if (genList[i].type === 'blank') {
  934. this.blanks.push({
  935. name: genList[i].model
  936. })
  937. }
  938. if (genList[i].options.dataBind) {
  939. if (['subform', 'group', 'table'].includes(genList[i].type)) {
  940. dataBindFields[genList[i].model] = {}
  941. } else {
  942. dataBindFields[genList[i].model] = true
  943. }
  944. }
  945. if (genList[i].type == 'subform') {
  946. this.generateSubformModel(`${groupName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  947. }
  948. if (genList[i].type == 'group') {
  949. this.generateGroupModel(`${groupName}.${genList[i].model}`, genList[i].list, dataBindFields[genList[i].model] || {})
  950. }
  951. genList[i].tableColumns && genList[i].tableColumns.length && genList[i].tableColumns.forEach(item => {
  952. if (item.type === 'blank') {
  953. this.blanks.push({
  954. name: item.model
  955. })
  956. }
  957. if (item.options.dataBind && genList[i].options.dataBind) {
  958. dataBindFields[genList[i].model][item.model] = true
  959. }
  960. // 处理 rules
  961. this._generateRules(`${groupName}.${genList[i].model}.${item.model}`, item.rules)
  962. // 处理子表单中的DataSource
  963. this._generateDataSource(item, `${groupName}.${genList[i].model}.${item.model}`)
  964. })
  965. this._generateRules(`${groupName}.${genList[i].model}`, genList[i].rules)
  966. // 处理弹框中的DataSource
  967. this._generateDataSource(genList[i], `${groupName}.${genList[i].model}`)
  968. }
  969. }
  970. },
  971. generateModel (genList) {
  972. for (let i = 0; i < genList.length; i++) {
  973. if (genList[i].type === 'grid') {
  974. this.displayFields[genList[i].model] = !genList[i].options.hidden
  975. genList[i].columns.forEach(item => {
  976. this.generateModel(item.list)
  977. })
  978. } else if (genList[i].type === 'tabs') {
  979. genList[i].tabs.forEach(item => {
  980. this.generateModel(item.list)
  981. })
  982. this.displayFields[genList[i].model] = !genList[i].options.hidden
  983. } else if (genList[i].type === 'collapse') {
  984. genList[i].tabs.forEach(item => {
  985. this.generateModel(item.list)
  986. })
  987. this.displayFields[genList[i].model] = !genList[i].options.hidden
  988. } else if (genList[i].type === 'report') {
  989. genList[i].rows.forEach(row => {
  990. row.columns.forEach(column => {
  991. this.generateModel(column.list)
  992. })
  993. })
  994. this.displayFields[genList[i].model] = !genList[i].options.hidden
  995. } else if (genList[i].type === 'inline') {
  996. this.generateModel(genList[i].list)
  997. this.displayFields[genList[i].model] = !genList[i].options.hidden
  998. } else if (genList[i].type === 'card') {
  999. this.generateModel(genList[i].list)
  1000. this.displayFields[genList[i].model] = !genList[i].options.hidden
  1001. } else {
  1002. if (Object.keys(this.formValue).indexOf(genList[i].model) >= 0) {
  1003. this.models[genList[i].model] = this.formValue[genList[i].model]
  1004. this.displayFields[genList[i].model] = !genList[i].options.hidden
  1005. if (genList[i].type === 'blank') {
  1006. this.blanks.push({
  1007. name: genList[i].model
  1008. })
  1009. }
  1010. } else {
  1011. if (genList[i].type === 'blank') {
  1012. // bound the default value
  1013. this.models[genList[i].model] = genList[i].options.defaultType === 'String' ? '' : (genList[i].options.defaultType === 'Object' ? {} : [])
  1014. this.displayFields[genList[i].model] = !genList[i].options.hidden
  1015. this.blanks.push({
  1016. name: genList[i].model
  1017. })
  1018. } else {
  1019. this.$set(this.models, genList[i].model, genList[i].options.defaultValue)
  1020. this.displayFields[genList[i].model] = !genList[i].options.hidden
  1021. }
  1022. }
  1023. if ((Object.keys(genList[i].options).indexOf('dataBind') < 0 || genList[i].options.dataBind) && genList[i].key && genList[i].model) {
  1024. if (['subform', 'table', 'dialog', 'group'].includes(genList[i].type)) {
  1025. this.dataBindFields[genList[i].model] = {}
  1026. } else {
  1027. this.dataBindFields[genList[i].model] = true
  1028. }
  1029. }
  1030. if (genList[i].type == 'subform') {
  1031. this.generateSubformModel(genList[i].model, genList[i].list, this.dataBindFields[genList[i].model] || {})
  1032. }
  1033. if (genList[i].type == 'dialog') {
  1034. this.generateDialogModel(genList[i].model, genList[i].list, this.dataBindFields[genList[i].model] || {})
  1035. }
  1036. if (genList[i].type == 'group') {
  1037. this.generateGroupModel(genList[i].model, genList[i].list, this.dataBindFields[genList[i].model] || {})
  1038. }
  1039. genList[i].tableColumns && genList[i].tableColumns.length && genList[i].tableColumns.forEach(item => {
  1040. if (item.type === 'blank') {
  1041. this.blanks.push({
  1042. name: item.model
  1043. })
  1044. }
  1045. if (item.options.dataBind && genList[i].options.dataBind) {
  1046. this.dataBindFields[genList[i].model][item.model] = true
  1047. }
  1048. // 处理 rules
  1049. this._generateRules(`${genList[i].model}.${item.model}`, item.rules)
  1050. // 处理子表单中的DataSource
  1051. this._generateDataSource(item, `${genList[i].model}.${item.model}`)
  1052. })
  1053. this._generateRules(genList[i].model, genList[i].rules)
  1054. // 处理DataSource
  1055. this._generateDataSource(genList[i], genList[i].model)
  1056. }
  1057. }
  1058. },
  1059. _generateDataSource (element, model) {
  1060. if (element.options.remote && element.options.remoteType === 'datasource' && element.options.remoteDataSource) {
  1061. this._setDataSourceInterface(model, element.options.remoteArgs, element.options.remoteDataSource)
  1062. }
  1063. if (element.options.remote && element.options.remoteType === 'fx' && element.options.remoteFx) {
  1064. this.dynamicOptionFxInterface[model] = element.options.remoteFx
  1065. }
  1066. if ((element.type == 'imgupload' || element.type == 'fileupload')
  1067. && element.options.tokenType == 'datasource' && element.options.tokenDataSource
  1068. ) {
  1069. this._setDataSourceInterface(model, element.options.remoteArgs, element.options.tokenDataSource)
  1070. }
  1071. if (element.options.isDynamicValue && element.options.dynamicValueType === 'datasource' && element.options.dynamicValueDataSource) {
  1072. this._setDynamicValueInterface(model, element.options.dynamicValueArgs, element.options.dynamicValueDataSource, element.options.dynamicValueStruct)
  1073. }
  1074. if (element.options.isDynamicValue && element.options.dynamicValueType === 'fx') {
  1075. this.dynamicValueFxInterface[model] = element.options.dynamicValueFx
  1076. }
  1077. },
  1078. _generateRules (model, rules) {
  1079. if (this.rules[model]) {
  1080. this.rules[model] = [
  1081. ...this.rules[model],
  1082. ...(rules ? rules.map(im => {
  1083. if (im.pattern) {
  1084. return {...im, pattern: eval(im.pattern)}
  1085. } else if (im.func) {
  1086. const validatorFunc = Function('rule', 'value', 'callback', im.func).bind(this)
  1087. return {...im, validator: validatorFunc}
  1088. } else {
  1089. return {...im}
  1090. }
  1091. }) : [])
  1092. ]
  1093. } else {
  1094. this.rules[model] = [
  1095. ...(rules ? rules.map(im => {
  1096. if (im.pattern) {
  1097. return {...im, pattern: eval(im.pattern)}
  1098. } else if (im.func) {
  1099. const validatorFunc = Function('rule', 'value', 'callback', im.func).bind(this)
  1100. return {...im, validator: validatorFunc}
  1101. } else {
  1102. return {...im}
  1103. }
  1104. }) : [])
  1105. ]
  1106. }
  1107. },
  1108. _setDataSourceInterface (field, args, key) {
  1109. let argsObj
  1110. if (typeof args == 'string') {
  1111. argsObj = (new Function('"use strict";return (' + (args || '{}') + ')').bind(this))()
  1112. } else {
  1113. argsObj = {...args}
  1114. }
  1115. for (let key in argsObj) {
  1116. if (isExpression(argsObj[key])) {
  1117. argsObj[key] = executeExpression(extractExpression(argsObj[key]), {}, this)
  1118. }
  1119. }
  1120. let findCurInterfaceIndex = this.dataSourceInterface.findIndex(item => item.key == key && _.isEqual(item.args, argsObj))
  1121. if (findCurInterfaceIndex >= 0) {
  1122. this.dataSourceInterface[findCurInterfaceIndex].fields.push(field)
  1123. } else {
  1124. this.dataSourceInterface.push({
  1125. key: key,
  1126. args: argsObj,
  1127. fields: [field],
  1128. dynamicValueFields: []
  1129. })
  1130. }
  1131. },
  1132. _setDynamicValueInterface (field, args, key, struct) {
  1133. let findCurInterfaceIndex = this.dataSourceInterface.findIndex(item => item.key == key && _.isEqual(item.args, args))
  1134. if (findCurInterfaceIndex >= 0) {
  1135. this.dataSourceInterface[findCurInterfaceIndex].dynamicValueFields.push({field, struct})
  1136. } else {
  1137. this.dataSourceInterface.push({
  1138. key,
  1139. args,
  1140. dynamicValueFields: [{field, struct}],
  1141. fields: []
  1142. })
  1143. }
  1144. },
  1145. _setSubDisabled (genList, fields, disabled) {
  1146. for (let i = 0; i < genList.length; i++) {
  1147. if (genList[i].type === 'grid') {
  1148. genList[i].columns.forEach(item => {
  1149. this._setSubDisabled(item.list, fields, disabled)
  1150. })
  1151. } else if (genList[i].type === 'tabs') {
  1152. genList[i].tabs.forEach(item => {
  1153. this._setSubDisabled(item.list, fields, disabled)
  1154. })
  1155. } else if (genList[i].type === 'collapse') {
  1156. genList[i].tabs.forEach(item => {
  1157. this._setSubDisabled(item.list, fields, disabled)
  1158. })
  1159. } else if (genList[i].type === 'report') {
  1160. genList[i].rows.forEach(row => {
  1161. row.columns.forEach(column => {
  1162. this._setSubDisabled(column.list, fields, disabled)
  1163. })
  1164. })
  1165. } else if (genList[i].type === 'inline') {
  1166. this._setSubDisabled(genList[i].list, fields, disabled)
  1167. } else if (genList[i].type === 'card') {
  1168. this._setSubDisabled(genList[i].list, fields, disabled)
  1169. } else {
  1170. if (fields.length === 1) {
  1171. if (genList[i].model === fields[0]) {
  1172. this.$set(genList[i].options, 'disabled', disabled)
  1173. }
  1174. } else {
  1175. if (genList[i].model !== fields[0]) continue
  1176. let newFields = [...fields]
  1177. newFields.splice(0, 1)
  1178. if (genList[i].type === 'table') {
  1179. this._setSubDisabled(genList[i].tableColumns, newFields, disabled)
  1180. }
  1181. if (genList[i].type === 'subform') {
  1182. this._setSubDisabled(genList[i].list, newFields, disabled)
  1183. }
  1184. if (genList[i].type === 'group') {
  1185. this._setSubDisabled(genList[i].list, newFields, disabled)
  1186. }
  1187. if (genList[i].type === 'dialog') {
  1188. this._setSubDisabled(genList[i].list, newFields, disabled)
  1189. }
  1190. }
  1191. }
  1192. }
  1193. },
  1194. _setSubOptions (genList, fields, opts) {
  1195. for (let i = 0; i < genList.length; i++) {
  1196. if (fields.length === 1) {
  1197. if (genList[i].model === fields[0]) {
  1198. Object.keys(opts).forEach(key => {
  1199. this.$set(genList[i].options, key, opts[key])
  1200. })
  1201. } else{
  1202. if (genList[i].type === 'grid') {
  1203. genList[i].columns.forEach(item => {
  1204. this._setSubOptions(item.list, fields, opts)
  1205. })
  1206. } else if (genList[i].type === 'tabs') {
  1207. genList[i].tabs.forEach(item => {
  1208. this._setSubOptions(item.list, fields, opts)
  1209. })
  1210. } else if (genList[i].type === 'collapse') {
  1211. genList[i].tabs.forEach(item => {
  1212. this._setSubOptions(item.list, fields, opts)
  1213. })
  1214. } else if (genList[i].type === 'report') {
  1215. genList[i].rows.forEach(row => {
  1216. row.columns.forEach(column => {
  1217. this._setSubOptions(column.list, fields, opts)
  1218. })
  1219. })
  1220. } else if (genList[i].type === 'inline') {
  1221. this._setSubOptions(genList[i].list, fields, opts)
  1222. } else if (genList[i].type === 'card') {
  1223. this._setSubOptions(genList[i].list, fields, opts)
  1224. }
  1225. }
  1226. } else {
  1227. if (genList[i].type === 'grid') {
  1228. genList[i].columns.forEach(item => {
  1229. this._setSubOptions(item.list, fields, opts)
  1230. })
  1231. } else if (genList[i].type === 'tabs') {
  1232. genList[i].tabs.forEach(item => {
  1233. this._setSubOptions(item.list, fields, opts)
  1234. })
  1235. } else if (genList[i].type === 'collapse') {
  1236. genList[i].tabs.forEach(item => {
  1237. this._setSubOptions(item.list, fields, opts)
  1238. })
  1239. } else if (genList[i].type === 'report') {
  1240. genList[i].rows.forEach(row => {
  1241. row.columns.forEach(column => {
  1242. this._setSubOptions(column.list, fields, opts)
  1243. })
  1244. })
  1245. } else if (genList[i].type === 'inline') {
  1246. this._setSubOptions(genList[i].list, fields, opts)
  1247. } else if (genList[i].type === 'card') {
  1248. this._setSubOptions(genList[i].list, fields, opts)
  1249. } else {
  1250. if (genList[i].model !== fields[0]) continue
  1251. let newFields = [...fields]
  1252. newFields.splice(0, 1)
  1253. if (genList[i].type === 'table') {
  1254. this._setSubOptions(genList[i].tableColumns, newFields, opts)
  1255. }
  1256. if (genList[i].type === 'subform') {
  1257. this._setSubOptions(genList[i].list, newFields, opts)
  1258. }
  1259. if (genList[i].type === 'group') {
  1260. this._setSubOptions(genList[i].list, newFields, opts)
  1261. }
  1262. if (genList[i].type === 'dialog') {
  1263. this._setSubOptions(genList[i].list, newFields, opts)
  1264. }
  1265. }
  1266. }
  1267. }
  1268. },
  1269. _getSubOptions(genList, fields) {
  1270. for (let i = 0; i < genList.length; i++) {
  1271. if (fields.length === 1) {
  1272. if (genList[i].model === fields[0]) {
  1273. return genList[i].options
  1274. } else {
  1275. if (genList[i].type === 'grid') {
  1276. for (const item of genList[i].columns) {
  1277. const options = this._getSubOptions(item.list, fields)
  1278. if (options) return options
  1279. }
  1280. } else if (genList[i].type === 'tabs') {
  1281. for (const item of genList[i].tabs) {
  1282. const options = this._getSubOptions(item.list, fields)
  1283. if (options) return options
  1284. }
  1285. } else if (genList[i].type === 'collapse') {
  1286. for (const item of genList[i].tabs) {
  1287. const options = this._getSubOptions(item.list, fields)
  1288. if (options) return options
  1289. }
  1290. } else if (genList[i].type === 'report') {
  1291. for (const row of genList[i].rows) {
  1292. for (const column of row.columns) {
  1293. const options = this._getSubOptions(column.list, fields)
  1294. if (options) return options
  1295. }
  1296. }
  1297. } else if (genList[i].type === 'inline') {
  1298. const options = this._getSubOptions(genList[i].list, fields)
  1299. if (options) return options
  1300. } else if (genList[i].type === 'card') {
  1301. const options = this._getSubOptions(genList[i].list, fields)
  1302. if (options) return options
  1303. }
  1304. }
  1305. } else {
  1306. if (genList[i].type === 'grid') {
  1307. for (const item of genList[i].columns) {
  1308. const options = this._getSubOptions(item.list, fields)
  1309. if (options) return options
  1310. }
  1311. } else if (genList[i].type === 'tabs') {
  1312. for (const item of genList[i].tabs) {
  1313. const options = this._getSubOptions(item.list, fields)
  1314. if (options) return options
  1315. }
  1316. } else if (genList[i].type === 'collapse') {
  1317. for (const item of genList[i].tabs) {
  1318. const options = this._getSubOptions(item.list, fields)
  1319. if (options) return options
  1320. }
  1321. } else if (genList[i].type === 'report') {
  1322. for (const row of genList[i].rows) {
  1323. for (const column of row.columns) {
  1324. const options = this._getSubOptions(column.list, fields)
  1325. if (options) return options
  1326. }
  1327. }
  1328. } else if (genList[i].type === 'inline') {
  1329. const options = this._getSubOptions(genList[i].list, fields)
  1330. if (options) return options
  1331. } else if (genList[i].type === 'card') {
  1332. const options = this._getSubOptions(genList[i].list, fields)
  1333. if (options) return options
  1334. } else {
  1335. if (genList[i].model !== fields[0]) continue
  1336. let newFields = [...fields]
  1337. newFields.splice(0, 1)
  1338. if (genList[i].type === 'table') {
  1339. const options = this._getSubOptions(genList[i].tableColumns, newFields)
  1340. if(options) return options
  1341. }
  1342. if (genList[i].type === 'subform') {
  1343. const options = this._getSubOptions(genList[i].list, newFields)
  1344. if (options) return options
  1345. }
  1346. if (genList[i].type === 'group') {
  1347. const options = this._getSubOptions(genList[i].list, newFields)
  1348. if (options) return options
  1349. }
  1350. if (genList[i].type === 'dialog') {
  1351. const options = this._getSubOptions(genList[i].list, newFields)
  1352. if (options) return options
  1353. }
  1354. }
  1355. }
  1356. }
  1357. return null
  1358. },
  1359. validate (fields) {
  1360. if (typeof fields === 'string') {
  1361. fields = [fields]
  1362. }
  1363. return new Promise((resolve, reject) => {
  1364. if (fields && fields.length) {
  1365. this.$refs[this.formRef].validateField(fields, (error) => {
  1366. if (!error) {
  1367. resolve()
  1368. } else {
  1369. reject(error)
  1370. }
  1371. })
  1372. } else {
  1373. this.$refs[this.formRef].validate((valid, error) => {
  1374. if (valid) {
  1375. resolve()
  1376. } else {
  1377. reject(error)
  1378. }
  1379. })
  1380. }
  1381. })
  1382. },
  1383. getData (isValidate = true) {
  1384. return new Promise((resolve, reject) => {
  1385. if (isValidate) {
  1386. this.$refs[this.formRef].validate(valid => {
  1387. if (valid) {
  1388. resolve(getBindModels(this.models, this.dataBindFields))
  1389. } else {
  1390. reject(new Error(this.$t('fm.message.validError')).message)
  1391. }
  1392. })
  1393. } else {
  1394. resolve(getBindModels(this.models, this.dataBindFields))
  1395. }
  1396. })
  1397. },
  1398. reset () {
  1399. return new Promise((resolve) => {
  1400. this.setData(_.cloneDeep(this.resetModels)).then(() => {
  1401. setTimeout(() => {
  1402. this.$refs[this.formRef].clearValidate()
  1403. resolve()
  1404. })
  1405. })
  1406. })
  1407. },
  1408. onInputChange (value, field) {
  1409. this.$emit('on-change', field, value, this.models)
  1410. this.$emit(`on-${field}-change`, value)
  1411. },
  1412. display (fields) {
  1413. if (typeof fields === 'string') {
  1414. fields = [fields]
  1415. }
  1416. fields.forEach(field => {
  1417. this.$set(this.dynamicHideFields, field, false)
  1418. })
  1419. },
  1420. hide (fields) {
  1421. if (typeof fields === 'string') {
  1422. fields = [fields]
  1423. }
  1424. fields.forEach(field => {
  1425. this.$set(this.dynamicHideFields, field, true)
  1426. })
  1427. },
  1428. disabled (fields, disabled) {
  1429. if (typeof fields === 'string') {
  1430. fields = [fields]
  1431. }
  1432. fields.forEach(item => {
  1433. let currentComponent = this.instanceObject[item]
  1434. if (currentComponent) {
  1435. if (Array.isArray(currentComponent)) {
  1436. currentComponent.forEach(cc => {
  1437. cc.$parent?.disabledElement(disabled)
  1438. })
  1439. } else {
  1440. currentComponent.$parent?.disabledElement(disabled)
  1441. }
  1442. } else {
  1443. this._setSubDisabled(this.formData.list, item.split('.'), disabled)
  1444. }
  1445. })
  1446. },
  1447. addClassName (fields, className) {
  1448. if (typeof fields === 'string') {
  1449. fields = [fields]
  1450. }
  1451. fields.forEach(item => {
  1452. updateClassName(this.formData.list, item.split('.'), className, 'add')
  1453. })
  1454. },
  1455. removeClassName (fields, className) {
  1456. if (typeof fields === 'string') {
  1457. fields = [fields]
  1458. }
  1459. fields.forEach(item => {
  1460. updateClassName(this.formData.list, item.split('.'), className, 'remove')
  1461. })
  1462. },
  1463. async refresh () {
  1464. await this._initForm()
  1465. },
  1466. setData (value) {
  1467. const _setNestedValue = (currentObj, keys, value) => {
  1468. const key = keys.shift()
  1469. if (keys.length === 0) {
  1470. this.$set(currentObj, key, value)
  1471. } else {
  1472. if (key in currentObj) {
  1473. if (Array.isArray(currentObj[key])) {
  1474. if (Number.isNaN(Number(keys[0]))) {
  1475. currentObj[key].forEach(cur => {
  1476. _setNestedValue(cur, [...keys], value)
  1477. })
  1478. } else {
  1479. const indexKey = keys.shift()
  1480. currentObj[key].length > Number(indexKey) && _setNestedValue(currentObj[key][Number(indexKey)], [...keys], value)
  1481. }
  1482. } else {
  1483. _setNestedValue(currentObj[key], [...keys], value)
  1484. }
  1485. }
  1486. }
  1487. }
  1488. return new Promise((resolve) => {
  1489. this.$nextTick(() => {
  1490. Object.keys(value).forEach(item => {
  1491. _setNestedValue(this.models, item.split('.'), value[item])
  1492. })
  1493. resolve()
  1494. })
  1495. })
  1496. },
  1497. getComponent (name) {
  1498. if (name === undefined) {
  1499. return this.instanceObject
  1500. }
  1501. if (this.instanceObject[name]) {
  1502. return this.instanceObject[name]
  1503. } else {
  1504. consoleError('No component instance found with ' + name)
  1505. return null
  1506. }
  1507. },
  1508. getValues () {
  1509. return _.cloneDeep(this.models)
  1510. },
  1511. getValue (fieldName) {
  1512. const resModels = _.cloneDeep(this.models)
  1513. let fieldArray = fieldName.split('.')
  1514. const _getFieldRes = (res, array) => {
  1515. if (array.length === 1) {
  1516. return res[array[0]]
  1517. } else {
  1518. let newRes = res[array[0]]
  1519. let newFields = [...array]
  1520. newFields.splice(0, 1)
  1521. return _getFieldRes(newRes, newFields)
  1522. }
  1523. }
  1524. return _getFieldRes(resModels, fieldArray)
  1525. },
  1526. setRules (field, rules) {
  1527. this.$set(this.rules, field, [...rules])
  1528. this.$nextTick(() => {
  1529. this.$refs[this.formRef].clearValidate(field)
  1530. })
  1531. },
  1532. setOptions (fields, options) {
  1533. if (typeof fields === 'string') {
  1534. fields = [fields]
  1535. }
  1536. fields.forEach(item => {
  1537. this._setSubOptions(this.formData.list, item.split('.'), options)
  1538. })
  1539. },
  1540. getOptions (field, key) {
  1541. const result = this._getSubOptions(this.formData.list, field.split('.'))
  1542. if (key) {
  1543. return result[key]
  1544. } else {
  1545. return result
  1546. }
  1547. },
  1548. generateComponentInstance (key, instance) {
  1549. if (this.instanceObject[key]) {
  1550. if (Array.isArray(this.instanceObject[key])) {
  1551. this.instanceObject[key] = [...this.instanceObject[key], instance]
  1552. } else {
  1553. this.instanceObject[key] = [this.instanceObject[key], instance]
  1554. }
  1555. } else {
  1556. this.instanceObject[key] = instance
  1557. }
  1558. },
  1559. deleteComponentInstance (key) {
  1560. if (this.instanceObject[key]) {
  1561. delete this.instanceObject[key]
  1562. }
  1563. },
  1564. generateFormItemContext (key, instance) {
  1565. if (this.formItemContexts[key]) {
  1566. if (Array.isArray(this.formItemContexts[key])) {
  1567. this.formItemContexts[key] = [...this.formItemContexts[key], instance]
  1568. } else {
  1569. this.formItemContexts[key] = [this.formItemContexts[key], instance]
  1570. }
  1571. } else {
  1572. this.formItemContexts[key] = instance
  1573. }
  1574. },
  1575. deleteFormItemContext (key) {
  1576. if (this.formItemContexts[key]) {
  1577. delete this.formItemContexts[key]
  1578. }
  1579. },
  1580. setOptionData (fields, data) {
  1581. if (typeof fields === 'string') {
  1582. fields = [fields]
  1583. }
  1584. fields.forEach(field => {
  1585. const curRef = this.instanceObject[field]
  1586. if (Array.isArray(curRef)) {
  1587. curRef.forEach(item => {
  1588. item?.$parent?.loadOptions(data)
  1589. })
  1590. } else {
  1591. curRef?.$parent?.loadOptions(data)
  1592. }
  1593. })
  1594. },
  1595. getOptionData (field) {
  1596. const curRef = this.instanceObject[field]
  1597. return curRef?.$parent?.getOptions()
  1598. },
  1599. exportPDF () {
  1600. if (this.printRead) {
  1601. return exportPDF(document.querySelector('.fm-'+this.formStyleKey))
  1602. } else {
  1603. return Promise.reject()
  1604. }
  1605. },
  1606. print () {
  1607. if (this.printRead) {
  1608. return new Promise((resolve, reject) => {
  1609. exportPDF(document.querySelector('.fm-'+this.formStyleKey)).then(data => {
  1610. const pdfUrl = URL.createObjectURL(data)
  1611. const iframeclass = 'fmiframe-print-container'
  1612. Array.from(document.getElementsByClassName(iframeclass)).forEach(item => {
  1613. document.body.removeChild(item)
  1614. })
  1615. let iframe = document.createElement('iframe')
  1616. iframe.style.display = 'none'
  1617. iframe.src = pdfUrl
  1618. iframe.className = iframeclass
  1619. iframe.onload = function() {
  1620. setTimeout(() => {
  1621. iframe.contentWindow.print()
  1622. resolve(data)
  1623. }, 100)
  1624. }
  1625. document.body.appendChild(iframe)
  1626. })
  1627. })
  1628. } else {
  1629. return Promise.reject('Set the print-read attribute to true for printing.')
  1630. }
  1631. },
  1632. openDialog (dialogField) {
  1633. const dialogComponent = this.getComponent(dialogField)
  1634. if (dialogComponent) {
  1635. dialogComponent.open()
  1636. }
  1637. },
  1638. closeDialog (dialogField) {
  1639. const dialogComponent = this.getComponent(dialogField)
  1640. if (dialogComponent) {
  1641. dialogComponent.close()
  1642. }
  1643. },
  1644. getDynamicValue (key) {
  1645. return this.dynamicValueData.find(item => item.key == key)
  1646. }
  1647. }
  1648. }
  1649. </script>
  1650. <style lang="scss">
  1651. </style>