WidgetFormGroup.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <template>
  2. <div>
  3. <h4 class="widget-form-group__head" v-show="column.label">
  4. <i :class="column.icon" v-show="column.icon" style="margin-right: 10px"></i>{{ column.label }}
  5. </h4>
  6. <draggable
  7. class="widget-form-group__body"
  8. :list="column.children.column"
  9. :group="{ name: 'form' }"
  10. ghost-class="ghost"
  11. :animation="200"
  12. @add="handleWidgetGroupAdd($event, column)"
  13. @end="$emit('change')"
  14. >
  15. <template v-for="(item, groupIndex) in column.children.column">
  16. <div
  17. class="widget-form-table"
  18. v-if="item.type == 'dynamic'"
  19. :key="groupIndex"
  20. :class="{ active: selectWidget.prop == item.prop }"
  21. @click.stop="handleWidgetTableSelect(item)"
  22. >
  23. <widget-form-table
  24. :data="column.children"
  25. :column="item"
  26. :index="groupIndex"
  27. :select.sync="selectWidget"
  28. @change="$emit('change')"
  29. ></widget-form-table>
  30. </div>
  31. <el-col v-else :key="groupIndex" :md="item.span || 12" :xs="24" :offset="item.offset || 0">
  32. <el-form-item
  33. class="widget-form-group__item"
  34. :label="item.label"
  35. :prop="item.prop"
  36. :class="{ active: selectWidget.prop == item.prop, required: item.required }"
  37. @click.native.stop="handleWidgetTableSelect(item)"
  38. >
  39. <widget-form-item :item="item" :params="column.params"></widget-form-item>
  40. <el-button
  41. title="删除"
  42. @click.stop="handleWidgetTableDelete(column, groupIndex)"
  43. class="widget-form-group__item--delete"
  44. v-if="selectWidget.prop == item.prop"
  45. circle
  46. plain
  47. type="danger"
  48. >
  49. <i class="iconfont icon-delete"></i>
  50. </el-button>
  51. <el-button
  52. title="复制"
  53. @click.stop="handleWidgetTableClone(column, item)"
  54. class="widget-form-group__item--clone"
  55. v-if="selectWidget.prop == item.prop"
  56. circle
  57. plain
  58. type="primary"
  59. >
  60. <i class="iconfont icon-copy"></i>
  61. </el-button>
  62. </el-form-item>
  63. </el-col>
  64. </template>
  65. </draggable>
  66. <el-button
  67. title="删除"
  68. @click.stop="handleWidgetDelete(index)"
  69. class="widget-action-delete"
  70. v-if="selectWidget.prop == column.prop"
  71. circle
  72. plain
  73. size="small"
  74. type="danger"
  75. >
  76. <i class="iconfont icon-delete"></i>
  77. </el-button>
  78. <el-button
  79. title="清空"
  80. @click.stop="handleWidgetClear(index)"
  81. class="widget-action-clear"
  82. v-if="selectWidget.prop == column.prop"
  83. circle
  84. plain
  85. size="small"
  86. type="warning"
  87. >
  88. <i class="iconfont icon-clear"></i>
  89. </el-button>
  90. <el-button
  91. title="复制"
  92. @click.stop="handleWidgetCloneTable(index)"
  93. class="widget-action-clone"
  94. v-if="selectWidget.prop == column.prop"
  95. circle
  96. plain
  97. size="small"
  98. type="primary"
  99. >
  100. <i class="iconfont icon-copy"></i>
  101. </el-button>
  102. </div>
  103. </template>
  104. <script>
  105. import WidgetFormItem from './WidgetFormItem'
  106. import WidgetFormTable from './WidgetFormTable'
  107. import draggable from 'vuedraggable'
  108. export default {
  109. name: 'widget-form-group',
  110. props: ['data', 'column', 'select', 'index'],
  111. components: { WidgetFormItem, WidgetFormTable, draggable },
  112. data() {
  113. return {
  114. selectWidget: this.select,
  115. }
  116. },
  117. methods: {
  118. handleSelectWidget(index) {
  119. this.selectWidget = this.data.column[index]
  120. },
  121. handleWidgetClear(index) {
  122. this.data.column[index].children.column = []
  123. this.selectWidget = this.data.column[index]
  124. this.$emit('change')
  125. },
  126. handleWidgetDelete(index) {
  127. if (this.data.column.length - 1 === index) {
  128. if (index === 0) this.selectWidget = {}
  129. else this.handleSelectWidget(index - 1)
  130. } else this.handleSelectWidget(index + 1)
  131. this.$nextTick(() => {
  132. this.data.column.splice(index, 1)
  133. this.$emit('change')
  134. })
  135. },
  136. handleWidgetCloneTable(index) {
  137. let cloneData = this.deepClone(this.data.column[index])
  138. cloneData.prop = 'a' + Date.now() + Math.ceil(Math.random() * 99999)
  139. cloneData.children.column.forEach((t) => {
  140. t.prop = 'a' + Date.now() + Math.ceil(Math.random() * 99999)
  141. })
  142. this.data.column.splice(index, 0, cloneData)
  143. this.$nextTick(() => {
  144. this.handleSelectWidget(index + 1)
  145. this.$emit('change')
  146. })
  147. },
  148. handleWidgetTableSelect(data) {
  149. this.selectWidget = data
  150. },
  151. handleWidgetTableClone(column, item) {
  152. const data = this.deepClone(item)
  153. data.prop = 'a' + Date.now() + Math.ceil(Math.random() * 99999)
  154. this.$set(column.children.column, column.children.column.length, { ...data })
  155. this.$nextTick(() => {
  156. this.selectWidget = column.children.column[column.children.column.length - 1]
  157. this.$emit('change')
  158. })
  159. },
  160. handleWidgetTableDelete(column, index) {
  161. if (column.children.column.length - 1 == index) {
  162. if (index == 0) this.selectWidget = column
  163. else this.selectWidget = column.children.column[index - 1]
  164. } else this.selectWidget = column.children.column[index + 1]
  165. this.$nextTick(() => {
  166. column.children.column.splice(index, 1)
  167. this.$emit('change')
  168. })
  169. },
  170. handleWidgetGroupAdd(evt, column) {
  171. let newIndex = evt.newIndex
  172. const item = evt.item
  173. if (newIndex == 1 && newIndex > column.children.column.length - 1) newIndex = 0
  174. if (['分组'].includes(item.textContent)) {
  175. column.children.column.splice(newIndex, 1)
  176. return
  177. }
  178. const data = this.deepClone(column.children.column[newIndex])
  179. if (!data.prop) data.prop = 'a' + Date.now() + Math.ceil(Math.random() * 99999)
  180. delete data.icon
  181. if (data.type == 'dynamic') data.span = 24
  182. else data.span = 12
  183. this.$set(column.children.column, newIndex, { ...data })
  184. this.selectWidget = column.children.column[newIndex]
  185. this.$emit('change')
  186. },
  187. },
  188. watch: {
  189. select(val) {
  190. this.selectWidget = val
  191. },
  192. selectWidget: {
  193. handler(val) {
  194. this.$emit('update:select', val)
  195. },
  196. deep: true,
  197. },
  198. },
  199. }
  200. </script>