Skip to content

Commit 22530b9

Browse files
committed
feat(ghostElementCreated): emit new event after the ghost element is created
1 parent ecc96ec commit 22530b9

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/draggable.directive.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,11 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
126126
*/
127127
@Output() dragStart = new EventEmitter<DragStart>();
128128

129+
/**
130+
* Called after the ghost element has been created
131+
*/
132+
@Output() ghostElementCreated = new EventEmitter();
133+
129134
/**
130135
* Called when the element is being dragged
131136
*/
@@ -309,12 +314,20 @@ export class DraggableDirective implements OnInit, OnChanges, OnDestroy {
309314
this.ghostElementTemplate
310315
);
311316
clone.innerHTML = '';
312-
clone.appendChild(viewRef.rootNodes[0]);
317+
viewRef.rootNodes
318+
.filter(node => node instanceof Node)
319+
.forEach(node => {
320+
clone.appendChild(node);
321+
});
313322
dragEnded$.subscribe(() => {
314323
this.vcr.remove(this.vcr.indexOf(viewRef));
315324
});
316325
}
317326

327+
this.zone.run(() => {
328+
this.ghostElementCreated.emit();
329+
});
330+
318331
dragEnded$.subscribe(() => {
319332
clone.parentElement!.removeChild(clone);
320333
this.ghostElement = null;

test/draggable.directive.spec.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ describe('draggable directive', () => {
2323
[ghostElementTemplate]="ghostElementTemplate"
2424
(dragPointerDown)="dragPointerDown($event)"
2525
(dragStart)="dragStart($event)"
26+
(ghostElementCreated)="ghostElementCreated($event)"
2627
(dragging)="dragging($event)"
2728
(dragEnd)="dragEnd($event)">
2829
Drag me!
2930
</div>
30-
<ng-template #ghostElementTemplateRef><span>I'm being dragged!</span></ng-template>
31+
<ng-template #ghostElementTemplateRef>
32+
<span>{{ 1 + 1 }} test</span>
33+
</ng-template>
3134
`
3235
})
3336
class TestComponent {
@@ -37,6 +40,7 @@ describe('draggable directive', () => {
3740
ghostElementTemplateRef: TemplateRef<any>;
3841
dragPointerDown = sinon.spy();
3942
dragStart = sinon.spy();
43+
ghostElementCreated = sinon.spy();
4044
dragging = sinon.spy();
4145
dragEnd = sinon.spy();
4246
dragAxis: any = { x: true, y: true };
@@ -313,6 +317,8 @@ describe('draggable directive', () => {
313317
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
314318
triggerDomEvent('mousemove', draggableElement, { clientX: 7, clientY: 10 });
315319
expect(fixture.componentInstance.dragStart).to.have.been.calledOnce;
320+
expect(fixture.componentInstance.ghostElementCreated).not.to.have.been
321+
.called;
316322
expect(fixture.componentInstance.dragging).to.have.been.calledWith({
317323
x: 2,
318324
y: 0
@@ -563,7 +569,7 @@ describe('draggable directive', () => {
563569
expect(fixture.componentInstance.dragEnd).not.to.have.been.called;
564570
});
565571

566-
it('should call the drag start, dragging and end events in order', () => {
572+
it('should call the drag lifecycle events in order', () => {
567573
const draggableElement =
568574
fixture.componentInstance.draggableElement.nativeElement;
569575
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
@@ -572,6 +578,7 @@ describe('draggable directive', () => {
572578
sinon.assert.callOrder(
573579
fixture.componentInstance.dragPointerDown,
574580
fixture.componentInstance.dragStart,
581+
fixture.componentInstance.ghostElementCreated,
575582
fixture.componentInstance.dragging,
576583
fixture.componentInstance.dragEnd
577584
);
@@ -712,7 +719,8 @@ describe('draggable directive', () => {
712719
fixture.componentInstance.draggableElement.nativeElement;
713720
triggerDomEvent('mousedown', draggableElement, { clientX: 5, clientY: 10 });
714721
triggerDomEvent('mousemove', draggableElement, { clientX: 7, clientY: 10 });
722+
fixture.detectChanges();
715723
const ghostElement = draggableElement.nextSibling as HTMLElement;
716-
expect(ghostElement.innerHTML).to.equal("<span>I'm being dragged!</span>");
724+
expect(ghostElement.innerHTML).to.equal('<span>2 test</span>');
717725
});
718726
});

0 commit comments

Comments
 (0)