@@ -6,7 +6,7 @@ import type {
66} from '@dnd-kit/abstract' ;
77import { defaultCollisionDetection } from '@dnd-kit/collision' ;
88import type { CollisionDetector } from '@dnd-kit/collision' ;
9- import { reactive , untracked } from '@dnd-kit/state' ;
9+ import { derived , reactive , untracked } from '@dnd-kit/state' ;
1010import type { BoundingRectangle , Shape } from '@dnd-kit/geometry' ;
1111import { DOMRectangle , PositionObserver } from '@dnd-kit/dom/utilities' ;
1212
@@ -20,32 +20,6 @@ export interface Input<T extends Data = Data>
2020 element ?: Element ;
2121}
2222
23- function getPathArray (
24- droppables : DragDropManager [ 'registry' ] [ 'droppables' ] ,
25- target : Element
26- ) : UniqueIdentifier [ ] {
27- // Create a map from element to id for easy lookup
28- const elementMap = new Map < Element , UniqueIdentifier > ( ) ;
29- Array . from ( droppables . value ) . forEach ( ( item ) => {
30- if ( item ?. element ) {
31- elementMap . set ( item . element , item . id ) ;
32- }
33- } ) ;
34-
35- const path : UniqueIdentifier [ ] = [ ] ;
36- let currentElement = target . parentElement ;
37-
38- while ( currentElement ) {
39- const parentId = elementMap . get ( currentElement ) ;
40- if ( parentId ) {
41- path . unshift ( parentId ) ;
42- }
43- currentElement = currentElement . parentElement ;
44- }
45-
46- return path ;
47- }
48-
4923export class Droppable < T extends Data = Data > extends AbstractDroppable <
5024 T ,
5125 DragDropManager
@@ -96,10 +70,6 @@ export class Droppable<T extends Data = Data> extends AbstractDroppable<
9670 ! this . disabled &&
9771 this . accepts ( source ) ;
9872
99- this . path = element
100- ? getPathArray ( manager . registry . droppables , element )
101- : [ ] ;
102-
10373 if ( observePosition ) {
10474 const positionObserver = new PositionObserver (
10575 element ,
@@ -143,4 +113,41 @@ export class Droppable<T extends Data = Data> extends AbstractDroppable<
143113 }
144114
145115 public refreshShape : ( ) => Shape | undefined ;
116+
117+ @derived
118+ private get elementMap ( ) {
119+ const { manager} = this ;
120+ if ( ! manager ) return ;
121+
122+ // Create a map from element to id for easy lookup
123+ const elementMap = new Map < Element , UniqueIdentifier > ( ) ;
124+ Array . from ( manager . registry . droppables . value ) . forEach ( ( item ) => {
125+ if ( item ?. element ) {
126+ elementMap . set ( item . element , item . id ) ;
127+ }
128+ } ) ;
129+
130+ return elementMap ;
131+ }
132+
133+ public get parent ( ) {
134+ if ( super . parent ) {
135+ return super . parent ;
136+ }
137+
138+ const { element} = this ;
139+ if ( ! element || ! this . elementMap ) return ;
140+
141+ let currentElement = element . parentElement ;
142+
143+ while ( currentElement ) {
144+ const parentId = this . elementMap . get ( currentElement ) ;
145+
146+ if ( parentId ) {
147+ return parentId ;
148+ }
149+
150+ currentElement = currentElement . parentElement ;
151+ }
152+ }
146153}
0 commit comments