WidgetFormItem.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <div>
  3. <div class="widget-view"
  4. :class="{
  5. active: selectWidget.key == element.key,
  6. 'is_req': element.options.required,
  7. 'is_hidden': element.options.hidden,
  8. }"
  9. @click.stop="handleSelectWidget(index)"
  10. @mouseover.stop="handleMouseover"
  11. @mouseout="handleMouseout"
  12. v-if="element && element.key && element.type != 'divider' && element.type != 'alert'"
  13. ref="widgetFormItem"
  14. >
  15. <el-form-item
  16. :class="{
  17. [element.options && element.options.customClass]: element.options.customClass?true: false,
  18. 'fm-label-wrap': element.options.labelWrap
  19. }"
  20. :label="element.options.hideLabel ? '' : element.name"
  21. :label-width="element.options.hideLabel ? '0px' : (element.options.isLabelWidth ? element.options.labelWidth + 'px' : '')"
  22. >
  23. <div v-if="element.options.tip" class="fm-item-tooltip" v-html="element.options.tip.replace(/\n/g, '<br/>')"></div>
  24. <widget-element-item :element="element" :is-table="false" :key="element.key"></widget-element-item>
  25. </el-form-item>
  26. <div class="widget-view-action" v-if="selectWidget.key == element.key">
  27. <i class="fm-iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)" :title="$t('fm.tooltip.clone')"></i>
  28. <i class="fm-iconfont icon-trash" @click.stop="handleWidgetDelete(index)" :title="$t('fm.tooltip.trash')"></i>
  29. </div>
  30. <div class="widget-view-drag" v-if="selectWidget.key == element.key">
  31. <i class="fm-iconfont icon-drag drag-widget"></i>
  32. </div>
  33. <div class="widget-view-model" :style="{'color': element.options.dataBind ? '' : '#666'}">
  34. <span>{{element.model}}</span>
  35. </div>
  36. <div class="widget-view-type ">
  37. <span>{{element.type ? this.$t('fm.components.fields.' + element.type) : ''}}</span>
  38. </div>
  39. </div>
  40. <div class="widget-view no-put"
  41. v-if="element && element.key && (element.type == 'divider' || element.type == 'alert')"
  42. :class="{active: selectWidget.key == element.key, 'is_hidden': element.options.hidden}"
  43. @click.stop="handleSelectWidget(index)"
  44. style="padding-bottom: 0;"
  45. @mouseover.stop="handleMouseover"
  46. @mouseout="handleMouseout"
  47. ref="widgetFormItem"
  48. >
  49. <el-form-item label-width="0">
  50. <el-divider
  51. :content-position="element.options.contentPosition"
  52. v-bind="element.options.customProps"
  53. v-if="element.type == 'divider'">
  54. {{element.name}}
  55. </el-divider>
  56. <el-alert v-if="element.type == 'alert'"
  57. :title="element.options.title"
  58. :type="element.options.type"
  59. :description="element.options.description"
  60. :closable="element.options.closable"
  61. :center="element.options.center"
  62. :show-icon="element.options.showIcon"
  63. :effect="element.options.effect"
  64. :style="{width: element.options.width}"
  65. v-bind="element.options.customProps"
  66. ></el-alert>
  67. </el-form-item>
  68. <div class="widget-view-action" v-if="selectWidget.key == element.key">
  69. <i class="fm-iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)" :title="$t('fm.tooltip.clone')"></i>
  70. <i class="fm-iconfont icon-trash" @click.stop="handleWidgetDelete(index)" :title="$t('fm.tooltip.trash')"></i>
  71. </div>
  72. <div class="widget-view-drag" v-if="selectWidget.key == element.key">
  73. <i class="fm-iconfont icon-drag drag-widget"></i>
  74. </div>
  75. <div class="widget-view-model " :style="{'color': element.options.dataBind ? '' : '#666'}">
  76. <span>{{element.model}}</span>
  77. </div>
  78. <div class="widget-view-type ">
  79. <span>{{element.type ? this.$t('fm.components.fields.' + element.type) : ''}}</span>
  80. </div>
  81. </div>
  82. </div>
  83. </template>
  84. <script>
  85. import WidgetElementItem from './WidgetElementItem'
  86. import _ from 'lodash'
  87. import { EventBus } from '../util/event-bus.js'
  88. import { addClass, removeClass } from '../util/index'
  89. export default {
  90. props: ['element', 'select', 'index', 'data', 'formKey'],
  91. components: {
  92. WidgetElementItem
  93. },
  94. inject: ['getDragging'],
  95. data () {
  96. return {
  97. selectWidget: this.select || {}
  98. }
  99. },
  100. mounted () {
  101. },
  102. methods: {
  103. handleMouseover (e) {
  104. !this.getDragging() && addClass(this.$refs['widgetFormItem'], 'is-hover')
  105. },
  106. handleMouseout (e) {
  107. removeClass(this.$refs['widgetFormItem'], 'is-hover')
  108. },
  109. handleSelectWidget (index) {
  110. this.selectWidget = this.data.list[index]
  111. },
  112. handleWidgetDelete (index) {
  113. if (this.data.list.length == 1) {
  114. this.$emit('select-change', -1)
  115. } else {
  116. if (this.data.list.length - 1 == index) {
  117. this.$emit('select-change', index - 1)
  118. } else {
  119. this.$emit('select-change', index)
  120. }
  121. }
  122. this.$nextTick(() => {
  123. this.data.list.splice(index, 1)
  124. setTimeout(() => {
  125. EventBus.$emit('on-history-add-' + this.formKey)
  126. }, 20)
  127. })
  128. },
  129. handleWidgetClone (index) {
  130. const key = Math.random().toString(36).slice(-8)
  131. let cloneData = {
  132. ..._.cloneDeep(this.data.list[index]),
  133. key,
  134. model: this.data.list[index].type + '_' + key,
  135. }
  136. this.data.list.splice(index + 1, 0, cloneData)
  137. this.$nextTick(() => {
  138. this.selectWidget = this.data.list[index + 1]
  139. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  140. })
  141. }
  142. },
  143. watch: {
  144. select (val) {
  145. this.selectWidget = val
  146. },
  147. selectWidget: {
  148. handler (val) {
  149. this.$emit('update:select', val)
  150. },
  151. deep: false
  152. }
  153. }
  154. }
  155. </script>