WidgetDialog.vue 11 KB

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