@@ -13,14 +13,16 @@ import TreePlaceholder from './tree-placeholder';
13
13
import PlaceholderRendererDefault from './placeholder-renderer-default' ;
14
14
import {
15
15
walk ,
16
- getFlatDataFromTree ,
17
16
changeNodeAtPath ,
18
- removeNodeAtPath ,
17
+ removeNode ,
19
18
insertNode ,
20
- getDescendantCount ,
21
19
find ,
22
20
} from './utils/tree-data-utils' ;
23
- import { memoizedInsertNode } from './utils/memoized-tree-data-utils' ;
21
+ import {
22
+ memoizedInsertNode ,
23
+ memoizedGetFlatDataFromTree ,
24
+ memoizedGetDescendantCount ,
25
+ } from './utils/memoized-tree-data-utils' ;
24
26
import { slideRows } from './utils/generic-utils' ;
25
27
import {
26
28
defaultGetNodeKey ,
@@ -75,7 +77,6 @@ class ReactSortableTree extends Component {
75
77
treeNodeRenderer,
76
78
isVirtualized,
77
79
slideRegionSize,
78
- treeData,
79
80
} = mergeTheme ( props ) ;
80
81
81
82
this . dndManager = new DndManager ( this ) ;
@@ -99,10 +100,9 @@ class ReactSortableTree extends Component {
99
100
100
101
this . state = {
101
102
draggingTreeData : null ,
102
- swapFrom : null ,
103
- swapLength : null ,
104
- swapDepth : null ,
105
- rows : this . getRows ( treeData ) ,
103
+ draggedNode : null ,
104
+ draggedMinimumTreeIndex : null ,
105
+ draggedDepth : null ,
106
106
searchMatches : [ ] ,
107
107
searchFocusTreeIndex : null ,
108
108
} ;
@@ -141,13 +141,12 @@ class ReactSortableTree extends Component {
141
141
this . search ( nextProps , false , false ) ;
142
142
}
143
143
144
- // Calculate the rows to be shown from the new tree data
144
+ // Reset the drag state
145
145
this . setState ( {
146
146
draggingTreeData : null ,
147
- swapFrom : null ,
148
- swapLength : null ,
149
- swapDepth : null ,
150
- rows : this . getRows ( nextProps . treeData ) ,
147
+ draggedNode : null ,
148
+ draggedMinimumTreeIndex : null ,
149
+ draggedDepth : null ,
151
150
} ) ;
152
151
} else if ( ! isEqual ( this . props . searchQuery , nextProps . searchQuery ) ) {
153
152
this . search ( nextProps ) ;
@@ -161,7 +160,7 @@ class ReactSortableTree extends Component {
161
160
}
162
161
163
162
getRows ( treeData ) {
164
- return getFlatDataFromTree ( {
163
+ return memoizedGetFlatDataFromTree ( {
165
164
ignoreCollapsed : true ,
166
165
getNodeKey : this . props . getNodeKey ,
167
166
treeData,
@@ -295,42 +294,51 @@ class ReactSortableTree extends Component {
295
294
}
296
295
297
296
startDrag ( { path } ) {
298
- const draggingTreeData = removeNodeAtPath ( {
299
- treeData : this . props . treeData ,
300
- path,
301
- getNodeKey : this . props . getNodeKey ,
302
- } ) ;
297
+ this . setState ( ( ) => {
298
+ const {
299
+ treeData : draggingTreeData ,
300
+ node : draggedNode ,
301
+ treeIndex : draggedMinimumTreeIndex ,
302
+ } = removeNode ( {
303
+ treeData : this . props . treeData ,
304
+ path,
305
+ getNodeKey : this . props . getNodeKey ,
306
+ } ) ;
303
307
304
- this . setState ( {
305
- draggingTreeData,
308
+ return {
309
+ draggingTreeData,
310
+ draggedNode,
311
+ draggedDepth : path . length - 1 ,
312
+ draggedMinimumTreeIndex,
313
+ } ;
306
314
} ) ;
307
315
}
308
316
309
- dragHover ( { node : draggedNode , depth, minimumTreeIndex } ) {
317
+ dragHover ( {
318
+ node : draggedNode ,
319
+ depth : draggedDepth ,
320
+ minimumTreeIndex : draggedMinimumTreeIndex ,
321
+ } ) {
310
322
// Fall back to the tree data if something is being dragged in from
311
323
// an external element
312
324
const draggingTreeData = this . state . draggingTreeData || this . props . treeData ;
313
325
314
326
const addedResult = memoizedInsertNode ( {
315
327
treeData : draggingTreeData ,
316
328
newNode : draggedNode ,
317
- depth,
318
- minimumTreeIndex,
329
+ depth : draggedDepth ,
330
+ minimumTreeIndex : draggedMinimumTreeIndex ,
319
331
expandParent : true ,
320
332
getNodeKey : this . props . getNodeKey ,
321
333
} ) ;
322
334
323
335
const rows = this . getRows ( addedResult . treeData ) ;
324
336
const expandedParentPath = rows [ addedResult . treeIndex ] . path ;
325
337
326
- const swapFrom = addedResult . treeIndex ;
327
- const swapTo = minimumTreeIndex ;
328
- const swapLength = 1 + getDescendantCount ( { node : draggedNode } ) ;
329
338
this . setState ( {
330
- rows : slideRows ( rows , swapFrom , swapTo , swapLength ) ,
331
- swapFrom,
332
- swapLength,
333
- swapDepth : depth ,
339
+ draggedNode,
340
+ draggedDepth,
341
+ draggedMinimumTreeIndex,
334
342
draggingTreeData : changeNodeAtPath ( {
335
343
treeData : draggingTreeData ,
336
344
path : expandedParentPath . slice ( 0 , - 1 ) ,
@@ -344,10 +352,9 @@ class ReactSortableTree extends Component {
344
352
const resetTree = ( ) =>
345
353
this . setState ( {
346
354
draggingTreeData : null ,
347
- swapFrom : null ,
348
- swapLength : null ,
349
- swapDepth : null ,
350
- rows : this . getRows ( this . props . treeData ) ,
355
+ draggedNode : null ,
356
+ draggedMinimumTreeIndex : null ,
357
+ draggedDepth : null ,
351
358
} ) ;
352
359
353
360
// Drop was cancelled
@@ -443,10 +450,7 @@ class ReactSortableTree extends Component {
443
450
444
451
renderRow (
445
452
{ node, parentNode, path, lowerSiblingCounts, treeIndex } ,
446
- listIndex ,
447
- style ,
448
- getPrevRow ,
449
- matchKeys
453
+ { listIndex, style, getPrevRow, matchKeys, swapFrom, swapDepth, swapLength }
450
454
) {
451
455
const {
452
456
canDrag,
@@ -490,9 +494,9 @@ class ReactSortableTree extends Component {
490
494
listIndex = { listIndex }
491
495
getPrevRow = { getPrevRow }
492
496
lowerSiblingCounts = { lowerSiblingCounts }
493
- swapFrom = { this . state . swapFrom }
494
- swapLength = { this . state . swapLength }
495
- swapDepth = { this . state . swapDepth }
497
+ swapFrom = { swapFrom }
498
+ swapLength = { swapLength }
499
+ swapDepth = { swapDepth }
496
500
{ ...sharedProps }
497
501
>
498
502
< NodeContentRenderer
@@ -517,8 +521,43 @@ class ReactSortableTree extends Component {
517
521
isVirtualized,
518
522
placeholderRenderer,
519
523
reactVirtualizedListProps,
524
+ getNodeKey,
520
525
} = mergeTheme ( this . props ) ;
521
- const { rows, searchMatches, searchFocusTreeIndex } = this . state ;
526
+ const {
527
+ searchMatches,
528
+ searchFocusTreeIndex,
529
+ draggedNode,
530
+ draggedDepth,
531
+ draggedMinimumTreeIndex,
532
+ } = this . state ;
533
+
534
+ const treeData = this . state . draggingTreeData || this . props . treeData ;
535
+
536
+ let rows ;
537
+ let swapFrom = null ;
538
+ let swapLength = null ;
539
+ if ( draggedNode && draggedMinimumTreeIndex !== null ) {
540
+ const addedResult = memoizedInsertNode ( {
541
+ treeData,
542
+ newNode : draggedNode ,
543
+ depth : draggedDepth ,
544
+ minimumTreeIndex : draggedMinimumTreeIndex ,
545
+ expandParent : true ,
546
+ getNodeKey,
547
+ } ) ;
548
+
549
+ const swapTo = draggedMinimumTreeIndex ;
550
+ swapFrom = addedResult . treeIndex ;
551
+ swapLength = 1 + memoizedGetDescendantCount ( { node : draggedNode } ) ;
552
+ rows = slideRows (
553
+ this . getRows ( addedResult . treeData ) ,
554
+ swapFrom ,
555
+ swapTo ,
556
+ swapLength
557
+ ) ;
558
+ } else {
559
+ rows = this . getRows ( treeData ) ;
560
+ }
522
561
523
562
// Get indices for rows that match the search conditions
524
563
const matchKeys = { } ;
@@ -569,13 +608,15 @@ class ReactSortableTree extends Component {
569
608
}
570
609
rowHeight = { rowHeight }
571
610
rowRenderer = { ( { index, style : rowStyle } ) =>
572
- this . renderRow (
573
- rows [ index ] ,
574
- index ,
575
- rowStyle ,
576
- ( ) => rows [ index - 1 ] || null ,
577
- matchKeys
578
- )
611
+ this . renderRow ( rows [ index ] , {
612
+ listIndex : index ,
613
+ style : rowStyle ,
614
+ getPrevRow : ( ) => rows [ index - 1 ] || null ,
615
+ matchKeys,
616
+ swapFrom,
617
+ swapDepth : draggedDepth ,
618
+ swapLength,
619
+ } )
579
620
}
580
621
{ ...reactVirtualizedListProps }
581
622
/>
@@ -585,18 +626,20 @@ class ReactSortableTree extends Component {
585
626
} else {
586
627
// Render list without react-virtualized
587
628
list = rows . map ( ( row , index ) =>
588
- this . renderRow (
589
- row ,
590
- index ,
591
- {
629
+ this . renderRow ( row , {
630
+ listIndex : index ,
631
+ style : {
592
632
height :
593
633
typeof rowHeight !== 'function'
594
634
? rowHeight
595
- : rowHeight ( { ... row , index } ) ,
635
+ : rowHeight ( { index } ) ,
596
636
} ,
597
- ( ) => rows [ index - 1 ] || null ,
598
- matchKeys
599
- )
637
+ getPrevRow : ( ) => rows [ index - 1 ] || null ,
638
+ matchKeys,
639
+ swapFrom,
640
+ swapDepth : draggedDepth ,
641
+ swapLength,
642
+ } )
600
643
) ;
601
644
}
602
645
0 commit comments