WidgetTabItem.vue 11 KB

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