Skip to content

Commit 3d38c81

Browse files
committed
feat(drag-n-drop): snap bug fixed
1 parent 53323cb commit 3d38c81

File tree

4 files changed

+19
-33
lines changed

4 files changed

+19
-33
lines changed

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

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export interface KtdGridEnterLeaveEvent {
9696
grid: KtdGridComponent;
9797
event: PointingDeviceEvent;
9898
source: DragRef;
99+
dragInfo: PointerEventInfo;
99100
}
100101

101102
export function getDragResizeEventData(dragRef: DragRef, layout: KtdGridLayout): KtdDragResizeEvent {
@@ -551,19 +552,17 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
551552
).subscribe(({event, draggableItem}) => {
552553
this.gridService.startDrag(event, draggableItem._dragRef, 'drag');
553554
}),
554-
555-
this.dragEntered.subscribe(({event, }) => {
556-
this.startRestoreDragSequence(event);
555+
this.dragEntered.subscribe(({event, dragInfo }) => {
556+
this.startRestoreDragSequence(event, dragInfo);
557557
}),
558-
this.dragExited.subscribe(() => {
559-
this.pauseDragSequence();
558+
this.dragExited.subscribe(({dragInfo}) => {
559+
this.pauseDragSequence(dragInfo);
560560
}),
561561
this.gridService.pointerBeforeEnd$.subscribe(({dragInfo}) => {
562562
if (this.drag !== null && dragInfo !== null) {
563563
this.updateLayout(dragInfo);
564564
this.stopDragSequence(dragInfo);
565565
}
566-
console.log(this.drag, dragInfo);
567566
}),
568567
this.gridService.pointerEnd$.subscribe(() => {
569568
this.drag = null;
@@ -574,9 +573,13 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
574573
/**
575574
* Starts the drag sequence when a drag event is triggered. It will restore paused drag sequence if it's already started.
576575
* @param event The event that triggered the drag sequence.
576+
* @param dragInfo The drag info.
577577
*/
578-
private startRestoreDragSequence(event: PointingDeviceEvent): void {
579-
const dragInfo = this.gridService.drag!;
578+
private startRestoreDragSequence(event: PointingDeviceEvent, dragInfo: PointerEventInfo): void {
579+
if (this.drag !== null && dragInfo.type === 'resize') {
580+
return;
581+
}
582+
580583
const scrollableParent = typeof this.scrollableParent === 'string' ? document.getElementById(this.scrollableParent) : this.scrollableParent;
581584

582585
// TODO (enhancement): consider move this 'side effect' observable inside the main drag loop.
@@ -593,12 +596,6 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
593596
takeUntil(this.gridService.pointerEnd$),
594597
).subscribe());
595598

596-
if (this.drag != null) {
597-
this.drag.dragSubscription = this.createDragResizeLoop(scrollableParent, dragInfo);
598-
this.drag.scrollSubscription = scrollSubscription;
599-
return;
600-
}
601-
602599
this.drag = {
603600
dragSubscription: this.createDragResizeLoop(scrollableParent, dragInfo),
604601
scrollSubscription,
@@ -614,18 +611,17 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
614611
};
615612
}
616613

617-
private pauseDragSequence(): void {
618-
const dragInfo = this.gridService.drag!;
614+
private pauseDragSequence(dragInfo: PointerEventInfo): void {
619615

620616
// If the drag is a resize, we don't need to pause the drag sequence.
621617
if (dragInfo.type === 'resize') {
622618
return;
623619
}
624620

625621
if (this.drag != null) {
622+
this.destroyPlaceholder();
626623
this.drag.dragSubscription.unsubscribe();
627624
this.drag.scrollSubscription.unsubscribe();
628-
this.destroyPlaceholder();
629625
}
630626
}
631627

@@ -754,14 +750,11 @@ export class KtdGridComponent implements OnChanges, AfterContentInit, AfterConte
754750
);
755751
}
756752

757-
// TODO: Call this only when the drag ended, when the drag is paused do nothing.
758753
private stopDragSequence(dragInfo: PointerEventInfo): void {
759754
if (this.drag === null) {
760755
return;
761756
}
762757

763-
console.log('stopDragSequence');
764-
765758
// Remove drag classes
766759
this.renderer.removeClass(dragInfo.dragRef.elementRef.nativeElement, 'no-transitions');
767760
this.renderer.removeClass(dragInfo.dragRef.elementRef.nativeElement, 'ktd-grid-item-dragging');

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export class KtdGridService {
3232
pointerBeforeEnd$: Observable<{event: MouseEvent | TouchEvent, dragInfo: PointerEventInfo | null}>;
3333
private pointerBeforeEndSubject: Subject<{event: MouseEvent | TouchEvent, dragInfo: PointerEventInfo | null}> = new Subject<{event: MouseEvent | TouchEvent, dragInfo: PointerEventInfo | null}>();
3434

35-
drag: PointerEventInfo | null = null;
35+
private drag: PointerEventInfo | null = null;
3636

3737
constructor(
3838
private ngZone: NgZone,
@@ -130,6 +130,7 @@ export class KtdGridService {
130130
source: this.drag!.dragRef,
131131
event: moveEvent,
132132
grid: this.drag!.currentGrid,
133+
dragInfo: this.drag!,
133134
});
134135
}
135136

@@ -138,6 +139,7 @@ export class KtdGridService {
138139
source: this.drag!.dragRef,
139140
event: moveEvent,
140141
grid: grid,
142+
dragInfo: this.drag!,
141143
});
142144
}
143145

projects/angular-grid-layout/src/lib/ktd-registry.service.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {ElementRef, Injectable, NgZone, RendererFactory2} from '@angular/core';
1+
import {ElementRef, Injectable, NgZone} from '@angular/core';
22
import {KtdDrag} from "./directives/ktd-drag";
33
import {BehaviorSubject} from "rxjs";
44
import {KtdGridService} from "./grid.service";
@@ -27,11 +27,10 @@ export class KtdRegistryService<T = any> {
2727

2828
constructor(
2929
private _ngZone: NgZone,
30-
private rendererFactory: RendererFactory2,
3130
) { }
3231

3332
public createKtgDrag(element: ElementRef<HTMLElement>, gridService: KtdGridService, itemRef: KtdGridItemComponent | KtdDrag<any>): DragRef<T> {
34-
const dragRef = new DragRef<T>(element, gridService, this._ngZone, this.rendererFactory, itemRef);
33+
const dragRef = new DragRef<T>(element, gridService, this._ngZone, itemRef);
3534
this._dragRefItems.push(dragRef);
3635
this.dragRefItems$.next(this._dragRefItems);
3736
return dragRef;

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {ElementRef, NgZone, Renderer2, RendererFactory2} from "@angular/core";
1+
import {ElementRef, NgZone} from "@angular/core";
22
import {coerceBooleanProperty} from "../coercion/boolean-property";
33
import {BehaviorSubject, combineLatest, iif, merge, NEVER, Observable, of, Subject, Subscription} from "rxjs";
44
import {exhaustMap, filter, map, startWith, switchMap, take, takeUntil} from "rxjs/operators";
@@ -90,13 +90,11 @@ export class DragRef<T = any> {
9090
private dragStartSubscription: Subscription;
9191

9292
private readonly element: HTMLElement;
93-
private readonly renderer: Renderer2;
9493

9594
constructor(
9695
public elementRef: ElementRef<HTMLElement>,
9796
private _gridService: KtdGridService,
9897
private _ngZone: NgZone,
99-
rendererFactory: RendererFactory2,
10098
private _itemRef: KtdGridItemComponent | KtdDrag<any>,
10199
) {
102100
this.dragStart$ = this.dragStartSubject.asObservable();
@@ -105,7 +103,6 @@ export class DragRef<T = any> {
105103

106104
this.dragStartSubscription = this._dragStart$().subscribe(this.dragStartSubject);
107105

108-
this.renderer = rendererFactory.createRenderer(null, null);
109106
this.element = this.elementRef.nativeElement as HTMLElement;
110107
this.initDrag();
111108
}
@@ -140,9 +137,6 @@ export class DragRef<T = any> {
140137
let dragSubscription: Subscription | null = null;
141138

142139
const dragStart$ = this.dragStart$.subscribe(({event}) => {
143-
this.renderer.addClass(this.element, 'no-transitions');
144-
this.renderer.addClass(this.element, 'ktd-grid-item-dragging');
145-
146140
const initialX = ktdPointerClientX(event) - this.transformX;
147141
const initialY = ktdPointerClientY(event) - this.transformY;
148142

@@ -182,8 +176,6 @@ export class DragRef<T = any> {
182176
scrollSubscription?.unsubscribe();
183177
dragSubscription?.unsubscribe();
184178
this.element.style.transform = `translate3d(${this.transformX}px, ${this.transformY}px, 0)`;
185-
this.renderer.removeClass(this.element, 'no-transitions');
186-
this.renderer.removeClass(this.element, 'ktd-grid-item-dragging');
187179
});
188180

189181
this.subscriptions = [dragStart$, dragEnd$];

0 commit comments

Comments
 (0)