@@ -8,14 +8,16 @@ import {
88 inject ,
99 Input ,
1010 NgZone ,
11+ OnDestroy ,
1112 Output
1213} from '@angular/core' ;
1314import {
1415 DragoverPredicate ,
1516 DropPredicate ,
1617 FdDndDropEventMode ,
1718 FdDndDropType ,
18- FdDropEvent
19+ FdDropEvent ,
20+ KeyUtil
1921} from '@fundamental-ngx/cdk/utils' ;
2022import { take } from 'rxjs/operators' ;
2123import { FDP_TABLE_DRAGGABLE_DIRECTIVE } from '../constants' ;
@@ -24,6 +26,17 @@ import { findRowChildren, getRowParents } from '../helpers';
2426import { TableRow , TableRowsRearrangeEvent , UpdatedDndRowsPosition } from '../models' ;
2527import { TableDraggable } from '../models/directives' ;
2628import { Table } from '../table' ;
29+ import {
30+ DOWN_ARROW ,
31+ END ,
32+ HOME ,
33+ LEFT_ARROW ,
34+ PAGE_DOWN ,
35+ PAGE_UP ,
36+ RIGHT_ARROW ,
37+ SPACE ,
38+ UP_ARROW
39+ } from '@angular/cdk/keycodes' ;
2740
2841@Directive ( {
2942 // eslint-disable-next-line @angular-eslint/directive-selector
@@ -36,7 +49,7 @@ import { Table } from '../table';
3649 }
3750 ]
3851} )
39- export class TableDraggableDirective < T = any > extends TableDraggable < T > {
52+ export class TableDraggableDirective < T = any > extends TableDraggable < T > implements OnDestroy {
4053 /** Whether to allow for row reordering on tree tables via drag and drop. */
4154 @Input ( )
4255 enableRowReordering = true ;
@@ -86,6 +99,11 @@ export class TableDraggableDirective<T = any> extends TableDraggable<T> {
8699 /** @hidden */
87100 dragDropInProgress = false ;
88101
102+ /** @hidden */
103+ ngOnDestroy ( ) : void {
104+ this . _setDragInProgress ( false ) ;
105+ }
106+
89107 /** Sets table reference. */
90108 setTable ( table : Table ) : void {
91109 this . _table = table ;
@@ -95,7 +113,7 @@ export class TableDraggableDirective<T = any> extends TableDraggable<T> {
95113 * Initiates drag&drop sequence.
96114 */
97115 dragDropStart ( ) : void {
98- this . dragDropInProgress = true ;
116+ this . _setDragInProgress ( true ) ;
99117 }
100118
101119 /** Method called when dnd performed with the keyboard. */
@@ -126,15 +144,17 @@ export class TableDraggableDirective<T = any> extends TableDraggable<T> {
126144 dropCancelled ( ) : void {
127145 /** After timeout to make click event handled first */
128146 this . _ngZone . runOutsideAngular ( ( ) => {
129- setTimeout ( ( ) => ( this . dragDropInProgress = false ) ) ;
147+ setTimeout ( ( ) => {
148+ this . _setDragInProgress ( false ) ;
149+ } ) ;
130150 } ) ;
131151 }
132152
133153 /** Method called when dragged item being dropped. */
134154 dragDropItemDrop ( event : FdDropEvent < TableRow > ) : void {
135155 /** After timeout to make click event handled first */
136156 this . _ngZone . runOutsideAngular ( ( ) => {
137- setTimeout ( ( ) => ( this . dragDropInProgress = false ) ) ;
157+ setTimeout ( ( ) => this . _setDragInProgress ( false ) ) ;
138158 } ) ;
139159
140160 this . _onZoneFree ( ( ) => {
@@ -193,6 +213,12 @@ export class TableDraggableDirective<T = any> extends TableDraggable<T> {
193213 ) ;
194214 }
195215
216+ /** @hidden */
217+ private _setDragInProgress ( dragging : boolean ) : void {
218+ this . dragDropInProgress = dragging ;
219+ dragging ? this . _blockScrolling ( ) : this . _enableScrolling ( ) ;
220+ }
221+
196222 /** @hidden */
197223 private _isDroppedInsideItself ( dropRow : TableRow , dragRow : TableRow ) : boolean {
198224 const dropRowParents = getRowParents ( dropRow ) ;
@@ -311,4 +337,38 @@ export class TableDraggableDirective<T = any> extends TableDraggable<T> {
311337 callback ( ) ;
312338 } ) ;
313339 }
340+
341+ /** @hidden */
342+ private _blockScrolling ( ) : void {
343+ this . _table . _focusableGrid . _preventKeydown = true ;
344+ this . _table . tableContainer . nativeElement . addEventListener ( 'DOMMouseScroll' , preventDefault , false ) ;
345+ this . _table . tableContainer . nativeElement . addEventListener ( 'wheel' , preventDefault , { passive : false } ) ;
346+ this . _table . tableContainer . nativeElement . addEventListener ( 'mousewheel' , preventDefault , { passive : false } ) ;
347+ this . _table . tableContainer . nativeElement . addEventListener ( 'touchmove' , preventDefault , { passive : false } ) ;
348+ this . _table . tableContainer . nativeElement . addEventListener ( 'keydown' , preventDefaultForScrollKeys , false ) ;
349+ }
350+
351+ /** @hidden */
352+ private _enableScrolling ( ) : void {
353+ this . _table . _focusableGrid . _preventKeydown = false ;
354+ this . _table . tableContainer . nativeElement . removeEventListener ( 'DOMMouseScroll' , preventDefault , false ) ;
355+ this . _table . tableContainer . nativeElement . removeEventListener ( 'wheel' , preventDefault ) ;
356+ this . _table . tableContainer . nativeElement . removeEventListener ( 'mousewheel' , preventDefault ) ;
357+ this . _table . tableContainer . nativeElement . removeEventListener ( 'touchmove' , preventDefault ) ;
358+ this . _table . tableContainer . nativeElement . removeEventListener ( 'keydown' , preventDefaultForScrollKeys , false ) ;
359+ }
360+ }
361+
362+ function preventDefault ( event : Event ) : void {
363+ event . preventDefault ( ) ;
364+ }
365+
366+ function preventDefaultForScrollKeys ( event : KeyboardEvent ) : boolean | undefined {
367+ if (
368+ ! event . altKey &&
369+ KeyUtil . isKeyCode ( event , [ LEFT_ARROW , RIGHT_ARROW , UP_ARROW , DOWN_ARROW , SPACE , PAGE_DOWN , PAGE_UP , END , HOME ] )
370+ ) {
371+ preventDefault ( event ) ;
372+ return false ;
373+ }
314374}
0 commit comments