WidgetSubForm.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <template>
  2. <div class="widget-subform widget-view"
  3. :class="{
  4. active: select.key && select.key == element.key,
  5. 'is_hidden': element.options.hidden
  6. }"
  7. @click.stop="handleSelectWidget(index)"
  8. @mouseover.stop="handleMouseover"
  9. @mouseout="handleMouseout"
  10. ref="widgetSubform"
  11. >
  12. <el-form-item
  13. :label="element.options.hideLabel ? '' : element.name"
  14. :label-width="element.options.hideLabel ? '0px' : (element.options.isLabelWidth ? element.options.labelWidth + 'px' : '')"
  15. :class="{
  16. [element.options && element.options.customClass]: element.options.customClass?true: false,
  17. 'fm-label-wrap': element.options.labelWrap
  18. }"
  19. >
  20. <div v-if="element.options.tip" class="fm-item-tooltip" v-html="element.options.tip.replace(/\n/g, '<br/>')"></div>
  21. <div class="widget-subform-wrapper">
  22. <draggable
  23. v-model="element.list"
  24. v-bind="{group:{name: 'people', put: handlePut}, ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
  25. :no-transition-on-drag="true"
  26. @add="handleWidgetSubFormAdd($event, element)"
  27. @update="handleWidgetSubFormUpdate"
  28. @start="setDragging(true)"
  29. @end="setDragging(false)"
  30. class="widget-col-list"
  31. :class="{
  32. [element.options && element.options.customClass]: element.options.customClass ? true : false
  33. }"
  34. >
  35. <template v-for="(item, index) in element.list">
  36. <widget-tab-item
  37. v-if="item.type === 'tabs'"
  38. :key="item.key"
  39. :element="item"
  40. :select.sync="selectWidget"
  41. :index="index"
  42. :data="element"
  43. @select-change="handleSelectChange($event, item)"
  44. :platform="platform"
  45. :form-key="formKey"
  46. :subform="true"
  47. >
  48. </widget-tab-item>
  49. <widget-collapse
  50. v-else-if="item.type === 'collapse'"
  51. :key="item.key"
  52. :element="item"
  53. :select.sync="selectWidget"
  54. :index="index"
  55. :data="element"
  56. @select-change="handleSelectChange($event, item)"
  57. :platform="platform"
  58. :form-key="formKey"
  59. :subform="true"
  60. >
  61. </widget-collapse>
  62. <widget-card
  63. v-else-if="item.type === 'card'"
  64. :key="item.key"
  65. :element="item"
  66. :select.sync="selectWidget"
  67. :index="index"
  68. :data="element"
  69. @select-change="handleSelectChange($event, item)"
  70. :platform="platform"
  71. :form-key="formKey"
  72. :subform="true"
  73. >
  74. </widget-card>
  75. <widget-group
  76. v-else-if="item.type === 'group'"
  77. :key="item.key"
  78. :element="item"
  79. :select.sync="selectWidget"
  80. :index="index"
  81. :data="element"
  82. @select-change="handleSelectChange($event, item)"
  83. :platform="platform"
  84. :form-key="formKey"
  85. :subform="true"
  86. >
  87. </widget-group>
  88. <widget-inline
  89. v-else-if="item.type === 'inline'"
  90. :key="item.key"
  91. :element="item"
  92. :select.sync="selectWidget"
  93. :index="index"
  94. :data="element"
  95. @select-change="handleSelectChange($event, item)"
  96. :platform="platform"
  97. :form-key="formKey"
  98. :subform="true"
  99. ></widget-inline>
  100. <widget-report
  101. v-else-if="item.type === 'report'"
  102. :key="item.key"
  103. :element="item"
  104. :select.sync="selectWidget"
  105. :index="index"
  106. :data="element"
  107. @select-change="handleSelectChange($event, item)"
  108. :platform="platform"
  109. :form-key="formKey"
  110. :subform="true"
  111. >
  112. </widget-report>
  113. <widget-sub-form
  114. v-else-if="item.type === 'subform'"
  115. :key="item.key"
  116. :element="item"
  117. :select.sync="selectWidget"
  118. :index="index"
  119. :data="element"
  120. @select-change="handleSelectChange($event, item)"
  121. :platform="platform"
  122. :form-key="formKey"
  123. :subform="true"
  124. >
  125. </widget-sub-form>
  126. <widget-table
  127. v-else-if="item.type === 'table'"
  128. :key="item.key"
  129. :element="item"
  130. :select.sync="selectWidget"
  131. :index="index"
  132. :data="element"
  133. @select-change="handleSelectChange($event, item)"
  134. :platform="platform"
  135. :form-key="formKey"
  136. :subform="true"
  137. >
  138. </widget-table>
  139. <widget-form-item
  140. v-else-if="item.type !== 'grid'"
  141. :key="item.key"
  142. :element="item"
  143. :select.sync="selectWidget"
  144. :index="index" :data="element"
  145. @select-change="handleSelectChange($event, item)"
  146. :form-key="formKey"
  147. >
  148. </widget-form-item>
  149. <widget-col-item
  150. v-else
  151. :key="item.key"
  152. :element="item"
  153. :select.sync="selectWidget"
  154. :index="index"
  155. :data="element"
  156. @select-change="handleSelectChange($event, item)"
  157. :platform="platform"
  158. :form-key="formKey"
  159. :subform="true"
  160. >
  161. </widget-col-item>
  162. </template>
  163. </draggable>
  164. </div>
  165. </el-form-item>
  166. <div class="widget-view-action widget-subform-action" v-if="select.key == element.key">
  167. <i class="fm-iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)" :title="$t('fm.tooltip.clone')"></i>
  168. <i class="fm-iconfont icon-trash" @click.stop="handleWidgetDelete(index)" :title="$t('fm.tooltip.trash')"></i>
  169. </div>
  170. <div class="widget-view-drag widget-subform-drag" v-if="select.key == element.key">
  171. <i class="fm-iconfont icon-drag drag-widget"></i>
  172. </div>
  173. <div class="widget-view-model " :style="{'color': element.options.dataBind ? '' : '#666'}">
  174. <span>{{element.model}}</span>
  175. </div>
  176. <div class="widget-view-type ">
  177. <span>{{element.type ? this.$t('fm.components.fields.' + element.type) : ''}}</span>
  178. </div>
  179. </div>
  180. </template>
  181. <script>
  182. import Draggable from 'vuedraggable'
  183. import WidgetFormItem from './WidgetFormItem.vue'
  184. import WidgetInline from './WidgetInline.vue'
  185. import WidgetTable from './WidgetTable.vue'
  186. import { defineAsyncComponent } from 'vue'
  187. import _ from 'lodash'
  188. import { CloneLayout } from '../util/layout-clone.js'
  189. import { EventBus } from '../util/event-bus.js'
  190. import { generateKeyToTD, generateKeyToTH, generateKeyToCol, fixDraggbleList, addClass, removeClass } from '../util'
  191. export default {
  192. name: 'widget-sub-form',
  193. components: {
  194. Draggable,
  195. WidgetFormItem,
  196. WidgetInline,
  197. WidgetTable,
  198. WidgetColItem: () => import('./WidgetColItem.vue'),
  199. WidgetTabItem: () => import('./WidgetTabItem.vue'),
  200. WidgetReport: () => import('./WidgetReport.vue'),
  201. WidgetCollapse: () => import('./WidgetCollapse.vue'),
  202. WidgetCard: () => import('./WidgetCard.vue'),
  203. WidgetGroup: () => import('./WidgetGroup.vue')
  204. },
  205. props: ['element', 'select', 'index', 'data', 'platform', 'formKey'],
  206. inject: ['setDragging', 'getDragging'],
  207. data () {
  208. return {
  209. selectWidget: this.select || {}
  210. }
  211. },
  212. methods: {
  213. handleMouseover (e) {
  214. !this.getDragging() && addClass(this.$refs['widgetSubform'], 'is-hover')
  215. },
  216. handleMouseout (e) {
  217. removeClass(this.$refs['widgetSubform'], 'is-hover')
  218. },
  219. handlePut (a, b, c) {
  220. if (c.className.split(' ').indexOf('widget-dialog') >=0 || c.className.split(' ').indexOf('dialog-put') >= 0 || c.children[0].className.split(' ').indexOf('dialog-put') >= 0) {
  221. return false
  222. }
  223. return true
  224. },
  225. handleSelectWidget (index) {
  226. this.$emit('update:select', this.data.list[index])
  227. },
  228. handleSelectChange (index, item) {
  229. setTimeout(() => {
  230. index >=0 ? (
  231. this.$emit('update:select', this.element.list[index])
  232. ) : (
  233. this.$emit('update:select', this.data.list[this.index])
  234. )
  235. })
  236. },
  237. handleWidgetClone (index) {
  238. let cloneData = _.cloneDeep(this.data.list[index])
  239. this.data.list.splice(index + 1, 0, CloneLayout(cloneData))
  240. this.$nextTick(() => {
  241. this.$emit('update:select', this.data.list[index + 1])
  242. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  243. })
  244. },
  245. handleWidgetDelete (index) {
  246. if (this.data.list.length == 1) {
  247. this.$emit('select-change', -1)
  248. } else {
  249. if (this.data.list.length - 1 == index) {
  250. this.$emit('select-change', index - 1)
  251. } else {
  252. this.$emit('select-change', index)
  253. }
  254. }
  255. this.data.list.splice(index, 1)
  256. setTimeout(() => {
  257. EventBus.$emit('on-history-add-' + this.formKey)
  258. }, 20)
  259. },
  260. handleWidgetSubFormAdd ($event, element) {
  261. const newIndex = $event.newIndex
  262. const key = Math.random().toString(36).slice(-8)
  263. fixDraggbleList(element.list, newIndex)
  264. element.list[newIndex] = _.cloneDeep(element.list[newIndex])
  265. element.list[newIndex] = {
  266. ...element.list[newIndex],
  267. options: {
  268. ...element.list[newIndex].options,
  269. remoteFunc: element.list[newIndex].options.remoteFunc || 'func_'+key,
  270. remoteOption: element.list[newIndex].options.remoteOption || 'option_'+key,
  271. tableColumn: false,
  272. subform: true
  273. },
  274. key: element.list[newIndex].key ? element.list[newIndex].key : key,
  275. model: element.list[newIndex].model ? element.list[newIndex].model : element.list[newIndex].type + '_' + key,
  276. rules: element.list[newIndex].rules ? [...element.list[newIndex].rules] : []
  277. }
  278. if (element.list[newIndex].type == 'report') {
  279. element.list[newIndex].rows = generateKeyToTD(element.list[newIndex].rows)
  280. element.list[newIndex].headerRow = generateKeyToTH(element.list[newIndex].headerRow)
  281. }
  282. if (element.list[newIndex].type == 'grid') {
  283. element.list[newIndex].columns = generateKeyToCol(element.list[newIndex].columns)
  284. }
  285. this.selectWidget = element.list[newIndex]
  286. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  287. },
  288. handleWidgetSubFormUpdate () {
  289. EventBus.$emit('on-history-add-' + this.formKey)
  290. },
  291. },
  292. watch: {
  293. select (val) {
  294. this.selectWidget = val
  295. },
  296. selectWidget (val) {
  297. this.$emit('update:select', val)
  298. }
  299. }
  300. }
  301. </script>