Skip to content

Commit

Permalink
feat: include sourceIndex and targetIndex in model events
Browse files Browse the repository at this point in the history
  • Loading branch information
cormacrelf committed Sep 6, 2018
1 parent 1f8d80c commit ea5fb03
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 39 deletions.
19 changes: 9 additions & 10 deletions modules/ng2-dragula/src/components/dragula.service.ts
@@ -1,5 +1,4 @@
import { Injectable, EventEmitter, Optional } from '@angular/core';
import { DrakeWithModels } from '../DrakeWithModels';
import { Injectable, Optional } from '@angular/core';
import { Group } from '../Group';
import { DragulaOptions } from '../DragulaOptions';
import { Subject, Observable } from 'rxjs';
Expand Down Expand Up @@ -91,9 +90,9 @@ export class DragulaService {
EventTypes.DropModel,
groupName,
(name, [
el, target, source, sibling, item, sourceModel, targetModel
]: [Element, Element, Element, Element, T, T[], T[]]) => {
return { name, el, target, source, sibling, item, sourceModel, targetModel }
el, target, source, sibling, item, sourceModel, targetModel, sourceIndex, targetIndex
]: [Element, Element, Element, Element, T, T[], T[], number, number]) => {
return { name, el, target, source, sibling, item, sourceModel, targetModel, sourceIndex, targetIndex }
})
);

Expand All @@ -102,9 +101,9 @@ export class DragulaService {
EventTypes.RemoveModel,
groupName,
(name, [
el, container, source, item, sourceModel
]: [Element, Element, Element, T, T[]]) => {
return { name, el, container, source, item, sourceModel }
el, container, source, item, sourceModel, sourceIndex
]: [Element, Element, Element, T, T[], number]) => {
return { name, el, container, source, item, sourceModel, sourceIndex }
}
)
);
Expand Down Expand Up @@ -171,7 +170,7 @@ export class DragulaService {
this.dispatch$.next({
event: EventTypes.RemoveModel,
name,
args: [ el, container, source, item, sourceModel ]
args: [ el, container, source, item, sourceModel, dragIndex ]
});
});
drake.on('drag', (el: any, source: any) => {
Expand Down Expand Up @@ -223,7 +222,7 @@ export class DragulaService {
this.dispatch$.next({
event: EventTypes.DropModel,
name,
args: [ dropElm, target, source, sibling, item, sourceModel, targetModel ]
args: [ dropElm, target, source, sibling, item, sourceModel, targetModel, dragIndex, dropIndex ]
});
});
}
Expand Down
26 changes: 13 additions & 13 deletions modules/ng2-dragula/src/spec/StaticService.ts
Expand Up @@ -9,27 +9,27 @@ type Interface<T> = {
}
export class StaticService implements Interface<DragulaService> {
public drag: (groupName?: string) => Observable<{ name: string; el: Element; source: Element; }>
= (name) => empty();
= () => empty();
public dragend: (groupName?: string) => Observable<{ name: string; el: Element; }>
= (name) => empty();
= () => empty();
public drop: (groupName?: string) => Observable<{ name: string; el: Element; target: Element; source: Element; sibling: Element; }>
= (name) => empty();
= () => empty();
public cancel: (groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; }>
= (name) => empty();
= () => empty();
public remove: (groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; }>
= (name) => empty();
= () => empty();
public shadow: (groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; }>
= (name) => empty();
= () => empty();
public over: (groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; }>
= (name) => empty();
= () => empty();
public out: (groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; }>
= (name) => empty();
= () => empty();
public cloned: (groupName?: string) => Observable<{ name: string; clone: Element; original: Element; cloneType: "mirror" | "copy"; }>
= (name) => empty();
public dropModel: <T = any>(groupName?: string) => Observable<{ name: string; el: Element; target: Element; source: Element; sibling: Element; item: T; sourceModel: T[]; targetModel: T[]; }>
= (name) => empty();
public removeModel: <T = any>(groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; item: T; sourceModel: T[]; }>
= (name) => empty();
= () => empty();
public dropModel: <T = any>(groupName?: string) => Observable<{ name: string; el: Element; target: Element; source: Element; sibling: Element; item: T; sourceModel: T[]; targetModel: T[]; sourceIndex: number; targetIndex: number; }>
= () => empty();
public removeModel: <T = any>(groupName?: string) => Observable<{ name: string; el: Element; container: Element; source: Element; item: T; sourceModel: T[]; sourceIndex: number; }>
= () => empty();

groups: { [k: string]: Group } = {};

Expand Down
33 changes: 17 additions & 16 deletions modules/ng2-dragula/src/spec/dragula.service.spec.ts
Expand Up @@ -2,24 +2,17 @@
/// <reference path="./testdouble-jasmine.d.ts" />
import { } from 'jasmine';
import * as td from 'testdouble'
import { TestBed, inject, async, ComponentFixture } from '@angular/core/testing';
import { DragulaDirective } from '../components/dragula.directive';
import { DragulaService } from '../components/dragula.service';
import { DrakeWithModels } from '../DrakeWithModels';
import { Group } from '../Group';
import { Component, ElementRef, EventEmitter } from "@angular/core";
import { TestHostComponent } from './test-host.component';
import dragula = require('dragula');
import { Subject, Subscription, Observable } from 'rxjs';
import { filter, take } from 'rxjs/operators';
import { Observable } from 'rxjs';
import { take } from 'rxjs/operators';
import { MockDrake, MockDrakeFactory } from '../MockDrake';
import { EventTypes } from '../EventTypes';
import { DragulaOptions } from '../DragulaOptions';

const GROUP = "GROUP";

type SimpleDrake = Partial<DrakeWithModels>;

describe('DragulaService', () => {
let service: DragulaService;

Expand Down Expand Up @@ -204,8 +197,8 @@ describe('DragulaService', () => {

let ev = subscribeSync(service.dropModel("DROPMODEL"), () => {
mock.emit(EventTypes.Drag, li, ul);
ul.removeChild(li);
ul.appendChild(li);
ul.removeChild(li); // removes a at index 0
ul.appendChild(li); // adds a at index 1
mock.emit(EventTypes.Drop, li, ul, ul, undefined);
});

Expand All @@ -215,6 +208,8 @@ describe('DragulaService', () => {
expect(ev.sourceModel.length).toBe(model.length);
expect(ev.targetModel).not.toBe(model, 'targetModel not cloned');
expect(ev.targetModel).toContain('a');
expect(ev.sourceIndex).toBe(0, 'sourceIndex');
expect(ev.targetIndex).toBe(1, 'targetIndex');

expect(ev.targetModel[0]).toBe('b');
expect(ev.targetModel[1]).toBe('a');
Expand All @@ -224,14 +219,14 @@ describe('DragulaService', () => {

it('should dropModel correctly in same list (backwards)', () => {
const ul = buildList('ul', ['li', 'li', 'li']);
const li = ul.children[2];
const li = ul.children[2]; // c
let model = ['a', 'b', 'c'];
let mock = _addMockDrake("DROPMODEL", [ ul ], {}, [ model ]);

let ev = subscribeSync(service.dropModel("DROPMODEL"), () => {
mock.emit(EventTypes.Drag, li, ul);
ul.removeChild(li);
ul.insertBefore(li, ul.firstChild);
ul.removeChild(li); // remove c from index 2
ul.insertBefore(li, ul.firstChild); // add c at index 0
mock.emit(EventTypes.Drop, li, ul, ul, undefined);
});

Expand All @@ -242,6 +237,8 @@ describe('DragulaService', () => {
expect(ev.sourceModel).toBe(ev.targetModel, 'sourceModel !== targetModel');
expect(ev.targetModel).not.toBe(model, 'targetModel not cloned');
expect(ev.targetModel).toContain('a');
expect(ev.sourceIndex).toBe(2, 'sourceIndex');
expect(ev.targetIndex).toBe(0, 'targetIndex');

expect(ev.targetModel[0]).toBe('c');
expect(ev.targetModel[1]).toBe('a');
Expand All @@ -260,8 +257,8 @@ describe('DragulaService', () => {

let ev = subscribeSync(service.dropModel("DROPMODEL"), () => {
mock.emit(EventTypes.Drag, li, source);
source.removeChild(li);
target.appendChild(li);
source.removeChild(li); // remove b at index 1
target.appendChild(li); // add b at index 2
mock.emit(EventTypes.Drop, li, target, source, undefined);
});

Expand All @@ -276,6 +273,9 @@ describe('DragulaService', () => {
expect(ev.targetModel).not.toBe(targetModel, 'targetModel not cloned');
expect(ev.targetModel).toContain('b', 'targetModel should have b in it');

expect(ev.sourceIndex).toBe(1, 'sourceIndex');
expect(ev.targetIndex).toBe(2, 'targetIndex');

expect(ev.targetModel.length).toBe(3);
expect(ev.targetModel[0]).toBe('x');
expect(ev.targetModel[1]).toBe('y');
Expand Down Expand Up @@ -303,6 +303,7 @@ describe('DragulaService', () => {
expect(ev.sourceModel[0]).toBe('a');
// no b
expect(ev.sourceModel[1]).toBe('c');
expect(ev.sourceIndex).toBe(1, 'sourceIndex');

service.destroy("REMOVEMODEL");
});
Expand Down

0 comments on commit ea5fb03

Please sign in to comment.