Skip to content

Commit 5995f81

Browse files
committed
feat(droppable): add css class when any element is being dragged
1 parent 7e50d74 commit 5995f81

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

src/droppable.directive.ts

+13
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ export class DroppableDirective implements OnInit, OnDestroy {
3939
*/
4040
@Input() dragOverClass: string;
4141

42+
/**
43+
* Added to the element any time a draggable element is being dragged
44+
*/
45+
@Input() dragActiveClass: string;
46+
4247
/**
4348
* Called when a draggable element starts overlapping the element
4449
*/
@@ -71,6 +76,10 @@ export class DroppableDirective implements OnInit, OnDestroy {
7176
ngOnInit(): void {
7277
this.currentDragSubscription = this.draggableHelper.currentDrag.subscribe(
7378
drag$ => {
79+
this.renderer.addClass(
80+
this.element.nativeElement,
81+
this.dragActiveClass
82+
);
7483
let droppableRectangle = this.element.nativeElement.getBoundingClientRect();
7584

7685
/* istanbul ignore next */
@@ -142,6 +151,10 @@ export class DroppableDirective implements OnInit, OnDestroy {
142151
drag$.subscribe({
143152
complete: () => {
144153
deregisterScrollListener();
154+
this.renderer.removeClass(
155+
this.element.nativeElement,
156+
this.dragActiveClass
157+
);
145158
if (dragOverActive) {
146159
this.renderer.removeClass(
147160
this.element.nativeElement,

test/droppable.directive.spec.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import * as sinon from 'sinon';
55
import { triggerDomEvent } from './util';
66
import { DragAndDropModule } from '../src/index';
77
import { DraggableDirective } from '../src/draggable.directive';
8+
import { st } from '@angular/core/src/render3';
89

910
describe('droppable directive', () => {
1011
@Component({
@@ -17,7 +18,8 @@ describe('droppable directive', () => {
1718
(dragOver)="dragEvent('over', $event)"
1819
(dragLeave)="dragEvent('leave', $event)"
1920
(drop)="drop($event)"
20-
[dragOverClass]="dragOverClass">
21+
[dragOverClass]="dragOverClass"
22+
[dragActiveClass]="dragActiveClass">
2123
Drop here
2224
</div>
2325
`,
@@ -50,6 +52,7 @@ describe('droppable directive', () => {
5052
foo: 'bar';
5153
};
5254
dragOverClass: string;
55+
dragActiveClass: string;
5356
}
5457

5558
beforeEach(() => {
@@ -166,6 +169,7 @@ describe('droppable directive', () => {
166169
fixture.componentInstance.droppableElement.nativeElement;
167170
expect(droppableElement.classList.contains('drag-over')).to.be.false;
168171
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
172+
triggerDomEvent('mousemove', draggableElement, { clientX: 5, clientY: 10 });
169173
expect(droppableElement.classList.contains('drag-over')).to.be.false;
170174
triggerDomEvent('mousemove', draggableElement, {
171175
clientX: 5,
@@ -190,4 +194,24 @@ describe('droppable directive', () => {
190194
fixture.componentInstance.dragEnd
191195
);
192196
});
197+
198+
it('should add a class to the droppable element when an element is being dragged anywhere', () => {
199+
fixture.componentInstance.dragActiveClass = 'drag-active';
200+
fixture.detectChanges();
201+
const draggableElement: HTMLElement =
202+
fixture.componentInstance.draggable.element.nativeElement;
203+
const droppableElement: HTMLElement =
204+
fixture.componentInstance.droppableElement.nativeElement;
205+
expect(droppableElement.classList.contains('drag-active')).to.be.false;
206+
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
207+
triggerDomEvent('mousemove', draggableElement, { clientX: 5, clientY: 10 });
208+
expect(droppableElement.classList.contains('drag-active')).to.be.true;
209+
triggerDomEvent('mousemove', draggableElement, {
210+
clientX: 5,
211+
clientY: 100
212+
});
213+
expect(droppableElement.classList.contains('drag-active')).to.be.true;
214+
triggerDomEvent('mouseup', draggableElement, { clientX: 5, clientY: 120 });
215+
expect(droppableElement.classList.contains('drag-active')).to.be.false;
216+
});
193217
});

0 commit comments

Comments
 (0)