From 8a166a60cfd1a2e593ffa103d10c0dc224fc8628 Mon Sep 17 00:00:00 2001
From: 田源 <tianyuan@vci-tech.com>
Date: 星期四, 09 一月 2025 11:14:50 +0800
Subject: [PATCH] 表格定义显示字段设置拖拽排序

---
 Source/plt-web/plt-web-ui/package.json                                                    |    1 
 Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/tableDialog.vue |   35 ++++++++---------
 Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/DragSelect.vue  |   67 +++++++++++++++++++++++++++++++++
 3 files changed, 84 insertions(+), 19 deletions(-)

diff --git a/Source/plt-web/plt-web-ui/package.json b/Source/plt-web/plt-web-ui/package.json
index df7f0b8..2fc68ec 100644
--- a/Source/plt-web/plt-web-ui/package.json
+++ b/Source/plt-web/plt-web-ui/package.json
@@ -27,6 +27,7 @@
     "portfinder": "^1.0.23",
     "quill": "^1.3.7",
     "script-loader": "^0.7.2",
+    "sortablejs": "^1.15.6",
     "v-charts": "^1.19.0",
     "vue": "^2.6.10",
     "vue-axios": "^2.1.2",
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/DragSelect.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/DragSelect.vue
new file mode 100644
index 0000000..315c7b4
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/DragSelect.vue
@@ -0,0 +1,67 @@
+<template>
+  <el-select ref="dragSelect" v-model="selectVal" v-bind="$attrs" class="drag-select" multiple v-on="$listeners" @change="changeHandler">
+    <slot />
+  </el-select>
+</template>
+
+<script>
+import Sortable from 'sortablejs'
+
+export default {
+  name: 'DragSelect',
+  props: {
+    value: {
+      type: Array,
+      required: true
+    }
+  },
+  computed: {
+    selectVal: {
+      get() {
+        return [...this.value]
+      },
+      set(val) {
+        this.$emit('input', [...val])
+      }
+    }
+  },
+  mounted() {
+    this.setSort()
+  },
+  methods: {
+    setSort() {
+      const el = this.$refs.dragSelect.$el.querySelectorAll('.el-select__tags > span')[0]
+      this.sortable = Sortable.create(el, {
+        ghostClass: 'sortable-ghost',
+        setData: function(dataTransfer) {
+          dataTransfer.setData('Text', '')
+        },
+        onEnd: evt => {
+          const targetRow = this.value.splice(evt.oldIndex, 1)[0]
+          this.value.splice(evt.newIndex, 0, targetRow)
+        }
+      })
+    },
+    changeHandler(val){
+      this.$emit('outFileChange',val);
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.drag-select {
+  ::v-deep {
+    .sortable-ghost {
+      opacity: .8;
+      color: #fff !important;
+      background: #42b983 !important;
+    }
+
+    .el-tag {
+      cursor: pointer;
+    }
+  }
+}
+</style>
+
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/tableDialog.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/tableDialog.vue
index ec0dabf..b5efc09 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/tableDialog.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/ui/formDefine/components/tableDialog.vue
@@ -9,17 +9,18 @@
     width="60%"
     @close="closeDialog"
   >
-    <el-form ref="form" size="small" v-loading="formLoading" :model="form" :rules="rules" label-position="right" label-width="100px">
+    <el-form ref="form" v-loading="formLoading" :model="form" :rules="rules" label-position="right" label-width="100px"
+             size="small">
       <el-row>
         <el-col :span="12">
           <el-form-item label="鍚嶇О" prop="viName">
-            <el-input v-model="form.viName" placeholder="璇疯緭鍏ュ悕绉�" ></el-input>
+            <el-input v-model="form.viName" placeholder="璇疯緭鍏ュ悕绉�"></el-input>
           </el-form-item>
         </el-col>
 
         <el-col :span="12">
           <el-form-item label="姣忛〉琛屾暟">
-            <el-input v-model="form.itemPageSize" placeholder="璇疯緭鍏ユ瘡椤佃鏁�"  type="number"></el-input>
+            <el-input v-model="form.itemPageSize" placeholder="璇疯緭鍏ユ瘡椤佃鏁�" type="number"></el-input>
           </el-form-item>
         </el-col>
 
@@ -45,7 +46,7 @@
         <el-col :span="12">
           <el-form-item label="鐖跺悕绉�">
             <div style="display: flex;align-items: center;">
-              <el-input v-model="form.itemParentFolderName" placeholder="璇疯緭鍏ョ埗鍚嶇О" ></el-input>
+              <el-input v-model="form.itemParentFolderName" placeholder="璇疯緭鍏ョ埗鍚嶇О"></el-input>
               <el-checkbox v-model="form.itemIsNavigatorExpand" style="margin-left: 5px; margin-right: 5px">鏄剧ず鏌ヨ鍖哄煙
               </el-checkbox>
               <el-checkbox v-model="form.itemIsShowFolder" style="margin-left: 5px;margin-right: 0px">鏄剧ず鏂囦欢澶�
@@ -56,15 +57,10 @@
 
         <el-col :span="24">
           <el-form-item label="鏄剧ず瀛楁" prop="showLabel">
-            <el-select v-model="form.itemOutFieldList" multiple placeholder="璇烽�夋嫨" style="width: 100%"
-                       @change="outFileChange">
-              <el-option
-                v-for="(item,index) in form.itemSelectOutFieldList"
-                :key="index"
-                :label="item.id"
-                :value="item.id">
-              </el-option>
-            </el-select>
+            <el-drag-select v-model="form.itemOutFieldList" multiple placeholder="璇烽�夋嫨" style="width:100%;" @outFileChange="outFileChange">
+              <el-option v-for="(item,index) in form.itemSelectOutFieldList" :key="index" :label="item.id"
+                         :value="item.id"/>
+            </el-drag-select>
           </el-form-item>
         </el-col>
 
@@ -94,7 +90,7 @@
       </el-col>
 
       <el-col :span="8">
-        <el-form-item label="鏌ヨ瀛楁"  >
+        <el-form-item label="鏌ヨ瀛楁">
           <el-input v-model="form.searchLabel" placeholder="璇疯緭鍏ユ煡璇㈠瓧娈�" size="mini"></el-input>
         </el-form-item>
       </el-col>
@@ -158,7 +154,7 @@
 
       <el-col :span="24">
         <el-form-item label="鍙屽嚮鎿嶄綔">
-          <el-select v-model="form.itemDbl" placeholder="璇烽�夋嫨鍙屽嚮鎿嶄綔" >
+          <el-select v-model="form.itemDbl" placeholder="璇烽�夋嫨鍙屽嚮鎿嶄綔">
             <el-option v-for="(item,index) in itemDblList" :key="index" :label="item.value"
                        :value="item.key"></el-option>
           </el-select>
@@ -170,7 +166,7 @@
           <div style="display: flex;align-items: center">
             <div style="display: flex;align-items: center;width: 100%;">
               <span>闀匡細</span>
-              <el-input v-model="itemImgHeight" placeholder="璇疯緭鍏ラ暱搴�" ></el-input>
+              <el-input v-model="itemImgHeight" placeholder="璇疯緭鍏ラ暱搴�"></el-input>
             </div>
             <div style="display: flex;align-items: center;width: 100%;margin-left: 30px">
               <span>瀹斤細</span>
@@ -194,7 +190,7 @@
 
       <el-col :span="24">
         <el-form-item label="鏌ヨ妯℃澘">
-          <el-select v-model="form.itemQtName" placeholder="璇烽�夋嫨鏌ヨ妯℃澘" >
+          <el-select v-model="form.itemQtName" placeholder="璇烽�夋嫨鏌ヨ妯℃澘">
             <el-option v-for="(item,index) in searchQtNameList" :key="index" :label="item.qtName"
                        :value="item.qtName"></el-option>
           </el-select>
@@ -214,9 +210,11 @@
 import basicOption from "@/util/basic-option";
 import {gridPortalVIDatas, getPortalVIById, getItemDblList, savePortalVI, getObjTypeQTs} from "@/api/UI/formDefine/api";
 import func from "@/util/func";
+import ElDragSelect from './DragSelect'
 
 export default {
   name: "tableDialog",
+  components: {ElDragSelect},
   props: {
     TreeNodeRow: {
       type: Object,
@@ -470,7 +468,6 @@
           $cellEdit: true,
           key: item,
           value: '250',
-
         }
       })
     },
@@ -524,7 +521,7 @@
     dialogSaveClickHandler() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          if(this.form.itemOutFieldList.length <= 0){
+          if (this.form.itemOutFieldList.length <= 0) {
             this.$message.error('璇烽�夋嫨鏄剧ず瀛楁');
             return;
           }

--
Gitblit v1.9.3