Skip to content

Commit 950ee44

Browse files
committed
feat(drag-n-drop): resize bug fix
1 parent c92c282 commit 950ee44

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

projects/angular-grid-layout/src/lib/grid.component.ts

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -505,15 +505,33 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
505505
startWith(this._gridItems),
506506
switchMap((gridItems: QueryList<KtdGridItemComponent>) => {
507507
return merge(
508-
...gridItems.map((gridItem) => gridItem.dragStart.pipe(map(({event}) => ({event, gridItem, type: 'drag' as DragActionType})))),
508+
...gridItems.map((gridItem) => gridItem.dragStart.pipe(map(({event}) => ({
509+
event,
510+
gridItem,
511+
type: 'drag' as DragActionType
512+
})))),
509513
...gridItems.map((gridItem) => gridItem.resizeStart$.pipe(map((event) => ({
510514
event,
511515
gridItem,
512516
type: 'resize' as DragActionType,
513517
})))),
514518
).pipe(exhaustMap((data) => of(data)));
515519
})
516-
).subscribe(({event, gridItem, type}) => this.gridService.startDrag(event, gridItem.dragRef, type, this)),
520+
).subscribe(({event, gridItem, type}) => {
521+
// Prevents the event from bubbling up the DOM tree, preventing any parent event handlers from being notified of the event.
522+
// Specifically, it prevents the event from being sent to any parent event handlers that may be listening for it.
523+
if (type === 'resize') {
524+
event.stopPropagation();
525+
}
526+
527+
// If the event started from an element with the native HTML drag&drop, it'll interfere
528+
// with our positioning logic since it'll start dragging the native element.
529+
if (event.target && ((event.target as HTMLElement).draggable || true) && event.type === 'pointerdown') {
530+
event.preventDefault();
531+
}
532+
533+
return this.gridService.startDrag(event, gridItem.dragRef, type, this);
534+
}),
517535

518536
connectedToItems$.pipe(
519537
startWith(connectedToItems$.value),
@@ -691,6 +709,7 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
691709
};
692710
}
693711

712+
// TODO: Call this only when the drag ended, when the drag is paused do nothing.
694713
public stopDragSequence(): void {
695714
const dragInfo = this.gridService.drag!;
696715

@@ -699,7 +718,9 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
699718
this.renderer.removeClass(dragInfo.dragRef.elementRef.nativeElement, 'no-transitions');
700719
this.renderer.removeClass(dragInfo.dragRef.elementRef.nativeElement, 'ktd-grid-item-dragging');
701720

702-
(dragInfo.type === 'drag' ? this.dragEnded : this.resizeEnded).emit(getDragResizeEventData(dragInfo.dragRef, this.layout));
721+
this.ngZone.run(() => {
722+
(dragInfo.type === 'drag' ? this.dragEnded : this.resizeEnded).emit(getDragResizeEventData(dragInfo.dragRef, this.layout));
723+
});
703724

704725
this.addGridItemAnimatingClass(dragInfo.dragRef).subscribe();
705726
// Consider destroying the placeholder after the animation has finished.

projects/angular-grid-layout/src/lib/utils/drag-ref.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export class DragRef<T = any> {
215215
exhaustMap((startEvent) => {
216216
// If the event started from an element with the native HTML drag&drop, it'll interfere
217217
// with our positioning logic since it'll start dragging the native element.
218-
if (startEvent.target && (startEvent.target as HTMLElement).draggable && startEvent.type === 'mousedown') {
218+
if (startEvent.target && (startEvent.target as HTMLElement).draggable && startEvent.type === 'pointerdown') {
219219
startEvent.preventDefault();
220220
}
221221

projects/angular-grid-layout/src/lib/utils/pointer.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export function ktdPointerDown(element): Observable<MouseEvent | TouchEvent | Po
128128
return ktdMouseOrTouchDown(element);
129129
}
130130

131-
return fromEvent<PointerEvent>(element, 'pointerdown', passiveEventListenerOptions as AddEventListenerOptions).pipe(
131+
return fromEvent<PointerEvent>(element, 'pointerdown', activeEventListenerOptions as AddEventListenerOptions).pipe(
132132
filter((pointerEvent) => pointerEvent.isPrimary)
133133
)
134134
}

0 commit comments

Comments
 (0)