WidgetGroup.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <template>
  2. <div class="widget-group 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="widgetGroup"
  11. >
  12. <van-field
  13. :label="element.options.hideLabel ? '' : element.name"
  14. :label-width="element.options.hideLabel ? '0px' : (element.options.isLabelWidth ? element.options.labelWidth + 'px' : config.labelWidth + 'px')"
  15. :labelAlign="element.options.labelWrap ? 'top' : config.labelPosition"
  16. style="padding-right: 2px;"
  17. >
  18. <template #input>
  19. <div style="width: 100%;">
  20. <draggable
  21. v-model="element.list"
  22. v-bind="{group:{name: 'people', put: handlePut}, ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
  23. :no-transition-on-drag="true"
  24. @add="handleWidgetGroupAdd($event, element)"
  25. @update="handleWidgetGroupUpdate"
  26. @start="setDragging(true)"
  27. @end="setDragging(false)"
  28. class="widget-col-list"
  29. :class="{
  30. [element.options && element.options.customClass]: element.options.customClass ? true : false
  31. }"
  32. item-key="key"
  33. >
  34. <template #item="{element:item, index}">
  35. <widget-tab-item
  36. v-if="item.type === 'tabs'"
  37. :key="`tabs-${item.key}`"
  38. :element="item"
  39. v-model:select="selectWidget"
  40. :index="index"
  41. :data="element"
  42. @select-change="handleSelectChange($event, item)"
  43. :platform="platform"
  44. :form-key="formKey"
  45. :config="config"
  46. >
  47. </widget-tab-item>
  48. <widget-collapse
  49. v-else-if="item.type === 'collapse'"
  50. :key="`collapse-${item.key}`"
  51. :element="item"
  52. v-model:select="selectWidget"
  53. :index="index"
  54. :data="element"
  55. @select-change="handleSelectChange($event, item)"
  56. :platform="platform"
  57. :form-key="formKey"
  58. :config="config"
  59. >
  60. </widget-collapse>
  61. <widget-table
  62. v-else-if="item.type === 'table'"
  63. :key="`table-${item.key}`"
  64. :element="item"
  65. v-model:select="selectWidget"
  66. :index="index"
  67. :data="element"
  68. @select-change="handleSelectChange($event, item)"
  69. :platform="platform"
  70. :form-key="formKey"
  71. :config="config"
  72. >
  73. </widget-table>
  74. <widget-sub-form
  75. v-else-if="item.type === 'subform'"
  76. :key="`subform-${item.key}`"
  77. :element="item"
  78. v-model:select="selectWidget"
  79. :index="index"
  80. :data="element"
  81. @select-change="handleSelectChange($event, item)"
  82. :platform="platform"
  83. :form-key="formKey"
  84. :config="config"
  85. >
  86. </widget-sub-form>
  87. <widget-card
  88. v-else-if="item.type === 'card'"
  89. :key="`card-${item.key}`"
  90. :element="item"
  91. v-model:select="selectWidget"
  92. :index="index"
  93. :data="element"
  94. @select-change="handleSelectChange($event, item)"
  95. :platform="platform"
  96. :form-key="formKey"
  97. :config="config"
  98. >
  99. </widget-card>
  100. <widget-inline
  101. v-else-if="item.type === 'inline'"
  102. :key="`inline-${item.key}`"
  103. :element="item"
  104. v-model:select="selectWidget"
  105. :index="index"
  106. :data="element"
  107. @select-change="handleSelectChange($event, item)"
  108. :platform="platform"
  109. :form-key="formKey"
  110. :config="config"
  111. ></widget-inline>
  112. <widget-group
  113. v-else-if="item.type === 'group'"
  114. :key="`group-${item.key}`"
  115. :element="item"
  116. v-model:select="selectWidget"
  117. :index="index"
  118. :data="element"
  119. @select-change="handleSelectChange($event, item)"
  120. :platform="platform"
  121. :form-key="formKey"
  122. :config="config"
  123. >
  124. </widget-group>
  125. <widget-col-item
  126. v-else-if="item.type === 'grid'"
  127. :key="`grid-${item.key}`"
  128. :element="item"
  129. v-model:select="selectWidget"
  130. :index="index"
  131. :data="element"
  132. @select-change="handleSelectChange($event, item)"
  133. :platform="platform"
  134. :form-key="formKey"
  135. :config="config"
  136. >
  137. </widget-col-item>
  138. <widget-form-item
  139. v-else
  140. :key="`form-item-${item.key}`"
  141. :element="item"
  142. v-model:select="selectWidget"
  143. :index="index" :data="element"
  144. @select-change="handleSelectChange($event, item)"
  145. :form-key="formKey"
  146. :config="config"
  147. >
  148. </widget-form-item>
  149. </template>
  150. </draggable>
  151. </div>
  152. </template>
  153. </van-field>
  154. <div class="widget-view-action widget-subform-action" v-if="select.key == element.key">
  155. <i class="fm-iconfont icon-icon_clone" @click.stop="handleWidgetClone(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-subform-drag" v-if="select.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 Draggable from 'vuedraggable/src/vuedraggable'
  171. import WidgetFormItem from './WidgetFormItem.vue'
  172. import { widgetGroupMixin } from '../../mixins/widgetGroup.js'
  173. import { defineAsyncComponent } from 'vue'
  174. export default {
  175. name: 'widget-group',
  176. components: {
  177. Draggable,
  178. WidgetFormItem,
  179. WidgetColItem: defineAsyncComponent(() => import('./WidgetColItem.vue')),
  180. WidgetTabItem: defineAsyncComponent(() => import('./WidgetTabItem.vue')),
  181. WidgetCollapse: defineAsyncComponent(() => import('./WidgetCollapse.vue')),
  182. WidgetTable: defineAsyncComponent(() => import('./WidgetTable.vue')),
  183. WidgetSubForm: defineAsyncComponent(() => import('./WidgetSubForm.vue')),
  184. WidgetCard: defineAsyncComponent(() => import('./WidgetCard.vue')),
  185. WidgetInline: defineAsyncComponent(() => import('./WidgetInline.vue')),
  186. },
  187. props: ['config'],
  188. mixins: [widgetGroupMixin]
  189. }
  190. </script>