@@ -354,6 +354,7 @@ describe('CdkDrag', () => {
354
354
dragElementViaMouse ( fixture , fixture . componentInstance . dragElement . nativeElement , 2 , 2 ) ;
355
355
356
356
expect ( fixture . componentInstance . startedSpy ) . not . toHaveBeenCalled ( ) ;
357
+ expect ( fixture . componentInstance . releasedSpy ) . not . toHaveBeenCalled ( ) ;
357
358
expect ( fixture . componentInstance . endedSpy ) . not . toHaveBeenCalled ( ) ;
358
359
expect ( moveSpy ) . not . toHaveBeenCalled ( ) ;
359
360
subscription . unsubscribe ( ) ;
@@ -1221,6 +1222,40 @@ describe('CdkDrag', () => {
1221
1222
. toBeFalsy ( 'Expected preview to be removed from the DOM if the transition timed out' ) ;
1222
1223
} ) ) ;
1223
1224
1225
+ it ( 'should emit the released event as soon as the item is released' , fakeAsync ( ( ) => {
1226
+ const fixture = createComponent ( DraggableInDropZone ) ;
1227
+ fixture . detectChanges ( ) ;
1228
+ const item = fixture . componentInstance . dragItems . toArray ( ) [ 1 ] ;
1229
+ const endedSpy = jasmine . createSpy ( 'ended spy' ) ;
1230
+ const releasedSpy = jasmine . createSpy ( 'released spy' ) ;
1231
+ const endedSubscription = item . ended . subscribe ( endedSpy ) ;
1232
+ const releasedSubscription = item . released . subscribe ( releasedSpy ) ;
1233
+
1234
+ startDraggingViaMouse ( fixture , item . element . nativeElement ) ;
1235
+
1236
+ const preview = document . querySelector ( '.cdk-drag-preview' ) ! as HTMLElement ;
1237
+
1238
+ // Add a duration since the tests won't include one.
1239
+ preview . style . transitionDuration = '500ms' ;
1240
+
1241
+ // Move somewhere so the draggable doesn't exit immediately.
1242
+ dispatchMouseEvent ( document , 'mousemove' , 50 , 50 ) ;
1243
+ fixture . detectChanges ( ) ;
1244
+
1245
+ dispatchMouseEvent ( document , 'mouseup' ) ;
1246
+ fixture . detectChanges ( ) ;
1247
+
1248
+ // Expected the released event to fire immediately upon release.
1249
+ expect ( releasedSpy ) . toHaveBeenCalled ( ) ;
1250
+ tick ( 1000 ) ;
1251
+
1252
+ // Expected the ended event to fire once the entire sequence is done.
1253
+ expect ( endedSpy ) . toHaveBeenCalled ( ) ;
1254
+
1255
+ endedSubscription . unsubscribe ( ) ;
1256
+ releasedSubscription . unsubscribe ( ) ;
1257
+ } ) ) ;
1258
+
1224
1259
it ( 'should reset immediately when failed drag happens after a successful one' , fakeAsync ( ( ) => {
1225
1260
const fixture = createComponent ( DraggableInDropZone ) ;
1226
1261
fixture . detectChanges ( ) ;
@@ -2597,6 +2632,7 @@ describe('CdkDrag', () => {
2597
2632
cdkDrag
2598
2633
[cdkDragBoundary]="boundarySelector"
2599
2634
(cdkDragStarted)="startedSpy($event)"
2635
+ (cdkDragReleased)="releasedSpy($event)"
2600
2636
(cdkDragEnded)="endedSpy($event)"
2601
2637
#dragElement
2602
2638
style="width: 100px; height: 100px; background: red;"></div>
@@ -2608,6 +2644,7 @@ class StandaloneDraggable {
2608
2644
@ViewChild ( CdkDrag ) dragInstance : CdkDrag ;
2609
2645
startedSpy = jasmine . createSpy ( 'started spy' ) ;
2610
2646
endedSpy = jasmine . createSpy ( 'ended spy' ) ;
2647
+ releasedSpy = jasmine . createSpy ( 'released spy' ) ;
2611
2648
boundarySelector : string ;
2612
2649
}
2613
2650
0 commit comments