Skip to content

Commit c428eed

Browse files
committed
fix: always remove global styles when clicking draggable elements
Fixes #44
1 parent 4bb3fde commit c428eed

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

src/draggable.directive.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,13 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
237237
this.dragPointerDown.next({ x: 0, y: 0 });
238238
});
239239

240+
const dragComplete$ = merge(
241+
this.pointerUp$,
242+
this.pointerDown$,
243+
cancelDrag$,
244+
this.destroy$
245+
).pipe(share());
246+
240247
const pointerMove = combineLatest<
241248
PointerEvent,
242249
{ top: number; left: number }
@@ -290,14 +297,7 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
290297
filter(
291298
({ x, y }) => !this.validateDrag || this.validateDrag({ x, y })
292299
),
293-
takeUntil(
294-
merge(
295-
this.pointerUp$,
296-
this.pointerDown$,
297-
cancelDrag$,
298-
this.destroy$
299-
)
300-
),
300+
takeUntil(dragComplete$),
301301
share()
302302
);
303303

@@ -403,7 +403,6 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
403403
})
404404
)
405405
.subscribe(({ x, y, dragCancelled }) => {
406-
this.document.head.removeChild(globalDragStyle);
407406
this.zone.run(() => {
408407
this.dragEnd.next({ x, y, dragCancelled });
409408
});
@@ -414,6 +413,12 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
414413
currentDrag$.complete();
415414
});
416415

416+
merge(dragComplete$, dragEnded$)
417+
.pipe(take(1))
418+
.subscribe(() => {
419+
this.document.head.removeChild(globalDragStyle);
420+
});
421+
417422
return pointerMove;
418423
}),
419424
share()

test/draggable.directive.spec.ts

+13
Original file line numberDiff line numberDiff line change
@@ -804,4 +804,17 @@ describe('draggable directive', () => {
804804
dragCancelled: false
805805
});
806806
});
807+
808+
it('should allow elements to be selected if clicking but not dragging the element', () => {
809+
const tmp = document.createElement('div');
810+
tmp.innerHTML = 'foo';
811+
document.body.appendChild(tmp);
812+
expect(getComputedStyle(tmp).userSelect).to.equal('auto');
813+
const draggableElement =
814+
fixture.componentInstance.draggableElement.nativeElement;
815+
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
816+
expect(getComputedStyle(tmp).userSelect).to.equal('none');
817+
triggerDomEvent('mouseup', draggableElement, { clientX: 5, clientY: 10 });
818+
expect(getComputedStyle(tmp).userSelect).to.equal('auto');
819+
});
807820
});

0 commit comments

Comments
 (0)