Skip to content

Commit b451814

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 29e74eb commit b451814

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

@@ -1546,7 +1552,8 @@ describe('CdkDrag', () => {
15461552
container: fixture.componentInstance.dropInstance,
15471553
previousContainer: fixture.componentInstance.dropInstance,
15481554
isPointerOverContainer: true,
1549-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1555+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1556+
event: jasmine.anything()
15501557
});
15511558

15521559
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1672,7 +1679,8 @@ describe('CdkDrag', () => {
16721679
container: fixture.componentInstance.dropInstance,
16731680
previousContainer: fixture.componentInstance.dropInstance,
16741681
isPointerOverContainer: false,
1675-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1682+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1683+
event: jasmine.anything()
16761684
});
16771685

16781686
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1731,7 +1739,8 @@ describe('CdkDrag', () => {
17311739
container: fixture.componentInstance.dropInstance,
17321740
previousContainer: fixture.componentInstance.dropInstance,
17331741
isPointerOverContainer: true,
1734-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1742+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1743+
event: jasmine.anything()
17351744
});
17361745

17371746
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1772,7 +1781,8 @@ describe('CdkDrag', () => {
17721781
container: fixture.componentInstance.dropInstance,
17731782
previousContainer: fixture.componentInstance.dropInstance,
17741783
isPointerOverContainer: true,
1775-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1784+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1785+
event: jasmine.anything()
17761786
});
17771787

17781788
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1809,7 +1819,8 @@ describe('CdkDrag', () => {
18091819
container: fixture.componentInstance.dropInstance,
18101820
previousContainer: fixture.componentInstance.dropInstance,
18111821
isPointerOverContainer: false,
1812-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1822+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1823+
event: jasmine.anything()
18131824
});
18141825

18151826
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -1852,7 +1863,8 @@ describe('CdkDrag', () => {
18521863
container: fixture.componentInstance.dropInstance,
18531864
previousContainer: fixture.componentInstance.dropInstance,
18541865
isPointerOverContainer: jasmine.any(Boolean),
1855-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1866+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1867+
event: jasmine.anything()
18561868
});
18571869
}));
18581870

@@ -1900,7 +1912,8 @@ describe('CdkDrag', () => {
19001912
container: fixture.componentInstance.dropInstance,
19011913
previousContainer: fixture.componentInstance.dropInstance,
19021914
isPointerOverContainer: jasmine.any(Boolean),
1903-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
1915+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
1916+
event: jasmine.anything()
19041917
});
19051918

19061919
scrollTo(0, 0);
@@ -3197,7 +3210,8 @@ describe('CdkDrag', () => {
31973210
container: dropInstance,
31983211
previousContainer: dropInstance,
31993212
isPointerOverContainer: true,
3200-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3213+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3214+
event: jasmine.anything()
32013215
});
32023216

32033217
expect(dragItems.map(drag => drag.element.nativeElement.textContent!.trim()))
@@ -3591,7 +3605,8 @@ describe('CdkDrag', () => {
35913605
container: fixture.componentInstance.dropInstance,
35923606
previousContainer: fixture.componentInstance.dropInstance,
35933607
isPointerOverContainer: true,
3594-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3608+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3609+
event: jasmine.anything()
35953610
});
35963611
}));
35973612

@@ -3749,7 +3764,8 @@ describe('CdkDrag', () => {
37493764
container: fixture.componentInstance.dropInstances.toArray()[1],
37503765
previousContainer: fixture.componentInstance.dropInstances.first,
37513766
isPointerOverContainer: true,
3752-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3767+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3768+
event: jasmine.anything()
37533769
});
37543770
}));
37553771

@@ -3852,7 +3868,8 @@ describe('CdkDrag', () => {
38523868
container: dropInstances[1],
38533869
previousContainer: dropInstances[0],
38543870
isPointerOverContainer: true,
3855-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3871+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3872+
event: jasmine.anything()
38563873
});
38573874
}));
38583875

@@ -3883,7 +3900,8 @@ describe('CdkDrag', () => {
38833900
container: dropInstances[0],
38843901
previousContainer: dropInstances[0],
38853902
isPointerOverContainer: false,
3886-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3903+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3904+
event: jasmine.anything()
38873905
});
38883906
}));
38893907

@@ -3914,7 +3932,8 @@ describe('CdkDrag', () => {
39143932
container: dropInstances[0],
39153933
previousContainer: dropInstances[0],
39163934
isPointerOverContainer: false,
3917-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
3935+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
3936+
event: jasmine.anything()
39183937
});
39193938
}));
39203939

@@ -4065,7 +4084,8 @@ describe('CdkDrag', () => {
40654084
container: dropInstances[1],
40664085
previousContainer: dropInstances[0],
40674086
isPointerOverContainer: true,
4068-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4087+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4088+
event: jasmine.anything()
40694089
});
40704090
}));
40714091

@@ -4092,7 +4112,8 @@ describe('CdkDrag', () => {
40924112
container: dropInstances[1],
40934113
previousContainer: dropInstances[0],
40944114
isPointerOverContainer: true,
4095-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4115+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4116+
event: jasmine.anything()
40964117
});
40974118
}));
40984119

@@ -4124,7 +4145,8 @@ describe('CdkDrag', () => {
41244145
container: dropInstances[1],
41254146
previousContainer: dropInstances[0],
41264147
isPointerOverContainer: true,
4127-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4148+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4149+
event: jasmine.anything()
41284150
});
41294151
}));
41304152

@@ -4160,7 +4182,8 @@ describe('CdkDrag', () => {
41604182
container: fixture.componentInstance.dropInstances.toArray()[1],
41614183
previousContainer: fixture.componentInstance.dropInstances.first,
41624184
isPointerOverContainer: true,
4163-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4185+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4186+
event: jasmine.anything()
41644187
});
41654188

41664189
expect(dropContainers[0].contains(item.element.nativeElement)).toBe(true,
@@ -4257,7 +4280,8 @@ describe('CdkDrag', () => {
42574280
container: dropInstances[0],
42584281
previousContainer: dropInstances[0],
42594282
isPointerOverContainer: false,
4260-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4283+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4284+
event: jasmine.anything()
42614285
});
42624286
}));
42634287

@@ -4378,7 +4402,8 @@ describe('CdkDrag', () => {
43784402
container: dropInstances[2],
43794403
previousContainer: dropInstances[0],
43804404
isPointerOverContainer: false,
4381-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4405+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4406+
event: jasmine.anything()
43824407
}));
43834408

43844409
}));
@@ -4637,7 +4662,8 @@ describe('CdkDrag', () => {
46374662
container: fixture.componentInstance.dropInstances.toArray()[1],
46384663
previousContainer: fixture.componentInstance.dropInstances.first,
46394664
isPointerOverContainer: true,
4640-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4665+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4666+
event: jasmine.anything()
46414667
});
46424668

46434669
cleanup();
@@ -4672,7 +4698,8 @@ describe('CdkDrag', () => {
46724698
container: fixture.componentInstance.dropInstances.toArray()[1],
46734699
previousContainer: fixture.componentInstance.dropInstances.first,
46744700
isPointerOverContainer: true,
4675-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4701+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4702+
event: jasmine.anything()
46764703
});
46774704
}));
46784705

@@ -4706,7 +4733,8 @@ describe('CdkDrag', () => {
47064733
container: fixture.componentInstance.dropInstances.toArray()[1],
47074734
previousContainer: fixture.componentInstance.dropInstances.first,
47084735
isPointerOverContainer: true,
4709-
distance: {x: jasmine.any(Number), y: jasmine.any(Number)}
4736+
distance: {x: jasmine.any(Number), y: jasmine.any(Number)},
4737+
event: jasmine.anything()
47104738
});
47114739
}));
47124740

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

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

387387
/** Handles the events from the underlying `DragRef`. */
388388
private _handleEvents(ref: DragRef<CdkDrag<T>>) {
389-
ref.started.subscribe(() => {
390-
this.started.emit({source: this});
389+
ref.started.subscribe(startEvent => {
390+
this.started.emit({source: this, event: startEvent.event});
391391

392392
// Since all of these events run outside of change detection,
393393
// we need to ensure that everything is marked correctly.
394394
this._changeDetectorRef.markForCheck();
395395
});
396396

397-
ref.released.subscribe(() => {
398-
this.released.emit({source: this});
397+
ref.released.subscribe(releaseEvent => {
398+
this.released.emit({source: this, event: releaseEvent.event});
399399
});
400400

401-
ref.ended.subscribe(event => {
402-
this.ended.emit({source: this, distance: event.distance});
401+
ref.ended.subscribe(endEvent => {
402+
this.ended.emit({source: this, distance: endEvent.distance, event: endEvent.event});
403403

404404
// Since all of these events run outside of change detection,
405405
// we need to ensure that everything is marked correctly.
406406
this._changeDetectorRef.markForCheck();
407407
});
408408

409-
ref.entered.subscribe(event => {
409+
ref.entered.subscribe(enterEvent => {
410410
this.entered.emit({
411-
container: event.container.data,
411+
container: enterEvent.container.data,
412412
item: this,
413-
currentIndex: event.currentIndex
413+
currentIndex: enterEvent.currentIndex
414414
});
415415
});
416416

417-
ref.exited.subscribe(event => {
417+
ref.exited.subscribe(exitEvent => {
418418
this.exited.emit({
419-
container: event.container.data,
419+
container: exitEvent.container.data,
420420
item: this
421421
});
422422
});
423423

424-
ref.dropped.subscribe(event => {
424+
ref.dropped.subscribe(dropEvent => {
425425
this.dropped.emit({
426-
previousIndex: event.previousIndex,
427-
currentIndex: event.currentIndex,
428-
previousContainer: event.previousContainer.data,
429-
container: event.container.data,
430-
isPointerOverContainer: event.isPointerOverContainer,
426+
previousIndex: dropEvent.previousIndex,
427+
currentIndex: dropEvent.currentIndex,
428+
previousContainer: dropEvent.previousContainer.data,
429+
container: dropEvent.container.data,
430+
isPointerOverContainer: dropEvent.isPointerOverContainer,
431431
item: this,
432-
distance: event.distance
432+
distance: dropEvent.distance,
433+
event: dropEvent.event
433434
});
434435
});
435436
}

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,16 @@ export class CdkDropList<T = any> implements AfterContentInit, OnDestroy {
363363
});
364364
});
365365

366-
ref.dropped.subscribe(event => {
366+
ref.dropped.subscribe(dropEvent => {
367367
this.dropped.emit({
368-
previousIndex: event.previousIndex,
369-
currentIndex: event.currentIndex,
370-
previousContainer: event.previousContainer.data,
371-
container: event.container.data,
372-
item: event.item.data,
373-
isPointerOverContainer: event.isPointerOverContainer,
374-
distance: event.distance
368+
previousIndex: dropEvent.previousIndex,
369+
currentIndex: dropEvent.currentIndex,
370+
previousContainer: dropEvent.previousContainer.data,
371+
container: dropEvent.container.data,
372+
item: dropEvent.item.data,
373+
isPointerOverContainer: dropEvent.isPointerOverContainer,
374+
distance: dropEvent.distance,
375+
event: dropEvent.event
375376
});
376377

377378
// 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)