select.vue 9.87 KB
<template>
  <div>
    <el-form-item v-if="data.type == 'select'" label="占位内容">
      <el-input
        v-model="data.placeholder"
        clearable
        placeholder="占位内容"
      ></el-input>
    </el-form-item>
    <el-form-item label="默认值">
      <el-input v-model="data.value" clearable placeholder="默认值"></el-input>
    </el-form-item>
    <el-form-item label="字典">
      <el-select
        v-model="data.dicType"
        placeholder="选择字典"
        style="width: 100%"
        @change="dicTypeChange"
        clearable
        filterable
      >
        <el-option
          :label="item.name"
          :value="item.type"
          v-for="item in dictList"
          :key="item.id"
        ></el-option>
      </el-select>
    </el-form-item>
    <div class="el-form-item--small el-form--label-top" style="padding: 13px">
      <strong class="el-form-item__label" style="padding: 0"
        >字典数据示例:</strong
      >
      <div class="el-form-item__content">
        <draggable
          tag="ul"
          :list="data.dicData"
          :group="{ name: 'dic' }"
          ghost-class="ghost"
          handle=".drag-item"
        >
          <li v-for="(item, index) in data.dicData" :key="index">
            <i
              class="drag-item el-icon-s-operation"
              style="font-size: 16px; margin: 0 5px; cursor: move"
            ></i>
            <el-input
              style="margin-right: 5px"
              size="mini"
              readonly
              clearable
              v-model="item.label"
              placeholder="label"
            ></el-input>
            <el-input
              :style="{
                'margin-right': data.type == 'select' ? '5px' : '0',
              }"
              size="mini"
              clearable
              readonly
              v-model="item.value"
              placeholder="value"
            ></el-input>
            <!-- <el-input
              v-if="data.type == 'select'"
              size="mini"
              clearable
              v-model="item.desc"
              placeholder="描述"
            ></el-input> -->
            <el-button
              @click="handleRemoveFields(index)"
              circle
              plain
              type="danger"
              size="mini"
              icon="el-icon-minus"
              style="padding: 4px; margin-left: 5px"
            ></el-button>
          </li>
        </draggable>
        <!-- <div style="margin-left: 22px">
          <el-button type="text" @click="handleAddFields">添加列 </el-button>
        </div> -->
      </div>
    </div>
    <!-- <div class="el-form-item el-form-item--small el-form--label-top">
      <label class="el-form-item__label" style="padding: 0"
        >字典key配置:</label
      >
      <div class="el-form-item__content">
        <ul>
          <li v-for="(value, key) in data.props" :key="key">
            <span style="width: 50px">{{ key }}</span>
            <el-input
              size="mini"
              v-model="data.props[key]"
              clearable
              placeholder="key配置"
            ></el-input>
          </li>
        </ul>
      </div>
    </div> -->
    <!-- <el-form-item
      v-if="data.dicOption == 'remote'"
      label="重新请求字典(crud)"
      label-width="150px"
    >
      <el-switch v-model="data.dicFlag"></el-switch>
    </el-form-item> -->

    <template v-if="data.type == 'select'">
      <el-form-item label="是否多选">
        <el-switch v-model="data.multiple"></el-switch>
      </el-form-item>
      <!-- <el-form-item label="是否可拖拽" label-width="110px" v-if="data.multiple">
        <template slot="label">
          <el-link
            :underline="false"
            href="https://avuejs.com/doc/form/form-select-drag"
            target="_blank"
            >是否可拖拽 <i class="el-icon-question"></i
          ></el-link>
        </template>
        <el-switch v-model="data.drag"></el-switch>
      </el-form-item> -->
      <el-form-item
        label="多选数量限制"
        label-width="110px"
        v-if="data.multiple"
      >
        <el-input-number
          v-model="data.limit"
          controls-position="right"
          placeholder="多选限制"
          :min="0"
          :max="data.dicData.length"
        ></el-input-number>
      </el-form-item>
      <!-- <div class="el-form-item el-form-item--small el-form--label-top">
        <label class="el-form-item__label" style="padding: 0">级联配置:</label>
        <div class="el-form-item__content">
          <draggable
            tag="ul"
            :list="data.cascaderItem"
            :group="{ name: 'cascaderItem' }"
            ghost-class="ghost"
            handle=".drag-item"
          >
            <li v-for="(item, index) in data.cascaderItem" :key="index">
              <i
                class="drag-item el-icon-s-operation"
                style="font-size: 16px; margin: 0 5px; cursor: move"
              ></i>
              <el-input
                size="mini"
                v-model="data.cascaderItem[index]"
                clearable
                placeholder="级联属性值"
              ></el-input>
              <el-button
                @click="handleRemoveCascaderItemFields(index)"
                circle
                plain
                type="danger"
                size="mini"
                icon="el-icon-minus"
                style="padding: 4px; margin-left: 5px"
              >
              </el-button>
            </li>
          </draggable>
          <div style="margin-left: 22px">
            <el-button type="text" @click="handleAddCascaderItemFields"
              >添加列</el-button
            >
          </div>
        </div>
      </div>
      <el-form-item
        v-if="data.cascaderItem && data.cascaderItem.length > 0"
        label="级联默认选中"
        label-width="110px"
      >
        <el-input-number
          v-model="data.cascaderIndex"
          controls-position="right"
          placeholder="级联默认选中"
          :min="0"
        ></el-input-number>
      </el-form-item> -->
      <el-form-item label="是否可清空" label-width="110px">
        <el-switch v-model="data.clearable"></el-switch>
      </el-form-item>
      <el-form-item label="是否可搜索" label-width="110px">
        <el-switch v-model="data.filterable"></el-switch>
      </el-form-item>
    </template>

    <template v-if="data.type == 'checkbox'">
      <el-form-item label="开启排斥项">
        <el-switch v-model="data.repel"></el-switch>
        <el-input
          v-if="data.repel"
          v-model.lazy="data.repelValue"
          placeholder="排斥项值(value)"
        ></el-input>
      </el-form-item>
    </template>

    <!-- <template v-if="['radio', 'checkbox'].includes(data.type)">
      <el-form-item label="边框" v-if="!data.button">
        <el-switch v-model="data.border"></el-switch>
      </el-form-item>
      <el-form-item label="按钮" v-if="!data.border">
        <el-switch v-model="data.button"></el-switch>
      </el-form-item>
    </template> -->
    <!-- <el-form-item label="尺寸" v-if="data.border || data.button">
      <el-radio-group v-model="data.size" size="mini">
        <el-radio-button label="medium">正常</el-radio-button>
        <el-radio-button label="small">小</el-radio-button>
        <el-radio-button label="mini">超小</el-radio-button>
      </el-radio-group>
    </el-form-item> -->
    <el-form-item label="是否禁用">
      <el-switch v-model="data.disabled"></el-switch>
    </el-form-item>
    <el-form-item label="是否可见">
      <el-switch v-model="data.display"></el-switch>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.required"></el-switch>
    </el-form-item>
    <el-form-item label="必填提示文本">
      <el-input v-model="data.pattern"></el-input>
    </el-form-item>
  </div>
</template>

<script>
import Draggable from "vuedraggable"
import { mapGetters } from "vuex"
export default {
  name: "config-select",
  props: ["data"],
  components: { Draggable },
  data() {
    return {
      validator: {
        type: null,
        required: null,
        pattern: null,
        length: null,
      },
      option: {
        column: [
          {
            type: "input",
            prop: "key",
            label: "key",
          },
          {
            type: "input",
            prop: "value",
            label: "value",
          },
        ],
      },
    }
  },
  computed: {
    ...mapGetters({
      dictList: ["dict/dictSet"],
      dictMap: ["dict/dictMap"],
    }),
  },
  methods: {
    dicTypeChange(type) {
      this.data.dicData = this.deepClone(this.dictMap[type])
    },
    generateRule() {
      const rules = []
      Object.keys(this.validator).forEach((key) => {
        if (this.validator[key]) rules.push(this.validator[key])
      })
      this.data.rules = rules
    },
    handleRemoveFields(index) {
      this.data.dicData.splice(index, 1)
    },
    handleAddFields() {
      const i = Math.ceil(Math.random() * 99999)
      this.data.dicData.push({ label: `字段${i}`, value: `col_${i}` })
    },
    handleRemoveCascaderItemFields(index) {
      this.data.cascaderItem.splice(index, 1)
    },
    handleAddCascaderItemFields() {
      this.data.cascaderItem.push("")
    },
    handleTabClick({ name }) {
      if (name == "remote" && !this.data.dicQueryConfig)
        this.data.dicQueryConfig = []
    },
  },
  watch: {
    "data.required": function (val) {
      if (val)
        this.validator.required = {
          required: true,
          message: `请选择${this.data.label}`,
        }
      else this.validator.required = null

      this.generateRule()
    },
    "data.pattern": function (val) {
      if (val)
        this.validator.required = {
          required: true,
          message: val,
        }
      else this.validator.required = null

      this.generateRule()
    },
  },
}
</script>