d-dragdrop
Version:
Drag and drop behavior
65 lines (52 loc) • 1.84 kB
text/coffeescript
helper = require './helper'
module.exports = Draggable = (e, containerEl, handle, dragSelector, handleSelector, component, @moveCallback, startX, startY) ->
items = containerEl.querySelectorAll dragSelector
if dragSelector == handleSelector
el = handle
else
handles = containerEl.querySelectorAll handleSelector
index = nodeIndex handles, handle
el = items[index]
@el = el
@container = cloneEl el
@container.classList.add 'dragging'
el.style.opacity = 0.5
rect = el.getBoundingClientRect()
startX ?= e.clientX
startY ?= e.clientY
@offsetLeft = rect.left - startX
@offsetTop = rect.top - startY
@onMove e
helper.appendToBody @container, component
return
Draggable::finish = (cancel) ->
@el.style.opacity = ''
unless cancel
@moveCallback @el
document.body.removeChild @container
Draggable::onMove = (e) ->
@container.style.left = (e.clientX + window.pageXOffset + @offsetLeft) + 'px'
@container.style.top = (e.clientY + window.pageYOffset + @offsetTop) + 'px'
nodeIndex = (nodeList, node) ->
for child, i in nodeList
return i if child == node
return -1
cloneEl = (el) ->
parent = el.parentNode
# Need table if we are dragging something like a TR
if parent.tagName == 'TBODY' || parent.tagName == 'THEAD'
container = parent.parentNode.cloneNode false
container.removeAttribute 'id'
parentClone = parent.cloneNode false
parentClone.removeAttribute 'id'
container.appendChild parentClone
else
container = parentClone = parent.cloneNode false
container.removeAttribute 'id'
clone = el.cloneNode true
clone.removeAttribute 'id'
parentClone.appendChild clone
container.style.width = window.getComputedStyle(parent).width
container.style.position = 'absolute'
clone.style = window.getComputedStyle el
return container