@@ -127,6 +127,82 @@ test.describe("Vue wrappers working as expected", async () => {
127127} ) ;
128128
129129test . describe ( "React wrapper working as expected" , async ( ) => {
130+ test ( "useDragAndDrop() keeps sorting across multiple rows during one drag" , async ( {
131+ browserName,
132+ } ) => {
133+ test . skip (
134+ browserName !== "chromium" ,
135+ "Synthetic native DragEvent sequence is only deterministic in Chromium."
136+ ) ;
137+
138+ await page . evaluate ( async ( ) => {
139+ const originElement = document . getElementById (
140+ "react_use_drag_and_drop_continuous_depeche_mode"
141+ ) ;
142+ const targetIds = [
143+ "react_use_drag_and_drop_continuous_duran_duran" ,
144+ "react_use_drag_and_drop_continuous_pet_shop_boys" ,
145+ "react_use_drag_and_drop_continuous_kraftwerk" ,
146+ ] ;
147+
148+ if ( ! originElement ) throw new Error ( "Missing origin element" ) ;
149+
150+ const dataTransfer = new DataTransfer ( ) ;
151+
152+ const getEventProps = ( element : Element ) => {
153+ const rect = element . getBoundingClientRect ( ) ;
154+ const x = rect . x + rect . width / 2 ;
155+ const y = rect . y + rect . height / 2 ;
156+
157+ return {
158+ bubbles : true ,
159+ cancelable : true ,
160+ clientX : x ,
161+ clientY : y ,
162+ dataTransfer,
163+ screenX : x ,
164+ screenY : y ,
165+ } ;
166+ } ;
167+
168+ originElement . dispatchEvent (
169+ new DragEvent ( "dragstart" , getEventProps ( originElement ) )
170+ ) ;
171+
172+ for ( const id of targetIds ) {
173+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
174+
175+ const targetElement = document . getElementById ( id ) ;
176+
177+ if ( ! targetElement ) throw new Error ( `Missing target element ${ id } ` ) ;
178+
179+ targetElement . dispatchEvent (
180+ new DragEvent ( "dragover" , getEventProps ( targetElement ) )
181+ ) ;
182+
183+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
184+ }
185+
186+ const dropElement = document . getElementById ( targetIds [ targetIds . length - 1 ] ) ;
187+
188+ if ( ! dropElement ) throw new Error ( "Missing drop element" ) ;
189+
190+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
191+
192+ dropElement . dispatchEvent (
193+ new DragEvent ( "drop" , getEventProps ( dropElement ) )
194+ ) ;
195+
196+ await new Promise ( ( resolve ) => setTimeout ( resolve , 200 ) ) ;
197+ } ) ;
198+
199+ await expect (
200+ page . locator ( "#react_use_drag_and_drop_continuous_values" )
201+ ) . toHaveText (
202+ "duran_duran pet_shop_boys kraftwerk depeche_mode tears_for_fears spandau_ballet"
203+ ) ;
204+ } ) ;
205+
130206 test ( "dragAndDrop() can enable sorting, accept new values, and update the parent config" , async ( ) => {
131207 // Check that the list items can be sorted
132208 await drag ( page , {
0 commit comments