WidgetFormItem.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <div>
  3. <el-form-item class="widget-view "
  4. v-if="element && element.key && element.type != 'divider'"
  5. :class="{active: selectWidget.key == element.key, 'is_req': element.options.required, 'is_hidden': element.options.hidden}"
  6. :label="element.name"
  7. :label-width="element.options.isLabelWidth ? element.options.labelWidth + 'px' : ''"
  8. @click.native.stop="handleSelectWidget(index)"
  9. >
  10. <widget-element-item :element="element" :is-table="false" :key="element.key"></widget-element-item>
  11. <div class="widget-view-action" v-if="selectWidget.key == element.key">
  12. <i class="iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)"></i>
  13. <i class="iconfont icon-trash" @click.stop="handleWidgetDelete(index)"></i>
  14. </div>
  15. <div class="widget-view-drag" v-if="selectWidget.key == element.key">
  16. <i class="iconfont icon-drag drag-widget"></i>
  17. </div>
  18. <!-- <div class="widget-view-model" v-if="element.options.dataBind">
  19. <span>{{element.model}}</span>
  20. </div> -->
  21. </el-form-item>
  22. <div class="widget-view no-put"
  23. v-if="element && element.key && element.type == 'divider'"
  24. :class="{active: selectWidget.key == element.key, 'is_hidden': element.options.hidden}"
  25. @click.stop="handleSelectWidget(index)"
  26. style="padding-bottom: 0;"
  27. >
  28. <el-divider :content-position="element.options.contentPosition">
  29. {{element.name}}
  30. </el-divider>
  31. <div class="widget-view-action" v-if="selectWidget.key == element.key">
  32. <i class="iconfont icon-icon_clone" @click.stop="handleWidgetClone(index)"></i>
  33. <i class="iconfont icon-trash" @click.stop="handleWidgetDelete(index)"></i>
  34. </div>
  35. <div class="widget-view-drag" v-if="selectWidget.key == element.key">
  36. <i class="iconfont icon-drag drag-widget"></i>
  37. </div>
  38. <div class="widget-view-model" v-if="element.options.dataBind">
  39. <span>{{element.model}}</span>
  40. </div>
  41. </div>
  42. </div>
  43. </template>
  44. <script>
  45. import WidgetElementItem from './WidgetElementItem'
  46. import _ from 'lodash'
  47. import { EventBus } from '../util/event-bus.js'
  48. export default {
  49. props: ['element', 'select', 'index', 'data'],
  50. components: {
  51. WidgetElementItem
  52. },
  53. data () {
  54. return {
  55. selectWidget: this.select
  56. }
  57. },
  58. mounted () {
  59. },
  60. methods: {
  61. handleSelectWidget (index) {
  62. this.selectWidget = this.data.list[index]
  63. },
  64. handleWidgetDelete (index) {
  65. if (this.data.list.length == 1) {
  66. this.$emit('select-change', -1)
  67. } else {
  68. if (this.data.list.length - 1 == index) {
  69. this.$emit('select-change', index - 1)
  70. } else {
  71. this.$emit('select-change', index)
  72. }
  73. }
  74. this.$nextTick(() => {
  75. this.data.list.splice(index, 1)
  76. setTimeout(() => {
  77. EventBus.$emit('on-history-add')
  78. }, 20)
  79. })
  80. },
  81. handleWidgetClone (index) {
  82. const key = new Date().getTime() + ''
  83. let cloneData = {
  84. ..._.cloneDeep(this.data.list[index]),
  85. key,
  86. model: this.data.list[index].type + key,
  87. }
  88. this.data.list.splice(index + 1, 0, cloneData)
  89. this.$nextTick(() => {
  90. this.selectWidget = this.data.list[index + 1]
  91. this.$nextTick(() => { EventBus.$emit('on-history-add') })
  92. })
  93. }
  94. },
  95. watch: {
  96. select (val) {
  97. this.selectWidget = val
  98. },
  99. selectWidget: {
  100. handler (val) {
  101. this.$emit('update:select', val)
  102. },
  103. deep: true
  104. }
  105. }
  106. }
  107. </script>