| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <template>
- <div>
- <el-form-item v-if="data.type == 'select'"
- label="占位内容">
- <el-input v-model="data.placeholder"
- clearable
- placeholder="占位内容"></el-input>
- </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">
- <el-tabs v-model="data.dicOption"
- stretch
- @tab-click="handleTabClick">
- <el-tab-pane label="静态数据"
- name="static">
- <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"
- clearable
- v-model="item.label"
- placeholder="label"></el-input>
- <el-input :style="{'margin-right': data.type == 'select'? '5px': '0'}"
- size="mini"
- clearable
- 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>
- </el-tab-pane>
- <el-tab-pane label="远端数据"
- name="remote">
- 网址
- <el-input v-model="data.dicUrl"
- placeholder="远端数据字典网址"></el-input>
- 远程搜索
- <el-switch v-model="data.remote"></el-switch><br>
- 請求方法
- <el-select v-model="data.dicMethod"
- placeholder="請求方法"
- style="width: 100%;">
- <el-option label="POST"
- value="post"></el-option>
- <el-option label="GET"
- value="get"></el-option>
- </el-select>
- <p v-if="data.dicMethod == 'post'">
- 請求参数
- <avue-dynamic v-model="data.dicQueryConfig"
- :children="option"></avue-dynamic>
- </p>
- </el-tab-pane>
- </el-tabs>
- </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="['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>
- </div>
- </template>
- <script>
- import Draggable from 'vuedraggable'
- 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'
- }]
- },
- }
- },
- methods: {
- 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()
- },
- }
- }
- </script>
|