• liang's avatar
    init · dad95e78
    liang authored
    dad95e78
WidgetFormGroup.vue 7.92 KB
<template>
  <div>
    <h4 class="widget-form-group__head" v-show="column.label">
      <i
        :class="column.icon"
        v-show="column.icon"
        style="margin-right: 10px"
      ></i
      >{{ column.label }}
    </h4>
    <draggable
      class="widget-form-group__body"
      :style="{
        paddingLeft: column.labelWidth ? `${column.labelWidth}px` : '',
      }"
      :list="column.children.column"
      :group="{ name: 'form' }"
      ghost-class="ghost"
      :animation="200"
      :key="column.prop"
      @add="handleWidgetGroupAdd($event, column)"
      @end="$emit('change')"
    >
      <template v-for="(item, groupIndex) in column.children.column">
        <div
          class="widget-form-table"
          v-if="item.type == 'dynamic'"
          :key="groupIndex"
          :class="{ active: selectWidget.prop == item.prop }"
          @click.stop="handleWidgetTableSelect(item)"
        >
          <widget-form-table
            :data="column.children"
            :column="item"
            :index="groupIndex"
            :select.sync="selectWidget"
            @change="$emit('change')"
          ></widget-form-table>
        </div>

        <div
          class="widget-form-group"
          v-else-if="item.type === 'group'"
          :key="groupIndex"
          :class="{ active: selectWidget.prop == item.prop }"
          @click.stop="handleWidgetTableSelect(item)"
        >
          <widget-form-group
            :data="column.children"
            :column="item"
            :index="groupIndex"
            :select.sync="selectWidget"
            @change="$emit('change')"
          >
          </widget-form-group>
        </div>

        <el-col
          v-else
          :key="groupIndex"
          :md="item.span || 12"
          :xs="24"
          :offset="item.offset || 0"
        >
          <div
            class="widget-form-group__item"
            :class="{
              active: selectWidget.prop == item.prop,
              required: item.required,
            }"
            :style="item.styles"
            @click.stop="handleWidgetTableSelect(item)"
          >
            <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}%` : '',
              }"
            >
              <widget-form-item
                :item="item"
                :params="column.params"
              ></widget-form-item>
              <el-button
                title="删除"
                @click.stop="handleWidgetTableDelete(column, groupIndex)"
                class="widget-form-group__item--delete"
                v-if="selectWidget.prop == item.prop"
                circle
                plain
                type="danger"
              >
                <i class="iconfont icon-delete"></i>
              </el-button>
              <!-- <el-button title="复制"
                       @click.stop="handleWidgetTableClone(column, item)"
                       class="widget-form-group__item--clone"
                       v-if="selectWidget.prop == item.prop"
                       circle
                       plain
                       type="primary">
              <i class="iconfont icon-copy"></i>
            </el-button> -->
            </el-form-item>
          </div>
        </el-col>
      </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 WidgetFormTable from "./WidgetFormTable"
import draggable from "vuedraggable"

export default {
  name: "widget-form-group",
  props: ["data", "column", "select", "index"],
  components: { WidgetFormItem, WidgetFormTable, 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")
      })
    },
    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")
      })
    },
    handleWidgetGroupAdd(evt, column) {
      let newIndex = evt.newIndex
      const item = evt.item

      if (newIndex == 1 && newIndex > column.children.column.length - 1)
        newIndex = 0

      const data = this.deepClone(column.children.column[newIndex])
      if (!data) return
      if (
        !data.prop ||
        (data.type === "dynamic" && data.prop === "fixed_field")
      )
        data.prop = Date.now() + "_" + Math.ceil(Math.random() * 99999)

      delete data.icon
      if (
        data.type == "dynamic" ||
        data.type === "title" ||
        data.type === "dental-tab" ||
        data.type === "dental-tab-tj"
      )
        data.span = 24
      if (data.type == "title") {
        delete data.label
      }
      data.cType = ""
      data.subfield = false
      this.$set(column.children.column, newIndex, { ...data })
      this.selectWidget = column.children.column[newIndex]
      this.$emit("change")
    },
  },
  watch: {
    select(val) {
      this.selectWidget = val
    },
    selectWidget: {
      handler(val) {
        this.$emit("update:select", val)
      },
      deep: true,
    },
  },
}
</script>