WidgetForm.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <div class="widget-form-container">
  3. <el-form :label-position="data.labelPosition || 'left'"
  4. :label-width="data.labelWidth ? `${data.labelWidth}px` : '100px' "
  5. :label-suffix="data.labelSuffix"
  6. :model="form"
  7. ref="widgetForm"
  8. size="small">
  9. <el-row :gutter="data.gutter">
  10. <draggable class="widget-form-list"
  11. :list="data.column"
  12. :group="{ name: 'form' }"
  13. ghost-class="ghost"
  14. :animation="300"
  15. @add="handleWidgetAdd"
  16. @end="$emit('change')">
  17. <template v-for="(column, index) in data.column">
  18. <div class="widget-form-table"
  19. v-if="column.type == 'dynamic'"
  20. :key="index"
  21. :class="{ active: selectWidget.prop == column.prop }"
  22. @click="handleSelectWidget(index)">
  23. <widget-form-table :data="data"
  24. :column="column"
  25. :index="index"
  26. :select.sync="selectWidget"
  27. @change="$emit('change')"></widget-form-table>
  28. </div>
  29. <div class="widget-form-group"
  30. v-else-if="column.type == 'group'"
  31. :key="index"
  32. :class="{ active: selectWidget.prop == column.prop }"
  33. @click="handleSelectWidget(index)">
  34. <widget-form-group :data="data"
  35. :column="column"
  36. :index="index"
  37. :select.sync="selectWidget"
  38. @change="$emit('change')">
  39. </widget-form-group>
  40. </div>
  41. <el-col v-else
  42. :key="index"
  43. :md="column.span || 12"
  44. :xs="24"
  45. :offset="column.offset || 0">
  46. <el-form-item class="widget-form-item"
  47. :label="column.label"
  48. :labelWidth="column.labelWidth"
  49. :prop="column.prop"
  50. :class="{ active: selectWidget.prop == column.prop, 'required': column.required }"
  51. @click.native="handleSelectWidget(index)">
  52. <widget-form-item :item="column"
  53. :params="column.params"></widget-form-item>
  54. <el-button title="删除"
  55. @click.stop="handleWidgetDelete(index)"
  56. class="widget-action-delete"
  57. v-if="selectWidget.prop == column.prop"
  58. circle
  59. plain
  60. size="small"
  61. type="danger">
  62. <i class="iconfont icon-delete"></i>
  63. </el-button>
  64. <el-button title="复制"
  65. @click.stop="handleWidgetClone(index)"
  66. class="widget-action-clone"
  67. v-if="selectWidget.prop == column.prop"
  68. circle
  69. plain
  70. size="small"
  71. type="primary">
  72. <i class="iconfont icon-copy"></i>
  73. </el-button>
  74. </el-form-item>
  75. </el-col>
  76. </template>
  77. </draggable>
  78. </el-row>
  79. </el-form>
  80. </div>
  81. </template>
  82. <script>
  83. import WidgetFormItem from './WidgetFormItem'
  84. import WidgetFormTable from './WidgetFormTable'
  85. import WidgetFormGroup from './WidgetFormGroup'
  86. import Draggable from 'vuedraggable'
  87. export default {
  88. name: 'widget-form',
  89. components: { Draggable, WidgetFormItem, WidgetFormTable, WidgetFormGroup },
  90. props: ['data', 'select'],
  91. data () {
  92. return {
  93. selectWidget: this.select,
  94. form: {}
  95. }
  96. },
  97. methods: {
  98. handleSelectWidget (index) {
  99. this.selectWidget = this.data.column[index]
  100. },
  101. handleWidgetAdd (evt) {
  102. const newIndex = evt.newIndex
  103. const data = this.deepClone(this.data.column[newIndex])
  104. if (!data.prop) data.prop = Date.now() + '_' + Math.ceil(Math.random() * 99999)
  105. delete data.icon
  106. delete data.subfield
  107. if (data.type == 'title') {
  108. delete data.label
  109. this.form[data.prop] = data.value
  110. }
  111. this.$set(this.data.column, newIndex, data)
  112. this.handleSelectWidget(newIndex)
  113. this.$emit("change")
  114. },
  115. handleWidgetDelete (index) {
  116. if (this.data.column.length - 1 === index) {
  117. if (index === 0) this.selectWidget = {}
  118. else this.handleSelectWidget(index - 1)
  119. } else this.handleSelectWidget(index + 1)
  120. this.$nextTick(() => {
  121. this.data.column.splice(index, 1)
  122. this.$emit("change")
  123. })
  124. },
  125. handleWidgetClone (index) {
  126. let cloneData = this.deepClone(this.data.column[index])
  127. cloneData.prop = Date.now() + '_' + Math.ceil(Math.random() * 99999)
  128. this.data.column.splice(index, 0, cloneData)
  129. this.$nextTick(() => {
  130. this.handleSelectWidget(index + 1)
  131. this.$emit("change")
  132. })
  133. },
  134. },
  135. watch: {
  136. select (val) {
  137. this.selectWidget = val
  138. },
  139. selectWidget: {
  140. handler (val) {
  141. this.$emit('update:select', val)
  142. },
  143. deep: true
  144. }
  145. }
  146. }
  147. </script>