Skip to content

Commit 461a7b3

Browse files
committed
feat(drag-drop): expose native event objects in custom events
Exposes the native `MouseEvent` and `TouchEvent` objects in the various drag&drop events since they can contain useful information like which keys were pressed while dragging. Fixes #17032.
1 parent 8008218 commit 461a7b3

File tree

7 files changed

+117
-64
lines changed

7 files changed

+117
-64
lines changed

src/cdk/drag-drop/directives/drag.spec.ts

Lines changed: 54 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,10 @@ describe('CdkDrag', () => {
345345

346346
// Assert the event like this, rather than `toHaveBeenCalledWith`, because Jasmine will
347347
// go into an infinite loop trying to stringify the event, if the test fails.
348-
expect(event).toEqual({source: fixture.componentInstance.dragInstance});
348+
expect(event).toEqual({
349+
source: fixture.componentInstance.dragInstance,
350+
event: jasmine.anything()
351+
});
349352
}));
350353

351354
it('should dispatch an event when the user has stopped dragging', fakeAsync(() => {
@@ -362,7 +365,8 @@ describe('CdkDrag', () => {
362365
// go into an infinite loop trying to stringify the event, if the test fails.
363366
expect(event).toEqual({
364367
source: fixture.componentInstance.dragInstance,
365-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
368+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
369+
event: jasmine.anything()
366370
});
367371
}));
368372

@@ -375,15 +379,17 @@ describe('CdkDrag', () => {
375379

376380
expect(event).toEqual({
377381
source: jasmine.anything(),
378-
distance: {x: 25, y: 30}
382+
distance: {x: 25, y: 30},
383+
event: jasmine.anything()
379384
});
380385

381386
dragElementViaMouse(fixture, fixture.componentInstance.dragElement.nativeElement, 40, 50);
382387
event = fixture.componentInstance.endedSpy.calls.mostRecent().args[0];
383388

384389
expect(event).toEqual({
385390
source: jasmine.anything(),
386-
distance: {x: 40, y: 50}
391+
distance: {x: 40, y: 50},
392+
event: jasmine.anything()
387393
});
388394
}));
389395

@@ -1567,7 +1573,8 @@ describe('CdkDrag', () => {
15671573
container: fixture.componentInstance.dropInstance,
15681574
previousContainer: fixture.componentInstance.dropInstance,
15691575
isPointerOverContainer: true,
1570-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1576+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1577+
event: jasmine.anything()
15711578
});
15721579

15731580
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1693,7 +1700,8 @@ describe('CdkDrag', () => {
16931700
container: fixture.componentInstance.dropInstance,
16941701
previousContainer: fixture.componentInstance.dropInstance,
16951702
isPointerOverContainer: false,
1696-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1703+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1704+
event: jasmine.anything()
16971705
});
16981706

16991707
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1752,7 +1760,8 @@ describe('CdkDrag', () => {
17521760
container: fixture.componentInstance.dropInstance,
17531761
previousContainer: fixture.componentInstance.dropInstance,
17541762
isPointerOverContainer: true,
1755-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1763+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1764+
event: jasmine.anything()
17561765
});
17571766

17581767
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1793,7 +1802,8 @@ describe('CdkDrag', () => {
17931802
container: fixture.componentInstance.dropInstance,
17941803
previousContainer: fixture.componentInstance.dropInstance,
17951804
isPointerOverContainer: true,
1796-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1805+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1806+
event: jasmine.anything()
17971807
});
17981808

17991809
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1830,7 +1840,8 @@ describe('CdkDrag', () => {
18301840
container: fixture.componentInstance.dropInstance,
18311841
previousContainer: fixture.componentInstance.dropInstance,
18321842
isPointerOverContainer: false,
1833-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1843+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1844+
event: jasmine.anything()
18341845
});
18351846

18361847
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1873,7 +1884,8 @@ describe('CdkDrag', () => {
18731884
container: fixture.componentInstance.dropInstance,
18741885
previousContainer: fixture.componentInstance.dropInstance,
18751886
isPointerOverContainer: jasmine.any(Boolean),
1876-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1887+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1888+
event: jasmine.anything()
18771889
});
18781890
}));
18791891

@@ -1921,7 +1933,8 @@ describe('CdkDrag', () => {
19211933
container: fixture.componentInstance.dropInstance,
19221934
previousContainer: fixture.componentInstance.dropInstance,
19231935
isPointerOverContainer: jasmine.any(Boolean),
1924-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1936+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1937+
event: jasmine.anything()
19251938
});
19261939

19271940
scrollTo(0, 0);
@@ -3352,7 +3365,8 @@ describe('CdkDrag', () => {
33523365
container: dropInstance,
33533366
previousContainer: dropInstance,
33543367
isPointerOverContainer: true,
3355-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3368+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3369+
event: jasmine.anything()
33563370
});
33573371

33583372
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -3746,7 +3760,8 @@ describe('CdkDrag', () => {
37463760
container: fixture.componentInstance.dropInstance,
37473761
previousContainer: fixture.componentInstance.dropInstance,
37483762
isPointerOverContainer: true,
3749-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3763+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3764+
event: jasmine.anything()
37503765
});
37513766
}));
37523767

@@ -3947,7 +3962,8 @@ describe('CdkDrag', () => {
39473962
container: fixture.componentInstance.dropInstances.toArray()[1],
39483963
previousContainer: fixture.componentInstance.dropInstances.first,
39493964
isPointerOverContainer: true,
3950-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3965+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3966+
event: jasmine.anything()
39513967
});
39523968
}));
39533969

@@ -4052,7 +4068,8 @@ describe('CdkDrag', () => {
40524068
container: dropInstances[1],
40534069
previousContainer: dropInstances[0],
40544070
isPointerOverContainer: true,
4055-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4071+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4072+
event: jasmine.anything()
40564073
});
40574074
}));
40584075

@@ -4083,7 +4100,8 @@ describe('CdkDrag', () => {
40834100
container: dropInstances[0],
40844101
previousContainer: dropInstances[0],
40854102
isPointerOverContainer: false,
4086-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4103+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4104+
event: jasmine.anything()
40874105
});
40884106
}));
40894107

@@ -4114,7 +4132,8 @@ describe('CdkDrag', () => {
41144132
container: dropInstances[0],
41154133
previousContainer: dropInstances[0],
41164134
isPointerOverContainer: false,
4117-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4135+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4136+
event: jasmine.anything()
41184137
});
41194138
}));
41204139

@@ -4414,7 +4433,8 @@ describe('CdkDrag', () => {
44144433
container: dropInstances[1],
44154434
previousContainer: dropInstances[0],
44164435
isPointerOverContainer: true,
4417-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4436+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4437+
event: jasmine.anything()
44184438
});
44194439
}));
44204440

@@ -4441,7 +4461,8 @@ describe('CdkDrag', () => {
44414461
container: dropInstances[1],
44424462
previousContainer: dropInstances[0],
44434463
isPointerOverContainer: true,
4444-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4464+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4465+
event: jasmine.anything()
44454466
});
44464467
}));
44474468

@@ -4473,7 +4494,8 @@ describe('CdkDrag', () => {
44734494
container: dropInstances[1],
44744495
previousContainer: dropInstances[0],
44754496
isPointerOverContainer: true,
4476-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4497+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4498+
event: jasmine.anything()
44774499
});
44784500
}));
44794501

@@ -4509,7 +4531,8 @@ describe('CdkDrag', () => {
45094531
container: fixture.componentInstance.dropInstances.toArray()[1],
45104532
previousContainer: fixture.componentInstance.dropInstances.first,
45114533
isPointerOverContainer: true,
4512-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4534+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4535+
event: jasmine.anything()
45134536
});
45144537

45154538
expect(dropContainers[0].contains(item.element.nativeElement)).toBe(true,
@@ -4606,7 +4629,8 @@ describe('CdkDrag', () => {
46064629
container: dropInstances[0],
46074630
previousContainer: dropInstances[0],
46084631
isPointerOverContainer: false,
4609-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4632+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4633+
event: jasmine.anything()
46104634
});
46114635
}));
46124636

@@ -4727,7 +4751,8 @@ describe('CdkDrag', () => {
47274751
container: dropInstances[2],
47284752
previousContainer: dropInstances[0],
47294753
isPointerOverContainer: false,
4730-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4754+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4755+
event: jasmine.anything()
47314756
}));
47324757

47334758
}));
@@ -4986,7 +5011,8 @@ describe('CdkDrag', () => {
49865011
container: fixture.componentInstance.dropInstances.toArray()[1],
49875012
previousContainer: fixture.componentInstance.dropInstances.first,
49885013
isPointerOverContainer: true,
4989-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
5014+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
5015+
event: jasmine.anything()
49905016
});
49915017

49925018
cleanup();
@@ -5021,7 +5047,8 @@ describe('CdkDrag', () => {
50215047
container: fixture.componentInstance.dropInstances.toArray()[1],
50225048
previousContainer: fixture.componentInstance.dropInstances.first,
50235049
isPointerOverContainer: true,
5024-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
5050+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
5051+
event: jasmine.anything()
50255052
});
50265053
}));
50275054

@@ -5055,7 +5082,8 @@ describe('CdkDrag', () => {
50555082
container: fixture.componentInstance.dropInstances.toArray()[1],
50565083
previousContainer: fixture.componentInstance.dropInstances.first,
50575084
isPointerOverContainer: true,
5058-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
5085+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
5086+
event: jasmine.anything()
50595087
});
50605088
}));
50615089

src/cdk/drag-drop/directives/drag.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -393,50 +393,51 @@ export class CdkDrag<T = any> implements AfterViewInit, OnChanges, OnDestroy {
393393

394394
/** Handles the events from the underlying `DragRef`. */
395395
private _handleEvents(ref: DragRef<CdkDrag<T>>) {
396-
ref.started.subscribe(() => {
397-
this.started.emit({source: this});
396+
ref.started.subscribe(startEvent => {
397+
this.started.emit({source: this, event: startEvent.event});
398398

399399
// Since all of these events run outside of change detection,
400400
// we need to ensure that everything is marked correctly.
401401
this._changeDetectorRef.markForCheck();
402402
});
403403

404-
ref.released.subscribe(() => {
405-
this.released.emit({source: this});
404+
ref.released.subscribe(releaseEvent => {
405+
this.released.emit({source: this, event: releaseEvent.event});
406406
});
407407

408-
ref.ended.subscribe(event => {
409-
this.ended.emit({source: this, distance: event.distance});
408+
ref.ended.subscribe(endEvent => {
409+
this.ended.emit({source: this, distance: endEvent.distance, event: endEvent.event});
410410

411411
// Since all of these events run outside of change detection,
412412
// we need to ensure that everything is marked correctly.
413413
this._changeDetectorRef.markForCheck();
414414
});
415415

416-
ref.entered.subscribe(event => {
416+
ref.entered.subscribe(enterEvent => {
417417
this.entered.emit({
418-
container: event.container.data,
418+
container: enterEvent.container.data,
419419
item: this,
420-
currentIndex: event.currentIndex
420+
currentIndex: enterEvent.currentIndex
421421
});
422422
});
423423

424-
ref.exited.subscribe(event => {
424+
ref.exited.subscribe(exitEvent => {
425425
this.exited.emit({
426-
container: event.container.data,
426+
container: exitEvent.container.data,
427427
item: this
428428
});
429429
});
430430

431-
ref.dropped.subscribe(event => {
431+
ref.dropped.subscribe(dropEvent => {
432432
this.dropped.emit({
433-
previousIndex: event.previousIndex,
434-
currentIndex: event.currentIndex,
435-
previousContainer: event.previousContainer.data,
436-
container: event.container.data,
437-
isPointerOverContainer: event.isPointerOverContainer,
433+
previousIndex: dropEvent.previousIndex,
434+
currentIndex: dropEvent.currentIndex,
435+
previousContainer: dropEvent.previousContainer.data,
436+
container: dropEvent.container.data,
437+
isPointerOverContainer: dropEvent.isPointerOverContainer,
438438
item: this,
439-
distance: event.distance
439+
distance: dropEvent.distance,
440+
event: dropEvent.event
440441
});
441442
});
442443
}

src/cdk/drag-drop/directives/drop-list.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -311,15 +311,16 @@ export class CdkDropList<T = any> implements OnDestroy {
311311
});
312312
});
313313

314-
ref.dropped.subscribe(event => {
314+
ref.dropped.subscribe(dropEvent => {
315315
this.dropped.emit({
316-
previousIndex: event.previousIndex,
317-
currentIndex: event.currentIndex,
318-
previousContainer: event.previousContainer.data,
319-
container: event.container.data,
320-
item: event.item.data,
321-
isPointerOverContainer: event.isPointerOverContainer,
322-
distance: event.distance
316+
previousIndex: dropEvent.previousIndex,
317+
currentIndex: dropEvent.currentIndex,
318+
previousContainer: dropEvent.previousContainer.data,
319+
container: dropEvent.container.data,
320+
item: dropEvent.item.data,
321+
isPointerOverContainer: dropEvent.isPointerOverContainer,
322+
distance: dropEvent.distance,
323+
event: dropEvent.event
323324
});
324325

325326
// Mark for check since all of these events run outside of change

src/cdk/drag-drop/drag-events.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@ import {CdkDropList} from './directives/drop-list';
1313
export interface CdkDragStart<T = any> {
1414
/** Draggable that emitted the event. */
1515
source: CdkDrag<T>;
16+
/** Native event that started the drag sequence. */
17+
event: MouseEvent | TouchEvent;
1618
}
1719

1820
/** Event emitted when the user releases an item, before any animations have started. */
1921
export interface CdkDragRelease<T = any> {
2022
/** Draggable that emitted the event. */
2123
source: CdkDrag<T>;
24+
/** Native event that caused the release event. */
25+
event: MouseEvent | TouchEvent;
2226
}
2327

2428
/** Event emitted when the user stops dragging a draggable. */
@@ -27,6 +31,8 @@ export interface CdkDragEnd<T = any> {
2731
source: CdkDrag<T>;
2832
/** Distance in pixels that the user has dragged since the drag sequence started. */
2933
distance: {x: number, y: number};
34+
/** Native event that caused the dragging to stop. */
35+
event: MouseEvent | TouchEvent;
3036
}
3137

3238
/** Event emitted when the user moves an item into a new drop container. */
@@ -67,6 +73,8 @@ export interface CdkDragDrop<T, O = T> {
6773
isPointerOverContainer: boolean;
6874
/** Distance in pixels that the user has dragged since the drag sequence started. */
6975
distance: {x: number, y: number};
76+
/** Native event that caused the drop event. */
77+
event: MouseEvent | TouchEvent;
7078
}
7179

7280
/** Event emitted as the user is dragging a draggable item. */

0 commit comments

Comments
 (0)