@@ -23,12 +23,14 @@ import { getDataSourceTypeConfig } from "./generate";
2323import { DataSourceTypeConfig , TableColumn } from "./generate/dataSourceCommon" ;
2424import { CompConfig } from "./generate/comp" ;
2525import { uiCompRegistry } from "comps/uiCompRegistry" ;
26- import { arrayMove , SortableContainer , SortableElement , SortableHandle } from "react-sortable-hoc" ;
2726import { trans } from "i18n" ;
2827import log from "loglevel" ;
2928import { Datasource } from "@lowcoder-ee/constants/datasourceConstants" ;
3029import DataSourceIcon from "components/DataSourceIcon" ;
3130import { 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" ;
3234
3335const OpenDialogButton = styled . span `
3436 &:hover {
@@ -421,20 +423,26 @@ const CustomEditText = (props: {
421423 ) ;
422424} ;
423425
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 } ) => {
430427 const { item, form } = props ;
431428 const { columnName, columnType, compItems } = item ;
432429 const disabled = ! Form . useWatch ( [ "columns" , columnName , "enabled" ] , form ) ;
430+ const { attributes, listeners, setNodeRef, transform, transition } = useSortable ( {
431+ id : String ( props . index ) ,
432+ } ) ;
433+
433434 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+ >
435443 < CellName >
436444 < LineWrapper >
437- < DragHandle />
445+ < StyledDragIcon { ... attributes } { ... listeners } />
438446 < FormItem
439447 name = { [ "columns" , columnName , "enabled" ] }
440448 valuePropName = "checked"
@@ -477,12 +485,9 @@ const SortableItem = SortableElement<{
477485 </ CellRequired >
478486 </ DataRow >
479487 ) ;
480- } ) ;
488+ } ;
481489
482- const SortableBody = SortableContainer < {
483- items : RowItem [ ] ,
484- form : FormInstance ,
485- } > ( ( props : { items : RowItem [ ] ; form : FormInstance } ) => {
490+ const SortableBody = ( props : { items : RowItem [ ] ; form : FormInstance } ) => {
486491 return (
487492 < DataBody >
488493 { props . items . map ( ( t , index ) => {
@@ -498,7 +503,7 @@ const SortableBody = SortableContainer<{
498503 } ) }
499504 </ DataBody >
500505 ) ;
501- } ) ;
506+ } ;
502507
503508function getEmptyText ( dataSourceNum : number , tableNum : number , columnNum : number ) : string {
504509 if ( dataSourceNum === 0 ) {
@@ -581,7 +586,27 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
581586 form . setFieldsValue ( { columns : initColumns } ) ;
582587 setItems ( initItems ) ;
583588 } , [ 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+
584608 const emptyText = getEmptyText ( dataSourceItems . length , tableStructures . length , items . length ) ;
609+
585610 return (
586611 < >
587612 < Form form = { form } preserve = { false } >
@@ -633,16 +658,18 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
633658 < CellComp $head = { true } > { trans ( "formComp.compType" ) } </ CellComp >
634659 < CellRequired $head = { true } > { trans ( "formComp.required" ) } </ CellRequired >
635660 </ 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 >
646673 < ModalFooterWrapper >
647674 < TacoButton
648675 buttonType = "primary"
0 commit comments