Skip to content

Commit 709327c

Browse files
author
Matt Lewis
committed
feat(ghostDragEnabled): add option to disable the ghost dragging effect
Closes #3
1 parent 16a3df8 commit 709327c

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

src/draggable.directive.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export class Draggable implements OnInit, OnDestroy {
2525

2626
@Input() snapGrid: SnapGrid = {};
2727

28+
@Input() ghostDragEnabled: boolean = true;
29+
2830
@Output() dragStart: EventEmitter<Coordinates> = new EventEmitter<Coordinates>();
2931

3032
@Output() dragging: EventEmitter<Coordinates> = new EventEmitter<Coordinates>();
@@ -136,11 +138,13 @@ export class Draggable implements OnInit, OnDestroy {
136138
}
137139

138140
private setCssTransform(value: string): void {
139-
this.renderer.setElementStyle(this.element.nativeElement, 'transform', value);
140-
this.renderer.setElementStyle(this.element.nativeElement, '-webkit-transform', value);
141-
this.renderer.setElementStyle(this.element.nativeElement, '-ms-transform', value);
142-
this.renderer.setElementStyle(this.element.nativeElement, '-moz-transform', value);
143-
this.renderer.setElementStyle(this.element.nativeElement, '-o-transform', value);
141+
if (this.ghostDragEnabled) {
142+
this.renderer.setElementStyle(this.element.nativeElement, 'transform', value);
143+
this.renderer.setElementStyle(this.element.nativeElement, '-webkit-transform', value);
144+
this.renderer.setElementStyle(this.element.nativeElement, '-ms-transform', value);
145+
this.renderer.setElementStyle(this.element.nativeElement, '-moz-transform', value);
146+
this.renderer.setElementStyle(this.element.nativeElement, '-o-transform', value);
147+
}
144148
}
145149

146150
}

test/draggable.directive.spec.ts

+36
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ describe('draggable directive', () => {
1414
mwlDraggable
1515
[dragAxis]="dragAxis"
1616
[snapGrid]="snapGrid"
17+
[ghostDragEnabled]="ghostDragEnabled"
1718
(dragStart)="dragStart($event)"
1819
(dragging)="dragging($event)"
1920
(dragEnd)="dragEnd($event)">
@@ -28,6 +29,7 @@ describe('draggable directive', () => {
2829
public dragEnd: sinon.SinonSpy = sinon.spy();
2930
public dragAxis: any = {x: true, y: true};
3031
public snapGrid: any = {};
32+
public ghostDragEnabled: boolean = true;
3133

3234
}
3335

@@ -154,4 +156,38 @@ describe('draggable directive', () => {
154156
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 12, y: 10});
155157
});
156158

159+
it('should snap all vertical and horizontal drags to a grid', () => {
160+
fixture.componentInstance.snapGrid = {y: 10, x: 10};
161+
fixture.detectChanges();
162+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
163+
triggerDomEvent('mousedown', draggableElement, {clientX: 10, clientY: 5});
164+
triggerDomEvent('mousemove', draggableElement, {clientX: 12, clientY: 7});
165+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 0});
166+
triggerDomEvent('mousemove', draggableElement, {clientX: 18, clientY: 14});
167+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 0, y: 0});
168+
triggerDomEvent('mousemove', draggableElement, {clientX: 20, clientY: 15});
169+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 10, y: 10});
170+
triggerDomEvent('mousemove', draggableElement, {clientX: 22, clientY: 16});
171+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 10, y: 10});
172+
triggerDomEvent('mouseup', draggableElement, {clientX: 22, clientY: 16});
173+
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 10, y: 10});
174+
});
175+
176+
it('should disable the ghost dragging effect', () => {
177+
fixture.componentInstance.ghostDragEnabled = false;
178+
fixture.detectChanges();
179+
const draggableElement: HTMLElement = fixture.componentInstance.draggable.element.nativeElement;
180+
triggerDomEvent('mousedown', draggableElement, {clientX: 5, clientY: 10});
181+
expect(fixture.componentInstance.dragStart).to.have.been.calledWith({x: 0, y: 0});
182+
triggerDomEvent('mousemove', draggableElement, {clientX: 7, clientY: 10});
183+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 2, y: 0});
184+
expect(draggableElement.style.transform).not.to.ok;
185+
triggerDomEvent('mousemove', draggableElement, {clientX: 7, clientY: 8});
186+
expect(fixture.componentInstance.dragging).to.have.been.calledWith({x: 2, y: -2});
187+
expect(draggableElement.style.transform).not.to.ok;
188+
triggerDomEvent('mouseup', draggableElement, {clientX: 7, clientY: 8});
189+
expect(fixture.componentInstance.dragEnd).to.have.been.calledWith({x: 2, y: -2});
190+
expect(draggableElement.style.transform).not.to.ok;
191+
});
192+
157193
});

0 commit comments

Comments
 (0)