WidgetFormTable.vue 8.83 KB
<template>
  <div>
    <h3 style="margin: 10px" v-show="column.label">{{ column.label }}</h3>
    <draggable
      class="widget-form-table__content"
      :list="column.children.column"
      :group="{ name: 'form' }"
      ghost-class="ghost"
      :animation="200"
      handle=".widget-form-table__item"
      @add="handleWidgetTableAdd($event, column)"
      @end="$emit('change')"
    >
      <template v-if="column.children.column.length > 0">
        <template v-if="column.children.type === 'form'">
          <el-col
            v-for="(item, tableIndex) in column.children.column"
            :key="tableIndex"
            :md="item.span || 12"
            :xs="24"
          >
            <div
              class="widget-form-table__item is-form"
              :class="{
                active: selectWidget.prop == item.prop,
                required: item.required,
              }"
              @click.stop="handleWidgetTableSelect(item)"
              :style="item.styles"
            >
              <el-form-item
                :label="
                  item.label ? `${item.label}${item.labelSuffix || ':'}` : ''
                "
                :prop="item.prop"
                :label-width="
                  item.label
                    ? item.labelWidth
                      ? `${item.labelWidth}px`
                      : ''
                    : '0px'
                "
                :style="{
                  width: item.width ? `${(item.width / 24) * 100}%` : '100%',
                }"
              >
                <widget-form-item
                  :item="item"
                  :params="column.params"
                ></widget-form-item>
                <el-button
                  title="删除"
                  @click.stop="handleWidgetTableDelete(column, tableIndex)"
                  class="widget-table-action-delete"
                  v-if="selectWidget.prop == item.prop"
                  circle
                  plain
                  size="small"
                  type="danger"
                >
                  <i class="iconfont icon-delete"></i>
                </el-button>
              </el-form-item>
            </div>
          </el-col>
        </template>
        <template v-else>
          <div
            v-for="(item, tableIndex) in column.children.column"
            :key="tableIndex"
            class="widget-form-table__item"
            :class="{
              active: selectWidget.prop == item.prop,
              required: item.required,
            }"
            :style="{
              width:
                item.type === 'dynamic'
                  ? '100%'
                  : item.width
                  ? `${item.width}px`
                  : '32%',
            }"
            @click.stop="handleWidgetTableSelect(item)"
          >
            <el-table :data="[item]" border>
              <el-table-column
                :prop="item.prop"
                :label="item.label"
                :align="column.children.align"
                :header-align="column.children.headerAlign"
              >
                <widget-form-item
                  :item="item"
                  :params="column.params"
                ></widget-form-item>
                <el-button
                  title="删除"
                  @click.stop="handleWidgetTableDelete(column, tableIndex)"
                  class="widget-table-action-delete"
                  v-if="selectWidget.prop == item.prop"
                  circle
                  plain
                  size="small"
                  type="danger"
                >
                  <i class="iconfont icon-delete"></i>
                </el-button>
                <!-- <el-button title="复制"
                         @click.stop="handleWidgetTableClone(column, item)"
                         class="widget-table-action-clone"
                         v-if="selectWidget.prop == item.prop"
                         circle
                         plain
                         size='small'
                         type="primary">
                <i class="iconfont icon-copy"></i>
              </el-button> -->
              </el-table-column>
            </el-table>
          </div>
        </template>
      </template>
      <template v-else>
        <div>拖拽字段至此</div>
      </template>
    </draggable>
    <el-button
      title="删除"
      @click.stop="handleWidgetDelete(index)"
      class="widget-action-delete"
      v-if="selectWidget.prop == column.prop"
      circle
      plain
      size="small"
      type="danger"
    >
      <i class="iconfont icon-delete"></i>
    </el-button>
    <el-button
      title="清空"
      @click.stop="handleWidgetClear(index)"
      class="widget-action-clear"
      v-if="selectWidget.prop == column.prop"
      circle
      plain
      size="small"
      type="warning"
    >
      <i class="iconfont icon-clear"></i>
    </el-button>
    <!-- <el-button title="复制"
               @click.stop="handleWidgetCloneTable(index)"
               class="widget-action-clone"
               v-if="selectWidget.prop == column.prop"
               circle
               plain
               size='small'
               type="primary">
      <i class="iconfont icon-copy"></i>
    </el-button> -->
  </div>
</template>
<script>
import WidgetFormItem from "./WidgetFormItem"
import draggable from "vuedraggable"

export default {
  name: "widget-form-table",
  props: ["data", "column", "select", "index"],
  components: { WidgetFormItem, draggable },
  data() {
    return {
      selectWidget: this.select,
    }
  },
  methods: {
    handleSelectWidget(index) {
      this.selectWidget = this.data.column[index]
    },
    handleWidgetClear(index) {
      this.data.column[index].children.column = []
      this.selectWidget = this.data.column[index]
      this.$emit("change")
    },
    handleWidgetDelete(index) {
      if (this.data.column.length - 1 === index) {
        if (index === 0) this.selectWidget = {}
        else this.handleSelectWidget(index - 1)
      } else this.handleSelectWidget(index + 1)

      this.$nextTick(() => {
        this.data.column.splice(index, 1)
        this.$emit("change")
      })
    },
    handleWidgetCloneTable(index) {
      let cloneData = this.deepClone(this.data.column[index])
      cloneData.prop = Date.now() + "_" + Math.ceil(Math.random() * 99999)
      cloneData.children.column.forEach((t) => {
        t.prop = Date.now() + "_" + Math.ceil(Math.random() * 99999)
      })
      this.data.column.splice(index, 0, cloneData)
      this.$nextTick(() => {
        this.handleSelectWidget(index + 1)
        this.$emit("change")
      })
    },
    handleWidgetTableAdd(evt, column) {
      let newIndex = evt.newIndex
      const item = evt.item
      const { type } = item._underlying_vm_
      if (newIndex == 1 && newIndex > column.children.column.length - 1)
        newIndex = 0
      if (type === "group") {
        this.$message.warning("该类型不可拖入")
        column.children.column.splice(newIndex, 1)
        return
      }

      const data = this.deepClone(column.children.column[newIndex])
      if (!data.prop)
        data.prop = Date.now() + "_" + Math.ceil(Math.random() * 99999)
      if (data.type === "dynamic") {
        data.prop = "fixed_field"
      }
      if (data.type == "title") {
        delete data.label
      }
      data.cType = column.children.type === "form" ? "form" : "table"
      data.subfield = true
      delete data.icon
      this.$set(column.children.column, newIndex, { ...data })
      this.selectWidget = column.children.column[newIndex]

      this.$emit("change")
    },
    handleWidgetTableSelect(data) {
      this.selectWidget = data
    },
    handleWidgetTableClone(column, item) {
      const data = this.deepClone(item)
      data.prop = Date.now() + "_" + Math.ceil(Math.random() * 99999)
      this.$set(column.children.column, column.children.column.length, {
        ...data,
      })
      this.$nextTick(() => {
        this.selectWidget =
          column.children.column[column.children.column.length - 1]
        this.$emit("change")
      })
    },
    handleWidgetTableDelete(column, index) {
      if (column.children.column.length - 1 == index) {
        if (index == 0) this.selectWidget = column
        else this.selectWidget = column.children.column[index - 1]
      } else this.selectWidget = column.children.column[index + 1]
      this.$nextTick(() => {
        column.children.column.splice(index, 1)
        this.$emit("change")
      })
    },
  },

  watch: {
    select(val) {
      this.selectWidget = val
    },
    selectWidget: {
      handler(val) {
        this.$emit("update:select", val)
      },
      deep: true,
    },
    "column.children.type": {
      handler(type) {
        this.column.children.column.map((item) => {
          this.$set(item, "cType", type ? "form" : "table")
        })
      },
      immediate: true,
    },
  },
}
</script>