11import { Collapse } from "@douyinfe/semi-ui" ;
2- import { useSelect , useDiagram } from "../../../hooks" ;
2+ import { useSelect , useDiagram , useSaveState , useLayout } from "../../../hooks" ;
33import Empty from "../Empty" ;
44import SearchBar from "./SearchBar" ;
55import RelationshipInfo from "./RelationshipInfo" ;
6- import { ObjectType } from "../../../data/constants" ;
6+ import { ObjectType , State } from "../../../data/constants" ;
77import { useTranslation } from "react-i18next" ;
8+ import { SortableList } from "../../SortableList/SortableList" ;
9+ import { DragHandle } from "../../SortableList/DragHandle" ;
810
911export default function RelationshipsTab ( ) {
10- const { relationships } = useDiagram ( ) ;
12+ const { relationships, setRelationships } = useDiagram ( ) ;
1113 const { selectedElement, setSelectedElement } = useSelect ( ) ;
14+ const { setSaveState } = useSaveState ( ) ;
15+ const { layout } = useLayout ( ) ;
1216 const { t } = useTranslation ( ) ;
1317
1418 return (
@@ -29,30 +33,40 @@ export default function RelationshipsTab() {
2933 }
3034 keepDOM = { false }
3135 lazyRender
32- onChange = { ( k ) =>
36+ onChange = { ( k ) => {
3337 setSelectedElement ( ( prev ) => ( {
3438 ...prev ,
3539 open : true ,
36- id : parseInt ( k ) ,
40+ id : k [ 0 ] ,
3741 element : ObjectType . RELATIONSHIP ,
38- } ) )
39- }
42+ } ) ) ;
43+ } }
4044 accordion
4145 >
42- { relationships . map ( ( r ) => (
43- < div id = { `scroll_ref_${ r . id } ` } key = { "relationship_" + r . id } >
44- < Collapse . Panel
45- header = {
46- < div className = "overflow-hidden text-ellipsis whitespace-nowrap" >
47- { r . name }
48- </ div >
49- }
50- itemKey = { `${ r . id } ` }
51- >
52- < RelationshipInfo data = { r } />
53- </ Collapse . Panel >
54- </ div >
55- ) ) }
46+ < SortableList
47+ keyPrefix = "relationships-tab"
48+ items = { relationships }
49+ onChange = { ( newRelationships ) => setRelationships ( newRelationships ) }
50+ afterChange = { ( ) => setSaveState ( State . SAVING ) }
51+ renderItem = { ( item ) => (
52+ < div id = { `scroll_ref_${ item . id } ` } key = { "relationship_" + item . id } >
53+ < Collapse . Panel
54+ className = "relative"
55+ header = {
56+ < div className = "w-full flex items-center gap-2" >
57+ < DragHandle readOnly = { layout . readOnly } id = { item . id } />
58+ < div className = "overflow-hidden text-ellipsis whitespace-nowrap" >
59+ { item . name }
60+ </ div >
61+ </ div >
62+ }
63+ itemKey = { `${ item . id } ` }
64+ >
65+ < RelationshipInfo data = { item } />
66+ </ Collapse . Panel >
67+ </ div >
68+ ) }
69+ />
5670 </ Collapse >
5771 ) }
5872 </ >
0 commit comments