GenerateColItem.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <template>
  2. <el-row
  3. :class="{
  4. [element.options && element.options.customClass]: element.options && element.options.customClass?true: false
  5. }"
  6. :type="element.options.flex ? 'flex' : ''"
  7. :gutter="element.options.gutter || 0"
  8. :justify="element.options.justify"
  9. :align="element.options.align"
  10. v-if="elementDisplay"
  11. >
  12. <el-col v-for="(item, index) in element.columns" :key="index"
  13. v-if="!hideCols.includes(index)"
  14. :span="item.options ? getColMD(item.options) : item.span"
  15. :xs="item.options ? getColXS(item.options) : item.span"
  16. :sm="item.options ? getColSM(item.options) : item.span"
  17. :md="item.options ? getColMD(item.options) : item.span"
  18. :lg="item.options ? getColMD(item.options) : item.span"
  19. :xl="item.options ? getColMD(item.options) : item.span"
  20. :offset="item.options ? item.options.offset : 0"
  21. :push="item.options ? item.options.push : 0"
  22. :pull="item.options ? item.options.pull : 0"
  23. :class="{
  24. [item.options && item.options.customClass]: item.options && item.options.customClass?true: false
  25. }"
  26. >
  27. <template v-for="col in item.list">
  28. <generate-col-item
  29. v-if="col.type == 'grid'"
  30. :key="col.key"
  31. :model="dataModels"
  32. :rules="rules"
  33. :element="col"
  34. :remote="remote"
  35. :blanks="blanks"
  36. :display="display"
  37. :sub-hide-fields="subHideFields"
  38. :sub-disabled-fields="subDisabledFields"
  39. :edit="edit"
  40. :remote-option="remoteOption"
  41. :platform="platform"
  42. :preview="preview"
  43. :container-key="containerKey"
  44. :data-source-value="dataSourceValue"
  45. :event-function="eventFunction"
  46. :print-read="printRead"
  47. :is-subform="isSubform"
  48. :row-index="rowIndex"
  49. :sub-name="subName"
  50. :is-dialog="isDialog"
  51. :dialog-name="dialogName"
  52. :is-group="isGroup"
  53. :group="group"
  54. :field-node="fieldNode"
  55. >
  56. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  57. <slot :name="blank.name" :model="scope.model"></slot>
  58. </template>
  59. </generate-col-item>
  60. <generate-tab-item
  61. v-else-if="col.type == 'tabs'"
  62. :key="col.key"
  63. :model="dataModels"
  64. :rules="rules"
  65. :element="col"
  66. :remote="remote"
  67. :blanks="blanks"
  68. :display="display"
  69. :sub-hide-fields="subHideFields"
  70. :sub-disabled-fields="subDisabledFields"
  71. :edit="edit"
  72. :remote-option="remoteOption"
  73. :platform="platform"
  74. :preview="preview"
  75. :container-key="containerKey"
  76. :data-source-value="dataSourceValue"
  77. :event-function="eventFunction"
  78. :print-read="printRead"
  79. :is-subform="isSubform"
  80. :row-index="rowIndex"
  81. :sub-name="subName"
  82. :is-dialog="isDialog"
  83. :dialog-name="dialogName"
  84. :is-group="isGroup"
  85. :group="group"
  86. :field-node="fieldNode"
  87. >
  88. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  89. <slot :name="blank.name" :model="scope.model"></slot>
  90. </template>
  91. </generate-tab-item>
  92. <generate-collapse
  93. v-else-if="col.type == 'collapse'"
  94. :key="col.key"
  95. :model="dataModels"
  96. :rules="rules"
  97. :element="col"
  98. :remote="remote"
  99. :blanks="blanks"
  100. :display="display"
  101. :sub-hide-fields="subHideFields"
  102. :sub-disabled-fields="subDisabledFields"
  103. :edit="edit"
  104. :remote-option="remoteOption"
  105. :platform="platform"
  106. :preview="preview"
  107. :container-key="containerKey"
  108. :data-source-value="dataSourceValue"
  109. :event-function="eventFunction"
  110. :print-read="printRead"
  111. :is-subform="isSubform"
  112. :row-index="rowIndex"
  113. :sub-name="subName"
  114. :is-dialog="isDialog"
  115. :dialog-name="dialogName"
  116. :is-group="isGroup"
  117. :group="group"
  118. :field-node="fieldNode"
  119. >
  120. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  121. <slot :name="blank.name" :model="scope.model"></slot>
  122. </template>
  123. </generate-collapse>
  124. <generate-report
  125. v-else-if="col.type == 'report'"
  126. :key="col.key"
  127. :model="dataModels"
  128. :rules="rules"
  129. :element="col"
  130. :remote="remote"
  131. :blanks="blanks"
  132. :display="display"
  133. :sub-hide-fields="subHideFields"
  134. :sub-disabled-fields="subDisabledFields"
  135. :edit="edit"
  136. :remote-option="remoteOption"
  137. :platform="platform"
  138. :preview="preview"
  139. :container-key="containerKey"
  140. :data-source-value="dataSourceValue"
  141. :event-function="eventFunction"
  142. :print-read="printRead"
  143. :is-subform="isSubform"
  144. :row-index="rowIndex"
  145. :sub-name="subName"
  146. :is-dialog="isDialog"
  147. :dialog-name="dialogName"
  148. :is-group="isGroup"
  149. :group="group"
  150. :field-node="fieldNode"
  151. >
  152. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  153. <slot :name="blank.name" :model="scope.model"></slot>
  154. </template>
  155. </generate-report>
  156. <generate-card
  157. v-else-if="col.type == 'card'"
  158. :key="col.key"
  159. :model="dataModels"
  160. :rules="rules"
  161. :element="col"
  162. :remote="remote"
  163. :blanks="blanks"
  164. :display="display"
  165. :sub-hide-fields="subHideFields"
  166. :sub-disabled-fields="subDisabledFields"
  167. :edit="edit"
  168. :remote-option="remoteOption"
  169. :platform="platform"
  170. :preview="preview"
  171. :container-key="containerKey"
  172. :data-source-value="dataSourceValue"
  173. :event-function="eventFunction"
  174. :print-read="printRead"
  175. :is-subform="isSubform"
  176. :row-index="rowIndex"
  177. :sub-name="subName"
  178. :is-dialog="isDialog"
  179. :dialog-name="dialogName"
  180. :is-group="isGroup"
  181. :group="group"
  182. :field-node="fieldNode"
  183. >
  184. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  185. <slot :name="blank.name" :model="scope.model"></slot>
  186. </template>
  187. </generate-card>
  188. <generate-inline
  189. v-else-if="col.type == 'inline'"
  190. :key="col.key"
  191. :model="dataModels"
  192. :rules="rules"
  193. :element="col"
  194. :remote="remote"
  195. :blanks="blanks"
  196. :display="display"
  197. :sub-hide-fields="subHideFields"
  198. :sub-disabled-fields="subDisabledFields"
  199. :edit="edit"
  200. :remote-option="remoteOption"
  201. :platform="platform"
  202. :preview="preview"
  203. :container-key="containerKey"
  204. :data-source-value="dataSourceValue"
  205. :event-function="eventFunction"
  206. :print-read="printRead"
  207. :is-subform="isSubform"
  208. :row-index="rowIndex"
  209. :sub-name="subName"
  210. :is-dialog="isDialog"
  211. :dialog-name="dialogName"
  212. :is-group="isGroup"
  213. :group="group"
  214. :field-node="fieldNode"
  215. >
  216. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  217. <slot :name="blank.name" :model="scope.model"></slot>
  218. </template>
  219. </generate-inline>
  220. <generate-form-item
  221. v-else
  222. :key="col.key"
  223. :models="dataModels"
  224. :rules="rules"
  225. :widget="col"
  226. :remote="remote"
  227. :blanks="blanks"
  228. :display="display"
  229. :sub-hide-fields="subHideFields"
  230. :sub-disabled-fields="subDisabledFields"
  231. :edit="edit"
  232. :remote-option="remoteOption"
  233. :platform="platform"
  234. :preview="preview"
  235. :container-key="containerKey"
  236. :data-source-value="dataSourceValue"
  237. :event-function="eventFunction"
  238. :print-read="printRead"
  239. :is-subform="isSubform"
  240. :row-index="rowIndex"
  241. :sub-name="subName"
  242. :is-dialog="isDialog"
  243. :dialog-name="dialogName"
  244. :is-group="isGroup"
  245. :group="group"
  246. :field-node="fieldNode"
  247. >
  248. <template v-slot:[blank.name]="scope" v-for="blank in blanks">
  249. <slot :name="blank.name" :model="scope.model"></slot>
  250. </template>
  251. </generate-form-item>
  252. </template>
  253. </el-col>
  254. </el-row>
  255. </template>
  256. <script>
  257. import GenerateFormItem from './GenerateFormItem'
  258. import GenerateInline from './GenerateInline'
  259. import {executeExpression, isExpression, extractExpression} from '../util/expression'
  260. export default {
  261. name: 'generate-col-item',
  262. components: {
  263. GenerateFormItem,
  264. GenerateInline,
  265. GenerateTabItem: () => import('./GenerateTabItem.vue'),
  266. GenerateReport: () => import('./GenerateReport.vue'),
  267. GenerateCollapse: () => import('./GenerateCollapse.vue'),
  268. GenerateCard: () => import('./GenerateCard.vue')
  269. },
  270. props: ['element', 'model', 'rules', 'remote', 'blanks', 'display', 'edit', 'remoteOption', 'platform', 'preview', 'containerKey', 'dataSourceValue', 'eventFunction', 'printRead', 'isSubform', 'rowIndex', 'subName', 'subHideFields', 'subDisabledFields', 'isDialog', 'dialogName', 'group', 'fieldNode', 'isGroup'],
  271. data () {
  272. return {
  273. dataModels: this.model,
  274. hideCols: []
  275. }
  276. },
  277. computed: {
  278. currentOptions () {
  279. if (this.isSubform) {
  280. return {
  281. fieldNode: this.fieldNode ? `${this.fieldNode}.${this.element.model}` : this.element.model,
  282. rowIndex: this.rowIndex,
  283. row: this.model
  284. }
  285. } else {
  286. return {
  287. fieldNode: this.fieldNode ? `${this.fieldNode}.${this.element.model}` : this.element.model,
  288. }
  289. }
  290. },
  291. elementDisplay () {
  292. let curFullField = this.fieldNode ? this.fieldNode + '.' + this.element.model : this.element.model
  293. let curField = this.group ? this.group + '.' + this.element.model : this.element.model
  294. if (this.dynamicHideFields[curFullField] != undefined) {
  295. return !this.dynamicHideFields[curFullField]
  296. }
  297. if (this.dynamicHideFields[curField] != undefined) {
  298. return !this.dynamicHideFields[curField]
  299. }
  300. if (typeof this.element.options.hidden === 'boolean') {
  301. return !this.element.options.hidden
  302. } else {
  303. if (isExpression(this.element.options.hidden)) {
  304. return !executeExpression(extractExpression(this.element.options.hidden), this.currentOptions, this.formContext)
  305. }
  306. }
  307. return true
  308. }
  309. },
  310. inject: ['generateComponentInstance', 'deleteComponentInstance', 'dynamicHideFields', 'formContext'],
  311. mounted () {
  312. this.generateComponentInstance && this.generateComponentInstance(this.fieldNode ? `${this.fieldNode}.${this.element.model}` : this.element.model, this)
  313. },
  314. beforeUnmount () {
  315. this.deleteComponentInstance && this.deleteComponentInstance(this.fieldNode ? `${this.fieldNode}.${this.element.model}` : this.element.model)
  316. },
  317. methods: {
  318. getColXS (options) {
  319. if (this.preview) {
  320. if (this.platform == 'pc') {
  321. return options.md
  322. }
  323. if (this.platform == 'pad') {
  324. return options.sm
  325. }
  326. if (this.platform == 'mobile') {
  327. return options.xs
  328. }
  329. } else {
  330. return options.xs
  331. }
  332. },
  333. getColSM (options) {
  334. if (this.preview) {
  335. if (this.platform == 'pc') {
  336. return options.md
  337. }
  338. if (this.platform == 'pad') {
  339. return options.sm
  340. }
  341. if (this.platform == 'mobile') {
  342. return options.xs
  343. }
  344. } else {
  345. return options.sm
  346. }
  347. },
  348. getColMD (options) {
  349. if (this.preview) {
  350. if (this.platform == 'pc') {
  351. return options.md
  352. }
  353. if (this.platform == 'pad') {
  354. return options.sm
  355. }
  356. if (this.platform == 'mobile') {
  357. return options.xs
  358. }
  359. } else {
  360. return options.md
  361. }
  362. },
  363. hideCol (index) {
  364. !this.hideCols.includes(index) && this.hideCols.push(index)
  365. },
  366. displayCol (index) {
  367. if (this.hideCols.includes(index)) {
  368. this.hideCols.splice(this.hideCols.indexOf(index), 1)
  369. }
  370. }
  371. },
  372. watch: {
  373. model: {
  374. deep: true,
  375. handler (val) {
  376. this.dataModels = val
  377. }
  378. }
  379. }
  380. }
  381. </script>