/* eslint-disable */
/*
* JQuery zTree exedit v3.5.37
* http://treejs.cn/
*
* Copyright (c) 2010 Hunter.z
*
* Licensed same as jquery - MIT License
* http://www.opensource.org/licenses/mit-license.php
*
* email: hunter.z@263.net
* Date: 2018-08-21
*/
(function ($) {
// default consts of exedit
var _consts = {
event: {
DRAG: 'ztree_drag',
DROP: 'ztree_drop',
RENAME: 'ztree_rename',
DRAGMOVE: 'ztree_dragmove'
},
id: {
EDIT: '_edit',
INPUT: '_input',
REMOVE: '_remove'
},
move: {
TYPE_INNER: 'inner',
TYPE_PREV: 'prev',
TYPE_NEXT: 'next'
},
node: {
CURSELECTED_EDIT: 'curSelectedNode_Edit',
TMPTARGET_TREE: 'tmpTargetzTree',
TMPTARGET_NODE: 'tmpTargetNode'
}
},
// default setting of exedit
_setting = {
edit: {
enable: false,
editNameSelectAll: false,
showRemoveBtn: true,
showRenameBtn: true,
removeTitle: 'remove',
renameTitle: 'rename',
drag: {
autoExpandTrigger: false,
isCopy: true,
isMove: true,
prev: true,
next: true,
inner: true,
minMoveSize: 5,
borderMax: 10,
borderMin: -5,
maxShowNodeNum: 5,
autoOpenTime: 500
}
},
view: {
addHoverDom: null,
removeHoverDom: null
},
callback: {
beforeDrag: null,
beforeDragOpen: null,
beforeDrop: null,
beforeEditName: null,
beforeRename: null,
onDrag: null,
onDragMove: null,
onDrop: null,
onRename: null
}
},
// default root of exedit
_initRoot = function (setting) {
var r = data.getRoot(setting), rs = data.getRoots()
r.curEditNode = null
r.curEditInput = null
r.curHoverNode = null
r.dragFlag = 0
r.dragNodeShowBefore = []
r.dragMaskList = new Array()
rs.showHoverDom = true
},
// default cache of exedit
_initCache = function (treeId) {
},
// default bind event of exedit
_bindEvent = function (setting) {
var o = setting.treeObj
var c = consts.event
o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) {
tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel])
})
o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) {
tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes])
})
o.bind(c.DRAGMOVE, function (event, srcEvent, treeId, treeNodes) {
tools.apply(setting.callback.onDragMove, [srcEvent, treeId, treeNodes])
})
o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) {
tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy])
})
},
_unbindEvent = function (setting) {
var o = setting.treeObj
var c = consts.event
o.unbind(c.RENAME)
o.unbind(c.DRAG)
o.unbind(c.DRAGMOVE)
o.unbind(c.DROP)
},
// default event proxy of exedit
_eventProxy = function (e) {
var target = e.target,
setting = data.getSetting(e.data.treeId),
relatedTarget = e.relatedTarget,
tId = '', node = null,
nodeEventType = '', treeEventType = '',
nodeEventCallback = null, treeEventCallback = null,
tmp = null
if (tools.eqs(e.type, 'mouseover')) {
tmp = tools.getMDom(setting, target, [{tagName: 'a', attrName: 'treeNode' + consts.id.A}])
if (tmp) {
tId = tools.getNodeMainDom(tmp).id
nodeEventType = 'hoverOverNode'
}
} else if (tools.eqs(e.type, 'mouseout')) {
tmp = tools.getMDom(setting, relatedTarget, [{tagName: 'a', attrName: 'treeNode' + consts.id.A}])
if (!tmp) {
tId = 'remove'
nodeEventType = 'hoverOutNode'
}
} else if (tools.eqs(e.type, 'mousedown')) {
tmp = tools.getMDom(setting, target, [{tagName: 'a', attrName: 'treeNode' + consts.id.A}])
if (tmp) {
tId = tools.getNodeMainDom(tmp).id
nodeEventType = 'mousedownNode'
}
}
if (tId.length > 0) {
node = data.getNodeCache(setting, tId)
switch (nodeEventType) {
case 'mousedownNode' :
nodeEventCallback = _handler.onMousedownNode
break
case 'hoverOverNode' :
nodeEventCallback = _handler.onHoverOverNode
break
case 'hoverOutNode' :
nodeEventCallback = _handler.onHoverOutNode
break
}
}
var proxyResult = {
stop: false,
node: node,
nodeEventType: nodeEventType,
nodeEventCallback: nodeEventCallback,
treeEventType: treeEventType,
treeEventCallback: treeEventCallback
}
return proxyResult
},
// default init node of exedit
_initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) {
if (!n) return
n.isHover = false
n.editNameFlag = false
},
// update zTreeObj, add method of edit
_zTreeTools = function (setting, zTreeTools) {
zTreeTools.cancelEditName = function (newName) {
var root = data.getRoot(this.setting)
if (!root.curEditNode) return
view.cancelCurEditNode(this.setting, newName || null, true)
}
zTreeTools.copyNode = function (targetNode, node, moveType, isSilent) {
if (!node) return null
var isParent = data.nodeIsParent(setting, targetNode)
if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null
var _this = this,
newNode = tools.clone(node)
if (!targetNode) {
targetNode = null
moveType = consts.move.TYPE_INNER
}
if (moveType == consts.move.TYPE_INNER) {
function copyCallback () {
view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent)
}
if (tools.canAsync(this.setting, targetNode)) {
view.asyncNode(this.setting, targetNode, isSilent, copyCallback)
} else {
copyCallback()
}
} else {
view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent)
view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent)
}
return newNode
}
zTreeTools.editName = function (node) {
if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return
if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true)
view.editNode(this.setting, node)
}
zTreeTools.moveNode = function (targetNode, node, moveType, isSilent) {
if (!node) return node
var isParent = data.nodeIsParent(setting, targetNode)
if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) {
return null
} else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find('#' + targetNode.tId).length > 0)) {
return null
} else if (!targetNode) {
targetNode = null
}
var _this = this
function moveCallback () {
view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent)
}
if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) {
view.asyncNode(this.setting, targetNode, isSilent, moveCallback)
} else {
moveCallback()
}
return node
}
zTreeTools.setEditable = function (editable) {
this.setting.edit.enable = editable
return this.refresh()
}
},
// method of operate data
_data = {
setSonNodeLevel: function (setting, parentNode, node) {
if (!node) return
var children = data.nodeChildren(setting, node)
node.level = (parentNode) ? parentNode.level + 1 : 0
if (!children) return
for (var i = 0, l = children.length; i < l; i++) {
if (children[i]) data.setSonNodeLevel(setting, node, children[i])
}
}
},
// method of event proxy
_event = {},
// method of event handler
_handler = {
onHoverOverNode: function (event, node) {
var setting = data.getSetting(event.data.treeId),
root = data.getRoot(setting)
if (root.curHoverNode != node) {
_handler.onHoverOutNode(event)
}
root.curHoverNode = node
view.addHoverDom(setting, node)
},
onHoverOutNode: function (event, node) {
var setting = data.getSetting(event.data.treeId),
root = data.getRoot(setting)
if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) {
view.removeTreeDom(setting, root.curHoverNode)
root.curHoverNode = null
}
},
onMousedownNode: function (eventMouseDown, _node) {
var i, l,
setting = data.getSetting(eventMouseDown.data.treeId),
root = data.getRoot(setting), roots = data.getRoots()
// right click can't drag & drop
if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true
// input of edit node name can't drag & drop
var target = eventMouseDown.target,
_nodes = data.getRoot(setting).curSelectedList,
nodes = []
if (!data.isSelectedNode(setting, _node)) {
nodes = [_node]
} else {
for (i = 0, l = _nodes.length; i < l; i++) {
if (_nodes[i].editNameFlag && tools.eqs(target.tagName, 'input') && target.getAttribute('treeNode' + consts.id.INPUT) !== null) {
return true
}
nodes.push(_nodes[i])
if (nodes[0].parentTId !== _nodes[i].parentTId) {
nodes = [_node]
break
}
}
}
view.editNodeBlur = true
view.cancelCurEditNode(setting)
var doc = $(setting.treeObj.get(0).ownerDocument),
body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget,
isOtherTree = false,
targetSetting = setting,
sourceSetting = setting,
preNode, nextNode,
preTmpTargetNodeId = null,
preTmpMoveType = null,
tmpTargetNodeId = null,
moveType = consts.move.TYPE_INNER,
mouseDownX = eventMouseDown.clientX,
mouseDownY = eventMouseDown.clientY,
startTime = (new Date()).getTime()
if (tools.uCanDo(setting)) {
doc.bind('mousemove', _docMouseMove)
}
function _docMouseMove (event) {
// avoid start drag after click node
if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize &&
Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) {
return true
}
var i, l, tmpNode, tmpDom, tmpNodes
body.css('cursor', 'pointer')
if (root.dragFlag == 0) {
if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) {
_docMouseUp(event)
return true
}
for (i = 0, l = nodes.length; i < l; i++) {
if (i == 0) {
root.dragNodeShowBefore = []
}
tmpNode = nodes[i]
if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) {
view.expandCollapseNode(setting, tmpNode, !tmpNode.open)
root.dragNodeShowBefore[tmpNode.tId] = true
} else {
root.dragNodeShowBefore[tmpNode.tId] = false
}
}
root.dragFlag = 1
roots.showHoverDom = false
tools.showIfameMask(setting, true)
// sort
var isOrder = true, lastIndex = -1
if (nodes.length > 1) {
var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting)
tmpNodes = []
for (i = 0, l = pNodes.length; i < l; i++) {
if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) {
if (isOrder && lastIndex > -1 && (lastIndex + 1) !== i) {
isOrder = false
}
tmpNodes.push(pNodes[i])
lastIndex = i
}
if (nodes.length === tmpNodes.length) {
nodes = tmpNodes
break
}
}
}
if (isOrder) {
preNode = nodes[0].getPreNode()
nextNode = nodes[nodes.length - 1].getNextNode()
}
// set node in selected
curNode = $$("
", setting)
for (i = 0, l = nodes.length; i < l; i++) {
tmpNode = nodes[i]
tmpNode.editNameFlag = false
view.selectNode(setting, tmpNode, i > 0)
view.removeTreeDom(setting, tmpNode)
if (i > setting.edit.drag.maxShowNodeNum - 1) {
continue
}
tmpDom = $$("", setting)
tmpDom.append($$(tmpNode, consts.id.A, setting).clone())
tmpDom.css('padding', '0')
tmpDom.children('#' + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED)
curNode.append(tmpDom)
if (i == setting.edit.drag.maxShowNodeNum - 1) {
tmpDom = $$(" ... ", setting)
curNode.append(tmpDom)
}
}
curNode.attr('id', nodes[0].tId + consts.id.UL + '_tmp')
curNode.addClass(setting.treeObj.attr('class'))
curNode.appendTo(body)
tmpArrow = $$("", setting)
tmpArrow.attr('id', 'zTreeMove_arrow_tmp')
tmpArrow.appendTo(body)
setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes])
}
if (root.dragFlag == 1) {
if (tmpTarget && tmpArrow.attr('id') == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft() + 2) > ($('#' + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) {
var xT = $('#' + tmpTargetNodeId + consts.id.A, tmpTarget)
event.target = (xT.length > 0) ? xT.get(0) : event.target
} else if (tmpTarget) {
tmpTarget.removeClass(consts.node.TMPTARGET_TREE)
if (tmpTargetNodeId) {
$('#' + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + '_' + consts.move.TYPE_PREV)
.removeClass(consts.node.TMPTARGET_NODE + '_' + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + '_' + _consts.move.TYPE_INNER)
}
}
tmpTarget = null
tmpTargetNodeId = null
// judge drag & drop in multi ztree
isOtherTree = false
targetSetting = setting
var settings = data.getSettings()
for (var s in settings) {
if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId &&
(event.target.id == settings[s].treeId || $(event.target).parents('#' + settings[s].treeId).length > 0)) {
isOtherTree = true
targetSetting = settings[s]
}
}
var docScrollTop = doc.scrollTop(),
docScrollLeft = doc.scrollLeft(),
treeOffset = targetSetting.treeObj.offset(),
scrollHeight = targetSetting.treeObj.get(0).scrollHeight,
scrollWidth = targetSetting.treeObj.get(0).scrollWidth,
dTop = (event.clientY + docScrollTop - treeOffset.top),
dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop),
dLeft = (event.clientX + docScrollLeft - treeOffset.left),
dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft),
isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin),
isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin),
isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin),
isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin),
isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin,
isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0),
isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height() + 10) >= scrollHeight),
isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0),
isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width() + 10) >= scrollWidth)
if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
// get node dom
var targetObj = event.target
while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, 'li') && targetObj.id != targetSetting.treeId) {
targetObj = targetObj.parentNode
}
var canMove = true
// don't move to self or children of self
for (i = 0, l = nodes.length; i < l; i++) {
tmpNode = nodes[i]
if (targetObj.id === tmpNode.tId) {
canMove = false
break
} else if ($$(tmpNode, setting).find('#' + targetObj.id).length > 0) {
canMove = false
break
}
}
if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) {
tmpTarget = $(targetObj)
tmpTargetNodeId = targetObj.id
}
}
// the mouse must be in zTree
tmpNode = nodes[0]
if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) {
// judge mouse move in root of ztree
if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) {
tmpTarget = targetSetting.treeObj
}
// auto scroll top
if (isTop) {
targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() - 10)
} else if (isBottom) {
targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() + 10)
}
if (isLeft) {
targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() - 10)
} else if (isRight) {
targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + 10)
}
// auto scroll left
if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) {
targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + tmpTarget.offset().left - targetSetting.treeObj.offset().left)
}
}
curNode.css({
'top': (event.clientY + docScrollTop + 3) + 'px',
'left': (event.clientX + docScrollLeft + 3) + 'px'
})
var dX = 0
var dY = 0
if (tmpTarget && tmpTarget.attr('id') != targetSetting.treeId) {
var tmpTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId),
isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy),
isPrev = !!(preNode && tmpTargetNodeId === preNode.tId),
isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId),
isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId),
canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev),
canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next),
canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner)
function clearMove () {
tmpTarget = null
tmpTargetNodeId = ''
moveType = consts.move.TYPE_INNER
tmpArrow.css({
'display': 'none'
})
if (window.zTreeMoveTimer) {
clearTimeout(window.zTreeMoveTimer)
window.zTreeMoveTargetNodeTId = null
}
}
if (!canPrev && !canNext && !canInner) {
clearMove()
} else {
var tmpTargetA = $('#' + tmpTargetNodeId + consts.id.A, tmpTarget),
tmpNextA = tmpTargetNode.isLastNode ? null : $('#' + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()),
tmpTop = tmpTargetA.offset().top,
tmpLeft = tmpTargetA.offset().left,
prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1)) : -1,
nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0)) : -1,
dY_percent = (event.clientY + docScrollTop - tmpTop) / tmpTargetA.height()
if ((prevPercent == 1 || dY_percent <= prevPercent && dY_percent >= -0.2) && canPrev) {
dX = 1 - tmpArrow.width()
dY = tmpTop - tmpArrow.height() / 2
moveType = consts.move.TYPE_PREV
} else if ((nextPercent == 0 || dY_percent >= nextPercent && dY_percent <= 1.2) && canNext) {
dX = 1 - tmpArrow.width()
dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height() / 2) : (tmpNextA.offset().top - tmpArrow.height() / 2)
moveType = consts.move.TYPE_NEXT
} else if (canInner) {
dX = 5 - tmpArrow.width()
dY = tmpTop
moveType = consts.move.TYPE_INNER
} else {
clearMove()
}
if (tmpTarget) {
tmpArrow.css({
'display': 'block',
'top': dY + 'px',
'left': (tmpLeft + dX) + 'px'
})
tmpTargetA.addClass(consts.node.TMPTARGET_NODE + '_' + moveType)
if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) {
startTime = (new Date()).getTime()
}
if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) {
var startTimer = true
if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) {
clearTimeout(window.zTreeMoveTimer)
window.zTreeMoveTargetNodeTId = null
} else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) {
startTimer = false
}
if (startTimer) {
window.zTreeMoveTimer = setTimeout(function () {
if (moveType != consts.move.TYPE_INNER) return
if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime &&
tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) {
view.switchNode(targetSetting, tmpTargetNode)
if (targetSetting.edit.drag.autoExpandTrigger) {
targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode])
}
}
}, targetSetting.edit.drag.autoOpenTime + 50)
window.zTreeMoveTargetNodeTId = tmpTargetNode.tId
}
}
}
}
} else {
moveType = consts.move.TYPE_INNER
if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) {
tmpTarget.addClass(consts.node.TMPTARGET_TREE)
} else {
tmpTarget = null
}
tmpArrow.css({
'display': 'none'
})
if (window.zTreeMoveTimer) {
clearTimeout(window.zTreeMoveTimer)
window.zTreeMoveTargetNodeTId = null
}
}
preTmpTargetNodeId = tmpTargetNodeId
preTmpMoveType = moveType
setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes])
}
return false
}
doc.bind('mouseup', _docMouseUp)
function _docMouseUp (event) {
if (window.zTreeMoveTimer) {
clearTimeout(window.zTreeMoveTimer)
window.zTreeMoveTargetNodeTId = null
}
preTmpTargetNodeId = null
preTmpMoveType = null
doc.unbind('mousemove', _docMouseMove)
doc.unbind('mouseup', _docMouseUp)
doc.unbind('selectstart', _docSelect)
body.css('cursor', '')
if (tmpTarget) {
tmpTarget.removeClass(consts.node.TMPTARGET_TREE)
if (tmpTargetNodeId) {
$('#' + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + '_' + consts.move.TYPE_PREV)
.removeClass(consts.node.TMPTARGET_NODE + '_' + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + '_' + _consts.move.TYPE_INNER)
}
}
tools.showIfameMask(setting, false)
roots.showHoverDom = true
if (root.dragFlag == 0) return
root.dragFlag = 0
var i, l, tmpNode
for (i = 0, l = nodes.length; i < l; i++) {
tmpNode = nodes[i]
if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) {
view.expandCollapseNode(setting, tmpNode, !tmpNode.open)
delete root.dragNodeShowBefore[tmpNode.tId]
}
}
if (curNode) curNode.remove()
if (tmpArrow) tmpArrow.remove()
var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy)
if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId == nodes[0].parentTId && moveType == consts.move.TYPE_INNER) {
tmpTarget = null
}
if (tmpTarget) {
var dragTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId)
if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) {
view.selectNodes(sourceSetting, nodes)
return
}
var newNodes = isCopy ? tools.clone(nodes) : nodes
function dropCallback () {
if (isOtherTree) {
if (!isCopy) {
for (var i = 0, l = nodes.length; i < l; i++) {
view.removeNode(setting, nodes[i])
}
}
if (moveType == consts.move.TYPE_INNER) {
view.addNodes(targetSetting, dragTargetNode, -1, newNodes)
} else {
view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes)
}
} else {
if (isCopy && moveType == consts.move.TYPE_INNER) {
view.addNodes(targetSetting, dragTargetNode, -1, newNodes)
} else if (isCopy) {
view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes)
} else {
if (moveType != consts.move.TYPE_NEXT) {
for (i = 0, l = newNodes.length; i < l; i++) {
view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false)
}
} else {
for (i = -1, l = newNodes.length - 1; i < l; l--) {
view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false)
}
}
}
}
view.selectNodes(targetSetting, newNodes)
var a = $$(newNodes[0], setting).get(0)
view.scrollIntoView(setting, a)
setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy])
}
if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) {
view.asyncNode(targetSetting, dragTargetNode, false, dropCallback)
} else {
dropCallback()
}
} else {
view.selectNodes(sourceSetting, nodes)
setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null])
}
}
doc.bind('selectstart', _docSelect)
function _docSelect () {
return false
}
// 2018-03-30 FireFox has fixed this issue.
// Avoid FireFox's Bug
// If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error.
// if(eventMouseDown.preventDefault) {
// eventMouseDown.preventDefault();
// }
return true
}
},
// method of tools for zTree
_tools = {
getAbs: function (obj) {
var oRect = obj.getBoundingClientRect(),
scrollTop = document.body.scrollTop + document.documentElement.scrollTop,
scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft
return [oRect.left + scrollLeft, oRect.top + scrollTop]
},
inputFocus: function (inputObj) {
if (inputObj.get(0)) {
inputObj.focus()
tools.setCursorPosition(inputObj.get(0), inputObj.val().length)
}
},
inputSelect: function (inputObj) {
if (inputObj.get(0)) {
inputObj.focus()
inputObj.select()
}
},
setCursorPosition: function (obj, pos) {
if (obj.setSelectionRange) {
obj.focus()
obj.setSelectionRange(pos, pos)
} else if (obj.createTextRange) {
var range = obj.createTextRange()
range.collapse(true)
range.moveEnd('character', pos)
range.moveStart('character', pos)
range.select()
}
},
showIfameMask: function (setting, showSign) {
var root = data.getRoot(setting)
// clear full mask
while (root.dragMaskList.length > 0) {
root.dragMaskList[0].remove()
root.dragMaskList.shift()
}
if (showSign) {
// show mask
var iframeList = $$('iframe', setting)
for (var i = 0, l = iframeList.length; i < l; i++) {
var obj = iframeList.get(i),
r = tools.getAbs(obj),
dragMask = $$("", setting)
dragMask.appendTo($$('body', setting))
root.dragMaskList.push(dragMask)
}
}
}
},
// method of operate ztree dom
_view = {
addEditBtn: function (setting, node) {
if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) {
return
}
if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) {
return
}
var aObj = $$(node, consts.id.A, setting),
editStr = ""
aObj.append(editStr)
$$(node, consts.id.EDIT, setting).bind('click',
function () {
if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false
view.editNode(setting, node)
return false
}
).show()
},
addRemoveBtn: function (setting, node) {
if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) {
return
}
if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) {
return
}
var aObj = $$(node, consts.id.A, setting),
removeStr = ""
aObj.append(removeStr)
$$(node, consts.id.REMOVE, setting).bind('click',
function () {
if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false
view.removeNode(setting, node)
setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node])
return false
}
).bind('mousedown',
function (eventMouseDown) {
return true
}
).show()
},
addHoverDom: function (setting, node) {
if (data.getRoots().showHoverDom) {
node.isHover = true
if (setting.edit.enable) {
view.addEditBtn(setting, node)
view.addRemoveBtn(setting, node)
}
tools.apply(setting.view.addHoverDom, [setting.treeId, node])
}
},
cancelCurEditNode: function (setting, forceName, isCancel) {
var root = data.getRoot(setting),
node = root.curEditNode
if (node) {
var inputObj = root.curEditInput,
newName = forceName || (isCancel ? data.nodeName(setting, node) : inputObj.val())
if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) {
return false
}
data.nodeName(setting, node, newName)
var aObj = $$(node, consts.id.A, setting)
aObj.removeClass(consts.node.CURSELECTED_EDIT)
inputObj.unbind()
view.setNodeName(setting, node)
node.editNameFlag = false
root.curEditNode = null
root.curEditInput = null
view.selectNode(setting, node, false)
setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel])
}
root.noSelection = true
return true
},
editNode: function (setting, node) {
var root = data.getRoot(setting)
view.editNodeBlur = false
if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
setTimeout(function () {
tools.inputFocus(root.curEditInput)
}, 0)
return
}
node.editNameFlag = true
view.removeTreeDom(setting, node)
view.cancelCurEditNode(setting)
view.selectNode(setting, node, false)
$$(node, consts.id.SPAN, setting).html("')
var inputObj = $$(node, consts.id.INPUT, setting)
inputObj.attr('value', data.nodeName(setting, node))
if (setting.edit.editNameSelectAll) {
tools.inputSelect(inputObj)
} else {
tools.inputFocus(inputObj)
}
inputObj.bind('blur', function (event) {
if (!view.editNodeBlur) {
view.cancelCurEditNode(setting)
}
}).bind('keydown', function (event) {
if (event.keyCode == '13') {
view.editNodeBlur = true
view.cancelCurEditNode(setting)
} else if (event.keyCode == '27') {
view.cancelCurEditNode(setting, null, true)
}
}).bind('click', function (event) {
return false
}).bind('dblclick', function (event) {
return false
})
$$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT)
root.curEditInput = inputObj
root.noSelection = false
root.curEditNode = node
},
moveNode: function (setting, targetNode, node, moveType, animateFlag, isSilent) {
var root = data.getRoot(setting)
if (targetNode == node) return
if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return
var oldParentNode = (node.parentTId ? node.getParentNode() : root),
targetNodeIsRoot = (targetNode === null || targetNode == root)
if (targetNodeIsRoot && targetNode === null) targetNode = root
if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER
var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root)
if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) {
moveType = consts.move.TYPE_INNER
}
if (moveType == consts.move.TYPE_INNER) {
if (targetNodeIsRoot) {
// parentTId of root node is null
node.parentTId = null
} else {
if (!data.nodeIsParent(setting, targetNode)) {
data.nodeIsParent(setting, targetNode, true)
targetNode.open = !!targetNode.open
view.setNodeLineIcos(setting, targetNode)
}
node.parentTId = targetNode.tId
}
}
// move node Dom
var targetObj, target_ulObj
if (targetNodeIsRoot) {
targetObj = setting.treeObj
target_ulObj = targetObj
} else {
if (!isSilent && moveType == consts.move.TYPE_INNER) {
view.expandCollapseNode(setting, targetNode, true, false)
} else if (!isSilent) {
view.expandCollapseNode(setting, targetNode.getParentNode(), true, false)
}
targetObj = $$(targetNode, setting)
target_ulObj = $$(targetNode, consts.id.UL, setting)
if (!!targetObj.get(0) && !target_ulObj.get(0)) {
var ulstr = []
view.makeUlHtml(setting, targetNode, ulstr, '')
targetObj.append(ulstr.join(''))
}
target_ulObj = $$(targetNode, consts.id.UL, setting)
}
var nodeDom = $$(node, setting)
if (!nodeDom.get(0)) {
nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join('')
} else if (!targetObj.get(0)) {
nodeDom.remove()
}
if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) {
target_ulObj.append(nodeDom)
} else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) {
targetObj.before(nodeDom)
} else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) {
targetObj.after(nodeDom)
}
// repair the data after move
var i, l,
tmpSrcIndex = -1,
tmpTargetIndex = 0,
oldNeighbor = null,
newNeighbor = null,
oldLevel = node.level
var oldChildren = data.nodeChildren(setting, oldParentNode)
var targetParentChildren = data.nodeChildren(setting, targetParentNode)
var targetChildren = data.nodeChildren(setting, targetNode)
if (node.isFirstNode) {
tmpSrcIndex = 0
if (oldChildren.length > 1) {
oldNeighbor = oldChildren[1]
oldNeighbor.isFirstNode = true
}
} else if (node.isLastNode) {
tmpSrcIndex = oldChildren.length - 1
oldNeighbor = oldChildren[tmpSrcIndex - 1]
oldNeighbor.isLastNode = true
} else {
for (i = 0, l = oldChildren.length; i < l; i++) {
if (oldChildren[i].tId == node.tId) {
tmpSrcIndex = i
break
}
}
}
if (tmpSrcIndex >= 0) {
oldChildren.splice(tmpSrcIndex, 1)
}
if (moveType != consts.move.TYPE_INNER) {
for (i = 0, l = targetParentChildren.length; i < l; i++) {
if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i
}
}
if (moveType == consts.move.TYPE_INNER) {
if (!targetChildren) {
targetChildren = data.nodeChildren(setting, targetNode, [])
}
if (targetChildren.length > 0) {
newNeighbor = targetChildren[targetChildren.length - 1]
newNeighbor.isLastNode = false
}
targetChildren.splice(targetChildren.length, 0, node)
node.isLastNode = true
node.isFirstNode = (targetChildren.length == 1)
} else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) {
targetParentChildren.splice(tmpTargetIndex, 0, node)
newNeighbor = targetNode
newNeighbor.isFirstNode = false
node.parentTId = targetNode.parentTId
node.isFirstNode = true
node.isLastNode = false
} else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) {
targetParentChildren.splice(tmpTargetIndex + 1, 0, node)
newNeighbor = targetNode
newNeighbor.isLastNode = false
node.parentTId = targetNode.parentTId
node.isFirstNode = false
node.isLastNode = true
} else {
if (moveType == consts.move.TYPE_PREV) {
targetParentChildren.splice(tmpTargetIndex, 0, node)
} else {
targetParentChildren.splice(tmpTargetIndex + 1, 0, node)
}
node.parentTId = targetNode.parentTId
node.isFirstNode = false
node.isLastNode = false
}
data.fixPIdKeyValue(setting, node)
data.setSonNodeLevel(setting, node.getParentNode(), node)
// repair node what been moved
view.setNodeLineIcos(setting, node)
view.repairNodeLevelClass(setting, node, oldLevel)
// repair node's old parentNode dom
if (!setting.data.keep.parent && oldChildren.length < 1) {
// old parentNode has no child nodes
data.nodeIsParent(setting, oldParentNode, false)
oldParentNode.open = false
var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting),
tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting),
tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting)
view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU)
view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU)
tmp_ulObj.css('display', 'none')
} else if (oldNeighbor) {
// old neigbor node
view.setNodeLineIcos(setting, oldNeighbor)
}
// new neigbor node
if (newNeighbor) {
view.setNodeLineIcos(setting, newNeighbor)
}
// repair checkbox / radio
if (!!setting.check && setting.check.enable && view.repairChkClass) {
view.repairChkClass(setting, oldParentNode)
view.repairParentChkClassWithSelf(setting, oldParentNode)
if (oldParentNode != node.parent) { view.repairParentChkClassWithSelf(setting, node) }
}
// expand parents after move
if (!isSilent) {
view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag)
}
},
removeEditBtn: function (setting, node) {
$$(node, consts.id.EDIT, setting).unbind().remove()
},
removeRemoveBtn: function (setting, node) {
$$(node, consts.id.REMOVE, setting).unbind().remove()
},
removeTreeDom: function (setting, node) {
node.isHover = false
view.removeEditBtn(setting, node)
view.removeRemoveBtn(setting, node)
tools.apply(setting.view.removeHoverDom, [setting.treeId, node])
},
repairNodeLevelClass: function (setting, node, oldLevel) {
if (oldLevel === node.level) return
var liObj = $$(node, setting),
aObj = $$(node, consts.id.A, setting),
ulObj = $$(node, consts.id.UL, setting),
oldClass = consts.className.LEVEL + oldLevel,
newClass = consts.className.LEVEL + node.level
liObj.removeClass(oldClass)
liObj.addClass(newClass)
aObj.removeClass(oldClass)
aObj.addClass(newClass)
ulObj.removeClass(oldClass)
ulObj.addClass(newClass)
},
selectNodes: function (setting, nodes) {
for (var i = 0, l = nodes.length; i < l; i++) {
view.selectNode(setting, nodes[i], i > 0)
}
}
},
_z = {
tools: _tools,
view: _view,
event: _event,
data: _data
}
$.extend(true, $.fn.zTree.consts, _consts)
$.extend(true, $.fn.zTree._z, _z)
var zt = $.fn.zTree,
tools = zt._z.tools,
consts = zt.consts,
view = zt._z.view,
data = zt._z.data,
event = zt._z.event,
$$ = tools.$
data.exSetting(_setting)
data.addInitBind(_bindEvent)
data.addInitUnBind(_unbindEvent)
data.addInitCache(_initCache)
data.addInitNode(_initNode)
data.addInitProxy(_eventProxy)
data.addInitRoot(_initRoot)
data.addZTreeTools(_zTreeTools)
var _cancelPreSelectedNode = view.cancelPreSelectedNode
view.cancelPreSelectedNode = function (setting, node) {
var list = data.getRoot(setting).curSelectedList
for (var i = 0, j = list.length; i < j; i++) {
if (!node || node === list[i]) {
view.removeTreeDom(setting, list[i])
if (node) break
}
}
if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments)
}
var _createNodes = view.createNodes
view.createNodes = function (setting, level, nodes, parentNode, index) {
if (_createNodes) {
_createNodes.apply(view, arguments)
}
if (!nodes) return
if (view.repairParentChkClassWithSelf) {
view.repairParentChkClassWithSelf(setting, parentNode)
}
}
var _makeNodeUrl = view.makeNodeUrl
view.makeNodeUrl = function (setting, node) {
return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments))
}
var _removeNode = view.removeNode
view.removeNode = function (setting, node) {
var root = data.getRoot(setting)
if (root.curEditNode === node) root.curEditNode = null
if (_removeNode) {
_removeNode.apply(view, arguments)
}
}
var _selectNode = view.selectNode
view.selectNode = function (setting, node, addFlag) {
var root = data.getRoot(setting)
if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) {
return false
}
if (_selectNode) _selectNode.apply(view, arguments)
view.addHoverDom(setting, node)
return true
}
var _uCanDo = tools.uCanDo
tools.uCanDo = function (setting, e) {
var root = data.getRoot(setting)
if (e && (tools.eqs(e.type, 'mouseover') || tools.eqs(e.type, 'mouseout') || tools.eqs(e.type, 'mousedown') || tools.eqs(e.type, 'mouseup'))) {
return true
}
if (root.curEditNode) {
view.editNodeBlur = false
root.curEditInput.focus()
}
return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true)
}
})(jQuery)