Skip to content

Commit fc0b971

Browse files
crisbetojelbourn
authored andcommitted
refactor(drag-drop): add current index to entered event (#15932)
Adds the index at which the item entered a new container to the `entered` events. Fixes #15924.
1 parent a632067 commit fc0b971

File tree

7 files changed

+67
-13
lines changed

7 files changed

+67
-13
lines changed

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

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import {DOCUMENT} from '@angular/common';
2525
import {of as observableOf} from 'rxjs';
2626

2727
import {DragDropModule} from '../drag-drop-module';
28-
import {CdkDragDrop} from '../drag-events';
28+
import {CdkDragDrop, CdkDragEnter} from '../drag-events';
2929
import {DragRefConfig, Point} from '../drag-ref';
3030
import {extendStyles} from '../drag-styling';
3131
import {moveItemInArray} from '../drag-utils';
@@ -3253,6 +3253,32 @@ describe('CdkDrag', () => {
32533253
'cdk-drop-list-dragging',
32543254
'Expected target to have dragging class once item has been moved over.');
32553255
}));
3256+
3257+
it('should dispatch an event when an item enters a new container', fakeAsync(() => {
3258+
const fixture = createComponent(ConnectedDropZones);
3259+
fixture.detectChanges();
3260+
3261+
const groups = fixture.componentInstance.groupedDragItems;
3262+
const item = groups[0][1];
3263+
const targetRect = groups[1][2].element.nativeElement.getBoundingClientRect();
3264+
3265+
startDraggingViaMouse(fixture, item.element.nativeElement);
3266+
3267+
dispatchMouseEvent(document, 'mousemove', targetRect.left + 1, targetRect.top + 1);
3268+
fixture.detectChanges();
3269+
3270+
const containerEnterEvent = fixture.componentInstance.enteredSpy.calls.mostRecent().args[0];
3271+
const itemEnterEvent = fixture.componentInstance.itemEnteredSpy.calls.mostRecent().args[0];
3272+
const expectedEvent: CdkDragEnter = {
3273+
container: fixture.componentInstance.dropInstances.toArray()[1],
3274+
item: item,
3275+
currentIndex: 2
3276+
};
3277+
3278+
expect(containerEnterEvent).toEqual(expectedEvent);
3279+
expect(itemEnterEvent).toEqual(expectedEvent);
3280+
}));
3281+
32563282
});
32573283
});
32583284

@@ -3548,25 +3574,40 @@ class DraggableInDropZoneWithCustomPlaceholder {
35483574
#todoZone="cdkDropList"
35493575
[cdkDropListData]="todo"
35503576
[cdkDropListConnectedTo]="[doneZone]"
3551-
(cdkDropListDropped)="droppedSpy($event)">
3552-
<div [cdkDragData]="item" *ngFor="let item of todo" cdkDrag>{{item}}</div>
3577+
(cdkDropListDropped)="droppedSpy($event)"
3578+
(cdkDropListEntered)="enteredSpy($event)">
3579+
<div
3580+
[cdkDragData]="item"
3581+
(cdkDragEntered)="itemEnteredSpy($event)"
3582+
*ngFor="let item of todo"
3583+
cdkDrag>{{item}}</div>
35533584
</div>
35543585
35553586
<div
35563587
cdkDropList
35573588
#doneZone="cdkDropList"
35583589
[cdkDropListData]="done"
35593590
[cdkDropListConnectedTo]="[todoZone]"
3560-
(cdkDropListDropped)="droppedSpy($event)">
3561-
<div [cdkDragData]="item" *ngFor="let item of done" cdkDrag>{{item}}</div>
3591+
(cdkDropListDropped)="droppedSpy($event)"
3592+
(cdkDropListEntered)="enteredSpy($event)">
3593+
<div
3594+
[cdkDragData]="item"
3595+
(cdkDragEntered)="itemEnteredSpy($event)"
3596+
*ngFor="let item of done"
3597+
cdkDrag>{{item}}</div>
35623598
</div>
35633599
35643600
<div
35653601
cdkDropList
35663602
#extraZone="cdkDropList"
35673603
[cdkDropListData]="extra"
3568-
(cdkDropListDropped)="droppedSpy($event)">
3569-
<div [cdkDragData]="item" *ngFor="let item of extra" cdkDrag>{{item}}</div>
3604+
(cdkDropListDropped)="droppedSpy($event)"
3605+
(cdkDropListEntered)="enteredSpy($event)">
3606+
<div
3607+
[cdkDragData]="item"
3608+
(cdkDragEntered)="itemEnteredSpy($event)"
3609+
*ngFor="let item of extra"
3610+
cdkDrag>{{item}}</div>
35703611
</div>
35713612
`
35723613
})
@@ -3579,6 +3620,8 @@ class ConnectedDropZones implements AfterViewInit {
35793620
done = ['Four', 'Five', 'Six'];
35803621
extra = [];
35813622
droppedSpy = jasmine.createSpy('dropped spy');
3623+
enteredSpy = jasmine.createSpy('entered spy');
3624+
itemEnteredSpy = jasmine.createSpy('item entered spy');
35823625

35833626
ngAfterViewInit() {
35843627
this.dropInstances.forEach((dropZone, index) => {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,8 @@ export class CdkDrag<T = any> implements AfterViewInit, OnChanges, OnDestroy {
355355
ref.entered.subscribe(event => {
356356
this.entered.emit({
357357
container: event.container.data,
358-
item: this
358+
item: this,
359+
currentIndex: event.currentIndex
359360
});
360361
});
361362

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ export class CdkDropList<T = any> implements CdkDropListContainer, AfterContentI
313313
ref.entered.subscribe(event => {
314314
this.entered.emit({
315315
container: this,
316-
item: event.item.data
316+
item: event.item.data,
317+
currentIndex: event.currentIndex
317318
});
318319
});
319320

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export interface CdkDragEnter<T = any, I = T> {
3333
container: CdkDropList<T>;
3434
/** Item that was removed from the container. */
3535
item: CdkDrag<I>;
36+
/** Index at which the item has entered the container. */
37+
currentIndex: number;
3638
}
3739

3840
/**

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ export class DragRef<T = any> {
236236
ended = new Subject<{source: DragRef}>();
237237

238238
/** Emits when the user has moved the item into a new container. */
239-
entered = new Subject<{container: DropListRef, item: DragRef}>();
239+
entered = new Subject<{container: DropListRef, item: DragRef, currentIndex: number}>();
240240

241241
/** Emits when the user removes the item its container by dragging it into another container. */
242242
exited = new Subject<{container: DropListRef, item: DragRef}>();
@@ -772,9 +772,13 @@ export class DragRef<T = any> {
772772
this.exited.next({item: this, container: this._dropContainer!});
773773
this._dropContainer!.exit(this);
774774
// Notify the new container that the item has entered.
775-
this.entered.next({item: this, container: newContainer!});
776775
this._dropContainer = newContainer!;
777776
this._dropContainer.enter(this, x, y);
777+
this.entered.next({
778+
item: this,
779+
container: newContainer!,
780+
currentIndex: newContainer!.getItemIndex(this)
781+
});
778782
});
779783
}
780784

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export class DropListRef<T = any> {
8181
/**
8282
* Emits when the user has moved a new drag item into this container.
8383
*/
84-
entered = new Subject<{item: DragRef, container: DropListRef}>();
84+
entered = new Subject<{item: DragRef, container: DropListRef, currentIndex: number}>();
8585

8686
/**
8787
* Emits when the user removes an item from the container
@@ -187,7 +187,6 @@ export class DropListRef<T = any> {
187187
* @param pointerY Position of the item along the Y axis.
188188
*/
189189
enter(item: DragRef, pointerX: number, pointerY: number): void {
190-
this.entered.next({item, container: this});
191190
this.start();
192191

193192
// If sorting is disabled, we want the item to return to its starting
@@ -235,6 +234,7 @@ export class DropListRef<T = any> {
235234
// Note that the positions were already cached when we called `start` above,
236235
// but we need to refresh them since the amount of items has changed.
237236
this._cacheItemPositions();
237+
this.entered.next({item, container: this, currentIndex: this.getItemIndex(item)});
238238
}
239239

240240
/**

tools/public_api_guard/cdk/drag-drop.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export interface CdkDragEnd<T = any> {
6464

6565
export interface CdkDragEnter<T = any, I = T> {
6666
container: CdkDropList<T>;
67+
currentIndex: number;
6768
item: CdkDrag<I>;
6869
}
6970

@@ -229,6 +230,7 @@ export declare class DragRef<T = any> {
229230
entered: Subject<{
230231
container: DropListRef;
231232
item: DragRef<any>;
233+
currentIndex: number;
232234
}>;
233235
exited: Subject<{
234236
container: DropListRef;
@@ -294,6 +296,7 @@ export declare class DropListRef<T = any> {
294296
entered: Subject<{
295297
item: DragRef;
296298
container: DropListRef<any>;
299+
currentIndex: number;
297300
}>;
298301
exited: Subject<{
299302
item: DragRef;

0 commit comments

Comments
 (0)