Skip to content

Commit a2e5180

Browse files
feat: User input parameters and interface parameters support adjusting the order(#2103)
* feat: table support sort(#2103) * feat: User input parameters and interface parameters support adjusting the order(#2103) * feat: User input parameters and interface parameters support adjusting the order(#2103)
1 parent df94068 commit a2e5180

File tree

3 files changed

+63
-2
lines changed

3 files changed

+63
-2
lines changed

ui/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"@ctrl/tinycolor": "^4.1.0",
1919
"@logicflow/core": "^1.2.27",
2020
"@logicflow/extension": "^1.2.27",
21+
"@types/sortablejs": "^1.15.8",
2122
"@vavt/cm-extension": "^1.6.0",
2223
"@vueuse/core": "^10.9.0",
2324
"@wecom/jssdk": "^2.1.0",
@@ -42,6 +43,7 @@
4243
"pinyin-pro": "^3.18.2",
4344
"recorder-core": "^1.3.24040900",
4445
"screenfull": "^6.0.2",
46+
"sortablejs": "^1.15.6",
4547
"use-element-plus-theme": "^0.0.5",
4648
"vue": "^3.3.4",
4749
"vue-clipboard3": "^2.0.0",

ui/src/workflow/nodes/base-node/component/ApiInputFieldTable.vue

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
<el-icon class="mr-4">
66
<Plus />
77
</el-icon>
8-
{{$t('common.add')}}
8+
{{ $t('common.add') }}
99
</el-button>
1010
</div>
1111
<el-table
1212
v-if="props.nodeModel.properties.api_input_field_list?.length > 0"
1313
:data="props.nodeModel.properties.api_input_field_list"
1414
class="mb-16"
15+
ref="tableRef"
16+
row-key="field"
1517
>
1618
<el-table-column prop="variable" :label="$t('dynamicsForm.paramForm.field.label')" />
1719
<el-table-column prop="default_value" :label="$t('dynamicsForm.default.label')" />
@@ -48,11 +50,13 @@
4850
<script setup lang="ts">
4951
import { onMounted, ref } from 'vue'
5052
import { set } from 'lodash'
53+
import Sortable from 'sortablejs'
5154
import ApiFieldFormDialog from './ApiFieldFormDialog.vue'
5255
import { MsgError } from '@/utils/message'
5356
import { t } from '@/locales'
54-
const props = defineProps<{ nodeModel: any }>()
5557
58+
const props = defineProps<{ nodeModel: any }>()
59+
const tableRef = ref()
5660
const currentIndex = ref(null)
5761
const ApiFieldFormDialogRef = ref()
5862
const inputFieldList = ref<any[]>([])
@@ -67,6 +71,7 @@ function openAddDialog(data?: any, index?: any) {
6771
function deleteField(index: any) {
6872
inputFieldList.value.splice(index, 1)
6973
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
74+
onDragHandle()
7075
}
7176
7277
function refreshFieldList(data: any) {
@@ -92,6 +97,30 @@ function refreshFieldList(data: any) {
9297
currentIndex.value = null
9398
ApiFieldFormDialogRef.value.close()
9499
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
100+
onDragHandle()
101+
}
102+
103+
function onDragHandle() {
104+
if (!tableRef.value) return
105+
106+
// 获取表格的 tbody DOM 元素
107+
const wrapper = tableRef.value.$el as HTMLElement
108+
const tbody = wrapper.querySelector('.el-table__body-wrapper tbody')
109+
if (!tbody) return
110+
// 初始化 Sortable
111+
Sortable.create(tbody, {
112+
animation: 150,
113+
ghostClass: 'ghost-row',
114+
onEnd: (evt) => {
115+
if (evt.oldIndex === undefined || evt.newIndex === undefined) return
116+
// 更新数据顺序
117+
const items = [...inputFieldList.value]
118+
const [movedItem] = items.splice(evt.oldIndex, 1)
119+
items.splice(evt.newIndex, 0, movedItem)
120+
inputFieldList.value = items
121+
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
122+
}
123+
})
95124
}
96125
97126
onMounted(() => {

ui/src/workflow/nodes/base-node/component/UserInputFieldTable.vue

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
v-if="props.nodeModel.properties.user_input_field_list?.length > 0"
2222
:data="props.nodeModel.properties.user_input_field_list"
2323
class="mb-16"
24+
ref="tableRef"
25+
row-key="field"
2426
>
2527
<el-table-column prop="field" :label="$t('dynamicsForm.paramForm.field.label')" width="95">
2628
<template #default="{ row }">
@@ -107,12 +109,14 @@
107109
<script setup lang="ts">
108110
import { onMounted, ref } from 'vue'
109111
import { set } from 'lodash'
112+
import Sortable from 'sortablejs'
110113
import UserFieldFormDialog from './UserFieldFormDialog.vue'
111114
import { MsgError } from '@/utils/message'
112115
import { t } from '@/locales'
113116
import UserInputTitleDialog from '@/workflow/nodes/base-node/component/UserInputTitleDialog.vue'
114117
const props = defineProps<{ nodeModel: any }>()
115118
119+
const tableRef = ref()
116120
const UserFieldFormDialogRef = ref()
117121
const UserInputTitleDialogRef = ref()
118122
const inputFieldList = ref<any[]>([])
@@ -129,6 +133,7 @@ function openChangeTitleDialog() {
129133
function deleteField(index: any) {
130134
inputFieldList.value.splice(index, 1)
131135
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
136+
onDragHandle()
132137
}
133138
134139
function refreshFieldList(data: any, index: any) {
@@ -153,6 +158,7 @@ function refreshFieldList(data: any, index: any) {
153158
}
154159
UserFieldFormDialogRef.value.close()
155160
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
161+
onDragHandle()
156162
}
157163
158164
function refreshFieldTitle(data: any) {
@@ -178,6 +184,29 @@ const getDefaultValue = (row: any) => {
178184
}
179185
}
180186
187+
function onDragHandle() {
188+
if (!tableRef.value) return
189+
190+
// 获取表格的 tbody DOM 元素
191+
const wrapper = tableRef.value.$el as HTMLElement
192+
const tbody = wrapper.querySelector('.el-table__body-wrapper tbody')
193+
if (!tbody) return
194+
// 初始化 Sortable
195+
Sortable.create(tbody, {
196+
animation: 150,
197+
ghostClass: 'ghost-row',
198+
onEnd: (evt) => {
199+
if (evt.oldIndex === undefined || evt.newIndex === undefined) return
200+
// 更新数据顺序
201+
const items = [...inputFieldList.value]
202+
const [movedItem] = items.splice(evt.oldIndex, 1)
203+
items.splice(evt.newIndex, 0, movedItem)
204+
inputFieldList.value = items
205+
props.nodeModel.graphModel.eventCenter.emit('refreshFieldList')
206+
}
207+
})
208+
}
209+
181210
onMounted(() => {
182211
if (!props.nodeModel.properties.user_input_field_list) {
183212
if (props.nodeModel.properties.input_field_list) {
@@ -211,6 +240,7 @@ onMounted(() => {
211240
})
212241
set(props.nodeModel.properties, 'user_input_field_list', inputFieldList)
213242
set(props.nodeModel.properties, 'user_input_config', inputFieldConfig)
243+
onDragHandle()
214244
})
215245
</script>
216246

0 commit comments

Comments
 (0)