WidgetForm.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <div class="widget-form-container">
  3. <el-form
  4. :label-position="data.labelPosition || 'left'"
  5. :label-width="data.labelWidth ? `${data.labelWidth}px` : '100px'"
  6. :label-suffix="data.labelSuffix"
  7. :model="form"
  8. ref="widgetForm"
  9. size="small"
  10. >
  11. <el-row :gutter="data.gutter">
  12. <draggable
  13. class="widget-form-list"
  14. :list="data.column"
  15. :group="{ name: 'form' }"
  16. ghost-class="ghost"
  17. :animation="300"
  18. @add="handleWidgetAdd"
  19. @end="$emit('change')"
  20. >
  21. <template v-for="(column, index) in data.column">
  22. <div
  23. class="widget-form-table"
  24. v-if="column.type == 'dynamic'"
  25. :key="index"
  26. :class="{ active: selectWidget.prop == column.prop }"
  27. @click="handleSelectWidget(index)"
  28. >
  29. <widget-form-table :data="data" :column="column" :index="index" :select.sync="selectWidget" @change="$emit('change')"></widget-form-table>
  30. </div>
  31. <div
  32. class="widget-form-group"
  33. v-else-if="column.type == 'group'"
  34. :key="index"
  35. :class="{ active: selectWidget.prop == column.prop }"
  36. @click="handleSelectWidget(index)"
  37. >
  38. <widget-form-group :data="data" :column="column" :index="index" :select.sync="selectWidget" @change="$emit('change')"> </widget-form-group>
  39. </div>
  40. <el-col v-else :key="index" :md="column.span || 12" :xs="24" :offset="column.offset || 0">
  41. <el-form-item
  42. class="widget-form-item"
  43. :label="column.label"
  44. :labelWidth="column.labelWidth && column.labelWidth + 'px'"
  45. :prop="column.prop"
  46. :class="[{ active: selectWidget.prop == column.prop, required: column.required }, 'avue-form__item--' + column.labelPosition || '']"
  47. @click.native="handleSelectWidget(index)"
  48. >
  49. <widget-form-item :item="column" :params="column.params"></widget-form-item>
  50. <el-button
  51. title="删除"
  52. @click.stop="handleWidgetDelete(index)"
  53. class="widget-action-delete"
  54. v-if="selectWidget.prop == column.prop"
  55. circle
  56. plain
  57. size="small"
  58. type="danger"
  59. >
  60. <i class="iconfont icon-delete"></i>
  61. </el-button>
  62. <el-button
  63. title="复制"
  64. @click.stop="handleWidgetClone(index)"
  65. class="widget-action-clone"
  66. v-if="selectWidget.prop == column.prop"
  67. circle
  68. plain
  69. size="small"
  70. type="primary"
  71. >
  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 = 'a' + 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 = 'a' + Date.now() + Math.ceil(Math.random() * 99999)
  128. this.data.column.push(cloneData)
  129. this.$nextTick(() => {
  130. this.handleSelectWidget(this.data.column.length - 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>