Skip to content

Commit 38fd4b5

Browse files
author
Matt Lewis
committed
feat(dragAxix): allow the drag axis to be locked to just x and y
Closes #2
1 parent fcace6a commit 38fd4b5

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

src/draggable.directive.ts

+13
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ import {DraggableHelper} from './draggableHelper.provider';
1010

1111
type Coordinates = {x: number, y: number};
1212

13+
type DragAxis = {x: boolean, y: boolean};
14+
1315
@Directive({
1416
selector: '[mwlDraggable]'
1517
})
1618
export class Draggable implements OnInit, OnDestroy {
1719

1820
@Input() dropData: any;
1921

22+
@Input() dragAxis: DragAxis = {x: true, y: true};
23+
2024
@Output() dragStart: EventEmitter<Coordinates> = new EventEmitter<Coordinates>();
2125

2226
@Output() dragging: EventEmitter<Coordinates> = new EventEmitter<Coordinates>();
@@ -49,6 +53,15 @@ export class Draggable implements OnInit, OnDestroy {
4953
y: mouseMoveEvent.clientY - mouseDownEvent.clientY
5054
};
5155
})
56+
.map((moveData: Coordinates) => {
57+
if (!this.dragAxis.x) {
58+
moveData.x = 0;
59+
}
60+
if (!this.dragAxis.y) {
61+
moveData.y = 0;
62+
}
63+
return moveData;
64+
})
5265
.takeUntil(Observable.merge(this.mouseUp, this.mouseDown));
5366

5467
mouseMove.takeLast(1).subscribe(({x, y}) => {

test/draggable.directive.spec.ts

+40-2
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ describe('draggable directive', () => {
1111
@Component({
1212
template: `
1313
<div
14-
mwlDraggable
14+
mwlDraggable
15+
[dragAxis]="dragAxis"
1516
(dragStart)="dragStart($event)"
1617
(dragging)="dragging($event)"
17-
(dragEnd)="dragEnd($event)" >
18+
(dragEnd)="dragEnd($event)">
1819
Drag me!
1920
</div>`,
2021
})
@@ -24,6 +25,7 @@ describe('draggable directive', () => {
2425
public dragStart: sinon.SinonSpy = sinon.spy();
2526
public dragging: sinon.SinonSpy = sinon.spy();
2627
public dragEnd: sinon.SinonSpy = sinon.spy();
28+
public dragAxis: any = {x: true, y: true};
2729

2830
}
2931

@@ -80,4 +82,40 @@ describe('draggable directive', () => {
8082
expect(complete).to.have.been.calledOnce;
8183
});
8284

85+
it('should disable dragging along the x axis', () => {
86+
fixture.componentInstance.dragAxis = {x: false, y: true};
87+
fixture.detectChanges();
88+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
89+
triggerDomEvent('mousedown', draggableElement, {clientX: 5, clientY: 10});
90+
triggerDomEvent('mousemove', draggableElement, {clientX: 7, clientY: 12});
91+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 2});
92+
expect(draggableElement.style.transform).to.equal('translate(0px, 2px)');
93+
triggerDomEvent('mouseup', draggableElement, {clientX: 7, clientY: 12});
94+
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 0, y: 2});
95+
});
96+
97+
it('should disable dragging along the y axis', () => {
98+
fixture.componentInstance.dragAxis = {x: true, y: false};
99+
fixture.detectChanges();
100+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
101+
triggerDomEvent('mousedown', draggableElement, {clientX: 5, clientY: 10});
102+
triggerDomEvent('mousemove', draggableElement, {clientX: 7, clientY: 12});
103+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 2, y: 0});
104+
expect(draggableElement.style.transform).to.equal('translate(2px, 0px)');
105+
triggerDomEvent('mouseup', draggableElement, {clientX: 7, clientY: 12});
106+
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 2, y: 0});
107+
});
108+
109+
it('should disable dragging', () => {
110+
fixture.componentInstance.dragAxis = {x: false, y: false};
111+
fixture.detectChanges();
112+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
113+
triggerDomEvent('mousedown', draggableElement, {clientX: 5, clientY: 10});
114+
triggerDomEvent('mousemove', draggableElement, {clientX: 7, clientY: 12});
115+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 0});
116+
expect(draggableElement.style.transform).to.equal('translate(0px, 0px)');
117+
triggerDomEvent('mouseup', draggableElement, {clientX: 7, clientY: 12});
118+
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 0, y: 0});
119+
});
120+
83121
});

0 commit comments

Comments
 (0)