<template> <div class="widget-config"> <el-form label-suffix=":" v-if="this.data && Object.keys(this.data).length > 0" labelPosition="left" labelWidth="110px" size="small" > <el-collapse v-model="collapse"> <el-collapse-item name="1" title="基本属性"> <el-form-item label="类型" v-if="data.type && !data.component"> <el-select v-model="data.type" style="width: 100%" placeholder="请选择类型" @change="handleChangeType" > <el-option-group v-for="group in fieldList" :key="group.title" :label="group.title" > <el-option v-for="item in group.list" :key="item.type" :label="item.label" :disabled="item.disabled" :value="item.type" > </el-option> </el-option-group> </el-select> </el-form-item> <el-form-item label="属性值"> <el-input v-model="data.prop" clearable placeholder="属性值" :disabled="propNotEdit" ></el-input> </el-form-item> <el-form-item label="标题"> <el-input v-model="data.label" clearable placeholder="标题" ></el-input> </el-form-item> <el-form-item label="标题前缀"> <el-input v-model="data.labelSuffix" placeholder="标题前缀" ></el-input> </el-form-item> <el-form-item label="左侧内边距" v-if="data.type === 'group'"> <el-input-number style="width: 100%" v-model="data.labelWidth" controls-position="right" placeholder="左侧内边距" :min="0" :max="400" ></el-input-number> </el-form-item> <el-form-item label="左边外边距" v-else> <el-input v-model="data.styles.marginLeft" clearable placeholder="距左边边距" ></el-input> </el-form-item> <el-form-item label="标题宽度" v-if="data.type !== 'group'"> <el-input-number style="width: 100%" v-model="data.labelWidth" controls-position="right" placeholder="标题宽度" :min="0" ></el-input-number> </el-form-item> <template v-if=" !['group', 'dynamic'].includes(data.type) && data.cType !== 'table' " > <el-form-item label="表单栅格"> <el-input-number style="width: 100%" v-model="data.span" controls-position="right" placeholder="表单栅格默认12(≥1720px)" :min="0" :max="24" ></el-input-number> </el-form-item> <el-form-item label="内容宽度"> <el-input-number style="width: 100%" v-model="data.width" controls-position="right" placeholder="默认24(≥1720px)" :min="0" :max="24" ></el-input-number> </el-form-item> <el-form-item label="xs表单栅格"> <el-input-number style="width: 100%" v-model="data.xs" controls-position="right" placeholder="xs默认24(<768)" :min="0" :max="24" ></el-input-number> </el-form-item> <el-form-item label="sm表单栅格"> <el-input-number style="width: 100%" v-model="data.sm" controls-position="right" placeholder="sm默认24(≥768px)" :min="0" :max="24" ></el-input-number> </el-form-item> <el-form-item label="md表单栅格"> <el-input-number style="width: 100%" v-model="data.md" controls-position="right" placeholder="md默认24(≥992px)" :min="0" :max="24" ></el-input-number> </el-form-item> <el-form-item label="lg表单栅格"> <el-input-number style="width: 100%" v-model="data.lg" controls-position="right" placeholder="lg默认追随表单栅格(≥1200px)" :min="0" :max="24" ></el-input-number> </el-form-item> </template> <el-form-item label="宽度" v-if="data.cType === 'table'"> <el-input-number style="width: 100%" v-model="data.width" controls-position="right" placeholder="表格宽度" :min="100" :max="800" ></el-input-number> </el-form-item> <el-form-item label="关联子表单" v-if="!['group', 'dynamic'].includes(data.type)" > <el-input v-model="data.relSubForm" clearable placeholder="填写子表单属性值" ></el-input> </el-form-item> <el-form-item label="自动采集完整度" labelWidth="130px"> <el-switch v-model="data.autoRequired" :active-value="1" :inactive-value="0" ></el-switch> </el-form-item> <el-form-item label="人工补录完整度" labelWidth="130px"> <el-switch v-model="data.personalRequired" :active-value="1" :inactive-value="0" ></el-switch> </el-form-item> <el-form-item label="重要字段" labelWidth="130px"> <el-switch v-model="data.importantField"></el-switch> </el-form-item> <el-form-item label="重要字段说明" labelWidth="130px" v-if=" data.importantField && !['group', 'dynamic'].includes(data.type) " > <el-input clearable v-model="data.importantFieldDesc"></el-input> </el-form-item> <!-- <el-form-item label="数据类型" v-if=" [ 'cascader', 'checkbox', 'radio', 'select', 'tree', 'upload', 'img', 'array', 'slider', 'timerange', 'daterange', 'datetimerange', ].includes(data.type) " > <template slot="label"> <el-link :underline="false" href="https://avuejs.com/doc/dataType" target="_blank" >数据类型 <i class="el-icon-question"></i ></el-link> </template> <el-select v-model="data.dataType" placeholder="数据类型" clearable style="width: 100%" > <el-option label="String" value="string"></el-option> <el-option label="Number" value="number"></el-option> <el-option label="Array" value="array"></el-option> </el-select> </el-form-item> <el-form-item label="深结构" v-if="data.type && !data.component"> <template slot="label"> <el-link :underline="false" href="https://avuejs.com/doc/form/form-bind" target="_blank" >深结构 <i class="el-icon-question"></i ></el-link> </template> <el-input v-model="data.bind" clearable placeholder="深结构" ></el-input> </el-form-item> <el-form-item label="字段提示"> <template slot="label"> <el-link :underline="false" href="https://avuejs.com/doc/form/form-tip" target="_blank" >字段提示 <i class="el-icon-question"></i ></el-link> </template> <el-input v-model="data.tip" clearable placeholder="字段提示" ></el-input> </el-form-item> <el-form-item v-if="data.tip && !['upload'].includes(data.type)" label="字段提示位置" label-width="110px" > <el-select v-model="data.tipPlacement" placeholder="字段提示位置" style="width: 100%" clearable > <el-option label="上" value="top"></el-option> <el-option label="下" value="bottom"></el-option> <el-option label="左" value="left"></el-option> <el-option label="右" value="right"></el-option> </el-select> </el-form-item> <el-form-item label="标题提示"> <template slot="label"> <el-link :underline="false" href="https://avuejs.com/doc/form/form-tip" target="_blank" >标题提示 <i class="el-icon-question"></i ></el-link> </template> <el-input v-model="data.labelTip" clearable placeholder="标题提示" ></el-input> </el-form-item> <el-form-item v-if="data.labelTip && !['upload'].includes(data.type)" label="标题提示位置" label-width="110px" > <el-select v-model="data.labelTipPlacement" placeholder="标题提示位置" clearable > <el-option label="上" value="top"></el-option> <el-option label="下" value="bottom"></el-option> <el-option label="左" value="left"></el-option> <el-option label="右" value="right"></el-option> </el-select> </el-form-item> --> <component :is="getComponent" :data="data"></component> </el-collapse-item> <!-- <el-collapse-item name="2" title="事件属性" v-if="!['group', 'dynamic'].includes(data.type)" > <el-form-item label="change"> <el-input v-model="data.change" type="textarea" placeholder="改变事件" rows="5" clearable ></el-input> </el-form-item> <el-form-item label="click"> <el-input v-model="data.click" type="textarea" placeholder="点击事件" rows="5" ></el-input> </el-form-item> <el-form-item label="focus"> <el-input v-model="data.focus" type="textarea" placeholder="获取焦点事件" rows="5" ></el-input> </el-form-item> <el-form-item label="blur"> <el-input v-model="data.blur" type="textarea" placeholder="失去焦点事件" rows="5" ></el-input> </el-form-item> </el-collapse-item> --> <slot name="dbtable"></slot> <el-collapse-item name="99" title="其他" v-if="!['group', 'dynamic', 'title'].includes(data.type)" > <el-form-item label="计算规则"> <el-input v-model.trim="data.algorithm" type="textarea" clearable placeholder="计算规则" ></el-input> </el-form-item> <dynamic-sh :data="data"></dynamic-sh> <el-form-item label="首次不触发" labelWidth="130px"> <el-switch v-model="data.noImmediate"></el-switch> </el-form-item> </el-collapse-item> </el-collapse> </el-form> </div> </template> <script> import fields from "./fieldsConfig.js" import DynamicSh from "./components/DynamicSh" const dateArr = [ "year", "month", "week", "date", "datetime", "time", "daterange", "timerange", "datetimerange", "dates", ] export default { name: "widget-config", components: { DynamicSh }, props: { data: { type: Array | Object, }, fieldNotEdit: { type: Boolean, default: false, }, propNotEdit: { type: Boolean, default: false, }, layoutHidden: { type: Boolean, default: false, }, }, computed: { getComponent() { const prefix = "config-" const { type, component } = this.data if ((!type || component) && type != "ueditor") return prefix + "custom" let result = "input" if ( [ undefined, "input", "password", "url", "dental-tab", "dental-tab-tj", ].includes(type) ) result = "input" else if (dateArr.includes(type)) result = "date" else if (["array", "img"].includes(type)) result = "array" else if (["tree", "cascader"].includes(type)) result = "tree" else if (["radio", "checkbox", "select"].includes(type)) result = "select" else result = type return prefix + result }, fieldList() { return this.layoutHidden ? fields.slice(1) : fields }, }, data() { return { fields, collapse: "1", } }, watch: { "data.styles": { handler(val) { if (!val) { this.$set(this.data, "styles", {}) } }, immediate: true, }, }, methods: { async handleChangeType(type) { if (type) { const { prop, children } = this.data const config = await this.getConfigByType(type) config.prop = prop for (let key in config) { if ( config && Object.prototype.hasOwnProperty.call(config, key) && !["icon", "label", "span"].includes(key) ) { const val = config[key] // 分组和子表单中的数据项转换 if ( key === "children" && children && children.column.length > 0 && Object.prototype.hasOwnProperty.call(val, "column") ) { val.column = this.deepClone(children.column) } this.$set(this.data, key, val) } } this.$set(this.data, "importantField", true) this.$set(this.data, "dicType", "") this.$emit("change") } }, getConfigByType(type) { return new Promise((resolve, reject) => { fields.forEach((field) => { field.list.forEach((config) => { if (config.type == type) resolve(config) }) }) reject() }) }, }, } </script> <style lang="scss"> .widget-config { ul { margin: 0; padding: 0; li { display: flex; align-items: center; width: 100%; .ghost { list-style: none; font-size: 0; height: 35px; } } } } </style>