Skip to content

Commit 44c9106

Browse files
committed
Fixes add/remove container api
1 parent fb68cac commit 44c9106

File tree

5 files changed

+135
-6
lines changed

5 files changed

+135
-6
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
### Changed
88

9+
- Fixed `addContainer`/`removeContainer` api
10+
911
## v1.0.0-beta.5 - 2018-03-02
1012

1113
### Added

src/Draggable/Draggable.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -245,21 +245,23 @@ export default class Draggable {
245245
* Adds container to this draggable instance
246246
* @param {...HTMLElement} containers - Containers you want to add to draggable
247247
* @return {Draggable}
248-
* @example draggable.addPlugin(CustomA11yPlugin, CustomMirrorPlugin)
248+
* @example draggable.addContainer(document.body)
249249
*/
250250
addContainer(...containers) {
251251
this.containers = [...this.containers, ...containers];
252+
this.sensors.forEach((sensor) => sensor.addContainer(...containers));
252253
return this;
253254
}
254255

255256
/**
256257
* Removes container from this draggable instance
257258
* @param {...HTMLElement} containers - Containers you want to remove from draggable
258259
* @return {Draggable}
259-
* @example draggable.removePlugin(MirrorPlugin, CustomMirrorPlugin)
260+
* @example draggable.removeContainer(document.body)
260261
*/
261262
removeContainer(...containers) {
262263
this.containers = this.containers.filter((container) => !containers.includes(container));
264+
this.sensors.forEach((sensor) => sensor.removeContainer(...containers));
263265
return this;
264266
}
265267

src/Draggable/Sensors/Sensor/Sensor.js

+19-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export default class Sensor {
1616
* @property containers
1717
* @type {HTMLElement[]}
1818
*/
19-
this.containers = containers;
19+
this.containers = [...containers];
2020

2121
/**
2222
* Current options
@@ -56,6 +56,24 @@ export default class Sensor {
5656
return this;
5757
}
5858

59+
/**
60+
* Adds container to this sensor instance
61+
* @param {...HTMLElement} containers - Containers you want to add to this sensor
62+
* @example draggable.addContainer(document.body)
63+
*/
64+
addContainer(...containers) {
65+
this.containers = [...this.containers, ...containers];
66+
}
67+
68+
/**
69+
* Removes container from this sensor instance
70+
* @param {...HTMLElement} containers - Containers you want to remove from this sensor
71+
* @example draggable.removeContainer(document.body)
72+
*/
73+
removeContainer(...containers) {
74+
this.containers = this.containers.filter((container) => !containers.includes(container));
75+
}
76+
5977
/**
6078
* Triggers event on target element
6179
* @param {HTMLElement} element - Element to trigger event on

src/Draggable/Sensors/Sensor/tests/Sensor.test.js

+30
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,36 @@ describe('Sensor', () => {
3737
});
3838
});
3939

40+
describe('#addContainer', () => {
41+
test('adds container to sensor', () => {
42+
const containers = [document.documentElement, document.body];
43+
const sensor = new Sensor();
44+
45+
expect(sensor.containers)
46+
.toEqual([]);
47+
48+
sensor.addContainer(...containers);
49+
50+
expect(sensor.containers)
51+
.toEqual(containers);
52+
});
53+
});
54+
55+
describe('#removeContainer', () => {
56+
test('removes container to sensor', () => {
57+
const containers = [document.documentElement, document.body];
58+
const sensor = new Sensor(containers);
59+
60+
expect(sensor.containers)
61+
.toEqual(containers);
62+
63+
sensor.removeContainer(...containers);
64+
65+
expect(sensor.containers)
66+
.toEqual([]);
67+
});
68+
});
69+
4070
describe('#trigger', () => {
4171
it('should dispatch event on element', () => {
4272
const sensor = new Sensor();

src/Draggable/tests/Draggable.test.js

+80-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
import {createSandbox, triggerEvent, TestPlugin} from 'helper';
1+
import {createSandbox, triggerEvent, TestPlugin, clickMouse, moveMouse, releaseMouse, waitForDragDelay} from 'helper';
2+
23
import Draggable, {defaultOptions} from '../Draggable';
34
import {DragStartEvent, DragMoveEvent, DragStopEvent} from '../DragEvent';
45
import {DraggableInitializedEvent, DraggableDestroyEvent} from '../DraggableEvent';
56
import {Accessibility, Mirror, Scrollable, Announcement} from '../Plugins';
67
import {MouseSensor, TouchSensor} from '../Sensors';
78

89
const sampleMarkup = `
9-
<ul>
10+
<ul class="Container">
11+
<li>First item</li>
12+
<li>Second item</li>
13+
</ul>
14+
<ul class="DynamicContainer">
1015
<li>First item</li>
1116
<li>Second item</li>
1217
</ul>
@@ -20,7 +25,7 @@ describe('Draggable', () => {
2025

2126
beforeEach(() => {
2227
sandbox = createSandbox(sampleMarkup);
23-
containers = sandbox.querySelectorAll('ul');
28+
containers = sandbox.querySelectorAll('.Container');
2429
});
2530

2631
afterEach(() => {
@@ -296,6 +301,78 @@ describe('Draggable', () => {
296301
});
297302
});
298303

304+
describe('#addContainer', () => {
305+
it('adds single container dynamically', () => {
306+
const dragOverContainerHandler = jest.fn();
307+
const newInstance = new Draggable(containers, {
308+
draggable: 'li',
309+
});
310+
311+
newInstance.on('drag:over:container', dragOverContainerHandler);
312+
313+
const draggableElement = document.querySelector('li');
314+
const dynamicContainer = document.querySelector('.DynamicContainer');
315+
316+
clickMouse(draggableElement);
317+
waitForDragDelay(100);
318+
moveMouse(dynamicContainer);
319+
320+
expect(dragOverContainerHandler).not.toHaveBeenCalled();
321+
322+
releaseMouse(newInstance.source);
323+
324+
newInstance.addContainer(dynamicContainer);
325+
326+
expect(newInstance.containers).toEqual([...containers, dynamicContainer]);
327+
328+
clickMouse(draggableElement);
329+
waitForDragDelay(100);
330+
moveMouse(dynamicContainer);
331+
332+
expect(dragOverContainerHandler).toHaveBeenCalled();
333+
334+
releaseMouse(newInstance.source);
335+
});
336+
});
337+
338+
describe('#removeContainer', () => {
339+
it('removes single container dynamically', () => {
340+
let dragOverContainerHandler = jest.fn();
341+
const allContainers = document.querySelectorAll('.Container, .DynamicContainer');
342+
const newInstance = new Draggable(allContainers, {
343+
draggable: 'li',
344+
});
345+
346+
newInstance.on('drag:over:container', dragOverContainerHandler);
347+
348+
const draggableElement = document.querySelector('li');
349+
const dynamicContainer = document.querySelector('.DynamicContainer');
350+
351+
clickMouse(draggableElement);
352+
waitForDragDelay(100);
353+
moveMouse(dynamicContainer);
354+
355+
expect(dragOverContainerHandler).toHaveBeenCalled();
356+
357+
releaseMouse(newInstance.source);
358+
359+
newInstance.removeContainer(dynamicContainer);
360+
361+
expect(newInstance.containers).toEqual([...containers]);
362+
363+
dragOverContainerHandler = jest.fn();
364+
newInstance.on('drag:over:container', dragOverContainerHandler);
365+
366+
clickMouse(draggableElement);
367+
waitForDragDelay(100);
368+
moveMouse(dynamicContainer);
369+
370+
expect(dragOverContainerHandler).not.toHaveBeenCalled();
371+
372+
releaseMouse(newInstance.source);
373+
});
374+
});
375+
299376
it('triggers `drag:start` drag event on mousedown', () => {
300377
const newInstance = new Draggable(containers, {
301378
draggable: 'li',

0 commit comments

Comments
 (0)