GenerateGroup.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. <template>
  2. <div
  3. :style="{
  4. width: element.options.width,
  5. }"
  6. :ref="`generate-group-${element.model}`"
  7. >
  8. <template v-for="item in element.list">
  9. <generate-col-item
  10. v-if="item.type == 'grid'"
  11. :key="item.key"
  12. :model="groupModel"
  13. :rules="rules"
  14. :element="item"
  15. :remote="remote"
  16. :blanks="blanks"
  17. :display="displayFields"
  18. :edit="edit"
  19. :remote-option="remoteOption"
  20. :platform="platform"
  21. :preview="preview"
  22. :container-key="containerKey"
  23. :data-source-value="dataSourceValue"
  24. :event-function="eventFunction"
  25. :print-read="printRead"
  26. :is-group="true"
  27. :is-subform="false"
  28. :group="group ? group + '.' + element.model : element.model"
  29. :field-node="fieldNode"
  30. :config="config"
  31. >
  32. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  33. <slot :name="blank.name" :model="scope.model"></slot>
  34. </template>
  35. </generate-col-item>
  36. <generate-tab-item
  37. v-else-if="item.type == 'tabs'"
  38. :key="item.key"
  39. :model="groupModel"
  40. :rules="rules"
  41. :element="item"
  42. :remote="remote"
  43. :blanks="blanks"
  44. :display="displayFields"
  45. :edit="edit"
  46. :remote-option="remoteOption"
  47. :platform="platform"
  48. :preview="preview"
  49. :container-key="containerKey"
  50. :data-source-value="dataSourceValue"
  51. :event-function="eventFunction"
  52. :print-read="printRead"
  53. :is-group="true"
  54. :is-subform="false"
  55. :group="group ? group + '.' + element.model : element.model"
  56. :field-node="fieldNode"
  57. :config="config"
  58. >
  59. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  60. <slot :name="blank.name" :model="scope.model"></slot>
  61. </template>
  62. </generate-tab-item>
  63. <generate-collapse
  64. v-else-if="item.type == 'collapse'"
  65. :key="item.key"
  66. :model="groupModel"
  67. :rules="rules"
  68. :element="item"
  69. :remote="remote"
  70. :blanks="blanks"
  71. :display="displayFields"
  72. :edit="edit"
  73. :remote-option="remoteOption"
  74. :platform="platform"
  75. :preview="preview"
  76. :container-key="containerKey"
  77. :data-source-value="dataSourceValue"
  78. :event-function="eventFunction"
  79. :print-read="printRead"
  80. :is-group="true"
  81. :is-subform="false"
  82. :group="group ? group + '.' + element.model : element.model"
  83. :field-node="fieldNode"
  84. :config="config"
  85. >
  86. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  87. <slot :name="blank.name" :model="scope.model"></slot>
  88. </template>
  89. </generate-collapse>
  90. <generate-report
  91. v-else-if="item.type == 'report'"
  92. :key="item.key"
  93. :model="groupModel"
  94. :rules="rules"
  95. :element="item"
  96. :remote="remote"
  97. :blanks="blanks"
  98. :display="displayFields"
  99. :edit="edit"
  100. :remote-option="remoteOption"
  101. :platform="platform"
  102. :preview="preview"
  103. :container-key="containerKey"
  104. :data-source-value="dataSourceValue"
  105. :event-function="eventFunction"
  106. :print-read="printRead"
  107. :is-group="true"
  108. :is-subform="false"
  109. :group="group ? group + '.' + element.model : element.model"
  110. :field-node="fieldNode"
  111. :config="config"
  112. >
  113. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  114. <slot :name="blank.name" :model="scope.model"></slot>
  115. </template>
  116. </generate-report>
  117. <generate-card
  118. v-else-if="item.type == 'card'"
  119. :key="item.key"
  120. :model="groupModel"
  121. :rules="rules"
  122. :element="item"
  123. :remote="remote"
  124. :blanks="blanks"
  125. :display="displayFields"
  126. :edit="edit"
  127. :remote-option="remoteOption"
  128. :platform="platform"
  129. :preview="preview"
  130. :container-key="containerKey"
  131. :data-source-value="dataSourceValue"
  132. :event-function="eventFunction"
  133. :print-read="printRead"
  134. :is-group="true"
  135. :is-subform="false"
  136. :group="group ? group + '.' + element.model : element.model"
  137. :field-node="fieldNode"
  138. :config="config"
  139. >
  140. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  141. <slot :name="blank.name" :model="scope.model"></slot>
  142. </template>
  143. </generate-card>
  144. <generate-inline
  145. v-else-if="item.type == 'inline'"
  146. :key="item.key"
  147. :model="groupModel"
  148. :rules="rules"
  149. :element="item"
  150. :remote="remote"
  151. :blanks="blanks"
  152. :display="displayFields"
  153. :edit="edit"
  154. :remote-option="remoteOption"
  155. :platform="platform"
  156. :preview="preview"
  157. :container-key="containerKey"
  158. :data-source-value="dataSourceValue"
  159. :event-function="eventFunction"
  160. :print-read="printRead"
  161. :is-group="true"
  162. :is-subform="false"
  163. :group="group ? group + '.' + element.model : element.model"
  164. :field-node="fieldNode"
  165. :config="config"
  166. >
  167. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  168. <slot :name="blank.name" :model="scope.model"></slot>
  169. </template>
  170. </generate-inline>
  171. <generate-form-item
  172. v-else
  173. :key="item.key"
  174. :models="groupModel"
  175. :rules="rules"
  176. :widget="item"
  177. :remote="remote"
  178. :blanks="blanks"
  179. :display="displayFields"
  180. :edit="edit"
  181. :remote-option="remoteOption"
  182. :platform="platform"
  183. :preview="preview"
  184. :container-key="containerKey"
  185. :data-source-value="dataSourceValue"
  186. :event-function="eventFunction"
  187. :print-read="printRead"
  188. :is-group="true"
  189. :is-subform="false"
  190. :group="group ? group + '.' + element.model : element.model"
  191. :field-node="fieldNode"
  192. :config="config"
  193. >
  194. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  195. <slot :name="blank.name" :model="scope.model"></slot>
  196. </template>
  197. </generate-form-item>
  198. </template>
  199. </div>
  200. </template>
  201. <script>
  202. import { updateClassName } from '../../util/reuse-methods'
  203. import _ from 'lodash'
  204. export default {
  205. name: 'fm-group',
  206. components: {
  207. GenerateColItem: () => import('./GenerateColItem.vue'),
  208. GenerateFormItem: () => import('./GenerateFormItem.vue'),
  209. GenerateInline: () => import('./GenereteInline.vue'),
  210. GenerateReport: () => import('./GenerateReport.vue'),
  211. GenerateTabItem: () => import('./GenerateTabItem.vue'),
  212. GenerateCollapse: () => import('./GenerateCollapse.vue'),
  213. GenerateCard: () => import('./GenerateCard.vue')
  214. },
  215. props: ['config', 'value', 'models', 'rules', 'element', 'remote', 'blanks', 'edit', 'remoteOption', 'platform', 'preview', 'containerKey', 'dataSourceValue', 'eventFunction', 'printRead', 'group', 'fieldNode'],
  216. data () {
  217. return {
  218. displayFields: {},
  219. groupModel: this.value || {},
  220. groupDisabled: {}
  221. }
  222. },
  223. inject: ['generateComponentInstance', 'deleteComponentInstance', 'getFormComponent', 'onFormHide', 'onFormDisplay'],
  224. created () {
  225. this._generateModel(this.element.list)
  226. },
  227. mounted () {
  228. this.generateComponentInstance && this.generateComponentInstance(this.fieldNode, this.$refs[`generate-group-${this.element.model}`].$parent)
  229. },
  230. beforeDestroy () {
  231. this.deleteComponentInstance && this.deleteComponentInstance(this.fieldNode)
  232. },
  233. provide () {
  234. return {
  235. 'setGroupData': this.setGroupData
  236. }
  237. },
  238. methods: {
  239. setGroupData (value, field) {
  240. this.$set(this.groupModel, field, value)
  241. },
  242. _generateModel (genList) {
  243. for (let i = 0; i < genList.length; i++) {
  244. if (genList[i].type == 'grid') {
  245. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  246. genList[i].columns.forEach(item => {
  247. this._generateModel(item.list)
  248. })
  249. } else if (genList[i].type === 'tabs') {
  250. genList[i].tabs.forEach(item => {
  251. this._generateModel(item.list)
  252. })
  253. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  254. } else if (genList[i].type === 'collapse') {
  255. genList[i].tabs.forEach(item => {
  256. this._generateModel(item.list)
  257. })
  258. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  259. } else if (genList[i].type === 'report') {
  260. genList[i].rows.forEach(row => {
  261. row.columns.forEach(column => {
  262. this._generateModel(column.list)
  263. })
  264. })
  265. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  266. } else if (genList[i].type === 'inline') {
  267. this._generateModel(genList[i].list)
  268. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  269. } else if (genList[i].type === 'card') {
  270. this._generateModel(genList[i].list)
  271. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  272. } else {
  273. if (genList[i].type == 'blank') {
  274. this.$set(this.groupModel, genList[i].model, genList[i].options.defaultType === 'String' ? '' : (genList[i].options.defaultType === 'Object' ? {} : []))
  275. } else {
  276. this.$set(this.groupModel, genList[i].model, this.value[genList[i].model] || _.cloneDeep(genList[i].options.defaultValue))
  277. }
  278. this.$set(this.displayFields, genList[i].model, !genList[i].options.hidden)
  279. this.$set(this.groupDisabled, genList[i].model, !genList[i].options.disabled)
  280. }
  281. }
  282. },
  283. hide (fields) {
  284. if (typeof fields === 'string') {
  285. fields = [fields]
  286. }
  287. fields.forEach(field => {
  288. this.onFormHide(`${this.fieldNode}.${field}`)
  289. })
  290. },
  291. display (fields) {
  292. if (typeof fields === 'string') {
  293. fields = [fields]
  294. }
  295. fields.forEach(field => {
  296. this.onFormDisplay(`${this.fieldNode}.${field}`)
  297. })
  298. },
  299. disabled (fields, disabled) {
  300. if (typeof fields === 'string') {
  301. fields = [fields]
  302. }
  303. this._setDisabled(this.element.list, fields, disabled)
  304. },
  305. validate () {
  306. return new Promise((resolve, reject) => {
  307. let realFields = this._getAllRuleFields()
  308. Promise.all(realFields.map(fieldItem => {
  309. return new Promise((resolve2) => {
  310. this.getFormComponent().validateField(fieldItem, (error, values) => {
  311. resolve2(values)
  312. })
  313. })
  314. })).then((values) => {
  315. console.log('promise all success', values)
  316. if (values.findIndex(v => v) >= 0) {
  317. reject()
  318. } else {
  319. resolve()
  320. }
  321. })
  322. })
  323. },
  324. clearValidate () {
  325. let realFields = this._getAllRuleFields()
  326. this.getFormComponent().clearValidate(realFields)
  327. },
  328. setOptions (fields, options) {
  329. if (typeof fields === 'string') {
  330. fields = [fields]
  331. }
  332. this._setOptions(this.element.list, fields, options)
  333. },
  334. setData (value) {
  335. return new Promise((resolve) => {
  336. this.$nextTick(() => {
  337. Object.keys(value).forEach(item => {
  338. this.$set(this.groupModel, item, value[item])
  339. })
  340. resolve()
  341. })
  342. })
  343. },
  344. getValues () {
  345. return this.groupModel
  346. },
  347. getValue (fieldName) {
  348. return this.groupModel[fieldName]
  349. },
  350. addClassName (fields, className) {
  351. if (typeof fields === 'string') {
  352. fields = [fields]
  353. }
  354. fields.forEach(item => {
  355. updateClassName(this.element.list, item.split('.'), className, 'add')
  356. })
  357. },
  358. removeClassName (fields, className) {
  359. if (typeof fields === 'string') {
  360. fields = [fields]
  361. }
  362. fields.forEach(item => {
  363. updateClassName(this.element.list, item.split('.'), className, 'remove')
  364. })
  365. },
  366. _setDisabled (genList, fields, disabled) {
  367. for (let i = 0; i < genList.length; i++) {
  368. if (genList[i].type === 'grid') {
  369. genList[i].columns.forEach(item => {
  370. this._setDisabled(item.list, fields, disabled)
  371. })
  372. } else if (genList[i].type === 'tabs') {
  373. genList[i].tabs.forEach(item => {
  374. this._setDisabled(item.list, fields, disabled)
  375. })
  376. } else if (genList[i].type === 'collapse') {
  377. genList[i].tabs.forEach(item => {
  378. this._setDisabled(item.list, fields, disabled)
  379. })
  380. } else if (genList[i].type === 'report') {
  381. genList[i].rows.forEach(row => {
  382. row.columns.forEach(column => {
  383. this._setDisabled(column.list, fields, disabled)
  384. })
  385. })
  386. } else if (genList[i].type === 'inline') {
  387. this._setDisabled(genList[i].list, fields, disabled)
  388. } else if (genList[i].type === 'card') {
  389. this._setDisabled(genList[i].list, fields, disabled)
  390. } else {
  391. if (fields.indexOf(genList[i].model) >= 0) {
  392. genList[i].options.disabled = disabled
  393. }
  394. }
  395. }
  396. },
  397. _setOptions (genList, fields, opts) {
  398. for (let i = 0; i < genList.length; i++) {
  399. if (genList[i].type === 'grid') {
  400. genList[i].columns.forEach(item => {
  401. this._setOptions(item.list, fields, opts)
  402. })
  403. } else if (genList[i].type === 'tabs') {
  404. genList[i].tabs.forEach(item => {
  405. this._setOptions(item.list, fields, opts)
  406. })
  407. } else if (genList[i].type === 'collapse') {
  408. genList[i].tabs.forEach(item => {
  409. this._setOptions(item.list, fields, opts)
  410. })
  411. } else if (genList[i].type === 'report') {
  412. genList[i].rows.forEach(row => {
  413. row.columns.forEach(column => {
  414. this._setOptions(column.list, fields, opts)
  415. })
  416. })
  417. } else if (genList[i].type === 'inline') {
  418. this._setOptions(genList[i].list, fields, opts)
  419. } else if (genList[i].type === 'card') {
  420. this._setOptions(genList[i].list, fields, opts)
  421. }
  422. if (fields.indexOf(genList[i].model) >= 0) {
  423. Object.keys(opts).forEach(key => {
  424. genList[i].options[key] = opts[key]
  425. })
  426. }
  427. }
  428. },
  429. _getAllRuleFields () {
  430. let realFields = []
  431. Object.keys(this.groupModel).forEach((v) => {
  432. if (Array.isArray(this.groupModel[v])) {
  433. const currentArray = this.groupModel[v]
  434. currentArray.forEach((o, i) => {
  435. Object.keys(o).forEach((key) => {
  436. realFields.push(`${this.fieldNode}.${v}.${i}.${key}`)
  437. })
  438. })
  439. } else {
  440. realFields.push(`${this.fieldNode}.${v}`)
  441. }
  442. })
  443. return realFields
  444. }
  445. },
  446. watch: {
  447. groupModel: {
  448. deep: true,
  449. handler (val) {
  450. this.$emit('input', val)
  451. }
  452. },
  453. value: {
  454. deep: true,
  455. handler (val) {
  456. this.groupModel = val
  457. }
  458. }
  459. }
  460. }
  461. </script>