|
69 | 69 | class="border"
|
70 | 70 | v-if="form_data.form_field_list.length > 0"
|
71 | 71 | :data="form_data.form_field_list"
|
| 72 | + ref="tableRef" |
| 73 | + row-key="field" |
72 | 74 | >
|
73 | 75 | <el-table-column
|
74 | 76 | prop="field"
|
@@ -151,9 +153,11 @@ import { ref, onMounted, computed } from 'vue'
|
151 | 153 | import { input_type_list } from '@/components/dynamics-form/constructor/data'
|
152 | 154 | import { MsgError } from '@/utils/message'
|
153 | 155 | import { set, cloneDeep } from 'lodash'
|
| 156 | +import Sortable from 'sortablejs' |
154 | 157 | import { t } from '@/locales'
|
155 | 158 | const props = defineProps<{ nodeModel: any }>()
|
156 | 159 | const formNodeFormRef = ref<FormInstance>()
|
| 160 | +const tableRef = ref() |
157 | 161 | const editFormField = (form_field_data: any, field_index: number) => {
|
158 | 162 | const _value = form_data.value.form_field_list.map((item: any, index: number) => {
|
159 | 163 | if (field_index === index) {
|
@@ -185,6 +189,7 @@ const sync_form_field_list = () => {
|
185 | 189 | ]
|
186 | 190 | set(props.nodeModel.properties.config, 'fields', fields)
|
187 | 191 | props.nodeModel.clear_next_node_field(false)
|
| 192 | + onDragHandle() |
188 | 193 | }
|
189 | 194 | const addFormCollectRef = ref<InstanceType<typeof AddFormCollect>>()
|
190 | 195 | const editFormCollectRef = ref<InstanceType<typeof EditFormCollect>>()
|
@@ -243,6 +248,30 @@ const validate = () => {
|
243 | 248 | function submitDialog(val: string) {
|
244 | 249 | set(props.nodeModel.properties.node_data, 'form_content_format', val)
|
245 | 250 | }
|
| 251 | +
|
| 252 | +// 表格排序拖拽 |
| 253 | +function onDragHandle() { |
| 254 | + if (!tableRef.value) return |
| 255 | +
|
| 256 | + // 获取表格的 tbody DOM 元素 |
| 257 | + const wrapper = tableRef.value.$el as HTMLElement |
| 258 | + const tbody = wrapper.querySelector('.el-table__body-wrapper tbody') |
| 259 | + if (!tbody) return |
| 260 | + // 初始化 Sortable |
| 261 | + Sortable.create(tbody as HTMLElement, { |
| 262 | + animation: 150, |
| 263 | + ghostClass: 'ghost-row', |
| 264 | + onEnd: (evt) => { |
| 265 | + if (evt.oldIndex === undefined || evt.newIndex === undefined) return |
| 266 | + // 更新数据顺序 |
| 267 | + const items = [...form_data.value.form_field_list] |
| 268 | + const [movedItem] = items.splice(evt.oldIndex, 1) |
| 269 | + items.splice(evt.newIndex, 0, movedItem) |
| 270 | + form_data.value.form_field_list = items |
| 271 | + sync_form_field_list() |
| 272 | + } |
| 273 | + }) |
| 274 | +} |
246 | 275 | onMounted(() => {
|
247 | 276 | set(props.nodeModel, 'validate', validate)
|
248 | 277 | sync_form_field_list()
|
|
0 commit comments