/* global describe,test,expect,beforeEach,CustomEvent */
import sortable from '../../src/html5sortable'
/* eslint-env jest */
describe('Testing events', () => {
let body = document.querySelector('body')
let getIndex = (item, NodeList) => Array.prototype.indexOf.call(NodeList, item)
let ul, li, secondLi, ul2, fifthLi, fourthLi
let startEventOriginItem, startEventOriginContainer
let sortupdateitem, sortupdateitemEndIndex, sortupdateitemStartIndex, sortupdateitemStartSortableIndex,
sortupdateitemEndSortableIndex, sortupdateitemStartParent, sortupdateitemEndParent,
sortupdateitemNewEndList, sortupdateitemNewStartList, sortupdateitemOldStartList
let sortstopitem, sortstopStartparent
let dataTransferObj
beforeEach(() => {
body.innerHTML = `
`
ul = body.querySelector('.sortable')
li = ul.querySelector('.first-item')
secondLi = ul.querySelector('.second-item')
fourthLi = ul.querySelector('.fourth-item')
ul2 = body.querySelector('.sortable2')
fifthLi = ul2.querySelector('.fifth-item')
li.getClientRects = function () {
return [{
left: 5,
top: 5
}]
}
secondLi.getClientRects = function () {
return [{
left: 5,
top: 25
}]
}
fourthLi.getClientRects = function () {
return [{
left: 5,
top: 25
}]
}
startEventOriginItem = null
startEventOriginContainer = null
sortupdateitem = null
sortupdateitemEndIndex = null
sortupdateitemStartIndex = null
sortupdateitemStartSortableIndex = null
sortupdateitemEndSortableIndex = null
sortupdateitemStartParent = null
sortupdateitemEndParent = null
sortupdateitemNewEndList = null
sortupdateitemNewStartList = null
sortupdateitemOldStartList = null
sortstopitem = null
sortstopStartparent = null
dataTransferObj = {
setData: function (val) {
this.data = val
}
}
})
function addEventListener (ul) {
sortable(ul, null)[0].addEventListener('sortstart', function (e) {
startEventOriginItem = e.detail.item
startEventOriginContainer = e.detail.origin.container
})
sortable(ul, null)[0].addEventListener('sortupdate', function (e) {
sortupdateitem = e.detail.item
sortupdateitemEndIndex = e.detail.endSortableIndex
sortupdateitemStartIndex = e.detail.startSortableIndex
sortupdateitemStartSortableIndex = e.detail.endIndex
sortupdateitemEndSortableIndex = e.detail.startIndex
sortupdateitemStartParent = e.detail.startParent
sortupdateitemEndParent = e.detail.endParent
sortupdateitemNewEndList = e.detail.newEndList
sortupdateitemNewStartList = e.detail.newStartList
sortupdateitemOldStartList = e.detail.oldStartList
})
sortable(ul, null)[0].addEventListener('sortstop', function (e) {
sortstopitem = e.detail.item
sortstopStartparent = e.detail.startParent
})
}
test('should correctly run dragstart event', () => {
sortable(ul, {
items: 'li',
placeholderClass: 'test-placeholder',
draggingClass: 'test-dragging'
})
addEventListener(ul)
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', { value: li, enumerable: true })
ul.dispatchEvent(event)
expect(li.getAttribute('aria-grabbed')).toEqual('true')
expect(li.classList.contains('test-dragging')).toBe(true)
expect(startEventOriginItem).toEqual(li)
expect(ul).toEqual(startEventOriginContainer)
expect(null).toEqual(sortupdateitem)
expect(null).toEqual(sortstopitem)
})
test('should correctly copy element on run dragstart/dragover event',
() => {
sortable(ul, {
items: 'li',
copy: true,
placeholderClass: 'test-placeholder',
draggingClass: 'test-dragging'
})
let childcount = li.parentNode.childNodes.length
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', { value: li, enumerable: true })
ul.dispatchEvent(event)
expect(li.getAttribute('aria-grabbed')).toEqual('false')
let copyli = li.parentNode.lastChild
expect(childcount + 1).toEqual(copyli.parentNode.childNodes.length)
expect(copyli.getAttribute('aria-grabbed')).toEqual('true')
expect(copyli.classList.contains('test-dragging')).toBe(true)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
secondLi.dispatchEvent(event)
expect(event.dataTransfer.dropEffect).toEqual('copy')
}
)
test('dragstart/dragover event with maxitems', () => {
sortable(ul, {
items: 'li',
maxItems: 1,
placeholderClass: 'test-placeholder',
draggingClass: 'test-dragging'
})
let childcount = li.parentNode.childNodes.length
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', { value: li, enumerable: true })
ul.dispatchEvent(event)
expect(li.getAttribute('aria-grabbed')).toEqual('true')
let copyli = li.parentNode.lastChild
expect(childcount).toEqual(copyli.parentNode.childNodes.length)
expect(event.dataTransfer.dropEffect).toBe(undefined)
})
test('should correctly drop item in place without placeholder', () => {
jest.useFakeTimers()
const placeholder = document.createElement('DIV')
sortable(ul, {
items: 'li',
copy: true,
acceptFrom: false,
placeholderClass: 'test-placeholder'
})
sortable(ul2, {
items: 'li',
acceptFrom: 'ul',
placeholder,
placeholderClass: 'test-placeholder2'
})
let childcount = ul.children.length
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', {value: li, enumerable: true})
ul.dispatchEvent(event)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
fifthLi.dispatchEvent(event)
jest.advanceTimersByTime(1)
expect(getIndex(placeholder, ul2.children)).not.toEqual(-1)
expect(ul.children.length).toEqual(childcount + 1)
event = new CustomEvent('drop')
ul2.dispatchEvent(event)
expect(ul.children.length).toEqual(childcount)
event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', {value: li, enumerable: true})
ul.dispatchEvent(event)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
ul2.dispatchEvent(event)
jest.advanceTimersByTime(1)
expect(getIndex(placeholder, ul2.children)).toEqual(-1)
expect(ul.children.length).toEqual(childcount + 1)
event = new CustomEvent('drop')
ul2.dispatchEvent(event)
expect(ul.children.length).toEqual(childcount + 1)
})
test.skip('should correctly place moved item into correct index', () => {
sortable(ul, {
items: 'li',
placeholderClass: 'test-placeholder'
})
addEventListener(ul)
let originalIndex = getIndex(li, ul.children)
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
li.dispatchEvent(event)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
secondLi.dispatchEvent(event)
expect(event.dataTransfer.dropEffect).toEqual('move')
// Object.defineProperty(event, 'target', {value: secondLi, enumerable: true})
document.querySelector('.test-placeholder').dispatchEvent(new CustomEvent('drop'))
li.dispatchEvent(new CustomEvent('dragend'))
expect(getIndex(li, ul.children)).not.toEqual(originalIndex)
expect(getIndex(li, ul.children)).toEqual(1)
expect(startEventOriginItem).toEqual(li)
expect(ul).toEqual(startEventOriginContainer)
expect(li).toEqual(sortupdateitem)
expect(1).toEqual(sortupdateitemEndIndex)
expect(0).toEqual(sortupdateitemStartIndex)
expect(1).toEqual(sortupdateitemStartSortableIndex)
expect(0).toEqual(sortupdateitemEndSortableIndex)
expect(ul).toEqual(sortupdateitemStartParent)
expect(ul).toEqual(sortupdateitemEndParent)
expect(5).toEqual(sortupdateitemNewEndList.length)
expect(5).toEqual(sortupdateitemNewStartList.length)
expect(5).toEqual(sortupdateitemOldStartList.length)
expect(sortstopitem).toEqual(li)
expect(ul).toEqual(sortstopStartparent)
})
test.skip(
'should correctly place moved item into correct index using acceptFrom',
() => {
sortable(ul, {
items: 'li',
acceptFrom: false,
placeholderClass: 'test-placeholder'
})
sortable(ul2, {
items: 'li',
acceptFrom: '.sortable',
placeholderClass: 'test-placeholder2'
})
// let originalChildrenLen = ul.children.length
let originalIndex = getIndex(li, ul.children)
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
li.dispatchEvent(event)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
fifthLi.dispatchEvent(event)
expect(event.dataTransfer.dropEffect).toEqual('move')
event = new CustomEvent('drop')
ul2.querySelector('.test-placeholder2').dispatchEvent(event)
event = new CustomEvent('dragend')
li.dispatchEvent(event)
expect(getIndex(li, ul.children)).not.toEqual(originalIndex)
expect(getIndex(li, ul2.children)).toEqual(2)
}
)
test.skip('should correctly place non-moved item into correct index', () => {
sortable(ul, {
items: 'li',
placeholderClass: 'test-placeholder'
})
let originalIndex = getIndex(li, ul.children)
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
li.dispatchEvent(event)
expect(getIndex(document.querySelector('.test-placeholder'), ul.children)).toEqual(-1)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
secondLi.dispatchEvent(event)
expect(getIndex(document.querySelector('.test-placeholder'), ul.children)).not.toEqual(originalIndex)
secondLi.dispatchEvent(event)
event = new CustomEvent('drop')
document.querySelector('.test-placeholder').dispatchEvent(event)
event = new CustomEvent('dragend')
li.dispatchEvent(event)
// TODO: does this test and this check make sense?
expect(getIndex(li, ul.children)).toEqual(originalIndex)
})
test(
'should revert item into correct index when dropped outside',
() => {
sortable(ul, {
'items': 'li',
placeholderClass: 'test-placeholder'
})
let originalIndex = getIndex(secondLi, ul.children)
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
secondLi.dispatchEvent(event)
expect(getIndex(document.querySelector('.test-placeholder'), ul.children)).toEqual(-1)
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
secondLi.dispatchEvent(event)
expect(getIndex(document.querySelector('.test-placeholder'), ul.children)).not.toEqual(originalIndex)
body.dispatchEvent(event)
event = new CustomEvent('drop')
body.dispatchEvent(event)
expect(getIndex(secondLi, ul.children)).toEqual(originalIndex)
}
)
test('should find sortable child dragover event', () => {
var item4 = ul.querySelector('.item4')
sortable(ul, {
items: 'li',
placeholderClass: 'test-placeholder',
draggingClass: 'test-dragging'
})
let event = new CustomEvent('dragstart')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', { value: li, enumerable: true })
ul.dispatchEvent(event)
expect(li.getAttribute('aria-grabbed')).toEqual('true')
event = new CustomEvent('dragover')
event.dataTransfer = dataTransferObj
Object.defineProperty(event, 'target', { value: item4, enumerable: true })
ul.dispatchEvent(event)
expect(event.dataTransfer.dropEffect).toEqual('move')
expect(ul.querySelector('.test-placeholder')).not.toBe(undefined)
})
})