@@ -23,12 +23,14 @@ import { getDataSourceTypeConfig } from "./generate";
23
23
import { DataSourceTypeConfig , TableColumn } from "./generate/dataSourceCommon" ;
24
24
import { CompConfig } from "./generate/comp" ;
25
25
import { uiCompRegistry } from "comps/uiCompRegistry" ;
26
- import { arrayMove , SortableContainer , SortableElement , SortableHandle } from "react-sortable-hoc" ;
27
26
import { trans } from "i18n" ;
28
27
import log from "loglevel" ;
29
28
import { Datasource } from "@lowcoder-ee/constants/datasourceConstants" ;
30
29
import DataSourceIcon from "components/DataSourceIcon" ;
31
30
import { messageInstance } from "lowcoder-design/src/components/GlobalInstances" ;
31
+ import { DndContext } from "@dnd-kit/core" ;
32
+ import { SortableContext , useSortable } from "@dnd-kit/sortable" ;
33
+ import { CSS } from "@dnd-kit/utilities" ;
32
34
33
35
const OpenDialogButton = styled . span `
34
36
&:hover {
@@ -421,20 +423,26 @@ const CustomEditText = (props: {
421
423
) ;
422
424
} ;
423
425
424
- const DragHandle = SortableHandle ( ( ) => < StyledDragIcon /> ) ;
425
-
426
- const SortableItem = SortableElement < {
427
- item : RowItem ,
428
- form : FormInstance ,
429
- } > ( ( props : { item : RowItem ; form : FormInstance } ) => {
426
+ const SortableItem = ( props : { item : RowItem ; form : FormInstance ; index : number } ) => {
430
427
const { item, form } = props ;
431
428
const { columnName, columnType, compItems } = item ;
432
429
const disabled = ! Form . useWatch ( [ "columns" , columnName , "enabled" ] , form ) ;
430
+ const { attributes, listeners, setNodeRef, transform, transition } = useSortable ( {
431
+ id : String ( props . index ) ,
432
+ } ) ;
433
+
433
434
return (
434
- < DataRow disabled = { disabled } >
435
+ < DataRow
436
+ ref = { setNodeRef }
437
+ disabled = { disabled }
438
+ style = { {
439
+ transform : CSS . Transform . toString ( transform ) ,
440
+ transition,
441
+ } }
442
+ >
435
443
< CellName >
436
444
< LineWrapper >
437
- < DragHandle />
445
+ < StyledDragIcon { ... attributes } { ... listeners } />
438
446
< FormItem
439
447
name = { [ "columns" , columnName , "enabled" ] }
440
448
valuePropName = "checked"
@@ -477,12 +485,9 @@ const SortableItem = SortableElement<{
477
485
</ CellRequired >
478
486
</ DataRow >
479
487
) ;
480
- } ) ;
488
+ } ;
481
489
482
- const SortableBody = SortableContainer < {
483
- items : RowItem [ ] ,
484
- form : FormInstance ,
485
- } > ( ( props : { items : RowItem [ ] ; form : FormInstance } ) => {
490
+ const SortableBody = ( props : { items : RowItem [ ] ; form : FormInstance } ) => {
486
491
return (
487
492
< DataBody >
488
493
{ props . items . map ( ( t , index ) => {
@@ -498,7 +503,7 @@ const SortableBody = SortableContainer<{
498
503
} ) }
499
504
</ DataBody >
500
505
) ;
501
- } ) ;
506
+ } ;
502
507
503
508
function getEmptyText ( dataSourceNum : number , tableNum : number , columnNum : number ) : string {
504
509
if ( dataSourceNum === 0 ) {
@@ -581,7 +586,27 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
581
586
form . setFieldsValue ( { columns : initColumns } ) ;
582
587
setItems ( initItems ) ;
583
588
} , [ dataSourceTypeConfig , tableStructure ] ) ;
589
+
590
+ const handleDragEnd = ( e : { active : { id : string } ; over : { id : string } | null } ) => {
591
+ console . log ( 'handleDragEnd' , e ) ;
592
+ if ( ! e . over ) {
593
+ return ;
594
+ }
595
+ const fromIndex = Number ( e . active . id ) ;
596
+ const toIndex = Number ( e . over . id ) ;
597
+ if ( fromIndex < 0 || toIndex < 0 || fromIndex === toIndex ) {
598
+ return ;
599
+ }
600
+
601
+ const newData = [ ...items ] ;
602
+ const [ movedItem ] = newData . splice ( fromIndex , 1 ) ;
603
+ newData . splice ( toIndex , 0 , movedItem ) ;
604
+
605
+ setItems ( newData ) ;
606
+ } ;
607
+
584
608
const emptyText = getEmptyText ( dataSourceItems . length , tableStructures . length , items . length ) ;
609
+
585
610
return (
586
611
< >
587
612
< Form form = { form } preserve = { false } >
@@ -633,16 +658,18 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
633
658
< CellComp $head = { true } > { trans ( "formComp.compType" ) } </ CellComp >
634
659
< CellRequired $head = { true } > { trans ( "formComp.required" ) } </ CellRequired >
635
660
</ HeaderRow >
636
- < SortableBody
637
- items = { items }
638
- form = { form }
639
- useDragHandle
640
- onSortEnd = { ( { oldIndex, newIndex } ) => {
641
- if ( oldIndex !== newIndex ) {
642
- setItems ( arrayMove ( items , oldIndex , newIndex ) ) ;
643
- }
644
- } }
645
- />
661
+ < DndContext
662
+ onDragEnd = { handleDragEnd }
663
+ >
664
+ < SortableContext
665
+ items = { items . map ( ( _ , itemIdx ) => String ( itemIdx ) ) }
666
+ >
667
+ < SortableBody
668
+ items = { items }
669
+ form = { form }
670
+ />
671
+ </ SortableContext >
672
+ </ DndContext >
646
673
< ModalFooterWrapper >
647
674
< TacoButton
648
675
buttonType = "primary"
0 commit comments