5
5
} from '@angular/core' ;
6
6
import { coerceNumberProperty , NumberInput } from './coercion/number-property' ;
7
7
import { KtdGridItemComponent } from './grid-item/grid-item.component' ;
8
- import { combineLatest , merge , NEVER , Observable , Observer , of , Subscription } from 'rxjs' ;
8
+ import { combineLatest , empty , merge , NEVER , Observable , Observer , of , Subscription } from 'rxjs' ;
9
9
import { exhaustMap , map , startWith , switchMap , takeUntil } from 'rxjs/operators' ;
10
10
import { ktdGetGridItemRowHeight , ktdGridItemDragging , ktdGridItemLayoutItemAreEqual , ktdGridItemResizing } from './utils/grid.utils' ;
11
11
import { compact } from './utils/react-grid-layout.utils' ;
@@ -19,6 +19,7 @@ import { getMutableClientRect, KtdClientRect } from './utils/client-rect';
19
19
import { ktdGetScrollTotalRelativeDifference$ , ktdScrollIfNearElementClientRect$ } from './utils/scroll' ;
20
20
import { BooleanInput , coerceBooleanProperty } from './coercion/boolean-property' ;
21
21
import { KtdGridItemPlaceholder } from './directives/placeholder' ;
22
+ import { getTransformTransitionDurationInMs } from './utils/transition-duration' ;
22
23
23
24
interface KtdDragResizeEvent {
24
25
layout : KtdGridLayout ;
@@ -272,6 +273,7 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
272
273
get backgroundConfig ( ) : KtdGridBackgroundCfg | null {
273
274
return this . _backgroundConfig ;
274
275
}
276
+
275
277
set backgroundConfig ( val : KtdGridBackgroundCfg | null ) {
276
278
this . _backgroundConfig = val ;
277
279
@@ -611,6 +613,8 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
611
613
this . renderer . removeClass ( gridItem . elementRef . nativeElement , 'no-transitions' ) ;
612
614
this . renderer . removeClass ( gridItem . elementRef . nativeElement , 'ktd-grid-item-dragging' ) ;
613
615
616
+ this . addGridItemAnimatingClass ( gridItem ) . subscribe ( ) ;
617
+ // Consider destroying the placeholder after the animation has finished.
614
618
this . destroyPlaceholder ( ) ;
615
619
616
620
if ( newLayout ) {
@@ -645,6 +649,43 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
645
649
} ) ;
646
650
}
647
651
652
+
653
+ /**
654
+ * It adds the `ktd-grid-item-animating` class and removes it when the animated transition is complete.
655
+ * This function is meant to be executed when the drag has ended.
656
+ * @param gridItem that has been dragged
657
+ */
658
+ private addGridItemAnimatingClass ( gridItem : KtdGridItemComponent ) : Observable < undefined > {
659
+
660
+ return new Observable ( observer => {
661
+
662
+ const duration = getTransformTransitionDurationInMs ( gridItem . elementRef . nativeElement ) ;
663
+
664
+ if ( duration === 0 ) {
665
+ observer . next ( ) ;
666
+ observer . complete ( ) ;
667
+ return ;
668
+ }
669
+
670
+ this . renderer . addClass ( gridItem . elementRef . nativeElement , 'ktd-grid-item-animating' ) ;
671
+ const handler = ( ( event : TransitionEvent ) => {
672
+ if ( ! event || ( event . target === gridItem . elementRef . nativeElement && event . propertyName === 'transform' ) ) {
673
+ this . renderer . removeClass ( gridItem . elementRef . nativeElement , 'ktd-grid-item-animating' ) ;
674
+ removeEventListener ( ) ;
675
+ clearTimeout ( timeout ) ;
676
+ observer . next ( ) ;
677
+ observer . complete ( ) ;
678
+ }
679
+ } ) as EventListener ;
680
+
681
+ // If a transition is short enough, the browser might not fire the `transitionend` event.
682
+ // Since we know how long it's supposed to take, add a timeout with a 50% buffer that'll
683
+ // fire if the transition hasn't completed when it was supposed to.
684
+ const timeout = setTimeout ( handler , duration * 1.5 ) ;
685
+ const removeEventListener = this . renderer . listen ( gridItem . elementRef . nativeElement , 'transitionend' , handler ) ;
686
+ } )
687
+ }
688
+
648
689
/** Creates placeholder element */
649
690
private createPlaceholderElement ( clientRect : KtdClientRect , gridItemPlaceholder ?: KtdGridItemPlaceholder ) {
650
691
this . placeholder = this . renderer . createElement ( 'div' ) ;
0 commit comments