WidgetTabItem.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. item-key="key"
  37. >
  38. <template #item="{element: tab, index: tabindex}">
  39. <widget-tab-item
  40. v-if="tab.type === 'tabs'"
  41. :key="`tabs-${tab.key}`"
  42. :element="tab"
  43. v-model:select="selectWidget"
  44. :index="tabindex" :data="item"
  45. @select-change="handleSelectChange($event, item)"
  46. :platform="platform"
  47. :form-key="formKey"
  48. :subform="subform"
  49. >
  50. </widget-tab-item>
  51. <widget-collapse
  52. v-else-if="tab.type === 'collapse'"
  53. :key="`collapse-${tab.key}`"
  54. :element="tab"
  55. v-model:select="selectWidget"
  56. :index="tabindex" :data="item"
  57. @select-change="handleSelectChange($event, item)"
  58. :platform="platform"
  59. :form-key="formKey"
  60. :subform="subform"
  61. >
  62. </widget-collapse>
  63. <widget-table
  64. v-else-if="tab.type === 'table'"
  65. :key="`table-${tab.key}`"
  66. :element="tab"
  67. v-model:select="selectWidget"
  68. :index="tabindex" :data="item"
  69. @select-change="handleSelectChange($event, item)"
  70. :platform="platform"
  71. :form-key="formKey"
  72. >
  73. </widget-table>
  74. <widget-sub-form
  75. v-else-if="tab.type === 'subform'"
  76. :key="`subform-${tab.key}`"
  77. :element="tab"
  78. v-model:select="selectWidget"
  79. :index="tabindex" :data="item"
  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="tab.type === 'card'"
  87. :key="`card-${tab.key}`"
  88. :element="tab"
  89. v-model:select="selectWidget"
  90. :index="tabindex" :data="item"
  91. @select-change="handleSelectChange($event, item)"
  92. :platform="platform"
  93. :form-key="formKey"
  94. >
  95. </widget-card>
  96. <widget-group
  97. v-else-if="tab.type === 'group'"
  98. :key="`group-${tab.key}`"
  99. :element="tab"
  100. v-model:select="selectWidget"
  101. :index="tabindex" :data="item"
  102. @select-change="handleSelectChange($event, item)"
  103. :platform="platform"
  104. :form-key="formKey"
  105. >
  106. </widget-group>
  107. <widget-inline
  108. v-else-if="tab.type === 'inline'"
  109. :key="`inline-${tab.key}`"
  110. :element="tab"
  111. v-model:select="selectWidget"
  112. :index="tabindex" :data="item"
  113. @select-change="handleSelectChange($event, item)"
  114. :platform="platform"
  115. :form-key="formKey"
  116. ></widget-inline>
  117. <widget-report
  118. v-else-if="tab.type === 'report'"
  119. :key="`report-${tab.key}`"
  120. :element="tab"
  121. v-model:select="selectWidget"
  122. :index="tabindex"
  123. :data="item"
  124. @select-change="handleSelectChange($event, item)"
  125. :platform="platform"
  126. :form-key="formKey"
  127. :subform="subform"
  128. >
  129. </widget-report>
  130. <widget-form-item
  131. v-else-if="tab.type !== 'grid'"
  132. :key="`form-item-${tab.key}`"
  133. :element="tab"
  134. v-model:select="selectWidget"
  135. :index="tabindex" :data="item"
  136. @select-change="handleSelectChange($event, item)"
  137. :form-key="formKey"
  138. >
  139. </widget-form-item>
  140. <widget-col-item
  141. v-else
  142. :key="`grid-${tab.key}`"
  143. :element="tab"
  144. v-model:select="selectWidget"
  145. :index="tabindex" :data="item"
  146. @select-change="handleSelectChange($event, item)"
  147. :platform="platform"
  148. :form-key="formKey"
  149. :subform="subform"
  150. >
  151. </widget-col-item>
  152. </template>
  153. </draggable>
  154. </el-tab-pane>
  155. </el-tabs>
  156. <div class="widget-view-action widget-col-action" v-if="selectWidget.key == element.key">
  157. <i class="fm-iconfont icon-icon_clone" @click.stop="handleTabClone(index)" :title="$t('fm.tooltip.clone')"></i>
  158. <i class="fm-iconfont icon-trash" @click.stop="handleWidgetDelete(index)" :title="$t('fm.tooltip.trash')"></i>
  159. </div>
  160. <div class="widget-view-drag widget-col-drag" v-if="selectWidget.key == element.key">
  161. <i class="fm-iconfont icon-drag drag-widget"></i>
  162. </div>
  163. <div class="widget-view-model " :style="{'color': element.options.dataBind ? '' : '#666'}">
  164. <span>{{element.model}}</span>
  165. </div>
  166. <div class="widget-view-type ">
  167. <span>{{element.type ? this.$t('fm.components.fields.' + element.type) : ''}}</span>
  168. </div>
  169. </div>
  170. </template>
  171. <script>
  172. import WidgetFormItem from './WidgetFormItem.vue'
  173. import WidgetTable from './WidgetTable.vue'
  174. import WidgetInline from './WidgetInline.vue'
  175. import Draggable from 'vuedraggable/src/vuedraggable'
  176. import { defineAsyncComponent } from 'vue'
  177. import { widgetTabItemMixin } from '../mixins/widgetTabItem.js'
  178. export default {
  179. name: 'widget-tab-item',
  180. components: {
  181. WidgetFormItem,
  182. WidgetTable,
  183. WidgetInline,
  184. Draggable,
  185. WidgetColItem: defineAsyncComponent(() => import('./WidgetColItem.vue')),
  186. WidgetReport: defineAsyncComponent(() => import('./WidgetReport.vue')),
  187. WidgetSubForm: defineAsyncComponent(() => import('./WidgetSubForm.vue')),
  188. WidgetCollapse: defineAsyncComponent(() => import('./WidgetCollapse.vue')),
  189. WidgetCard: defineAsyncComponent(() => import('./WidgetCard.vue')),
  190. WidgetGroup: defineAsyncComponent(() => import('./WidgetGroup.vue'))
  191. },
  192. mixins: [widgetTabItemMixin]
  193. }
  194. </script>