From 945a4ea02215e40e6e9de65385e2c5d1ad70087c Mon Sep 17 00:00:00 2001 From: 田源 <lastanimals@163.com> Date: 星期三, 23 十月 2024 17:07:37 +0800 Subject: [PATCH] 表单定义 预览 应用 表格穿梭框删除重复数据 --- Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/formDialog.vue | 325 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 300 insertions(+), 25 deletions(-) diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/formDialog.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/formDialog.vue index de71674..cabe032 100644 --- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/formDialog.vue +++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/formDialog.vue @@ -58,7 +58,64 @@ <el-form-item :class="['hiddenLabel', { 'active-border': activeItem.text === item.text }]" :label="item.text + '锛�'" style="padding-left: 5px" @click.native="formItemClick(item,index)"> - <el-input v-model="item.value" :placeholder="item.text" size="mini"></el-input> + <el-input + v-if="item.itemType === 'text' || + item.itemType === 'custom' || + item.itemType === 'customform'|| + item.itemType === 'hidden' || + item.itemType === 'specialCharacter'" + v-model="item.value" :placeholder="item.text" + size="mini"></el-input> + + <div v-if="item.itemType === 'textbtn'" style="display: flex;align-items: center"> + <el-input v-model="item.value" :placeholder="item.text" size="mini"></el-input> + <el-button icon="el-icon-edit" plain size="mini" style="height: 28px;" + type="primary"></el-button> + </div> + + <el-input + v-if="item.itemType === 'textarea' || item.itemType === 'richtext' || item.itemType === 'webeditor'" + v-model="item.value" + :placeholder="item.text" + :rows="2" + type="textarea"> + </el-input> + + <el-input-number v-if="item.itemType === 'number'" v-model="item.value" :max="99999" + :min="1"></el-input-number> + <el-input v-if="item.itemType === 'password'" v-model="input" placeholder="璇疯緭鍏ュ瘑鐮�" + show-password></el-input> + <el-radio v-if="item.itemType === 'radio'" v-model="item.value"></el-radio> + <el-checkbox v-if="item.itemType === 'checkbox'" v-model="item.value"></el-checkbox> + <el-select v-if="item.itemType === 'select' || item.itemType === 'multiselect'" + v-model="item.value" :disabled="true" placeholder="璇烽�夋嫨" size="mini"> + </el-select> + <el-date-picker + v-if="item.itemType === 'date' || item.itemType === 'datetime'" + v-model="item.value" + :placeholder="item.itemType === 'date' ? '璇烽�夋嫨鏃ユ湡' : '璇烽�夋嫨鏃ユ湡鏃堕棿'" + type="date"> + </el-date-picker> + + <el-time-select + v-if="item.itemType === 'time'" + v-model="item.value" + :picker-options="{ + start: '08:30', + step: '00:15', + end: '18:30' + }" + placeholder="閫夋嫨鏃堕棿"> + </el-time-select> + <el-button v-if="item.itemType === 'file'" + v-model="item.value" plain size="mini" type="primary"> + 涓婁紶鏂囦欢 + </el-button> + <el-button v-if="item.itemType === 'multiFile'" + v-model="item.value" plain size="mini" type="primary"> + 澶氭枃浠朵笂浼� + </el-button> + </el-form-item> </el-col> </el-row> @@ -72,21 +129,21 @@ </el-button> <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addCustomClickHandler">娣诲姞鑷畾涔夌粍浠� </el-button> - <el-button icon="el-icon-zoom-in" plain size="small" type="primary">棰勮</el-button> + <el-button icon="el-icon-zoom-in" plain size="small" type="primary" @click="checkViewHandler" >棰勮</el-button> </div> </basic-container> </el-main> <el-aside width="25%"> <basic-container> - <div style="height: 700px; overflow-y: auto;padding-right: 10px"> + <div style="height: 660px; overflow-y: auto;padding-right: 10px"> <h3>璁剧疆</h3> <el-form ref="form" :model="form" :rules="rules" label-position="left" label-width="85px"> <el-row style="border-bottom: 1px solid #878585;padding-bottom: 10px"> <el-col :span="24"> <el-form-item label="浣跨敤瀛楁"> <div style="display: flex"> - <el-input v-model="form.text" placeholder="璇疯緭鍏ヤ娇鐢ㄥ瓧娈�" size="mini"></el-input> + <el-input v-model="form.text" :readonly="true" placeholder="璇疯緭鍏ヤ娇鐢ㄥ瓧娈�" size="mini"></el-input> <el-checkbox v-model="form.itemIsEditable" style="margin-left: 5px; margin-right: 5px">鍙 </el-checkbox> <el-checkbox v-model="form.itemIsRequired" style="margin-left: 5px;margin-right: 0px">蹇呭~ @@ -103,7 +160,7 @@ <el-col :span="12"> <el-form-item class="rightLabel" label="鏄剧ず绫诲瀷"> - <el-select v-model="form.itemType" placeholder="璇烽�夋嫨绫诲瀷" size="mini"> + <el-select v-model="form.itemType" placeholder="璇烽�夋嫨绫诲瀷" size="mini" @change="itemTypeChange"> <el-option v-for="(item,index) in showSelectList" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> @@ -264,7 +321,7 @@ <el-form-item> <div style="height: 150px; width: 100%; border: 1px solid #bdbbbb;overflow-y: auto"> <el-table - :data="form.itemValueList" + :data="form.itemKeyValueList" :highlight-current-row="true" :show-header="false" border @@ -334,6 +391,10 @@ </el-form> </div> + <div style="display: flex;justify-content: right"> + <el-button plain size="mini" style="margin-top: 10px" type="success" @click="asideFormHandler">搴旂敤 + </el-button> + </div> </basic-container> </el-aside> </div> @@ -347,14 +408,18 @@ append-to-body="true" class="avue-dialog" title="琛ㄥ崟" - width="40%" + width="50%" @close="closeCustomDialog"> <el-form ref="form" :model="customForm" :rules="rules" label-position="left" label-width="85px"> <el-row style="border-bottom: 1px solid #878585;padding-bottom: 10px"> <el-col :span="24"> <el-form-item label="浣跨敤瀛楁"> - <div style="display: flex"> - <el-input v-model="customForm.text" placeholder="璇疯緭鍏ヤ娇鐢ㄥ瓧娈�" size="mini"></el-input> + <div style="display: flex;align-items: center"> + <div style="display: flex;align-items: center"> + <el-input v-model="customForm.text" placeholder="璇疯緭鍏ヤ娇鐢ㄥ瓧娈�" size="mini"></el-input> + <el-button plain size="mini" style="margin-left: 3px" type="success" @click="customTextHandler">閫夋嫨 + </el-button> + </div> <el-checkbox v-model="customForm.itemIsEditable" style="margin-left: 5px; margin-right: 5px">鍙 </el-checkbox> <el-checkbox v-model="customForm.itemIsRequired" style="margin-left: 5px;margin-right: 0px">蹇呭~ @@ -371,7 +436,7 @@ <el-col :span="12"> <el-form-item class="rightLabel" label="鏄剧ず绫诲瀷"> - <el-select v-model="customForm.itemType" placeholder="璇烽�夋嫨绫诲瀷" size="mini"> + <el-select v-model="customForm.itemType" placeholder="璇烽�夋嫨绫诲瀷" size="mini" @change="customItemTypeChange"> <el-option v-for="(item,index) in showSelectList" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> @@ -513,7 +578,8 @@ </el-row> - <el-row style="margin-top: 10px;border-bottom: 1px solid #878585;padding-bottom: 10px"> + <el-row v-if="customForm.itemType ? customOptionTypeStatus : true" + style="margin-top: 10px;border-bottom: 1px solid #878585;padding-bottom: 10px"> <h4>閫夐」鍒楄〃</h4> <el-col :span="12"> <el-form-item label="鍚嶇О"> @@ -531,7 +597,7 @@ <el-form-item> <div style="height: 150px; width: 100%; border: 1px solid #bdbbbb;overflow-y: auto"> <el-table - :data="customForm.itemValueList" + :data="customForm.itemKeyValueList" :highlight-current-row="true" :show-header="false" border @@ -582,7 +648,7 @@ </el-form-item> </el-col> </el-row> - <el-row style="margin-top: 10px"> + <el-row v-if="customForm.itemType ? customItemStyleTypeStatus : true" style="margin-top: 10px"> <el-col :span="24" style="height: 90px"> <el-form-item label="闄勫姞灞炴��"> <el-input @@ -599,14 +665,90 @@ </el-form> <span slot="footer" class="dialog-footer"> <el-button @click="customVisible = false">鍙� 娑�</el-button> - <el-button type="primary">纭� 瀹�</el-button> + <el-button type="primary" @click="customSaveHandler">纭� 瀹�</el-button> </span> + </el-dialog> + <el-dialog + v-dialogDrag + :visible.sync="checkViewVisible" + append-to-body="true" + class="avue-dialog" + title="棰勮" + width="80%"> + <el-form ref="form" :model="form" :rules="rules" label-width="100px"> + <el-row> + <el-col v-for="(item,index) in formList" :key="index" :span="topForm.columnNumber"> + <el-form-item :class="['hiddenLabel', { 'active-border': activeItem.text === item.text }]" + :label="item.itemName + '锛�'" + style="padding-left: 5px" @click.native="formItemClick(item,index)"> + <el-input + v-if="item.itemType === 'text' || + item.itemType === 'custom' || + item.itemType === 'customform'|| + item.itemType === 'hidden' || + item.itemType === 'specialCharacter'" + v-model="item.value" :placeholder="item.text" + size="mini"></el-input> + + <div v-if="item.itemType === 'textbtn'" style="display: flex;align-items: center"> + <el-input v-model="item.value" :placeholder="item.text" size="mini"></el-input> + <el-button icon="el-icon-edit" plain size="mini" style="height: 28px;" + type="primary"></el-button> + </div> + + <el-input + v-if="item.itemType === 'textarea' || item.itemType === 'richtext' || item.itemType === 'webeditor'" + v-model="item.value" + :placeholder="item.text" + :rows="2" + type="textarea"> + </el-input> + + <el-input-number v-if="item.itemType === 'number'" v-model="item.value" :max="99999" + :min="1"></el-input-number> + <el-input v-if="item.itemType === 'password'" v-model="input" placeholder="璇疯緭鍏ュ瘑鐮�" + show-password></el-input> + <el-radio v-if="item.itemType === 'radio'" v-model="item.value"></el-radio> + <el-checkbox v-if="item.itemType === 'checkbox'" v-model="item.value"></el-checkbox> + <el-select v-if="item.itemType === 'select' || item.itemType === 'multiselect'" + v-model="item.value" :disabled="true" placeholder="璇烽�夋嫨" size="mini"> + </el-select> + <el-date-picker + v-if="item.itemType === 'date' || item.itemType === 'datetime'" + v-model="item.value" + :placeholder="item.itemType === 'date' ? '璇烽�夋嫨鏃ユ湡' : '璇烽�夋嫨鏃ユ湡鏃堕棿'" + type="date"> + </el-date-picker> + + <el-time-select + v-if="item.itemType === 'time'" + v-model="item.value" + :picker-options="{ + start: '08:30', + step: '00:15', + end: '18:30' + }" + placeholder="閫夋嫨鏃堕棿"> + </el-time-select> + <el-button v-if="item.itemType === 'file'" + v-model="item.value" plain size="mini" type="primary"> + 涓婁紶鏂囦欢 + </el-button> + <el-button v-if="item.itemType === 'multiFile'" + v-model="item.value" plain size="mini" type="primary"> + 澶氭枃浠朵笂浼� + </el-button> + + </el-form-item> + </el-col> + </el-row> + </el-form> </el-dialog> </el-dialog> </template> <script> -import {getTreeAttributes} from "@/api/UI/formDefine/api"; +import {getTreeAttributes, savePortalVI} from "@/api/UI/formDefine/api"; import func from "@/util/func"; export default { @@ -620,10 +762,16 @@ treeRadio: { type: String, default: "" + }, + editRow: { + type: Object, + default: () => { + } } }, data() { return { + checkViewVisible: false, optionObj: { optionName: '', optionValue: '' @@ -633,7 +781,8 @@ optionValue: '' }, customForm: { - itemValueList: [], + itemKeyValueList: [], + itemCols: '1' }, customLoading: false, customVisible: false, @@ -732,7 +881,7 @@ form: {}, topForm: { columnNumber: 8, - showColumn: '', + showColumn: '3', viName: '', position: '' }, @@ -769,7 +918,15 @@ itemStyleTypeStatus() { const types = ['hidden', 'webeditor', 'radio', 'checkbox']; return !types.includes(this.form.itemType); // 涓嶅睍绀� - } + }, + customOptionTypeStatus() { + const types = ['radio', 'checkbox', 'select']; + return types.includes(this.customForm.itemType); // 灞曠ず + }, + customItemStyleTypeStatus() { + const types = ['hidden', 'webeditor', 'radio', 'checkbox']; + return !types.includes(this.customForm.itemType); // 涓嶅睍绀� + }, }, created() { // this.getTreeList(); @@ -778,7 +935,9 @@ // 鍏抽棴瀵硅瘽妗� closeDialog() { this.formList = []; - + this.form = {}; + this.activeItem = {}; + this.topForm.viName = ""; }, getTreeList() { @@ -810,6 +969,7 @@ const params = { text: data.text, oid: data.oid, + itemType: 'text' } const isDuplicate = this.formList.some(item => item.text === data.text); @@ -825,6 +985,9 @@ this.activeItem = item; this.activeItemIndex = index; this.form = {...item}; + + // console.log(item,index); + this.topForm.position = index += 1; }, // 璁剧疆鏄剧ず琛屾暟 @@ -931,18 +1094,18 @@ // 閫夐」娣诲姞 optionAddClickHandler(val) { - let optionObj, itemValueList; + let optionObj, itemKeyValueList; if (val === 'dialog') { optionObj = this.customOptionObj; - itemValueList = this.customForm.itemValueList; + itemKeyValueList = this.customForm.itemKeyValueList; } else { if (func.isEmptyObject(this.activeItem)) { this.$message.error('璇烽�夋嫨涓�鏉℃暟鎹繘琛屾坊鍔犻�夐」'); return; } optionObj = this.optionObj; - itemValueList = this.form.itemValueList; + itemKeyValueList = this.form.itemKeyValueList; } if (!optionObj.optionName) { @@ -960,7 +1123,7 @@ value: optionObj.optionValue }; - itemValueList.push(params); + itemKeyValueList.push(params); }, // 閫夐」鍒犻櫎 @@ -983,9 +1146,121 @@ this.$message.error('椤甸潰涓嶈兘涓虹┖'); return; } - this.visible = false; - this.$message.success('淇濆瓨鎴愬姛'); + this.formList = this.formList.map(item => { + return { + ...item, + itemField: item.text // 灏唅temField璧嬪�间负text锛屽洜涓哄繕璁扮埗缁勪欢涓轰粈涔堝湪缂栬緫鍥炲~鏃舵妸itemField璧嬪�间负text浜� + }; + }); + const params = { + id: this.editRow.id,// 淇敼鏃跺�欏繀浼� + typeFlag: this.treeRadio, // 涓氬姟绫诲瀷0 or 閾炬帴绫诲瀷1 + typeFlagText: this.treeRadio === '0' ? '涓氬姟绫诲瀷鐨勮〃鍗�' : '閾炬帴绫诲瀷鐨勮〃鍗�',// 涓氬姟绫诲瀷鏄剧ず鍊� + typeName: this.treeRadio === '0' ? this.TreeNodeRow.id : this.TreeNodeRow.name, // 涓氬姟绫诲瀷鍚� or 閾炬帴绫诲瀷鍚� + viName: this.topForm.viName, // 瑙嗗浘鍚嶇О + viType: 1, // 瑙嗗浘绫诲瀷 + viTypeText: "琛ㄥ崟", // 瑙嗗浘涓枃鍚嶇О + prm: { + formQtName: '', // 鏌ヨ妯℃澘鍚嶇О + showCols: this.topForm.showColumn, + prmItemList: this.formList + }, + } + savePortalVI(params).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.visible = false; + this.closeDialog(); + } + }) + // this.visible = false; + // this.$message.success('淇濆瓨鎴愬姛'); + }, + + // 淇敼鏄剧ず绫诲瀷 + itemTypeChange(val) { + if (val) { + this.clearFormBottom(); + } + if (!this.form.text) { + this.$message.error('璇峰湪鍙充晶閫夋嫨鏁版嵁鍚庤繘琛屾搷浣滐紒'); + return; + } + + }, + + // 鑷畾涔夌粍浠朵慨鏀规樉绀虹被鍨� + customItemTypeChange(val) { + if (val) { + this.customClearFormBottom(); + } + }, + + // 鑷畾涔夌粍浠朵繚瀛� + customSaveHandler() { + if (!this.customForm.text) { + this.$message.error('璇烽�夋嫨浣跨敤瀛楁'); + return; + } + if (!this.customForm.itemType) { + this.$message.error('璇烽�夋嫨鏄剧ず绫诲瀷'); + return; + } + const status = this.formList.some(item => item.text === this.customForm.text); + if(status){ + this.$message.error('璇锋鏌ユ槸鍚︽坊鍔犵浉鍚岄」'); + return; + } + this.formList.push(this.customForm); + this.customVisible = false; + }, + + // 鑷畾涔夊璇濇鍏抽棴 + closeCustomDialog() { + this.customForm = { + itemKeyValueList: [], + itemType: 'text', + itemCols: '1' + }; + }, + + // 娓呯┖涓嶅悓绫诲瀷琛ㄥ崟涓嬫柟缁戝畾鍊� + clearFormBottom() { + this.optionObj = {}; + this.form.itemKeyValueList = []; + this.form.itemListTable = this.form.itemListTxt = this.form.itemListVal = this.form.itemStyle = ""; + }, + + // 鑷畾涔夌粍浠舵竻绌轰笉鍚岀被鍨嬭〃鍗曚笅鏂圭粦瀹氬�� + customClearFormBottom() { + this.customOptionObj = {}; + this.customForm.itemKeyValueList = []; + this.customForm.itemListTable = this.customForm.itemListTxt = this.customForm.itemListVal = this.customForm.itemStyle = ""; + }, + + // 鑷畾涔夎〃鍗曚娇鐢ㄥ瓧娈甸�夋嫨 + customTextHandler() { + + }, + + // 鍙充晶琛ㄥ崟搴旂敤鎸夐挳 + asideFormHandler() { + if(!this.form.text){ + this.$message.error('璇锋坊鍔犱竴鏉℃暟鎹繘琛屼繚瀛橈紒'); + return; + } + this.formList = this.formList.map(item => + item.text === this.form.text ? this.form : item + ); + + this.$message.success('搴旂敤鎴愬姛'); + }, + + // 棰勮鎸夐挳 + checkViewHandler(){ + this.checkViewVisible = true; } + } } </script> -- Gitblit v1.9.3