diff --git a/package.json b/package.json index 15f8460..c1a7a48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "allonsh", - "version": "0.1.0", + "version": "0.2.0-beta", "description": "Lightweight, dependency-free drag-and-drop with precise native target detection and easy customization.", "main": "src/allonsh.js", "directories": { diff --git a/src/allonsh.js b/src/allonsh.js index 5ee33ff..dcac8d4 100644 --- a/src/allonsh.js +++ b/src/allonsh.js @@ -56,6 +56,12 @@ class Allonsh { console.warn( `Allonsh Warning: No draggable elements found with selector '.${draggableSelector}'.` ); + } else { + this.draggableElements.forEach((element) => { + if (!element.classList.contains(CSS_CLASSES.DRAGGABLE)) { + element.classList.add(CSS_CLASSES.DRAGGABLE); + } + }); } if (dropzoneSelector) { diff --git a/test/allonsh.test.js b/test/allonsh.test.js index 204c383..1c4ed62 100644 --- a/test/allonsh.test.js +++ b/test/allonsh.test.js @@ -164,4 +164,40 @@ describe('Allonsh', () => { expect(dropHandler).toHaveBeenCalled(); }); + + it('should not duplicate event listeners on update', () => { + const el = allonsh.draggableElements[0]; + const addSpy = vi.spyOn(el, 'addEventListener'); + + allonsh.update({ restrictToDropzones: true }); + allonsh.update({ enableStacking: false }); + allonsh.update({ useGhostEffect: false }); + + const mousedownAdds = addSpy.mock.calls.filter( + ([event]) => event === 'mousedown' + ); + const touchstartAdds = addSpy.mock.calls.filter( + ([event]) => event === 'touchstart' + ); + + expect(mousedownAdds.length).toBeLessThanOrEqual(1); + expect(touchstartAdds.length).toBeLessThanOrEqual(1); + + addSpy.mockRestore(); + }); + + it('should preserve existing draggables and increment count by 1 when addDraggable() is called', () => { + const initialCount = allonsh.draggableElements.length; + + const newEl = document.createElement('div'); + newEl.className = 'draggable new'; + document.querySelector('.play-area').appendChild(newEl); + + allonsh.addDraggable(newEl); + + const finalCount = allonsh.draggableElements.length; + + expect(finalCount).toBe(initialCount + 1); + expect([...allonsh.draggableElements]).toContain(newEl); + }); });