index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. <template>
  2. <div class="form-subform">
  3. <div class="form-subform-item"
  4. v-for="(t, index) in (paging ? pagingLength : subformData)"
  5. :key="(paging ? pageSize * (currentPage - 1) : 0) + index"
  6. @mouseover.stop="handleMouseover((paging ? pageSize * (currentPage - 1) : 0) + index)"
  7. @mouseout="handleMouseout((paging ? pageSize * (currentPage - 1) : 0) + index)"
  8. :ref="`formSubformItem_${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  9. >
  10. <div class="form-subform-index" v-if="showControl">
  11. <el-tag round size="small">#{{(paging ? pageSize * (currentPage - 1) : 0) + index + 1}}</el-tag>
  12. </div>
  13. <div class="form-subform-remove" v-if="showControl">
  14. <el-popconfirm :teleported="false" :title="$t('fm.description.deleteConfirm')" @confirm="handleRemove((paging ? pageSize * (currentPage - 1) : 0) + index)">
  15. <el-button slot="reference" v-if="!printRead && isDelete" :disabled="disableddata" type="danger" icon="el-icon-delete" circle></el-button>
  16. </el-popconfirm>
  17. <el-tag round size="small" v-if="printRead || !isDelete">#{{(paging ? pageSize * (currentPage - 1) : 0) + index + 1}}</el-tag>
  18. </div>
  19. <div class="form-subform-content">
  20. <template v-for="item in list">
  21. <generate-col-item
  22. v-if="item.type == 'grid'"
  23. :key="item.key"
  24. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  25. :rules="rules"
  26. :element="item"
  27. :remote="remote"
  28. :blanks="blanks"
  29. :display="displayFields"
  30. :sub-hide-fields="subHideFields"
  31. :sub-disabled-fields="subDisabledFields"
  32. :edit="!disableddata"
  33. :remote-option="remoteOption"
  34. :platform="platform"
  35. :preview="preview"
  36. :container-key="containerKey"
  37. :data-source-value="dataSourceValue"
  38. :event-function="eventFunction"
  39. :print-read="printRead"
  40. :is-subform="true"
  41. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  42. :sub-name="name"
  43. :is-dialog="isDialog"
  44. :dialog-name="dialogName"
  45. :is-group="false"
  46. :group="group ? `${group}.${name}` : name"
  47. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  48. >
  49. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  50. <slot :name="blank.name" :model="scope.model"></slot>
  51. </template>
  52. </generate-col-item>
  53. <generate-tab-item
  54. v-else-if="item.type == 'tabs'"
  55. :key="item.key"
  56. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  57. :rules="rules"
  58. :element="item"
  59. :remote="remote"
  60. :blanks="blanks"
  61. :display="displayFields"
  62. :sub-hide-fields="subHideFields"
  63. :sub-disabled-fields="subDisabledFields"
  64. :edit="!disableddata"
  65. :remote-option="remoteOption"
  66. :platform="platform"
  67. :preview="preview"
  68. :container-key="containerKey"
  69. :data-source-value="dataSourceValue"
  70. :event-function="eventFunction"
  71. :print-read="printRead"
  72. :is-subform="true"
  73. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  74. :sub-name="name"
  75. :is-dialog="isDialog"
  76. :dialog-name="dialogName"
  77. :is-group="false"
  78. :group="group ? `${group}.${name}` : name"
  79. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  80. >
  81. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  82. <slot :name="blank.name" :model="scope.model"></slot>
  83. </template>
  84. </generate-tab-item>
  85. <generate-collapse
  86. v-else-if="item.type == 'collapse'"
  87. :key="item.key"
  88. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  89. :rules="rules"
  90. :element="item"
  91. :remote="remote"
  92. :blanks="blanks"
  93. :display="displayFields"
  94. :sub-hide-fields="subHideFields"
  95. :sub-disabled-fields="subDisabledFields"
  96. :edit="!disableddata"
  97. :remote-option="remoteOption"
  98. :platform="platform"
  99. :preview="preview"
  100. :container-key="containerKey"
  101. :data-source-value="dataSourceValue"
  102. :event-function="eventFunction"
  103. :print-read="printRead"
  104. :is-subform="true"
  105. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  106. :sub-name="name"
  107. :is-dialog="isDialog"
  108. :dialog-name="dialogName"
  109. :is-group="false"
  110. :group="group ? `${group}.${name}` : name"
  111. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  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-collapse>
  117. <generate-report
  118. v-else-if="item.type == 'report'"
  119. :key="item.key"
  120. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  121. :rules="rules"
  122. :element="item"
  123. :remote="remote"
  124. :blanks="blanks"
  125. :display="displayFields"
  126. :sub-hide-fields="subHideFields"
  127. :sub-disabled-fields="subDisabledFields"
  128. :edit="!disableddata"
  129. :remote-option="remoteOption"
  130. :platform="platform"
  131. :preview="preview"
  132. :container-key="containerKey"
  133. :data-source-value="dataSourceValue"
  134. :event-function="eventFunction"
  135. :print-read="printRead"
  136. :is-subform="true"
  137. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  138. :sub-name="name"
  139. :is-dialog="isDialog"
  140. :dialog-name="dialogName"
  141. :is-group="false"
  142. :group="group ? `${group}.${name}` : name"
  143. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  144. >
  145. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  146. <slot :name="blank.name" :model="scope.model"></slot>
  147. </template>
  148. </generate-report>
  149. <generate-card
  150. v-else-if="item.type == 'card'"
  151. :key="item.key"
  152. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  153. :rules="rules"
  154. :element="item"
  155. :remote="remote"
  156. :blanks="blanks"
  157. :display="displayFields"
  158. :sub-hide-fields="subHideFields"
  159. :sub-disabled-fields="subDisabledFields"
  160. :edit="!disableddata"
  161. :remote-option="remoteOption"
  162. :platform="platform"
  163. :preview="preview"
  164. :container-key="containerKey"
  165. :data-source-value="dataSourceValue"
  166. :event-function="eventFunction"
  167. :print-read="printRead"
  168. :is-subform="true"
  169. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  170. :sub-name="name"
  171. :is-dialog="isDialog"
  172. :dialog-name="dialogName"
  173. :is-group="false"
  174. :group="group ? `${group}.${name}` : name"
  175. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  176. >
  177. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  178. <slot :name="blank.name" :model="scope.model"></slot>
  179. </template>
  180. </generate-card>
  181. <generate-inline
  182. v-else-if="item.type == 'inline'"
  183. :key="item.key"
  184. :model="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  185. :rules="rules"
  186. :element="item"
  187. :remote="remote"
  188. :blanks="blanks"
  189. :display="displayFields"
  190. :sub-hide-fields="subHideFields"
  191. :sub-disabled-fields="subDisabledFields"
  192. :edit="!disableddata"
  193. :remote-option="remoteOption"
  194. :platform="platform"
  195. :preview="preview"
  196. :container-key="containerKey"
  197. :data-source-value="dataSourceValue"
  198. :event-function="eventFunction"
  199. :print-read="printRead"
  200. :is-subform="true"
  201. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  202. :sub-name="name"
  203. :is-dialog="isDialog"
  204. :dialog-name="dialogName"
  205. :is-group="false"
  206. :group="group ? `${group}.${name}` : name"
  207. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  208. >
  209. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  210. <slot :name="blank.name" :model="scope.model"></slot>
  211. </template>
  212. </generate-inline>
  213. <generate-form-item
  214. v-else
  215. :key="item.key"
  216. :models="subformData[(paging ? pageSize * (currentPage - 1) : 0) + index]"
  217. :rules="rules"
  218. :widget="item"
  219. :remote="remote"
  220. :blanks="blanks"
  221. :display="displayFields"
  222. :sub-hide-fields="subHideFields"
  223. :sub-disabled-fields="subDisabledFields"
  224. :edit="!disableddata"
  225. :remote-option="remoteOption"
  226. :platform="platform"
  227. :preview="preview"
  228. :container-key="containerKey"
  229. :data-source-value="dataSourceValue"
  230. :event-function="eventFunction"
  231. :print-read="printRead"
  232. :is-subform="true"
  233. :row-index="(paging ? pageSize * (currentPage - 1) : 0) + index"
  234. :sub-name="name"
  235. :is-dialog="isDialog"
  236. :dialog-name="dialogName"
  237. :is-group="false"
  238. :group="group ? `${group}.${name}` : name"
  239. :field-node="`${fieldNode}.${(paging ? pageSize * (currentPage - 1) : 0) + index}`"
  240. >
  241. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  242. <slot :name="blank.name" :model="scope.model"></slot>
  243. </template>
  244. </generate-form-item>
  245. </template>
  246. </div>
  247. </div>
  248. <el-row class="form-subform-action">
  249. <el-col :span="(preview && platform != 'mobile') || !preview ? 12 : 24" :xs="24">
  250. <el-button type="text" @click="handleAddRow" v-if="!disableddata && isAdd">
  251. <i class="fm-iconfont icon-plus" style="font-size: 12px; margin: 5px;"></i>{{$t('fm.actions.add')}}
  252. </el-button>
  253. </el-col>
  254. <el-col :span="((preview && platform != 'mobile') || !preview) && !disableddata ? 12 : 24" :xs="24">
  255. <el-pagination
  256. style="float: right;"
  257. layout="total, prev, pager, next"
  258. :page-size="pageSize"
  259. :current-page="currentPage"
  260. :total="subformData.length"
  261. :pager-count="5"
  262. @current-change="handlePageChange"
  263. v-if="paging && subformData.length"
  264. >
  265. </el-pagination>
  266. </el-col>
  267. </el-row>
  268. </div>
  269. </template>
  270. <script>
  271. import _ from 'lodash'
  272. import { addClass, removeClass } from '../../util'
  273. import { updateClassName } from '../../util/reuse-methods'
  274. export default {
  275. name: 'fm-sub-form',
  276. components: {
  277. GenerateColItem: () => import('../GenerateColItem.vue'),
  278. GenerateFormItem: () => import('../GenerateFormItem.vue'),
  279. GenerateInline: () => import('../GenerateInline.vue'),
  280. GenerateReport: () => import('../GenerateReport.vue'),
  281. GenerateTabItem: () => import('../GenerateTabItem.vue'),
  282. GenerateCollapse: () => import('../GenerateCollapse.vue'),
  283. GenerateCard: () => import('../GenerateCard.vue')
  284. },
  285. props: ['showControl', 'list', 'value', 'models', 'remote', 'blanks', 'disableddata',
  286. 'rules', 'name', 'remoteOption', 'preview', 'platform', 'dataSourceValue', 'eventFunction',
  287. 'widget', 'printRead', 'paging', 'pageSize', 'containerKey',
  288. 'isAdd', 'isDelete', 'isDialog', 'dialogName', 'group', 'fieldNode'],
  289. data () {
  290. return {
  291. subformData: this.value || [],
  292. displayFields: {},
  293. changeItem: {},
  294. pagingData: [],
  295. pagingLength: 0,
  296. currentPage: 1,
  297. itemModel: {},
  298. subHideFields: [],
  299. subDisabledFields: [],
  300. itemDisabled: {}
  301. }
  302. },
  303. created () {
  304. this._generateModel(this.list)
  305. this.loadPagingData()
  306. this.subHideFields = this.subformData.map(v => Object.fromEntries(Object.keys(this.displayFields).map(field => [field, !this.displayFields[field]])))
  307. this.subDisabledFields = this.subformData.map(v => Object.fromEntries(Object.keys(this.itemDisabled).map(field => [field, !this.itemDisabled[field]])))
  308. },
  309. provide () {
  310. return {
  311. 'setSubformData': this.setSubformData
  312. }
  313. },
  314. inject: ['onFormDisabled', 'onFormHide', 'onFormDisplay'],
  315. methods: {
  316. handleMouseover (key) {
  317. addClass(this.$refs[`formSubformItem_${key}`][0], 'is-hover')
  318. },
  319. handleMouseout (key) {
  320. removeClass(this.$refs[`formSubformItem_${key}`][0], 'is-hover')
  321. },
  322. setSubformData (value, rowIndex, field) {
  323. const newData = _.cloneDeep(this.subformData)
  324. newData[rowIndex][field] = value
  325. this.subformData = newData
  326. },
  327. setData (rowIndex, value) {
  328. if (typeof rowIndex !== 'number') {
  329. return new Promise((resolve) => {
  330. value = rowIndex
  331. this.subformData.forEach((_, index) => {
  332. Object.keys(value).forEach(item => {
  333. this.setSubformData(value[item], index, item)
  334. })
  335. })
  336. resolve()
  337. })
  338. }
  339. return new Promise((resolve) => {
  340. this.$nextTick(() => {
  341. Object.keys(value).forEach(item => {
  342. this.setSubformData(value[item], rowIndex, item)
  343. })
  344. resolve()
  345. })
  346. })
  347. },
  348. handleAddRow () {
  349. this.subformData = [...this.subformData, {...this.itemModel}]
  350. this.subHideFields.push(
  351. Object.fromEntries(Object.keys(this.displayFields).map(field => [field, !this.displayFields[field]]))
  352. )
  353. this.subDisabledFields.push(
  354. Object.fromEntries(Object.keys(this.itemDisabled).map(field => [field, !this.itemDisabled[field]]))
  355. )
  356. if (this.widget && this.widget.events && this.widget.events.onRowAdd) {
  357. let funcKey = this.widget.events.onRowAdd
  358. this.eventFunction[funcKey]({
  359. rowIndex: this.subformData.length - 1,
  360. field: this.widget.model,
  361. currentRef: this,
  362. group: this.group,
  363. fieldNode: this.fieldNode
  364. })
  365. }
  366. if (this.paging) {
  367. this.$nextTick(() => {
  368. if (this.subformData.length > this.currentPage * this.pageSize) {
  369. this.currentPage = parseInt((this.subformData.length - 1) / this.pageSize) + 1
  370. }
  371. this.loadPagingData()
  372. })
  373. }
  374. },
  375. handleRemove (index) {
  376. const removeData = {...this.subformData[index]}
  377. const tmpdata = [...this.subformData]
  378. tmpdata.splice(index, 1)
  379. this.subformData = tmpdata
  380. this.subHideFields.splice(index, 1)
  381. this.subDisabledFields.splice(index, 1)
  382. if (this.widget && this.widget.events && this.widget.events.onRowRemove) {
  383. let funcKey = this.widget.events.onRowRemove
  384. this.eventFunction[funcKey]({
  385. removeIndex: index,
  386. removeData: removeData,
  387. field: this.widget.model,
  388. currentRef: this,
  389. group: this.group,
  390. fieldNode: this.fieldNode
  391. })
  392. }
  393. this.pagingData = []
  394. this.pagingLength = 0
  395. if (this.paging) {
  396. this.$nextTick(() => {
  397. if (this.subformData.length % this.pageSize == 0 && this.currentPage > parseInt(this.subformData.length / this.pageSize)) {
  398. this.currentPage = parseInt(this.subformData.length / this.pageSize)
  399. }
  400. this.loadPagingData()
  401. })
  402. }
  403. },
  404. hide (fields) {
  405. if (typeof fields === 'string') {
  406. fields = [fields]
  407. }
  408. fields.forEach(field => {
  409. this.onFormHide(`${this.fieldNode}.${field}`)
  410. })
  411. },
  412. display (fields) {
  413. if (typeof fields === 'string') {
  414. fields = [fields]
  415. }
  416. Object.keys(this.displayFields).forEach(key => {
  417. if (fields.indexOf(key) >= 0) {
  418. this.displayFields[key] = true
  419. }
  420. })
  421. this.displayFields = {...this.displayFields}
  422. this.subformData.forEach((_, index) => {
  423. fields.forEach(field => {
  424. this.$set(this.subHideFields[index], field, false)
  425. })
  426. })
  427. },
  428. disabled (fields, disabled) {
  429. if (typeof fields === 'string') {
  430. fields = [fields]
  431. }
  432. fields.forEach(field => {
  433. this.onFormDisplay(`${this.fieldNode}.${field}`)
  434. })
  435. },
  436. hideChild (rowIndex, fields) {
  437. if (typeof fields === 'string') {
  438. fields = [fields]
  439. }
  440. fields.forEach(field => {
  441. this.onFormHide(`${this.fieldNode}.${rowIndex}.${field}`)
  442. })
  443. },
  444. displayChild (rowIndex, fields) {
  445. if (typeof fields === 'string') {
  446. fields = [fields]
  447. }
  448. fields.forEach(field => {
  449. this.onFormDisplay(`${this.fieldNode}.${rowIndex}.${field}`)
  450. })
  451. },
  452. disabledChild (rowIndex, fields, disabled) {
  453. if (typeof fields === 'string') {
  454. fields = [fields]
  455. }
  456. fields.forEach(field => {
  457. this.$set(this.subDisabledFields[rowIndex], field, disabled)
  458. this.onFormDisabled(`${this.fieldNode}.${rowIndex}.${field}`, disabled)
  459. })
  460. },
  461. setOptions (fields, options) {
  462. if (typeof fields === 'string') {
  463. fields = [fields]
  464. }
  465. this._setOptions(this.list, fields, options)
  466. },
  467. addClassName (fields, className) {
  468. if (typeof fields === 'string') {
  469. fields = [fields]
  470. }
  471. fields.forEach(item => {
  472. updateClassName(this.list, item.split('.'), className, 'add')
  473. })
  474. },
  475. removeClassName (fields, className) {
  476. if (typeof fields === 'string') {
  477. fields = [fields]
  478. }
  479. fields.forEach(item => {
  480. updateClassName(this.list, item.split('.'), className, 'remove')
  481. })
  482. },
  483. handlePageChange (val) {
  484. this.currentPage = val
  485. this.pagingData = []
  486. this.pagingLength = 0
  487. this.$nextTick(() => {
  488. this.loadPagingData()
  489. })
  490. if (this.widget && this.widget.events && this.widget.events.onPageChange) {
  491. let funcKey = this.widget.events.onPageChange
  492. this.eventFunction[funcKey]({
  493. currentPage: val,
  494. field: this.widget.model,
  495. currentRef: this,
  496. group: this.group,
  497. fieldNode: this.fieldNode
  498. })
  499. }
  500. },
  501. loadPagingData () {
  502. let beginIndex = (this.currentPage - 1) * this.pageSize
  503. let endIndex = beginIndex + this.pageSize
  504. this.pagingData = this.subformData.slice(beginIndex, endIndex)
  505. this.pagingLength = this.pagingData.length
  506. },
  507. _generateModel (genList) {
  508. for (let i = 0; i < genList.length; i++) {
  509. if (genList[i].type == 'grid') {
  510. this.displayFields[genList[i].model] = !genList[i].options.hidden
  511. genList[i].columns.forEach(item => {
  512. this._generateModel(item.list)
  513. })
  514. } else if (genList[i].type === 'tabs') {
  515. genList[i].tabs.forEach(item => {
  516. this._generateModel(item.list)
  517. })
  518. this.displayFields[genList[i].model] = !genList[i].options.hidden
  519. } else if (genList[i].type === 'collapse') {
  520. genList[i].tabs.forEach(item => {
  521. this._generateModel(item.list)
  522. })
  523. this.displayFields[genList[i].model] = !genList[i].options.hidden
  524. } else if (genList[i].type === 'report') {
  525. genList[i].rows.forEach(row => {
  526. row.columns.forEach(column => {
  527. this._generateModel(column.list)
  528. })
  529. })
  530. this.displayFields[genList[i].model] = !genList[i].options.hidden
  531. } else if (genList[i].type === 'inline') {
  532. this._generateModel(genList[i].list)
  533. this.displayFields[genList[i].model] = !genList[i].options.hidden
  534. } else if (genList[i].type === 'card') {
  535. this._generateModel(genList[i].list)
  536. this.displayFields[genList[i].model] = !genList[i].options.hidden
  537. } else {
  538. if (genList[i].type == 'blank') {
  539. this.itemModel[genList[i].model] = genList[i].options.defaultType === 'String' ? '' : (genList[i].options.defaultType === 'Object' ? {} : [])
  540. } else {
  541. this.itemModel[genList[i].model] = _.cloneDeep(genList[i].options.defaultValue)
  542. }
  543. this.displayFields[genList[i].model] = !genList[i].options.hidden
  544. this.itemDisabled[genList[i].model] = !genList[i].options.disabled
  545. }
  546. }
  547. },
  548. _setDisabled (genList, fields, disabled) {
  549. for (let i = 0; i < genList.length; i++) {
  550. if (genList[i].type === 'grid') {
  551. genList[i].columns.forEach(item => {
  552. this._setDisabled(item.list, fields, disabled)
  553. })
  554. } else if (genList[i].type === 'tabs') {
  555. genList[i].tabs.forEach(item => {
  556. this._setDisabled(item.list, fields, disabled)
  557. })
  558. } else if (genList[i].type === 'collapse') {
  559. genList[i].tabs.forEach(item => {
  560. this._setDisabled(item.list, fields, disabled)
  561. })
  562. } else if (genList[i].type === 'report') {
  563. genList[i].rows.forEach(row => {
  564. row.columns.forEach(column => {
  565. this._setDisabled(column.list, fields, disabled)
  566. })
  567. })
  568. } else if (genList[i].type === 'inline') {
  569. this._setDisabled(genList[i].list, fields, disabled)
  570. } else if (genList[i].type === 'card') {
  571. this._setDisabled(genList[i].list, fields, disabled)
  572. } else {
  573. if (fields.indexOf(genList[i].model) >= 0) {
  574. this.$set(genList[i].options, 'disabled', disabled)
  575. this.$set(this.itemDisabled, genList[i].model, !disabled)
  576. }
  577. }
  578. }
  579. },
  580. _setOptions (genList, fields, opts) {
  581. for (let i = 0; i < genList.length; i++) {
  582. if (genList[i].type === 'grid') {
  583. genList[i].columns.forEach(item => {
  584. this._setOptions(item.list, fields, opts)
  585. })
  586. } else if (genList[i].type === 'tabs') {
  587. genList[i].tabs.forEach(item => {
  588. this._setOptions(item.list, fields, opts)
  589. })
  590. } else if (genList[i].type === 'collapse') {
  591. genList[i].tabs.forEach(item => {
  592. this._setOptions(item.list, fields, opts)
  593. })
  594. } else if (genList[i].type === 'report') {
  595. genList[i].rows.forEach(row => {
  596. row.columns.forEach(column => {
  597. this._setOptions(column.list, fields, opts)
  598. })
  599. })
  600. } else if (genList[i].type === 'inline') {
  601. this._setOptions(genList[i].list, fields, opts)
  602. } else if (genList[i].type === 'card') {
  603. this._setOptions(genList[i].list, fields, opts)
  604. }
  605. if (fields.indexOf(genList[i].model) >= 0) {
  606. Object.keys(opts).forEach(key => {
  607. genList[i].options[key] = opts[key]
  608. })
  609. }
  610. }
  611. },
  612. },
  613. watch: {
  614. value (val) {
  615. this.subformData = val
  616. let hideFields = []
  617. let disabledFields = []
  618. for (let i = 0; i < this.value.length; i++) {
  619. let rowArray = Object.keys(this.displayFields)
  620. let hideRow = {}
  621. for (let f = 0; f < rowArray.length; f++) {
  622. hideRow[rowArray[f]] = this.subHideFields?.[i]?.[rowArray[f]] || !this.displayFields[rowArray[f]]
  623. }
  624. hideFields.push(hideRow)
  625. let disabledArray = Object.keys(this.itemDisabled)
  626. let disabledRow = {}
  627. for (let d = 0; d < disabledArray.length; d++) {
  628. disabledRow[disabledArray[d]] = this.subDisabledFields?.[i]?.[disabledArray[d]] || !this.itemDisabled[disabledArray[d]]
  629. }
  630. disabledFields.push(disabledRow)
  631. }
  632. this.subHideFields = hideFields
  633. this.subDisabledFields = disabledFields
  634. },
  635. subformData: {
  636. deep: true,
  637. handler (val) {
  638. this.loadPagingData()
  639. this.$emit('input', val)
  640. }
  641. }
  642. }
  643. }
  644. </script>
  645. <style lang="scss">
  646. .form-subform{
  647. .form-subform-item{
  648. display: flex;
  649. padding: 6px;
  650. &.is-hover{
  651. background-color: #f5f7fa;
  652. >.form-subform-index{
  653. display: none;
  654. }
  655. >.form-subform-remove{
  656. display: block;
  657. }
  658. }
  659. .form-subform-index{
  660. width: 50px;
  661. text-align: center;
  662. }
  663. .form-subform-content{
  664. flex: 1;
  665. >.fm-report-table__wrapper{
  666. margin: 0;
  667. }
  668. }
  669. .form-subform-remove{
  670. width: 50px;
  671. text-align: center;
  672. display: none;
  673. }
  674. }
  675. }
  676. </style>