diff --git a/config/production b/config/production index 682c9167..1c5d2b19 100755 --- a/config/production +++ b/config/production @@ -1,3 +1,5 @@ +rm -rf ./lib && +mkdir lib && rollup -c config/rollup.config.mjs && DEBUG_BUILD=true rollup -c config/rollup.config.mjs && babel src --config-file ./config/babel.config.json --out-dir lib --extensions .ts && diff --git a/lib/dragAndDropHandler.js b/lib/dragAndDropHandler.js deleted file mode 100644 index b5a4a07d..00000000 --- a/lib/dragAndDropHandler.js +++ /dev/null @@ -1,471 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.HitAreasGenerator = exports.DragAndDropHandler = void 0; -var _node = require("./node"); -class DragAndDropHandler { - constructor(treeWidget) { - this.treeWidget = treeWidget; - this.hoveredArea = null; - this.hitAreas = []; - this.isDragging = false; - this.currentItem = null; - } - mouseCapture(positionInfo) { - const $element = jQuery(positionInfo.target); - if (!this.mustCaptureElement($element)) { - return null; - } - if (this.treeWidget.options.onIsMoveHandle && !this.treeWidget.options.onIsMoveHandle($element)) { - return null; - } - let nodeElement = this.treeWidget._getNodeElement($element); - if (nodeElement && this.treeWidget.options.onCanMove) { - if (!this.treeWidget.options.onCanMove(nodeElement.node)) { - nodeElement = null; - } - } - this.currentItem = nodeElement; - return this.currentItem != null; - } - mouseStart(positionInfo) { - if (!this.currentItem || positionInfo.pageX === undefined || positionInfo.pageY === undefined) { - return false; - } - this.refresh(); - const offset = jQuery(positionInfo.target).offset(); - const left = offset ? offset.left : 0; - const top = offset ? offset.top : 0; - const node = this.currentItem.node; - this.dragElement = new DragElement(node.name, positionInfo.pageX - left, positionInfo.pageY - top, this.treeWidget.element, this.treeWidget.options.autoEscape ?? true); - this.isDragging = true; - this.currentItem.$element.addClass("jqtree-moving"); - return true; - } - mouseDrag(positionInfo) { - if (!this.currentItem || !this.dragElement || positionInfo.pageX === undefined || positionInfo.pageY === undefined) { - return false; - } - this.dragElement.move(positionInfo.pageX, positionInfo.pageY); - const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY); - if (area && this.canMoveToArea(area)) { - if (!area.node.isFolder()) { - this.stopOpenFolderTimer(); - } - if (this.hoveredArea !== area) { - this.hoveredArea = area; - - // If this is a closed folder, start timer to open it - if (this.mustOpenFolderTimer(area)) { - this.startOpenFolderTimer(area.node); - } else { - this.stopOpenFolderTimer(); - } - this.updateDropHint(); - } - } else { - this.removeDropHint(); - this.stopOpenFolderTimer(); - this.hoveredArea = area; - } - if (!area) { - if (this.treeWidget.options.onDragMove) { - this.treeWidget.options.onDragMove(this.currentItem.node, positionInfo.originalEvent); - } - } - return true; - } - mouseStop(positionInfo) { - this.moveItem(positionInfo); - this.clear(); - this.removeHover(); - this.removeDropHint(); - this.removeHitAreas(); - const currentItem = this.currentItem; - if (this.currentItem) { - this.currentItem.$element.removeClass("jqtree-moving"); - this.currentItem = null; - } - this.isDragging = false; - if (!this.hoveredArea && currentItem) { - if (this.treeWidget.options.onDragStop) { - this.treeWidget.options.onDragStop(currentItem.node, positionInfo.originalEvent); - } - } - return false; - } - refresh() { - this.removeHitAreas(); - if (this.currentItem) { - this.generateHitAreas(); - this.currentItem = this.treeWidget._getNodeElementForNode(this.currentItem.node); - if (this.isDragging) { - this.currentItem.$element.addClass("jqtree-moving"); - } - } - } - generateHitAreas() { - if (!this.currentItem) { - this.hitAreas = []; - } else { - const hitAreasGenerator = new HitAreasGenerator(this.treeWidget.tree, this.currentItem.node, this.getTreeDimensions().bottom); - this.hitAreas = hitAreasGenerator.generate(); - } - } - mustCaptureElement($element) { - return !$element.is("input,select,textarea"); - } - canMoveToArea(area) { - if (!this.treeWidget.options.onCanMoveTo) { - return true; - } - if (!this.currentItem) { - return false; - } - const positionName = (0, _node.getPositionName)(area.position); - return this.treeWidget.options.onCanMoveTo(this.currentItem.node, area.node, positionName); - } - removeHitAreas() { - this.hitAreas = []; - } - clear() { - if (this.dragElement) { - this.dragElement.remove(); - this.dragElement = null; - } - } - removeDropHint() { - if (this.previousGhost) { - this.previousGhost.remove(); - } - } - removeHover() { - this.hoveredArea = null; - } - findHoveredArea(x, y) { - const dimensions = this.getTreeDimensions(); - if (x < dimensions.left || y < dimensions.top || x > dimensions.right || y > dimensions.bottom) { - return null; - } - let low = 0; - let high = this.hitAreas.length; - while (low < high) { - const mid = low + high >> 1; - const area = this.hitAreas[mid]; - if (!area) { - return null; - } - if (y < area.top) { - high = mid; - } else if (y > area.bottom) { - low = mid + 1; - } else { - return area; - } - } - return null; - } - mustOpenFolderTimer(area) { - const node = area.node; - return node.isFolder() && !node.is_open && area.position === _node.Position.Inside; - } - updateDropHint() { - if (!this.hoveredArea) { - return; - } - - // remove previous drop hint - this.removeDropHint(); - - // add new drop hint - const nodeElement = this.treeWidget._getNodeElementForNode(this.hoveredArea.node); - this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position); - } - startOpenFolderTimer(folder) { - const openFolder = () => { - this.treeWidget._openNode(folder, this.treeWidget.options.slide, () => { - this.refresh(); - this.updateDropHint(); - }); - }; - this.stopOpenFolderTimer(); - const openFolderDelay = this.treeWidget.options.openFolderDelay; - if (openFolderDelay !== false) { - this.openFolderTimer = window.setTimeout(openFolder, openFolderDelay); - } - } - stopOpenFolderTimer() { - if (this.openFolderTimer) { - clearTimeout(this.openFolderTimer); - this.openFolderTimer = null; - } - } - moveItem(positionInfo) { - if (this.currentItem && this.hoveredArea && this.hoveredArea.position !== _node.Position.None && this.canMoveToArea(this.hoveredArea)) { - const movedNode = this.currentItem.node; - const targetNode = this.hoveredArea.node; - const position = this.hoveredArea.position; - const previousParent = movedNode.parent; - if (position === _node.Position.Inside) { - this.hoveredArea.node.is_open = true; - } - const doMove = () => { - this.treeWidget.tree.moveNode(movedNode, targetNode, position); - this.treeWidget.element.empty(); - this.treeWidget._refreshElements(null); - }; - const event = this.treeWidget._triggerEvent("tree.move", { - move_info: { - moved_node: movedNode, - target_node: targetNode, - position: (0, _node.getPositionName)(position), - previous_parent: previousParent, - do_move: doMove, - original_event: positionInfo.originalEvent - } - }); - if (!event.isDefaultPrevented()) { - doMove(); - } - } - } - getTreeDimensions() { - // Return the dimensions of the tree. Add a margin to the bottom to allow - // to drag-and-drop after the last element. - const offset = this.treeWidget.element.offset(); - if (!offset) { - return { - left: 0, - top: 0, - right: 0, - bottom: 0 - }; - } else { - const el = this.treeWidget.element; - const width = el.width() || 0; - const height = el.height() || 0; - const left = offset.left + this.treeWidget._getScrollLeft(); - return { - left, - top: offset.top, - right: left + width, - bottom: offset.top + height + 16 - }; - } - } -} -exports.DragAndDropHandler = DragAndDropHandler; -class VisibleNodeIterator { - constructor(tree) { - this.tree = tree; - } - iterate() { - let isFirstNode = true; - const _iterateNode = (node, nextNode) => { - let mustIterateInside = (node.is_open || !node.element) && node.hasChildren(); - let $element = null; - if (node.element) { - $element = jQuery(node.element); - if (!$element.is(":visible")) { - return; - } - if (isFirstNode) { - this.handleFirstNode(node); - isFirstNode = false; - } - if (!node.hasChildren()) { - this.handleNode(node, nextNode, $element); - } else if (node.is_open) { - if (!this.handleOpenFolder(node, $element)) { - mustIterateInside = false; - } - } else { - this.handleClosedFolder(node, nextNode, $element); - } - } - if (mustIterateInside) { - const childrenLength = node.children.length; - node.children.forEach((_, i) => { - const child = node.children[i]; - if (child) { - if (i === childrenLength - 1) { - _iterateNode(child, null); - } else { - const nextChild = node.children[i + 1]; - if (nextChild) { - _iterateNode(child, nextChild); - } - } - } - }); - if (node.is_open && $element) { - this.handleAfterOpenFolder(node, nextNode); - } - } - }; - _iterateNode(this.tree, null); - } - - /* - override - return - - true: continue iterating - - false: stop iterating - */ -} - -class HitAreasGenerator extends VisibleNodeIterator { - constructor(tree, currentNode, treeBottom) { - super(tree); - this.currentNode = currentNode; - this.treeBottom = treeBottom; - } - generate() { - this.positions = []; - this.lastTop = 0; - this.iterate(); - return this.generateHitAreas(this.positions); - } - generateHitAreas(positions) { - let previousTop = positions[0]?.top ?? 0; - let group = []; - const hitAreas = []; - for (const position of positions) { - if (position.top !== previousTop && group.length) { - this.generateHitAreasForGroup(hitAreas, group, previousTop, position.top); - previousTop = position.top; - group = []; - } - group.push(position); - } - this.generateHitAreasForGroup(hitAreas, group, previousTop, this.treeBottom); - return hitAreas; - } - handleOpenFolder(node, $element) { - if (node === this.currentNode) { - // Cannot move inside current item - - // Dnd over the current element is not possible: add a position with type None for the top and the bottom. - const top = this.getTop($element); - const height = $element.height() || 0; - this.addPosition(node, _node.Position.None, top); - if (height > 5) { - // Subtract 5 pixels to allow more space for the next element. - this.addPosition(node, _node.Position.None, top + height - 5); - } - - // Stop iterating - return false; - } - - // Cannot move before current item - if (node.children[0] !== this.currentNode) { - this.addPosition(node, _node.Position.Inside, this.getTop($element)); - } - - // Continue iterating - return true; - } - handleClosedFolder(node, nextNode, $element) { - const top = this.getTop($element); - if (node === this.currentNode) { - // Cannot move after current item - this.addPosition(node, _node.Position.None, top); - } else { - this.addPosition(node, _node.Position.Inside, top); - - // Cannot move before current item - if (nextNode !== this.currentNode) { - this.addPosition(node, _node.Position.After, top); - } - } - } - handleFirstNode(node) { - if (node !== this.currentNode) { - this.addPosition(node, _node.Position.Before, this.getTop(jQuery(node.element))); - } - } - handleAfterOpenFolder(node, nextNode) { - if (node === this.currentNode || nextNode === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, _node.Position.None, this.lastTop); - } else { - this.addPosition(node, _node.Position.After, this.lastTop); - } - } - handleNode(node, nextNode, $element) { - const top = this.getTop($element); - if (node === this.currentNode) { - // Cannot move inside current item - this.addPosition(node, _node.Position.None, top); - } else { - this.addPosition(node, _node.Position.Inside, top); - } - if (nextNode === this.currentNode || node === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, _node.Position.None, top); - } else { - this.addPosition(node, _node.Position.After, top); - } - } - getTop($element) { - const offset = $element.offset(); - return offset ? offset.top : 0; - } - addPosition(node, position, top) { - const area = { - top, - bottom: 0, - node, - position - }; - this.positions.push(area); - this.lastTop = top; - } - generateHitAreasForGroup(hitAreas, positionsInGroup, top, bottom) { - // limit positions in group - const positionCount = Math.min(positionsInGroup.length, 4); - const areaHeight = Math.round((bottom - top) / positionCount); - let areaTop = top; - let i = 0; - while (i < positionCount) { - const position = positionsInGroup[i]; - if (position && position.position !== _node.Position.None) { - hitAreas.push({ - top: areaTop, - bottom: areaTop + areaHeight, - node: position.node, - position: position.position - }); - } - areaTop += areaHeight; - i += 1; - } - } -} -exports.HitAreasGenerator = HitAreasGenerator; -class DragElement { - constructor(nodeName, offsetX, offsetY, $tree, autoEscape) { - this.offsetX = offsetX; - this.offsetY = offsetY; - this.$element = jQuery("").addClass("jqtree-title jqtree-dragging"); - if (autoEscape) { - this.$element.text(nodeName); - } else { - this.$element.html(nodeName); - } - this.$element.css("position", "absolute"); - $tree.append(this.$element); - } - move(pageX, pageY) { - this.$element.offset({ - left: pageX - this.offsetX, - top: pageY - this.offsetY - }); - } - remove() { - this.$element.remove(); - } -} \ No newline at end of file diff --git a/lib/dragAndDropHandler/dragElement.js b/lib/dragAndDropHandler/dragElement.js new file mode 100644 index 00000000..ce0eea35 --- /dev/null +++ b/lib/dragAndDropHandler/dragElement.js @@ -0,0 +1,30 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +class DragElement { + constructor(nodeName, offsetX, offsetY, $tree, autoEscape) { + this.offsetX = offsetX; + this.offsetY = offsetY; + this.$element = jQuery("").addClass("jqtree-title jqtree-dragging"); + if (autoEscape) { + this.$element.text(nodeName); + } else { + this.$element.html(nodeName); + } + this.$element.css("position", "absolute"); + $tree.append(this.$element); + } + move(pageX, pageY) { + this.$element.offset({ + left: pageX - this.offsetX, + top: pageY - this.offsetY + }); + } + remove() { + this.$element.remove(); + } +} +var _default = exports.default = DragElement; \ No newline at end of file diff --git a/lib/dragAndDropHandler/hitAreasGenerator.js b/lib/dragAndDropHandler/hitAreasGenerator.js new file mode 100644 index 00000000..edeceae4 --- /dev/null +++ b/lib/dragAndDropHandler/hitAreasGenerator.js @@ -0,0 +1,126 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _node = require("../node"); +var _util = require("../util"); +var _visibleNodeIterator = _interopRequireDefault(require("./visibleNodeIterator")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +class HitAreasGenerator extends _visibleNodeIterator.default { + constructor(tree, currentNode, treeBottom) { + super(tree); + this.currentNode = currentNode; + this.treeBottom = treeBottom; + } + generate() { + this.positions = []; + this.lastTop = 0; + this.iterate(); + return this.generateHitAreas(this.positions); + } + generateHitAreas(positions) { + let previousTop = positions[0]?.top ?? 0; + let group = []; + const hitAreas = []; + for (const position of positions) { + if (position.top !== previousTop && group.length) { + this.generateHitAreasForGroup(hitAreas, group, previousTop, position.top); + previousTop = position.top; + group = []; + } + group.push(position); + } + this.generateHitAreasForGroup(hitAreas, group, previousTop, this.treeBottom); + return hitAreas; + } + handleOpenFolder(node, element) { + if (node === this.currentNode) { + // Cannot move inside current item + // Stop iterating + return false; + } + + // Cannot move before current item + if (node.children[0] !== this.currentNode) { + this.addPosition(node, _node.Position.Inside, (0, _util.getOffsetTop)(element)); + } + + // Continue iterating + return true; + } + handleClosedFolder(node, nextNode, element) { + const top = (0, _util.getOffsetTop)(element); + if (node === this.currentNode) { + // Cannot move after current item + this.addPosition(node, _node.Position.None, top); + } else { + this.addPosition(node, _node.Position.Inside, top); + + // Cannot move before current item + if (nextNode !== this.currentNode) { + this.addPosition(node, _node.Position.After, top); + } + } + } + handleFirstNode(node) { + if (node !== this.currentNode) { + this.addPosition(node, _node.Position.Before, (0, _util.getOffsetTop)(node.element)); + } + } + handleAfterOpenFolder(node, nextNode) { + if (node === this.currentNode || nextNode === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, _node.Position.None, this.lastTop); + } else { + this.addPosition(node, _node.Position.After, this.lastTop); + } + } + handleNode(node, nextNode, element) { + const top = (0, _util.getOffsetTop)(element); + if (node === this.currentNode) { + // Cannot move inside current item + this.addPosition(node, _node.Position.None, top); + } else { + this.addPosition(node, _node.Position.Inside, top); + } + if (nextNode === this.currentNode || node === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, _node.Position.None, top); + } else { + this.addPosition(node, _node.Position.After, top); + } + } + addPosition(node, position, top) { + const area = { + top, + bottom: 0, + node, + position + }; + this.positions.push(area); + this.lastTop = top; + } + generateHitAreasForGroup(hitAreas, positionsInGroup, top, bottom) { + // limit positions in group + const positionCount = Math.min(positionsInGroup.length, 4); + const areaHeight = Math.round((bottom - top) / positionCount); + let areaTop = top; + let i = 0; + while (i < positionCount) { + const position = positionsInGroup[i]; + if (position) { + hitAreas.push({ + top: areaTop, + bottom: areaTop + areaHeight, + node: position.node, + position: position.position + }); + } + areaTop += areaHeight; + i += 1; + } + } +} +var _default = exports.default = HitAreasGenerator; \ No newline at end of file diff --git a/lib/dragAndDropHandler/index.js b/lib/dragAndDropHandler/index.js new file mode 100644 index 00000000..93d029ed --- /dev/null +++ b/lib/dragAndDropHandler/index.js @@ -0,0 +1,263 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DragAndDropHandler = void 0; +var _node = require("../node"); +var _dragElement = _interopRequireDefault(require("./dragElement")); +var _hitAreasGenerator = _interopRequireDefault(require("./hitAreasGenerator")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +class DragAndDropHandler { + constructor(treeWidget) { + this.treeWidget = treeWidget; + this.hoveredArea = null; + this.hitAreas = []; + this.isDragging = false; + this.currentItem = null; + } + mouseCapture(positionInfo) { + const element = positionInfo.target; + if (!this.mustCaptureElement(element)) { + return null; + } + if (this.treeWidget.options.onIsMoveHandle && !this.treeWidget.options.onIsMoveHandle(jQuery(element))) { + return null; + } + let nodeElement = this.treeWidget._getNodeElement(element); + if (nodeElement && this.treeWidget.options.onCanMove) { + if (!this.treeWidget.options.onCanMove(nodeElement.node)) { + nodeElement = null; + } + } + this.currentItem = nodeElement; + return this.currentItem != null; + } + mouseStart(positionInfo) { + if (!this.currentItem || positionInfo.pageX === undefined || positionInfo.pageY === undefined) { + return false; + } + this.refresh(); + const offset = jQuery(positionInfo.target).offset(); + const left = offset ? offset.left : 0; + const top = offset ? offset.top : 0; + const node = this.currentItem.node; + this.dragElement = new _dragElement.default(node.name, positionInfo.pageX - left, positionInfo.pageY - top, this.treeWidget.element, this.treeWidget.options.autoEscape ?? true); + this.isDragging = true; + this.currentItem.element.classList.add("jqtree-moving"); + return true; + } + mouseDrag(positionInfo) { + if (!this.currentItem || !this.dragElement || positionInfo.pageX === undefined || positionInfo.pageY === undefined) { + return false; + } + this.dragElement.move(positionInfo.pageX, positionInfo.pageY); + const area = this.findHoveredArea(positionInfo.pageX, positionInfo.pageY); + if (area && this.canMoveToArea(area)) { + if (!area.node.isFolder()) { + this.stopOpenFolderTimer(); + } + if (this.hoveredArea !== area) { + this.hoveredArea = area; + + // If this is a closed folder, start timer to open it + if (this.mustOpenFolderTimer(area)) { + this.startOpenFolderTimer(area.node); + } else { + this.stopOpenFolderTimer(); + } + this.updateDropHint(); + } + } else { + this.removeDropHint(); + this.stopOpenFolderTimer(); + this.hoveredArea = area; + } + if (!area) { + if (this.treeWidget.options.onDragMove) { + this.treeWidget.options.onDragMove(this.currentItem.node, positionInfo.originalEvent); + } + } + return true; + } + mouseStop(positionInfo) { + this.moveItem(positionInfo); + this.clear(); + this.removeHover(); + this.removeDropHint(); + this.removeHitAreas(); + const currentItem = this.currentItem; + if (this.currentItem) { + this.currentItem.element.classList.remove("jqtree-moving"); + this.currentItem = null; + } + this.isDragging = false; + if (!this.hoveredArea && currentItem) { + if (this.treeWidget.options.onDragStop) { + this.treeWidget.options.onDragStop(currentItem.node, positionInfo.originalEvent); + } + } + return false; + } + refresh() { + this.removeHitAreas(); + if (this.currentItem) { + this.generateHitAreas(); + this.currentItem = this.treeWidget._getNodeElementForNode(this.currentItem.node); + if (this.isDragging) { + this.currentItem.element.classList.add("jqtree-moving"); + } + } + } + generateHitAreas() { + if (!this.currentItem) { + this.hitAreas = []; + } else { + const hitAreasGenerator = new _hitAreasGenerator.default(this.treeWidget.tree, this.currentItem.node, this.getTreeDimensions().bottom); + this.hitAreas = hitAreasGenerator.generate(); + } + } + mustCaptureElement(element) { + const nodeName = element.nodeName; + return nodeName !== "INPUT" && nodeName !== "SELECT" && nodeName !== "TEXTAREA"; + } + canMoveToArea(area) { + if (!this.treeWidget.options.onCanMoveTo) { + return true; + } + if (!this.currentItem) { + return false; + } + const positionName = (0, _node.getPositionName)(area.position); + return this.treeWidget.options.onCanMoveTo(this.currentItem.node, area.node, positionName); + } + removeHitAreas() { + this.hitAreas = []; + } + clear() { + if (this.dragElement) { + this.dragElement.remove(); + this.dragElement = null; + } + } + removeDropHint() { + if (this.previousGhost) { + this.previousGhost.remove(); + } + } + removeHover() { + this.hoveredArea = null; + } + findHoveredArea(x, y) { + const dimensions = this.getTreeDimensions(); + if (x < dimensions.left || y < dimensions.top || x > dimensions.right || y > dimensions.bottom) { + return null; + } + let low = 0; + let high = this.hitAreas.length; + while (low < high) { + const mid = low + high >> 1; + const area = this.hitAreas[mid]; + if (!area) { + return null; + } + if (y < area.top) { + high = mid; + } else if (y > area.bottom) { + low = mid + 1; + } else { + return area; + } + } + return null; + } + mustOpenFolderTimer(area) { + const node = area.node; + return node.isFolder() && !node.is_open && area.position === _node.Position.Inside; + } + updateDropHint() { + if (!this.hoveredArea) { + return; + } + + // remove previous drop hint + this.removeDropHint(); + + // add new drop hint + const nodeElement = this.treeWidget._getNodeElementForNode(this.hoveredArea.node); + this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position); + } + startOpenFolderTimer(folder) { + const openFolder = () => { + this.treeWidget._openNode(folder, this.treeWidget.options.slide, () => { + this.refresh(); + this.updateDropHint(); + }); + }; + this.stopOpenFolderTimer(); + const openFolderDelay = this.treeWidget.options.openFolderDelay; + if (openFolderDelay !== false) { + this.openFolderTimer = window.setTimeout(openFolder, openFolderDelay); + } + } + stopOpenFolderTimer() { + if (this.openFolderTimer) { + clearTimeout(this.openFolderTimer); + this.openFolderTimer = null; + } + } + moveItem(positionInfo) { + if (this.currentItem && this.hoveredArea && this.hoveredArea.position !== _node.Position.None && this.canMoveToArea(this.hoveredArea)) { + const movedNode = this.currentItem.node; + const targetNode = this.hoveredArea.node; + const position = this.hoveredArea.position; + const previousParent = movedNode.parent; + if (position === _node.Position.Inside) { + this.hoveredArea.node.is_open = true; + } + const doMove = () => { + this.treeWidget.tree.moveNode(movedNode, targetNode, position); + this.treeWidget.element.empty(); + this.treeWidget._refreshElements(null); + }; + const event = this.treeWidget._triggerEvent("tree.move", { + move_info: { + moved_node: movedNode, + target_node: targetNode, + position: (0, _node.getPositionName)(position), + previous_parent: previousParent, + do_move: doMove, + original_event: positionInfo.originalEvent + } + }); + if (!event.isDefaultPrevented()) { + doMove(); + } + } + } + getTreeDimensions() { + // Return the dimensions of the tree. Add a margin to the bottom to allow + // to drag-and-drop after the last element. + const offset = this.treeWidget.element.offset(); + if (!offset) { + return { + left: 0, + top: 0, + right: 0, + bottom: 0 + }; + } else { + const el = this.treeWidget.element; + const width = el.width() || 0; + const height = el.height() || 0; + const left = offset.left + this.treeWidget._getScrollLeft(); + return { + left, + top: offset.top, + right: left + width, + bottom: offset.top + height + 16 + }; + } + } +} +exports.DragAndDropHandler = DragAndDropHandler; \ No newline at end of file diff --git a/lib/dragAndDropHandler/visibleNodeIterator.js b/lib/dragAndDropHandler/visibleNodeIterator.js new file mode 100644 index 00000000..85a40f41 --- /dev/null +++ b/lib/dragAndDropHandler/visibleNodeIterator.js @@ -0,0 +1,64 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +class VisibleNodeIterator { + constructor(tree) { + this.tree = tree; + } + iterate() { + let isFirstNode = true; + const _iterateNode = (node, nextNode) => { + let mustIterateInside = (node.is_open || !node.element) && node.hasChildren(); + let element = null; + + // Is the element visible? + if (node.element?.offsetParent) { + element = node.element; + if (isFirstNode) { + this.handleFirstNode(node); + isFirstNode = false; + } + if (!node.hasChildren()) { + this.handleNode(node, nextNode, node.element); + } else if (node.is_open) { + if (!this.handleOpenFolder(node, node.element)) { + mustIterateInside = false; + } + } else { + this.handleClosedFolder(node, nextNode, element); + } + } + if (mustIterateInside) { + const childrenLength = node.children.length; + node.children.forEach((_, i) => { + const child = node.children[i]; + if (child) { + if (i === childrenLength - 1) { + _iterateNode(child, null); + } else { + const nextChild = node.children[i + 1]; + if (nextChild) { + _iterateNode(child, nextChild); + } + } + } + }); + if (node.is_open && element) { + this.handleAfterOpenFolder(node, nextNode); + } + } + }; + _iterateNode(this.tree, null); + } + + /* + override + return + - true: continue iterating + - false: stop iterating + */ +} +var _default = exports.default = VisibleNodeIterator; \ No newline at end of file diff --git a/lib/elementsRenderer.js b/lib/elementsRenderer.js index 47635ca1..1428a1e9 100644 --- a/lib/elementsRenderer.js +++ b/lib/elementsRenderer.js @@ -207,6 +207,10 @@ class ElementsRenderer { const div = document.createElement("div"); div.innerHTML = value; return document.createTextNode(div.innerHTML); + } else if (value == null) { + return undefined; + } else if (value.nodeType) { + return value; } else { return jQuery(value)[0]; } diff --git a/lib/keyHandler.js b/lib/keyHandler.js index 4d5ff9cf..3abdecb3 100644 --- a/lib/keyHandler.js +++ b/lib/keyHandler.js @@ -5,18 +5,18 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; class KeyHandler { - static LEFT = 37; - static UP = 38; - static RIGHT = 39; - static DOWN = 40; + handleKeyDownHandler = null; constructor(treeWidget) { this.treeWidget = treeWidget; if (treeWidget.options.keyboardSupport) { - jQuery(document).on("keydown.jqtree", this.handleKeyDown); + this.handleKeyDownHandler = this.handleKeyDown.bind(this); + document.addEventListener("keydown", this.handleKeyDownHandler); } } deinit() { - jQuery(document).off("keydown.jqtree"); + if (this.handleKeyDownHandler) { + document.removeEventListener("keydown", this.handleKeyDownHandler); + } } moveDown(selectedNode) { return this.selectNode(selectedNode.getNextVisibleNode()); @@ -65,15 +65,14 @@ class KeyHandler { if (!selectedNode) { return true; } - const key = e.which; - switch (key) { - case KeyHandler.DOWN: + switch (e.key) { + case "ArrowDown": return this.moveDown(selectedNode); - case KeyHandler.UP: + case "ArrowUp": return this.moveUp(selectedNode); - case KeyHandler.RIGHT: + case "ArrowRight": return this.moveRight(selectedNode); - case KeyHandler.LEFT: + case "ArrowLeft": return this.moveLeft(selectedNode); default: return true; diff --git a/lib/nodeElement.js b/lib/nodeElement.js deleted file mode 100644 index b66e267a..00000000 --- a/lib/nodeElement.js +++ /dev/null @@ -1,200 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.NodeElement = exports.FolderElement = exports.BorderDropHint = void 0; -var _node = require("./node"); -class NodeElement { - constructor(node, treeWidget) { - this.init(node, treeWidget); - } - init(node, treeWidget) { - this.node = node; - this.treeWidget = treeWidget; - if (!node.element) { - const element = this.treeWidget.element.get(0); - if (element) { - node.element = element; - } - } - if (node.element) { - this.$element = jQuery(node.element); - } - } - addDropHint(position) { - if (this.mustShowBorderDropHint(position)) { - return new BorderDropHint(this.$element, this.treeWidget._getScrollLeft()); - } else { - return new GhostDropHint(this.node, this.$element, position); - } - } - select(mustSetFocus) { - const $li = this.getLi(); - $li.addClass("jqtree-selected"); - const $span = this.getSpan(); - $span.attr("tabindex", this.treeWidget.options.tabIndex ?? null); - $span.attr("aria-selected", "true"); - if (mustSetFocus) { - $span.trigger("focus"); - } - } - deselect() { - const $li = this.getLi(); - $li.removeClass("jqtree-selected"); - const $span = this.getSpan(); - $span.removeAttr("tabindex"); - $span.attr("aria-selected", "false"); - $span.trigger("blur"); - } - getUl() { - return this.$element.children("ul:first"); - } - getSpan() { - return this.$element.children(".jqtree-element").find("span.jqtree-title"); - } - getLi() { - return this.$element; - } - mustShowBorderDropHint(position) { - return position === _node.Position.Inside; - } -} -exports.NodeElement = NodeElement; -class FolderElement extends NodeElement { - open(onFinished) { - let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - let animationSpeed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "fast"; - if (this.node.is_open) { - return; - } - this.node.is_open = true; - const $button = this.getButton(); - $button.removeClass("jqtree-closed"); - $button.html(""); - const buttonEl = $button.get(0); - if (buttonEl) { - const openedIconElement = this.treeWidget.renderer.openedIconElement; - if (openedIconElement) { - const icon = openedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } - } - const doOpen = () => { - const $li = this.getLi(); - $li.removeClass("jqtree-closed"); - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "true"); - if (onFinished) { - onFinished(this.node); - } - this.treeWidget._triggerEvent("tree.open", { - node: this.node - }); - }; - if (slide) { - this.getUl().slideDown(animationSpeed, doOpen); - } else { - this.getUl().show(); - doOpen(); - } - } - close() { - let slide = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - let animationSpeed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fast"; - if (!this.node.is_open) { - return; - } - this.node.is_open = false; - const $button = this.getButton(); - $button.addClass("jqtree-closed"); - $button.html(""); - const buttonEl = $button.get(0); - if (buttonEl) { - const closedIconElement = this.treeWidget.renderer.closedIconElement; - if (closedIconElement) { - const icon = closedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } - } - const doClose = () => { - const $li = this.getLi(); - $li.addClass("jqtree-closed"); - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "false"); - this.treeWidget._triggerEvent("tree.close", { - node: this.node - }); - }; - if (slide) { - this.getUl().slideUp(animationSpeed, doClose); - } else { - this.getUl().hide(); - doClose(); - } - } - mustShowBorderDropHint(position) { - return !this.node.is_open && position === _node.Position.Inside; - } - getButton() { - return this.$element.children(".jqtree-element").find("a.jqtree-toggler"); - } -} -exports.FolderElement = FolderElement; -class BorderDropHint { - constructor($element, scrollLeft) { - const $div = $element.children(".jqtree-element"); - const elWidth = $element.width() || 0; - const width = Math.max(elWidth + scrollLeft - 4, 0); - const elHeight = $div.outerHeight() || 0; - const height = Math.max(elHeight - 4, 0); - this.$hint = jQuery(''); - $div.append(this.$hint); - this.$hint.css({ - width, - height - }); - } - remove() { - this.$hint.remove(); - } -} -exports.BorderDropHint = BorderDropHint; -class GhostDropHint { - constructor(node, $element, position) { - this.$element = $element; - this.node = node; - this.$ghost = jQuery(`
  • -
  • `); - if (position === _node.Position.After) { - this.moveAfter(); - } else if (position === _node.Position.Before) { - this.moveBefore(); - } else if (position === _node.Position.Inside) { - if (node.isFolder() && node.is_open) { - this.moveInsideOpenFolder(); - } else { - this.moveInside(); - } - } - } - remove() { - this.$ghost.remove(); - } - moveAfter() { - this.$element.after(this.$ghost); - } - moveBefore() { - this.$element.before(this.$ghost); - } - moveInsideOpenFolder() { - const childElement = this.node.children[0]?.element; - if (childElement) { - jQuery(childElement).before(this.$ghost); - } - } - moveInside() { - this.$element.after(this.$ghost); - this.$ghost.addClass("jqtree-inside"); - } -} \ No newline at end of file diff --git a/lib/nodeElement/borderDropHint.js b/lib/nodeElement/borderDropHint.js new file mode 100644 index 00000000..7f1bcbb5 --- /dev/null +++ b/lib/nodeElement/borderDropHint.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +class BorderDropHint { + constructor(element, scrollLeft) { + const div = element.querySelector(":scope > .jqtree-element"); + if (!div) { + this.hint = undefined; + return; + } + const width = Math.max(element.offsetWidth + scrollLeft - 4, 0); + const height = Math.max(element.clientHeight - 4, 0); + const hint = document.createElement("span"); + hint.className = "jqtree-border"; + hint.style.width = `${width}px`; + hint.style.height = `${height}px`; + this.hint = hint; + div.append(this.hint); + } + remove() { + this.hint?.remove(); + } +} +var _default = exports.default = BorderDropHint; \ No newline at end of file diff --git a/lib/nodeElement/folderElement.js b/lib/nodeElement/folderElement.js new file mode 100644 index 00000000..69e84d57 --- /dev/null +++ b/lib/nodeElement/folderElement.js @@ -0,0 +1,81 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _node = require("../node"); +var _index = _interopRequireDefault(require("./index")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +class FolderElement extends _index.default { + open(onFinished) { + let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + let animationSpeed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "fast"; + if (this.node.is_open) { + return; + } + this.node.is_open = true; + const button = this.getButton(); + button.classList.remove("jqtree-closed"); + button.innerHTML = ""; + const openedIconElement = this.treeWidget.renderer.openedIconElement; + if (openedIconElement) { + const icon = openedIconElement.cloneNode(true); + button.appendChild(icon); + } + const doOpen = () => { + this.element.classList.remove("jqtree-closed"); + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "true"); + if (onFinished) { + onFinished(this.node); + } + this.treeWidget._triggerEvent("tree.open", { + node: this.node + }); + }; + if (slide) { + jQuery(this.getUl()).slideDown(animationSpeed, doOpen); + } else { + jQuery(this.getUl()).show(); + doOpen(); + } + } + close() { + let slide = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + let animationSpeed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "fast"; + if (!this.node.is_open) { + return; + } + this.node.is_open = false; + const button = this.getButton(); + button.classList.add("jqtree-closed"); + button.innerHTML = ""; + const closedIconElement = this.treeWidget.renderer.closedIconElement; + if (closedIconElement) { + const icon = closedIconElement.cloneNode(true); + button.appendChild(icon); + } + const doClose = () => { + this.element.classList.add("jqtree-closed"); + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "false"); + this.treeWidget._triggerEvent("tree.close", { + node: this.node + }); + }; + if (slide) { + jQuery(this.getUl()).slideUp(animationSpeed, doClose); + } else { + jQuery(this.getUl()).hide(); + doClose(); + } + } + mustShowBorderDropHint(position) { + return !this.node.is_open && position === _node.Position.Inside; + } + getButton() { + return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler"); + } +} +var _default = exports.default = FolderElement; \ No newline at end of file diff --git a/lib/nodeElement/ghostDropHint.js b/lib/nodeElement/ghostDropHint.js new file mode 100644 index 00000000..def32368 --- /dev/null +++ b/lib/nodeElement/ghostDropHint.js @@ -0,0 +1,56 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _node = require("../node"); +class GhostDropHint { + constructor(node, element, position) { + this.element = element; + this.node = node; + this.ghost = this.createGhostElement(); + if (position === _node.Position.After) { + this.moveAfter(); + } else if (position === _node.Position.Before) { + this.moveBefore(); + } else if (position === _node.Position.Inside) { + if (node.isFolder() && node.is_open) { + this.moveInsideOpenFolder(); + } else { + this.moveInside(); + } + } + } + remove() { + this.ghost.remove(); + } + moveAfter() { + this.element.after(this.ghost); + } + moveBefore() { + this.element.before(this.ghost); + } + moveInsideOpenFolder() { + const childElement = this.node.children[0]?.element; + if (childElement) { + childElement.before(this.ghost); + } + } + moveInside() { + this.element.after(this.ghost); + this.ghost.classList.add("jqtree-inside"); + } + createGhostElement() { + const ghost = document.createElement("li"); + ghost.className = "jqtree_common jqtree-ghost"; + const circleSpan = document.createElement("span"); + circleSpan.className = "jqtree_common jqtree-circle"; + ghost.append(circleSpan); + const lineSpan = document.createElement("span"); + lineSpan.className = "jqtree_common jqtree-line"; + ghost.append(lineSpan); + return ghost; + } +} +var _default = exports.default = GhostDropHint; \ No newline at end of file diff --git a/lib/nodeElement/index.js b/lib/nodeElement/index.js new file mode 100644 index 00000000..a4cc16e5 --- /dev/null +++ b/lib/nodeElement/index.js @@ -0,0 +1,66 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _node = require("../node"); +var _borderDropHint = _interopRequireDefault(require("./borderDropHint")); +var _ghostDropHint = _interopRequireDefault(require("./ghostDropHint")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +class NodeElement { + constructor(node, treeWidget) { + this.init(node, treeWidget); + } + init(node, treeWidget) { + this.node = node; + this.treeWidget = treeWidget; + if (!node.element) { + const element = this.treeWidget.element.get(0); + if (element) { + node.element = element; + } + } + if (node.element) { + this.element = node.element; + } + } + addDropHint(position) { + if (this.mustShowBorderDropHint(position)) { + return new _borderDropHint.default(this.element, this.treeWidget._getScrollLeft()); + } else { + return new _ghostDropHint.default(this.node, this.element, position); + } + } + select(mustSetFocus) { + this.element.classList.add("jqtree-selected"); + const titleSpan = this.getTitleSpan(); + const tabIndex = this.treeWidget.options.tabIndex; + + // Check for null or undefined + if (tabIndex != null) { + titleSpan.setAttribute("tabindex", tabIndex.toString()); + } + titleSpan.setAttribute("aria-selected", "true"); + if (mustSetFocus) { + titleSpan.focus(); + } + } + deselect() { + this.element.classList.remove("jqtree-selected"); + const titleSpan = this.getTitleSpan(); + titleSpan.removeAttribute("tabindex"); + titleSpan.setAttribute("aria-selected", "false"); + titleSpan.blur(); + } + getUl() { + return this.element.querySelector(":scope > ul"); + } + getTitleSpan() { + return this.element.querySelector(":scope > .jqtree-element > span.jqtree-title"); + } + mustShowBorderDropHint(position) { + return position === _node.Position.Inside; + } +} +var _default = exports.default = NodeElement; \ No newline at end of file diff --git a/lib/scrollHandler/scrollParent.js b/lib/scrollHandler/scrollParent.js deleted file mode 100644 index cb51b44e..00000000 --- a/lib/scrollHandler/scrollParent.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; -var _containerScrollParent = _interopRequireDefault(require("./containerScrollParent")); -var _documentScrollParent = _interopRequireDefault(require("./documentScrollParent")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -var hasOverFlow = function hasOverFlow($element) { - for (var _i = 0, _arr = ["overflow", "overflow-y"]; _i < _arr.length; _i++) { - var attr = _arr[_i]; - var overflowValue = $element.css(attr); - if (overflowValue === "auto" || overflowValue === "scroll") { - return true; - } - } - return false; -}; -var getParentWithOverflow = function getParentWithOverflow($treeElement) { - if (hasOverFlow($treeElement)) { - return $treeElement; - } - var _iterator = _createForOfIteratorHelper($treeElement.parents().get()), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var element = _step.value; - var $element = jQuery(element); - if (hasOverFlow($element)) { - return $element; - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - return null; -}; -var createScrollParent = function createScrollParent($treeElement, refreshHitAreas) { - var _$container$; - var $container = getParentWithOverflow($treeElement); - if ($container !== null && $container !== void 0 && $container.length && ((_$container$ = $container[0]) === null || _$container$ === void 0 ? void 0 : _$container$.tagName) !== "HTML") { - return new _containerScrollParent["default"]({ - $container: $container, - refreshHitAreas: refreshHitAreas, - $treeElement: $treeElement - }); - } else { - return new _documentScrollParent["default"]($treeElement, refreshHitAreas); - } -}; -var _default = createScrollParent; -exports["default"] = _default; \ No newline at end of file diff --git a/lib/test/jqTree/keyboard.test.js b/lib/test/jqTree/keyboard.test.js index 9958fd62..18bafb75 100644 --- a/lib/test/jqTree/keyboard.test.js +++ b/lib/test/jqTree/keyboard.test.js @@ -1,6 +1,7 @@ "use strict"; var _givens = _interopRequireDefault(require("givens")); +var _userEvent = require("@testing-library/user-event"); require("../../tree.jquery"); var _exampleData = _interopRequireDefault(require("../support/exampleData")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -14,16 +15,11 @@ afterEach(() => { $tree.remove(); }); describe("keyboard support", () => { - const KEY_DOWN = 40; - const KEY_LEFT = 37; - const KEY_RIGHT = 39; - const KEY_UP = 38; - const KEY_PAGE_UP = 33; const given = (0, _givens.default)(); given("autoOpen", () => false); given("initialSelectedNode", () => null); given("$tree", () => $("#tree1")); - beforeEach(() => { + beforeEach(async () => { given.$tree.tree({ animationSpeed: 0, autoOpen: given.autoOpen, @@ -32,12 +28,10 @@ describe("keyboard support", () => { if (given.initialSelectedNode) { given.$tree.tree("selectNode", given.initialSelectedNode); } - given.$tree.trigger($.Event("keydown", { - which: given.pressedKey - })); + await _userEvent.userEvent.keyboard(`{${given.pressedKey}}`); }); context("with key down", () => { - given("pressedKey", () => KEY_DOWN); + given("pressedKey", () => "ArrowDown"); context("when a node is selected", () => { given("initialSelectedNode", () => given.$tree.tree("getNodeByNameMustExist", "node1")); it("selects the next node", () => { @@ -65,7 +59,7 @@ describe("keyboard support", () => { }); }); context("with key up", () => { - given("pressedKey", () => KEY_UP); + given("pressedKey", () => "ArrowUp"); context("when a node is selected", () => { given("initialSelectedNode", () => given.$tree.tree("getNodeByNameMustExist", "node2")); it("selects the next node", () => { @@ -85,7 +79,7 @@ describe("keyboard support", () => { }); }); context("with key right", () => { - given("pressedKey", () => KEY_RIGHT); + given("pressedKey", () => "ArrowRight"); context("when a closed folder is selected", () => { given("initialSelectedNode", () => given.$tree.tree("getNodeByNameMustExist", "node1")); it("opens the folder", () => { @@ -136,7 +130,7 @@ describe("keyboard support", () => { }); }); context("with key left", () => { - given("pressedKey", () => KEY_LEFT); + given("pressedKey", () => "ArrowLeft"); context("when a closed folder is selected", () => { given("initialSelectedNode", () => given.$tree.tree("getNodeByNameMustExist", "node3")); it("selects the previous node", () => { @@ -176,7 +170,7 @@ describe("keyboard support", () => { }); }); context("with page up key", () => { - given("pressedKey", () => KEY_PAGE_UP); + given("pressedKey", () => "PageUp"); given("initialSelectedNode", () => given.$tree.tree("getNodeByNameMustExist", "child1")); it("does nothing", () => { expect(given.$tree.tree("getSelectedNode")).toMatchObject({ diff --git a/lib/test/jqTree/options.test.js b/lib/test/jqTree/options.test.js index 7141f1f7..44ea735b 100644 --- a/lib/test/jqTree/options.test.js +++ b/lib/test/jqTree/options.test.js @@ -163,17 +163,26 @@ describe("closedIcon", () => { expect($span.text()).toBe("test"); }); it("renders a html element", () => { - const closedIcon = document.createElement("span"); - closedIcon.className = "abc"; - closedIcon.textContent = "test"; + const icon = document.createElement("span"); + icon.className = "abc"; + icon.textContent = "test"; const $tree = $("#tree1"); $tree.tree({ - closedIcon, + closedIcon: icon, data: _exampleData.default }); const $span = $tree.find("a.jqtree-toggler:first span.abc"); expect($span.text()).toBe("test"); }); + it("renders a default when the option is empty", () => { + const $tree = $("#tree1"); + $tree.tree({ + closedIcon: undefined, + data: _exampleData.default + }); + const $span = $tree.find("a.jqtree-toggler:first"); + expect($span.text()).toBe("►"); + }); }); describe("dataUrl", () => { const exampleStructure = [expect.objectContaining({ diff --git a/lib/test/jqTree/scrollHandler/containerScrollParent.test.js b/lib/test/jqTree/scrollHandler/containerScrollParent.test.js deleted file mode 100644 index 6d71c883..00000000 --- a/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; - -var _containerScrollParent = _interopRequireDefault(require("../../../scrollHandler/containerScrollParent")); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } -function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } -var defaultMockJQueryElementParams = { - height: 200, - innerHeight: 180, - offsetTop: 20, - scrollLeft: 0 -}; -var mock$JQueryElement = function mock$JQueryElement(inputParams) { - var params = _objectSpread(_objectSpread({}, defaultMockJQueryElementParams), inputParams); - var element = {}; - var $element = { - get: function get(_) { - return element; - }, - height: function height() { - return params.height; - }, - innerHeight: function innerHeight() { - return params.innerHeight; - }, - offset: function offset() { - return { - top: params.offsetTop - }; - }, - scrollLeft: function scrollLeft() { - return params.scrollLeft; - } - }; - return $element; -}; -var mockContainerScrollParent = function mockContainerScrollParent($container) { - var refreshHitAreas = jest.fn(); - var $treeElement = {}; - return new _containerScrollParent["default"]({ - $container: $container, - refreshHitAreas: refreshHitAreas, - $treeElement: $treeElement - }); -}; -describe("getScrollLeft", function () { - it("returns the scrollLeft of the container", function () { - var $container = mock$JQueryElement({ - scrollLeft: 10 - }); - var containerScrollParent = mockContainerScrollParent($container); - expect(containerScrollParent.getScrollLeft()).toBe(10); - }); -}); -describe("isScrolledIntoView", function () { - it("returns true when the element is visible", function () { - var $container = mock$JQueryElement({ - height: 100, - offsetTop: 0 - }); - var containerScrollParent = mockContainerScrollParent($container); - var $element = mock$JQueryElement({ - height: 10, - offsetTop: 0 - }); - expect(containerScrollParent.isScrolledIntoView($element)).toBe(true); - }); - it("returns false when the element is not visible", function () { - var $container = mock$JQueryElement({ - height: 100, - offsetTop: 0 - }); - var containerScrollParent = mockContainerScrollParent($container); - var $element = mock$JQueryElement({ - height: 10, - offsetTop: 150 - }); - expect(containerScrollParent.isScrolledIntoView($element)).toBe(false); - }); -}); -describe("scrollToY", function () { - it("sets scrollTop of the container", function () { - var $container = mock$JQueryElement({ - scrollLeft: 10 - }); - var containerScrollParent = mockContainerScrollParent($container); - containerScrollParent.scrollToY(10); - expect($container.get(0).scrollTop).toBe(10); - }); -}); \ No newline at end of file diff --git a/lib/tree.jquery.js b/lib/tree.jquery.js index 7e6b9a5e..e4809ef4 100644 --- a/lib/tree.jquery.js +++ b/lib/tree.jquery.js @@ -16,7 +16,8 @@ var _selectNodeHandler = _interopRequireDefault(require("./selectNodeHandler")); var _simple = _interopRequireDefault(require("./simple.widget")); var _node2 = require("./node"); var _util = require("./util"); -var _nodeElement = require("./nodeElement"); +var _nodeElement = _interopRequireDefault(require("./nodeElement")); +var _folderElement = _interopRequireDefault(require("./nodeElement/folderElement")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const NODE_PARAM_IS_EMPTY = "Node parameter is empty"; const PARAM_IS_EMPTY = "Parameter is empty: "; @@ -141,8 +142,12 @@ class JqTreeWidget extends _mouse.default { getNodesByProperty(key, value) { return this.tree.getNodesByProperty(key, value); } - getNodeByHtmlElement(element) { - return this.getNode(jQuery(element)); + getNodeByHtmlElement(inputElement) { + const element = inputElement instanceof HTMLElement ? inputElement : inputElement[0]; + if (!element) { + return null; + } + return this.getNode(element); } getNodeByCallback(callback) { return this.tree.getNodeByCallback(callback); @@ -176,7 +181,7 @@ class JqTreeWidget extends _mouse.default { } const slide = slideParam ?? this.options.slide; if (node.isFolder() || node.isEmptyFolder) { - new _nodeElement.FolderElement(node, this).close(slide, this.options.animationSpeed); + new _folderElement.default(node, this).close(slide, this.options.animationSpeed); this.saveState(); } return this.element; @@ -362,7 +367,7 @@ class JqTreeWidget extends _mouse.default { let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; let onFinished = arguments.length > 2 ? arguments[2] : undefined; const doOpenNode = (_node, _slide, _onFinished) => { - const folderElement = new _nodeElement.FolderElement(_node, this); + const folderElement = new _folderElement.default(_node, this); folderElement.open(_onFinished, _slide, this.options.animationSpeed); }; if (node.isFolder() || node.isEmptyFolder) { @@ -398,13 +403,13 @@ class JqTreeWidget extends _mouse.default { } _getNodeElementForNode(node) { if (node.isFolder()) { - return new _nodeElement.FolderElement(node, this); + return new _folderElement.default(node, this); } else { - return new _nodeElement.NodeElement(node, this); + return new _nodeElement.default(node, this); } } - _getNodeElement($element) { - const node = this.getNode($element); + _getNodeElement(element) { + const node = this.getNode(element); if (node) { return this._getNodeElementForNode(node); } else { @@ -412,7 +417,7 @@ class JqTreeWidget extends _mouse.default { } } _containsElement(element) { - const node = this.getNode(jQuery(element)); + const node = this.getNode(element); return node != null && node.tree === this.tree; } _getScrollLeft() { @@ -696,10 +701,9 @@ class JqTreeWidget extends _mouse.default { } }; getClickTarget(element) { - const $target = jQuery(element); - const $button = $target.closest(".jqtree-toggler"); - if ($button.length) { - const node = this.getNode($button); + const button = element.closest(".jqtree-toggler"); + if (button) { + const node = this.getNode(button); if (node) { return { type: "button", @@ -707,9 +711,9 @@ class JqTreeWidget extends _mouse.default { }; } } else { - const $el = $target.closest(".jqtree-element"); - if ($el.length) { - const node = this.getNode($el); + const jqTreeElement = element.closest(".jqtree-element"); + if (jqTreeElement) { + const node = this.getNode(jqTreeElement); if (node) { return { type: "label", @@ -720,18 +724,18 @@ class JqTreeWidget extends _mouse.default { } return null; } - getNode($element) { - const $li = $element.closest("li.jqtree_common"); - if ($li.length === 0) { - return null; + getNode(element) { + const liElement = element.closest("li.jqtree_common"); + if (liElement) { + return jQuery(liElement).data("node"); } else { - return $li.data("node"); + return null; } } handleContextmenu = e => { - const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element"); - if ($div.length) { - const node = this.getNode($div); + const div = e.target.closest("ul.jqtree-tree .jqtree-element"); + if (div) { + const node = this.getNode(div); if (node) { e.preventDefault(); e.stopPropagation(); diff --git a/lib/util.js b/lib/util.js index f04b5607..da328dc5 100644 --- a/lib/util.js +++ b/lib/util.js @@ -3,10 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.isInt = exports.isFunction = exports.getBoolString = void 0; +exports.isInt = exports.isFunction = exports.getOffsetTop = exports.getBoolString = void 0; const isInt = n => typeof n === "number" && n % 1 === 0; exports.isInt = isInt; const isFunction = v => typeof v === "function"; exports.isFunction = isFunction; const getBoolString = value => value ? "true" : "false"; -exports.getBoolString = getBoolString; \ No newline at end of file +exports.getBoolString = getBoolString; +const getOffsetTop = element => element.getBoundingClientRect().y + window.scrollY; +exports.getOffsetTop = getOffsetTop; \ No newline at end of file diff --git a/package.json b/package.json index f99a2c6c..51b407e9 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@testing-library/dom": "^9.3.3", + "@testing-library/user-event": "^14.5.1", "@types/debug": "^4.1.10", "@types/jest": "^29.5.6", "@types/jest-axe": "^3.5.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1b6b8df..1bbdbf43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,6 +37,9 @@ devDependencies: '@testing-library/dom': specifier: ^9.3.3 version: 9.3.3 + '@testing-library/user-event': + specifier: ^14.5.1 + version: 14.5.1(@testing-library/dom@9.3.3) '@types/debug': specifier: ^4.1.10 version: 4.1.10 @@ -1969,6 +1972,15 @@ packages: pretty-format: 27.5.1 dev: true + /@testing-library/user-event@14.5.1(@testing-library/dom@9.3.3): + resolution: {integrity: sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + dependencies: + '@testing-library/dom': 9.3.3 + dev: true + /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} diff --git a/src/dragAndDropHandler/dragElement.ts b/src/dragAndDropHandler/dragElement.ts new file mode 100644 index 00000000..9d2ea63b --- /dev/null +++ b/src/dragAndDropHandler/dragElement.ts @@ -0,0 +1,42 @@ +class DragElement { + private offsetX: number; + private offsetY: number; + private $element: JQuery; + + constructor( + nodeName: string, + offsetX: number, + offsetY: number, + $tree: JQuery, + autoEscape: boolean, + ) { + this.offsetX = offsetX; + this.offsetY = offsetY; + + this.$element = jQuery("").addClass( + "jqtree-title jqtree-dragging", + ); + + if (autoEscape) { + this.$element.text(nodeName); + } else { + this.$element.html(nodeName); + } + + this.$element.css("position", "absolute"); + $tree.append(this.$element); + } + + public move(pageX: number, pageY: number): void { + this.$element.offset({ + left: pageX - this.offsetX, + top: pageY - this.offsetY, + }); + } + + public remove(): void { + this.$element.remove(); + } +} + +export default DragElement; diff --git a/src/dragAndDropHandler/hitAreasGenerator.ts b/src/dragAndDropHandler/hitAreasGenerator.ts new file mode 100644 index 00000000..7a781989 --- /dev/null +++ b/src/dragAndDropHandler/hitAreasGenerator.ts @@ -0,0 +1,175 @@ +import { HitArea } from "../types"; +import { Node, Position } from "../node"; +import { getOffsetTop } from "../util"; +import VisibleNodeIterator from "./visibleNodeIterator"; + +class HitAreasGenerator extends VisibleNodeIterator { + private currentNode: Node; + private treeBottom: number; + private positions: HitArea[]; + private lastTop: number; + + constructor(tree: Node, currentNode: Node, treeBottom: number) { + super(tree); + + this.currentNode = currentNode; + this.treeBottom = treeBottom; + } + + public generate(): HitArea[] { + this.positions = []; + this.lastTop = 0; + + this.iterate(); + + return this.generateHitAreas(this.positions); + } + + protected generateHitAreas(positions: HitArea[]): HitArea[] { + let previousTop = positions[0]?.top ?? 0; + let group = []; + const hitAreas: HitArea[] = []; + + for (const position of positions) { + if (position.top !== previousTop && group.length) { + this.generateHitAreasForGroup( + hitAreas, + group, + previousTop, + position.top, + ); + + previousTop = position.top; + group = []; + } + + group.push(position); + } + + this.generateHitAreasForGroup( + hitAreas, + group, + previousTop, + this.treeBottom, + ); + + return hitAreas; + } + + protected handleOpenFolder(node: Node, element: HTMLElement): boolean { + if (node === this.currentNode) { + // Cannot move inside current item + // Stop iterating + return false; + } + + // Cannot move before current item + if (node.children[0] !== this.currentNode) { + this.addPosition(node, Position.Inside, getOffsetTop(element)); + } + + // Continue iterating + return true; + } + + protected handleClosedFolder( + node: Node, + nextNode: Node, + element: HTMLElement, + ): void { + const top = getOffsetTop(element); + + if (node === this.currentNode) { + // Cannot move after current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.Inside, top); + + // Cannot move before current item + if (nextNode !== this.currentNode) { + this.addPosition(node, Position.After, top); + } + } + } + + protected handleFirstNode(node: Node): void { + if (node !== this.currentNode) { + this.addPosition(node, Position.Before, getOffsetTop(node.element)); + } + } + + protected handleAfterOpenFolder(node: Node, nextNode: Node): void { + if (node === this.currentNode || nextNode === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, Position.None, this.lastTop); + } else { + this.addPosition(node, Position.After, this.lastTop); + } + } + + protected handleNode( + node: Node, + nextNode: Node, + element: HTMLElement, + ): void { + const top = getOffsetTop(element); + + if (node === this.currentNode) { + // Cannot move inside current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.Inside, top); + } + + if (nextNode === this.currentNode || node === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.After, top); + } + } + + private addPosition(node: Node, position: number, top: number): void { + const area = { + top, + bottom: 0, + node, + position, + }; + + this.positions.push(area); + this.lastTop = top; + } + + private generateHitAreasForGroup( + hitAreas: HitArea[], + positionsInGroup: HitArea[], + top: number, + bottom: number, + ): void { + // limit positions in group + const positionCount = Math.min(positionsInGroup.length, 4); + + const areaHeight = Math.round((bottom - top) / positionCount); + let areaTop = top; + + let i = 0; + while (i < positionCount) { + const position = positionsInGroup[i]; + + if (position) { + hitAreas.push({ + top: areaTop, + bottom: areaTop + areaHeight, + node: position.node, + position: position.position, + }); + } + + areaTop += areaHeight; + i += 1; + } + } +} + +export default HitAreasGenerator; diff --git a/src/dragAndDropHandler.ts b/src/dragAndDropHandler/index.ts similarity index 51% rename from src/dragAndDropHandler.ts rename to src/dragAndDropHandler/index.ts index 4b29c448..a4cf46e5 100644 --- a/src/dragAndDropHandler.ts +++ b/src/dragAndDropHandler/index.ts @@ -1,7 +1,9 @@ -import { getPositionName, Node, Position } from "./node"; -import { DropHint, HitArea, PositionInfo } from "./types"; -import { NodeElement } from "./nodeElement"; -import { JqTreeWidget } from "./tree.jquery"; +import { getPositionName, Node, Position } from "../node"; +import { DropHint, HitArea, PositionInfo } from "../types"; +import NodeElement from "../nodeElement"; +import { JqTreeWidget } from "../tree.jquery"; +import DragElement from "./dragElement"; +import HitAreasGenerator from "./hitAreasGenerator"; interface Dimensions { left: number; @@ -31,20 +33,20 @@ export class DragAndDropHandler { } public mouseCapture(positionInfo: PositionInfo): boolean | null { - const $element = jQuery(positionInfo.target); + const element = positionInfo.target; - if (!this.mustCaptureElement($element)) { + if (!this.mustCaptureElement(element)) { return null; } if ( this.treeWidget.options.onIsMoveHandle && - !this.treeWidget.options.onIsMoveHandle($element) + !this.treeWidget.options.onIsMoveHandle(jQuery(element)) ) { return null; } - let nodeElement = this.treeWidget._getNodeElement($element); + let nodeElement = this.treeWidget._getNodeElement(element); if (nodeElement && this.treeWidget.options.onCanMove) { if (!this.treeWidget.options.onCanMove(nodeElement.node)) { @@ -82,7 +84,7 @@ export class DragAndDropHandler { ); this.isDragging = true; - this.currentItem.$element.addClass("jqtree-moving"); + this.currentItem.element.classList.add("jqtree-moving"); return true; } @@ -149,7 +151,7 @@ export class DragAndDropHandler { const currentItem = this.currentItem; if (this.currentItem) { - this.currentItem.$element.removeClass("jqtree-moving"); + this.currentItem.element.classList.remove("jqtree-moving"); this.currentItem = null; } @@ -178,7 +180,7 @@ export class DragAndDropHandler { ); if (this.isDragging) { - this.currentItem.$element.addClass("jqtree-moving"); + this.currentItem.element.classList.add("jqtree-moving"); } } } @@ -196,8 +198,14 @@ export class DragAndDropHandler { } } - private mustCaptureElement($element: JQuery): boolean { - return !$element.is("input,select,textarea"); + private mustCaptureElement(element: HTMLElement): boolean { + const nodeName = element.nodeName; + + return ( + nodeName !== "INPUT" && + nodeName !== "SELECT" && + nodeName !== "TEXTAREA" + ); } private canMoveToArea(area: HitArea): boolean { @@ -390,324 +398,3 @@ export class DragAndDropHandler { } } } - -abstract class VisibleNodeIterator { - private tree: Node; - - constructor(tree: Node) { - this.tree = tree; - } - - protected iterate(): void { - let isFirstNode = true; - - const _iterateNode = (node: Node, nextNode: Node | null): void => { - let mustIterateInside = - (node.is_open || !node.element) && node.hasChildren(); - - let $element: JQuery | null = null; - - if (node.element) { - $element = jQuery(node.element); - - if (!$element.is(":visible")) { - return; - } - - if (isFirstNode) { - this.handleFirstNode(node); - isFirstNode = false; - } - - if (!node.hasChildren()) { - this.handleNode(node, nextNode, $element); - } else if (node.is_open) { - if (!this.handleOpenFolder(node, $element)) { - mustIterateInside = false; - } - } else { - this.handleClosedFolder(node, nextNode, $element); - } - } - - if (mustIterateInside) { - const childrenLength = node.children.length; - node.children.forEach((_, i) => { - const child = node.children[i]; - - if (child) { - if (i === childrenLength - 1) { - _iterateNode(child, null); - } else { - const nextChild = node.children[i + 1]; - - if (nextChild) { - _iterateNode(child, nextChild); - } - } - } - }); - - if (node.is_open && $element) { - this.handleAfterOpenFolder(node, nextNode); - } - } - }; - - _iterateNode(this.tree, null); - } - - protected abstract handleNode( - node: Node, - nextNode: Node | null, - $element: JQuery, - ): void; - - /* - override - return - - true: continue iterating - - false: stop iterating - */ - protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean; - - protected abstract handleClosedFolder( - node: Node, - nextNode: Node | null, - $element: JQuery, - ): void; - - protected abstract handleAfterOpenFolder( - node: Node, - nextNode: Node | null, - ): void; - - protected abstract handleFirstNode(node: Node): void; -} - -export class HitAreasGenerator extends VisibleNodeIterator { - private currentNode: Node; - private treeBottom: number; - private positions: HitArea[]; - private lastTop: number; - - constructor(tree: Node, currentNode: Node, treeBottom: number) { - super(tree); - - this.currentNode = currentNode; - this.treeBottom = treeBottom; - } - - public generate(): HitArea[] { - this.positions = []; - this.lastTop = 0; - - this.iterate(); - - return this.generateHitAreas(this.positions); - } - - protected generateHitAreas(positions: HitArea[]): HitArea[] { - let previousTop = positions[0]?.top ?? 0; - let group = []; - const hitAreas: HitArea[] = []; - - for (const position of positions) { - if (position.top !== previousTop && group.length) { - this.generateHitAreasForGroup( - hitAreas, - group, - previousTop, - position.top, - ); - - previousTop = position.top; - group = []; - } - - group.push(position); - } - - this.generateHitAreasForGroup( - hitAreas, - group, - previousTop, - this.treeBottom, - ); - - return hitAreas; - } - - protected handleOpenFolder(node: Node, $element: JQuery): boolean { - if (node === this.currentNode) { - // Cannot move inside current item - - // Dnd over the current element is not possible: add a position with type None for the top and the bottom. - const top = this.getTop($element); - const height = $element.height() || 0; - this.addPosition(node, Position.None, top); - - if (height > 5) { - // Subtract 5 pixels to allow more space for the next element. - this.addPosition(node, Position.None, top + height - 5); - } - - // Stop iterating - return false; - } - - // Cannot move before current item - if (node.children[0] !== this.currentNode) { - this.addPosition(node, Position.Inside, this.getTop($element)); - } - - // Continue iterating - return true; - } - - protected handleClosedFolder( - node: Node, - nextNode: Node, - $element: JQuery, - ): void { - const top = this.getTop($element); - - if (node === this.currentNode) { - // Cannot move after current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.Inside, top); - - // Cannot move before current item - if (nextNode !== this.currentNode) { - this.addPosition(node, Position.After, top); - } - } - } - - protected handleFirstNode(node: Node): void { - if (node !== this.currentNode) { - this.addPosition( - node, - Position.Before, - this.getTop(jQuery(node.element)), - ); - } - } - - protected handleAfterOpenFolder(node: Node, nextNode: Node): void { - if (node === this.currentNode || nextNode === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, Position.None, this.lastTop); - } else { - this.addPosition(node, Position.After, this.lastTop); - } - } - - protected handleNode(node: Node, nextNode: Node, $element: JQuery): void { - const top = this.getTop($element); - - if (node === this.currentNode) { - // Cannot move inside current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.Inside, top); - } - - if (nextNode === this.currentNode || node === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.After, top); - } - } - - private getTop($element: JQuery): number { - const offset = $element.offset(); - - return offset ? offset.top : 0; - } - - private addPosition(node: Node, position: number, top: number): void { - const area = { - top, - bottom: 0, - node, - position, - }; - - this.positions.push(area); - this.lastTop = top; - } - - private generateHitAreasForGroup( - hitAreas: HitArea[], - positionsInGroup: HitArea[], - top: number, - bottom: number, - ): void { - // limit positions in group - const positionCount = Math.min(positionsInGroup.length, 4); - - const areaHeight = Math.round((bottom - top) / positionCount); - let areaTop = top; - - let i = 0; - while (i < positionCount) { - const position = positionsInGroup[i]; - - if (position && position.position !== Position.None) { - hitAreas.push({ - top: areaTop, - bottom: areaTop + areaHeight, - node: position.node, - position: position.position, - }); - } - - areaTop += areaHeight; - i += 1; - } - } -} - -class DragElement { - private offsetX: number; - private offsetY: number; - private $element: JQuery; - - constructor( - nodeName: string, - offsetX: number, - offsetY: number, - $tree: JQuery, - autoEscape: boolean, - ) { - this.offsetX = offsetX; - this.offsetY = offsetY; - - this.$element = jQuery("").addClass( - "jqtree-title jqtree-dragging", - ); - - if (autoEscape) { - this.$element.text(nodeName); - } else { - this.$element.html(nodeName); - } - - this.$element.css("position", "absolute"); - $tree.append(this.$element); - } - - public move(pageX: number, pageY: number): void { - this.$element.offset({ - left: pageX - this.offsetX, - top: pageY - this.offsetY, - }); - } - - public remove(): void { - this.$element.remove(); - } -} diff --git a/src/dragAndDropHandler/visibleNodeIterator.ts b/src/dragAndDropHandler/visibleNodeIterator.ts new file mode 100644 index 00000000..c9c4a3a1 --- /dev/null +++ b/src/dragAndDropHandler/visibleNodeIterator.ts @@ -0,0 +1,97 @@ +import { Node } from "../node"; + +abstract class VisibleNodeIterator { + private tree: Node; + + constructor(tree: Node) { + this.tree = tree; + } + + protected iterate(): void { + let isFirstNode = true; + + const _iterateNode = (node: Node, nextNode: Node | null): void => { + let mustIterateInside = + (node.is_open || !node.element) && node.hasChildren(); + + let element: HTMLElement | null = null; + + // Is the element visible? + if (node.element?.offsetParent) { + element = node.element; + + if (isFirstNode) { + this.handleFirstNode(node); + isFirstNode = false; + } + + if (!node.hasChildren()) { + this.handleNode(node, nextNode, node.element); + } else if (node.is_open) { + if (!this.handleOpenFolder(node, node.element)) { + mustIterateInside = false; + } + } else { + this.handleClosedFolder(node, nextNode, element); + } + } + + if (mustIterateInside) { + const childrenLength = node.children.length; + node.children.forEach((_, i) => { + const child = node.children[i]; + + if (child) { + if (i === childrenLength - 1) { + _iterateNode(child, null); + } else { + const nextChild = node.children[i + 1]; + + if (nextChild) { + _iterateNode(child, nextChild); + } + } + } + }); + + if (node.is_open && element) { + this.handleAfterOpenFolder(node, nextNode); + } + } + }; + + _iterateNode(this.tree, null); + } + + protected abstract handleNode( + node: Node, + nextNode: Node | null, + element: HTMLElement, + ): void; + + /* + override + return + - true: continue iterating + - false: stop iterating + */ + protected abstract handleOpenFolder( + node: Node, + element: HTMLElement, + ): boolean; + + protected abstract handleClosedFolder( + node: Node, + nextNode: Node | null, + element: HTMLElement, + ): void; + + protected abstract handleAfterOpenFolder( + node: Node, + nextNode: Node | null, + ): void; + + protected abstract handleFirstNode(node: Node): void; +} + +export default VisibleNodeIterator; diff --git a/src/elementsRenderer.ts b/src/elementsRenderer.ts index cf390843..b2b999d2 100644 --- a/src/elementsRenderer.ts +++ b/src/elementsRenderer.ts @@ -325,6 +325,10 @@ export default class ElementsRenderer { div.innerHTML = value; return document.createTextNode(div.innerHTML); + } else if (value == null) { + return undefined; + } else if ((value as HTMLElement).nodeType) { + return value as HTMLElement; } else { return jQuery(value)[0]; } diff --git a/src/jqtreeOptions.ts b/src/jqtreeOptions.ts index 78456e8e..032e678f 100644 --- a/src/jqtreeOptions.ts +++ b/src/jqtreeOptions.ts @@ -47,6 +47,6 @@ export interface JQTreeOptions { showEmptyFolder: boolean; slide: boolean; startDndDelay: number; - tabIndex: number; + tabIndex: number | undefined; useContextMenu: boolean; } diff --git a/src/keyHandler.ts b/src/keyHandler.ts index 8f2d5497..4e8ee323 100644 --- a/src/keyHandler.ts +++ b/src/keyHandler.ts @@ -1,24 +1,26 @@ import { Node } from "./node"; import { JqTreeWidget } from "./tree.jquery"; -export default class KeyHandler { - private static LEFT = 37; - private static UP = 38; - private static RIGHT = 39; - private static DOWN = 40; +type KeyboardEventHandler = (event: KeyboardEvent) => boolean; +export default class KeyHandler { private treeWidget: JqTreeWidget; + private handleKeyDownHandler: KeyboardEventHandler | null = null; constructor(treeWidget: JqTreeWidget) { this.treeWidget = treeWidget; if (treeWidget.options.keyboardSupport) { - jQuery(document).on("keydown.jqtree", this.handleKeyDown); + this.handleKeyDownHandler = this.handleKeyDown.bind(this); + + document.addEventListener("keydown", this.handleKeyDownHandler); } } public deinit(): void { - jQuery(document).off("keydown.jqtree"); + if (this.handleKeyDownHandler) { + document.removeEventListener("keydown", this.handleKeyDownHandler); + } } public moveDown(selectedNode: Node): boolean { @@ -66,7 +68,7 @@ export default class KeyHandler { } } - private handleKeyDown = (e: JQuery.Event): boolean => { + private handleKeyDown = (e: KeyboardEvent): boolean => { if (!this.canHandleKeyboard()) { return true; } @@ -76,19 +78,17 @@ export default class KeyHandler { return true; } - const key = e.which; - - switch (key) { - case KeyHandler.DOWN: + switch (e.key) { + case "ArrowDown": return this.moveDown(selectedNode); - case KeyHandler.UP: + case "ArrowUp": return this.moveUp(selectedNode); - case KeyHandler.RIGHT: + case "ArrowRight": return this.moveRight(selectedNode); - case KeyHandler.LEFT: + case "ArrowLeft": return this.moveLeft(selectedNode); default: diff --git a/src/nodeElement.ts b/src/nodeElement.ts deleted file mode 100644 index 36d2a007..00000000 --- a/src/nodeElement.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { Position, Node } from "./node"; -import { JqTreeWidget } from "./tree.jquery"; -import { DropHint } from "./types"; - -export type OnFinishOpenNode = (node: Node) => void; - -export class NodeElement { - public node: Node; - public $element: JQuery; - protected treeWidget: JqTreeWidget; - - constructor(node: Node, treeWidget: JqTreeWidget) { - this.init(node, treeWidget); - } - - public init(node: Node, treeWidget: JqTreeWidget): void { - this.node = node; - this.treeWidget = treeWidget; - - if (!node.element) { - const element = this.treeWidget.element.get(0); - - if (element) { - node.element = element; - } - } - - if (node.element) { - this.$element = jQuery(node.element); - } - } - - public addDropHint(position: number): DropHint { - if (this.mustShowBorderDropHint(position)) { - return new BorderDropHint( - this.$element, - this.treeWidget._getScrollLeft(), - ); - } else { - return new GhostDropHint(this.node, this.$element, position); - } - } - - public select(mustSetFocus: boolean): void { - const $li = this.getLi(); - - $li.addClass("jqtree-selected"); - - const $span = this.getSpan(); - $span.attr("tabindex", this.treeWidget.options.tabIndex ?? null); - $span.attr("aria-selected", "true"); - - if (mustSetFocus) { - $span.trigger("focus"); - } - } - - public deselect(): void { - const $li = this.getLi(); - - $li.removeClass("jqtree-selected"); - - const $span = this.getSpan(); - $span.removeAttr("tabindex"); - $span.attr("aria-selected", "false"); - - $span.trigger("blur"); - } - - protected getUl(): JQuery { - return this.$element.children("ul:first"); - } - - protected getSpan(): JQuery { - return this.$element - .children(".jqtree-element") - .find("span.jqtree-title"); - } - - protected getLi(): JQuery { - return this.$element; - } - - protected mustShowBorderDropHint(position: Position): boolean { - return position === Position.Inside; - } -} - -export class FolderElement extends NodeElement { - public open( - onFinished: OnFinishOpenNode | null, - slide = true, - animationSpeed: JQuery.Duration = "fast", - ): void { - if (this.node.is_open) { - return; - } - - this.node.is_open = true; - - const $button = this.getButton(); - $button.removeClass("jqtree-closed"); - $button.html(""); - - const buttonEl = $button.get(0); - - if (buttonEl) { - const openedIconElement = - this.treeWidget.renderer.openedIconElement; - - if (openedIconElement) { - const icon = openedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } - } - - const doOpen = (): void => { - const $li = this.getLi(); - $li.removeClass("jqtree-closed"); - - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "true"); - - if (onFinished) { - onFinished(this.node); - } - - this.treeWidget._triggerEvent("tree.open", { - node: this.node, - }); - }; - - if (slide) { - this.getUl().slideDown(animationSpeed, doOpen); - } else { - this.getUl().show(); - doOpen(); - } - } - - public close( - slide = true, - animationSpeed: JQuery.Duration | undefined = "fast", - ): void { - if (!this.node.is_open) { - return; - } - - this.node.is_open = false; - - const $button = this.getButton(); - $button.addClass("jqtree-closed"); - $button.html(""); - - const buttonEl = $button.get(0); - - if (buttonEl) { - const closedIconElement = - this.treeWidget.renderer.closedIconElement; - - if (closedIconElement) { - const icon = closedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } - } - - const doClose = (): void => { - const $li = this.getLi(); - $li.addClass("jqtree-closed"); - - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "false"); - - this.treeWidget._triggerEvent("tree.close", { - node: this.node, - }); - }; - - if (slide) { - this.getUl().slideUp(animationSpeed, doClose); - } else { - this.getUl().hide(); - doClose(); - } - } - - protected mustShowBorderDropHint(position: Position): boolean { - return !this.node.is_open && position === Position.Inside; - } - - private getButton(): JQuery { - return this.$element - .children(".jqtree-element") - .find("a.jqtree-toggler"); - } -} - -export class BorderDropHint implements DropHint { - private $hint: JQuery; - - constructor($element: JQuery, scrollLeft: number) { - const $div = $element.children(".jqtree-element"); - - const elWidth = $element.width() || 0; - const width = Math.max(elWidth + scrollLeft - 4, 0); - - const elHeight = $div.outerHeight() || 0; - const height = Math.max(elHeight - 4, 0); - - this.$hint = jQuery(''); - $div.append(this.$hint); - - this.$hint.css({ width, height }); - } - - public remove(): void { - this.$hint.remove(); - } -} - -class GhostDropHint implements DropHint { - private $element: JQuery; - private node: Node; - private $ghost: JQuery; - - constructor(node: Node, $element: JQuery, position: Position) { - this.$element = $element; - - this.node = node; - this.$ghost = jQuery( - `
  • -
  • `, - ); - - if (position === Position.After) { - this.moveAfter(); - } else if (position === Position.Before) { - this.moveBefore(); - } else if (position === Position.Inside) { - if (node.isFolder() && node.is_open) { - this.moveInsideOpenFolder(); - } else { - this.moveInside(); - } - } - } - - public remove(): void { - this.$ghost.remove(); - } - - public moveAfter(): void { - this.$element.after(this.$ghost); - } - - public moveBefore(): void { - this.$element.before(this.$ghost); - } - - public moveInsideOpenFolder(): void { - const childElement = this.node.children[0]?.element; - - if (childElement) { - jQuery(childElement).before(this.$ghost); - } - } - - public moveInside(): void { - this.$element.after(this.$ghost); - this.$ghost.addClass("jqtree-inside"); - } -} diff --git a/src/nodeElement/borderDropHint.ts b/src/nodeElement/borderDropHint.ts new file mode 100644 index 00000000..f27964af --- /dev/null +++ b/src/nodeElement/borderDropHint.ts @@ -0,0 +1,32 @@ +import { DropHint } from "..//types"; + +class BorderDropHint implements DropHint { + private hint?: HTMLElement; + + constructor(element: HTMLElement, scrollLeft: number) { + const div = element.querySelector(":scope > .jqtree-element"); + + if (!div) { + this.hint = undefined; + return; + } + + const width = Math.max(element.offsetWidth + scrollLeft - 4, 0); + const height = Math.max(element.clientHeight - 4, 0); + + const hint = document.createElement("span"); + hint.className = "jqtree-border"; + hint.style.width = `${width}px`; + hint.style.height = `${height}px`; + + this.hint = hint; + + div.append(this.hint); + } + + public remove(): void { + this.hint?.remove(); + } +} + +export default BorderDropHint; diff --git a/src/nodeElement/folderElement.ts b/src/nodeElement/folderElement.ts new file mode 100644 index 00000000..26f1eb7b --- /dev/null +++ b/src/nodeElement/folderElement.ts @@ -0,0 +1,103 @@ +import { Position, Node } from "../node"; +import NodeElement from "./index"; + +export type OnFinishOpenNode = (node: Node) => void; + +class FolderElement extends NodeElement { + public open( + onFinished: OnFinishOpenNode | null, + slide = true, + animationSpeed: JQuery.Duration = "fast", + ): void { + if (this.node.is_open) { + return; + } + + this.node.is_open = true; + + const button = this.getButton(); + button.classList.remove("jqtree-closed"); + button.innerHTML = ""; + + const openedIconElement = this.treeWidget.renderer.openedIconElement; + + if (openedIconElement) { + const icon = openedIconElement.cloneNode(true); + button.appendChild(icon); + } + + const doOpen = (): void => { + this.element.classList.remove("jqtree-closed"); + + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "true"); + + if (onFinished) { + onFinished(this.node); + } + + this.treeWidget._triggerEvent("tree.open", { + node: this.node, + }); + }; + + if (slide) { + jQuery(this.getUl()).slideDown(animationSpeed, doOpen); + } else { + jQuery(this.getUl()).show(); + doOpen(); + } + } + + public close( + slide = true, + animationSpeed: JQuery.Duration | undefined = "fast", + ): void { + if (!this.node.is_open) { + return; + } + + this.node.is_open = false; + + const button = this.getButton(); + button.classList.add("jqtree-closed"); + button.innerHTML = ""; + + const closedIconElement = this.treeWidget.renderer.closedIconElement; + + if (closedIconElement) { + const icon = closedIconElement.cloneNode(true); + button.appendChild(icon); + } + + const doClose = (): void => { + this.element.classList.add("jqtree-closed"); + + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "false"); + + this.treeWidget._triggerEvent("tree.close", { + node: this.node, + }); + }; + + if (slide) { + jQuery(this.getUl()).slideUp(animationSpeed, doClose); + } else { + jQuery(this.getUl()).hide(); + doClose(); + } + } + + protected mustShowBorderDropHint(position: Position): boolean { + return !this.node.is_open && position === Position.Inside; + } + + private getButton(): HTMLLinkElement { + return this.element.querySelector( + ":scope > .jqtree-element > a.jqtree-toggler", + ) as HTMLLinkElement; + } +} + +export default FolderElement; diff --git a/src/nodeElement/ghostDropHint.ts b/src/nodeElement/ghostDropHint.ts new file mode 100644 index 00000000..aeac5dfe --- /dev/null +++ b/src/nodeElement/ghostDropHint.ts @@ -0,0 +1,68 @@ +import { Position, Node } from "../node"; +import { DropHint } from "../types"; + +class GhostDropHint implements DropHint { + private element: HTMLElement; + private node: Node; + private ghost: HTMLElement; + + constructor(node: Node, element: HTMLElement, position: Position) { + this.element = element; + this.node = node; + this.ghost = this.createGhostElement(); + + if (position === Position.After) { + this.moveAfter(); + } else if (position === Position.Before) { + this.moveBefore(); + } else if (position === Position.Inside) { + if (node.isFolder() && node.is_open) { + this.moveInsideOpenFolder(); + } else { + this.moveInside(); + } + } + } + + public remove(): void { + this.ghost.remove(); + } + + private moveAfter(): void { + this.element.after(this.ghost); + } + + private moveBefore(): void { + this.element.before(this.ghost); + } + + private moveInsideOpenFolder(): void { + const childElement = this.node.children[0]?.element; + + if (childElement) { + childElement.before(this.ghost); + } + } + + private moveInside(): void { + this.element.after(this.ghost); + this.ghost.classList.add("jqtree-inside"); + } + + private createGhostElement() { + const ghost = document.createElement("li"); + ghost.className = "jqtree_common jqtree-ghost"; + + const circleSpan = document.createElement("span"); + circleSpan.className = "jqtree_common jqtree-circle"; + ghost.append(circleSpan); + + const lineSpan = document.createElement("span"); + lineSpan.className = "jqtree_common jqtree-line"; + ghost.append(lineSpan); + + return ghost; + } +} + +export default GhostDropHint; diff --git a/src/nodeElement/index.ts b/src/nodeElement/index.ts new file mode 100644 index 00000000..49dff7f2 --- /dev/null +++ b/src/nodeElement/index.ts @@ -0,0 +1,87 @@ +import { Position, Node } from "../node"; +import { JqTreeWidget } from "../tree.jquery"; +import { DropHint } from "../types"; +import BorderDropHint from "./borderDropHint"; +import GhostDropHint from "./ghostDropHint"; + +class NodeElement { + public node: Node; + public element: HTMLElement; + protected treeWidget: JqTreeWidget; + + constructor(node: Node, treeWidget: JqTreeWidget) { + this.init(node, treeWidget); + } + + public init(node: Node, treeWidget: JqTreeWidget): void { + this.node = node; + this.treeWidget = treeWidget; + + if (!node.element) { + const element = this.treeWidget.element.get(0); + + if (element) { + node.element = element; + } + } + + if (node.element) { + this.element = node.element; + } + } + + public addDropHint(position: number): DropHint { + if (this.mustShowBorderDropHint(position)) { + return new BorderDropHint( + this.element, + this.treeWidget._getScrollLeft(), + ); + } else { + return new GhostDropHint(this.node, this.element, position); + } + } + + public select(mustSetFocus: boolean): void { + this.element.classList.add("jqtree-selected"); + + const titleSpan = this.getTitleSpan(); + const tabIndex = this.treeWidget.options.tabIndex; + + // Check for null or undefined + if (tabIndex != null) { + titleSpan.setAttribute("tabindex", tabIndex.toString()); + } + + titleSpan.setAttribute("aria-selected", "true"); + + if (mustSetFocus) { + titleSpan.focus(); + } + } + + public deselect(): void { + this.element.classList.remove("jqtree-selected"); + + const titleSpan = this.getTitleSpan(); + titleSpan.removeAttribute("tabindex"); + titleSpan.setAttribute("aria-selected", "false"); + + titleSpan.blur(); + } + + protected getUl(): HTMLUListElement { + return this.element.querySelector(":scope > ul") as HTMLUListElement; + } + + protected getTitleSpan(): HTMLSpanElement { + return this.element.querySelector( + ":scope > .jqtree-element > span.jqtree-title", + ) as HTMLSpanElement; + } + + protected mustShowBorderDropHint(position: Position): boolean { + return position === Position.Inside; + } +} + +export default NodeElement; diff --git a/src/test/jqTree/keyboard.test.ts b/src/test/jqTree/keyboard.test.ts index 171575eb..af57870d 100644 --- a/src/test/jqTree/keyboard.test.ts +++ b/src/test/jqTree/keyboard.test.ts @@ -1,4 +1,5 @@ import getGiven from "givens"; +import { userEvent } from "@testing-library/user-event"; import "../../tree.jquery"; import exampleData from "../support/exampleData"; @@ -18,22 +19,16 @@ describe("keyboard support", () => { interface Vars { autoOpen: boolean; initialSelectedNode: INode | null; - pressedKey: number; + pressedKey: string; $tree: JQuery; } - const KEY_DOWN = 40; - const KEY_LEFT = 37; - const KEY_RIGHT = 39; - const KEY_UP = 38; - const KEY_PAGE_UP = 33; - const given = getGiven(); given("autoOpen", () => false); given("initialSelectedNode", () => null); given("$tree", () => $("#tree1")); - beforeEach(() => { + beforeEach(async () => { given.$tree.tree({ animationSpeed: 0, autoOpen: given.autoOpen, @@ -44,15 +39,15 @@ describe("keyboard support", () => { given.$tree.tree("selectNode", given.initialSelectedNode); } - given.$tree.trigger($.Event("keydown", { which: given.pressedKey })); + await userEvent.keyboard(`{${given.pressedKey}}`); }); context("with key down", () => { - given("pressedKey", () => KEY_DOWN); + given("pressedKey", () => "ArrowDown"); context("when a node is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node1") + given.$tree.tree("getNodeByNameMustExist", "node1"), ); it("selects the next node", () => { @@ -71,7 +66,7 @@ describe("keyboard support", () => { context("when the last node is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node2") + given.$tree.tree("getNodeByNameMustExist", "node2"), ); it("keeps the node selected", () => { @@ -83,11 +78,11 @@ describe("keyboard support", () => { }); context("with key up", () => { - given("pressedKey", () => KEY_UP); + given("pressedKey", () => "ArrowUp"); context("when a node is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node2") + given.$tree.tree("getNodeByNameMustExist", "node2"), ); it("selects the next node", () => { @@ -106,11 +101,11 @@ describe("keyboard support", () => { }); context("with key right", () => { - given("pressedKey", () => KEY_RIGHT); + given("pressedKey", () => "ArrowRight"); context("when a closed folder is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node1") + given.$tree.tree("getNodeByNameMustExist", "node1"), ); it("opens the folder", () => { @@ -132,7 +127,7 @@ describe("keyboard support", () => { context("when an open folder is selected", () => { given("autoOpen", () => true); given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node1") + given.$tree.tree("getNodeByNameMustExist", "node1"), ); it("selects the first child", () => { @@ -168,7 +163,7 @@ describe("keyboard support", () => { context("when a child is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "child1") + given.$tree.tree("getNodeByNameMustExist", "child1"), ); it("does nothing", () => { @@ -179,11 +174,11 @@ describe("keyboard support", () => { }); }); context("with key left", () => { - given("pressedKey", () => KEY_LEFT); + given("pressedKey", () => "ArrowLeft"); context("when a closed folder is selected", () => { given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node3") + given.$tree.tree("getNodeByNameMustExist", "node3"), ); it("selects the previous node", () => { @@ -210,7 +205,7 @@ describe("keyboard support", () => { context("when an open folder is selected", () => { given("autoOpen", () => true); given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "node2") + given.$tree.tree("getNodeByNameMustExist", "node2"), ); it("closes the folder", () => { @@ -237,10 +232,10 @@ describe("keyboard support", () => { }); context("with page up key", () => { - given("pressedKey", () => KEY_PAGE_UP); + given("pressedKey", () => "PageUp"); given("initialSelectedNode", () => - given.$tree.tree("getNodeByNameMustExist", "child1") + given.$tree.tree("getNodeByNameMustExist", "child1"), ); it("does nothing", () => { diff --git a/src/test/jqTree/options.test.ts b/src/test/jqTree/options.test.ts index 55d67bc4..c1a88aa6 100644 --- a/src/test/jqTree/options.test.ts +++ b/src/test/jqTree/options.test.ts @@ -199,19 +199,30 @@ describe("closedIcon", () => { }); it("renders a html element", () => { - const closedIcon = document.createElement("span"); - closedIcon.className = "abc"; - closedIcon.textContent = "test"; + const icon = document.createElement("span"); + icon.className = "abc"; + icon.textContent = "test"; const $tree = $("#tree1"); $tree.tree({ - closedIcon, + closedIcon: icon, data: exampleData, }); const $span = $tree.find("a.jqtree-toggler:first span.abc"); expect($span.text()).toBe("test"); }); + + it("renders a default when the option is empty", () => { + const $tree = $("#tree1"); + $tree.tree({ + closedIcon: undefined, + data: exampleData, + }); + + const $span = $tree.find("a.jqtree-toggler:first"); + expect($span.text()).toBe("►"); + }); }); describe("dataUrl", () => { diff --git a/src/tree.jquery.ts b/src/tree.jquery.ts index 06e1165c..607e742b 100644 --- a/src/tree.jquery.ts +++ b/src/tree.jquery.ts @@ -11,7 +11,9 @@ import SelectNodeHandler from "./selectNodeHandler"; import SimpleWidget from "./simple.widget"; import { Node, getPosition } from "./node"; import { isFunction } from "./util"; -import { FolderElement, NodeElement, OnFinishOpenNode } from "./nodeElement"; +import NodeElement from "./nodeElement"; +import FolderElement, { OnFinishOpenNode } from "./nodeElement/folderElement"; + import { JQTreeOptions } from "./jqtreeOptions"; interface ClickTarget { @@ -185,9 +187,18 @@ export class JqTreeWidget extends MouseWidget { } public getNodeByHtmlElement( - element: HTMLElement | JQuery, + inputElement: HTMLElement | JQuery, ): Node | null { - return this.getNode(jQuery(element)); + const element = + inputElement instanceof HTMLElement + ? inputElement + : inputElement[0]; + + if (!element) { + return null; + } + + return this.getNode(element); } public getNodeByCallback(callback: (node: Node) => boolean): Node | null { @@ -576,8 +587,8 @@ export class JqTreeWidget extends MouseWidget { } } - public _getNodeElement($element: JQuery): NodeElement | null { - const node = this.getNode($element); + public _getNodeElement(element: HTMLElement): NodeElement | null { + const node = this.getNode(element); if (node) { return this._getNodeElementForNode(node); } else { @@ -586,7 +597,7 @@ export class JqTreeWidget extends MouseWidget { } public _containsElement(element: HTMLElement): boolean { - const node = this.getNode(jQuery(element)); + const node = this.getNode(element); return node != null && node.tree === this.tree; } @@ -938,13 +949,11 @@ export class JqTreeWidget extends MouseWidget { } }; - private getClickTarget(element: EventTarget): ClickTarget | null { - const $target = jQuery(element); - - const $button = $target.closest(".jqtree-toggler"); + private getClickTarget(element: HTMLElement): ClickTarget | null { + const button = element.closest(".jqtree-toggler"); - if ($button.length) { - const node = this.getNode($button as JQuery); + if (button) { + const node = this.getNode(button as HTMLElement); if (node) { return { @@ -953,9 +962,10 @@ export class JqTreeWidget extends MouseWidget { }; } } else { - const $el = $target.closest(".jqtree-element"); - if ($el.length) { - const node = this.getNode($el as JQuery); + const jqTreeElement = element.closest(".jqtree-element"); + + if (jqTreeElement) { + const node = this.getNode(jqTreeElement as HTMLElement); if (node) { return { type: "label", @@ -968,21 +978,23 @@ export class JqTreeWidget extends MouseWidget { return null; } - private getNode($element: JQuery): null | Node { - const $li = $element.closest("li.jqtree_common"); - if ($li.length === 0) { - return null; + private getNode(element: HTMLElement): null | Node { + const liElement = element.closest("li.jqtree_common"); + + if (liElement) { + return jQuery(liElement).data("node") as Node; } else { - return $li.data("node") as Node; + return null; } } private handleContextmenu = ( e: JQuery.ContextMenuEvent, ) => { - const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element"); - if ($div.length) { - const node = this.getNode($div); + const div = e.target.closest("ul.jqtree-tree .jqtree-element"); + + if (div) { + const node = this.getNode(div as HTMLElement); if (node) { e.preventDefault(); e.stopPropagation(); diff --git a/src/util.ts b/src/util.ts index ca3ea828..d8726ab2 100644 --- a/src/util.ts +++ b/src/util.ts @@ -5,3 +5,6 @@ export const isFunction = (v: unknown): boolean => typeof v === "function"; export const getBoolString = (value: unknown): string => value ? "true" : "false"; + +export const getOffsetTop = (element: HTMLElement) => + element.getBoundingClientRect().y + window.scrollY; diff --git a/tree.jquery.debug.js b/tree.jquery.debug.js index b8e36696..b2d7c62b 100644 --- a/tree.jquery.debug.js +++ b/tree.jquery.debug.js @@ -567,6 +567,209 @@ var jqtree = (function (exports) { } } + class DragElement { + constructor(nodeName, offsetX, offsetY, $tree, autoEscape) { + this.offsetX = offsetX; + this.offsetY = offsetY; + this.$element = jQuery("").addClass("jqtree-title jqtree-dragging"); + if (autoEscape) { + this.$element.text(nodeName); + } else { + this.$element.html(nodeName); + } + this.$element.css("position", "absolute"); + $tree.append(this.$element); + } + move(pageX, pageY) { + this.$element.offset({ + left: pageX - this.offsetX, + top: pageY - this.offsetY + }); + } + remove() { + this.$element.remove(); + } + } + + const isInt = n => typeof n === "number" && n % 1 === 0; + const isFunction = v => typeof v === "function"; + const getBoolString = value => value ? "true" : "false"; + const getOffsetTop = element => element.getBoundingClientRect().y + window.scrollY; + + class VisibleNodeIterator { + constructor(tree) { + this.tree = tree; + } + iterate() { + let isFirstNode = true; + const _iterateNode = (node, nextNode) => { + let mustIterateInside = (node.is_open || !node.element) && node.hasChildren(); + let element = null; + + // Is the element visible? + if (node.element?.offsetParent) { + element = node.element; + if (isFirstNode) { + this.handleFirstNode(node); + isFirstNode = false; + } + if (!node.hasChildren()) { + this.handleNode(node, nextNode, node.element); + } else if (node.is_open) { + if (!this.handleOpenFolder(node, node.element)) { + mustIterateInside = false; + } + } else { + this.handleClosedFolder(node, nextNode, element); + } + } + if (mustIterateInside) { + const childrenLength = node.children.length; + node.children.forEach((_, i) => { + const child = node.children[i]; + if (child) { + if (i === childrenLength - 1) { + _iterateNode(child, null); + } else { + const nextChild = node.children[i + 1]; + if (nextChild) { + _iterateNode(child, nextChild); + } + } + } + }); + if (node.is_open && element) { + this.handleAfterOpenFolder(node, nextNode); + } + } + }; + _iterateNode(this.tree, null); + } + + /* + override + return + - true: continue iterating + - false: stop iterating + */ + } + + class HitAreasGenerator extends VisibleNodeIterator { + constructor(tree, currentNode, treeBottom) { + super(tree); + this.currentNode = currentNode; + this.treeBottom = treeBottom; + } + generate() { + this.positions = []; + this.lastTop = 0; + this.iterate(); + return this.generateHitAreas(this.positions); + } + generateHitAreas(positions) { + let previousTop = positions[0]?.top ?? 0; + let group = []; + const hitAreas = []; + for (const position of positions) { + if (position.top !== previousTop && group.length) { + this.generateHitAreasForGroup(hitAreas, group, previousTop, position.top); + previousTop = position.top; + group = []; + } + group.push(position); + } + this.generateHitAreasForGroup(hitAreas, group, previousTop, this.treeBottom); + return hitAreas; + } + handleOpenFolder(node, element) { + if (node === this.currentNode) { + // Cannot move inside current item + // Stop iterating + return false; + } + + // Cannot move before current item + if (node.children[0] !== this.currentNode) { + this.addPosition(node, Position.Inside, getOffsetTop(element)); + } + + // Continue iterating + return true; + } + handleClosedFolder(node, nextNode, element) { + const top = getOffsetTop(element); + if (node === this.currentNode) { + // Cannot move after current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.Inside, top); + + // Cannot move before current item + if (nextNode !== this.currentNode) { + this.addPosition(node, Position.After, top); + } + } + } + handleFirstNode(node) { + if (node !== this.currentNode) { + this.addPosition(node, Position.Before, getOffsetTop(node.element)); + } + } + handleAfterOpenFolder(node, nextNode) { + if (node === this.currentNode || nextNode === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, Position.None, this.lastTop); + } else { + this.addPosition(node, Position.After, this.lastTop); + } + } + handleNode(node, nextNode, element) { + const top = getOffsetTop(element); + if (node === this.currentNode) { + // Cannot move inside current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.Inside, top); + } + if (nextNode === this.currentNode || node === this.currentNode) { + // Cannot move before or after current item + this.addPosition(node, Position.None, top); + } else { + this.addPosition(node, Position.After, top); + } + } + addPosition(node, position, top) { + const area = { + top, + bottom: 0, + node, + position + }; + this.positions.push(area); + this.lastTop = top; + } + generateHitAreasForGroup(hitAreas, positionsInGroup, top, bottom) { + // limit positions in group + const positionCount = Math.min(positionsInGroup.length, 4); + const areaHeight = Math.round((bottom - top) / positionCount); + let areaTop = top; + let i = 0; + while (i < positionCount) { + const position = positionsInGroup[i]; + if (position) { + hitAreas.push({ + top: areaTop, + bottom: areaTop + areaHeight, + node: position.node, + position: position.position + }); + } + areaTop += areaHeight; + i += 1; + } + } + } + class DragAndDropHandler { constructor(treeWidget) { this.treeWidget = treeWidget; @@ -576,14 +779,14 @@ var jqtree = (function (exports) { this.currentItem = null; } mouseCapture(positionInfo) { - const $element = jQuery(positionInfo.target); - if (!this.mustCaptureElement($element)) { + const element = positionInfo.target; + if (!this.mustCaptureElement(element)) { return null; } - if (this.treeWidget.options.onIsMoveHandle && !this.treeWidget.options.onIsMoveHandle($element)) { + if (this.treeWidget.options.onIsMoveHandle && !this.treeWidget.options.onIsMoveHandle(jQuery(element))) { return null; } - let nodeElement = this.treeWidget._getNodeElement($element); + let nodeElement = this.treeWidget._getNodeElement(element); if (nodeElement && this.treeWidget.options.onCanMove) { if (!this.treeWidget.options.onCanMove(nodeElement.node)) { nodeElement = null; @@ -603,7 +806,7 @@ var jqtree = (function (exports) { const node = this.currentItem.node; this.dragElement = new DragElement(node.name, positionInfo.pageX - left, positionInfo.pageY - top, this.treeWidget.element, this.treeWidget.options.autoEscape ?? true); this.isDragging = true; - this.currentItem.$element.addClass("jqtree-moving"); + this.currentItem.element.classList.add("jqtree-moving"); return true; } mouseDrag(positionInfo) { @@ -647,7 +850,7 @@ var jqtree = (function (exports) { this.removeHitAreas(); const currentItem = this.currentItem; if (this.currentItem) { - this.currentItem.$element.removeClass("jqtree-moving"); + this.currentItem.element.classList.remove("jqtree-moving"); this.currentItem = null; } this.isDragging = false; @@ -664,7 +867,7 @@ var jqtree = (function (exports) { this.generateHitAreas(); this.currentItem = this.treeWidget._getNodeElementForNode(this.currentItem.node); if (this.isDragging) { - this.currentItem.$element.addClass("jqtree-moving"); + this.currentItem.element.classList.add("jqtree-moving"); } } } @@ -676,8 +879,9 @@ var jqtree = (function (exports) { this.hitAreas = hitAreasGenerator.generate(); } } - mustCaptureElement($element) { - return !$element.is("input,select,textarea"); + mustCaptureElement(element) { + const nodeName = element.nodeName; + return nodeName !== "INPUT" && nodeName !== "SELECT" && nodeName !== "TEXTAREA"; } canMoveToArea(area) { if (!this.treeWidget.options.onCanMoveTo) { @@ -818,221 +1022,6 @@ var jqtree = (function (exports) { } } } - class VisibleNodeIterator { - constructor(tree) { - this.tree = tree; - } - iterate() { - let isFirstNode = true; - const _iterateNode = (node, nextNode) => { - let mustIterateInside = (node.is_open || !node.element) && node.hasChildren(); - let $element = null; - if (node.element) { - $element = jQuery(node.element); - if (!$element.is(":visible")) { - return; - } - if (isFirstNode) { - this.handleFirstNode(node); - isFirstNode = false; - } - if (!node.hasChildren()) { - this.handleNode(node, nextNode, $element); - } else if (node.is_open) { - if (!this.handleOpenFolder(node, $element)) { - mustIterateInside = false; - } - } else { - this.handleClosedFolder(node, nextNode, $element); - } - } - if (mustIterateInside) { - const childrenLength = node.children.length; - node.children.forEach((_, i) => { - const child = node.children[i]; - if (child) { - if (i === childrenLength - 1) { - _iterateNode(child, null); - } else { - const nextChild = node.children[i + 1]; - if (nextChild) { - _iterateNode(child, nextChild); - } - } - } - }); - if (node.is_open && $element) { - this.handleAfterOpenFolder(node, nextNode); - } - } - }; - _iterateNode(this.tree, null); - } - - /* - override - return - - true: continue iterating - - false: stop iterating - */ - } - - class HitAreasGenerator extends VisibleNodeIterator { - constructor(tree, currentNode, treeBottom) { - super(tree); - this.currentNode = currentNode; - this.treeBottom = treeBottom; - } - generate() { - this.positions = []; - this.lastTop = 0; - this.iterate(); - return this.generateHitAreas(this.positions); - } - generateHitAreas(positions) { - let previousTop = positions[0]?.top ?? 0; - let group = []; - const hitAreas = []; - for (const position of positions) { - if (position.top !== previousTop && group.length) { - this.generateHitAreasForGroup(hitAreas, group, previousTop, position.top); - previousTop = position.top; - group = []; - } - group.push(position); - } - this.generateHitAreasForGroup(hitAreas, group, previousTop, this.treeBottom); - return hitAreas; - } - handleOpenFolder(node, $element) { - if (node === this.currentNode) { - // Cannot move inside current item - - // Dnd over the current element is not possible: add a position with type None for the top and the bottom. - const top = this.getTop($element); - const height = $element.height() || 0; - this.addPosition(node, Position.None, top); - if (height > 5) { - // Subtract 5 pixels to allow more space for the next element. - this.addPosition(node, Position.None, top + height - 5); - } - - // Stop iterating - return false; - } - - // Cannot move before current item - if (node.children[0] !== this.currentNode) { - this.addPosition(node, Position.Inside, this.getTop($element)); - } - - // Continue iterating - return true; - } - handleClosedFolder(node, nextNode, $element) { - const top = this.getTop($element); - if (node === this.currentNode) { - // Cannot move after current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.Inside, top); - - // Cannot move before current item - if (nextNode !== this.currentNode) { - this.addPosition(node, Position.After, top); - } - } - } - handleFirstNode(node) { - if (node !== this.currentNode) { - this.addPosition(node, Position.Before, this.getTop(jQuery(node.element))); - } - } - handleAfterOpenFolder(node, nextNode) { - if (node === this.currentNode || nextNode === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, Position.None, this.lastTop); - } else { - this.addPosition(node, Position.After, this.lastTop); - } - } - handleNode(node, nextNode, $element) { - const top = this.getTop($element); - if (node === this.currentNode) { - // Cannot move inside current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.Inside, top); - } - if (nextNode === this.currentNode || node === this.currentNode) { - // Cannot move before or after current item - this.addPosition(node, Position.None, top); - } else { - this.addPosition(node, Position.After, top); - } - } - getTop($element) { - const offset = $element.offset(); - return offset ? offset.top : 0; - } - addPosition(node, position, top) { - const area = { - top, - bottom: 0, - node, - position - }; - this.positions.push(area); - this.lastTop = top; - } - generateHitAreasForGroup(hitAreas, positionsInGroup, top, bottom) { - // limit positions in group - const positionCount = Math.min(positionsInGroup.length, 4); - const areaHeight = Math.round((bottom - top) / positionCount); - let areaTop = top; - let i = 0; - while (i < positionCount) { - const position = positionsInGroup[i]; - if (position && position.position !== Position.None) { - hitAreas.push({ - top: areaTop, - bottom: areaTop + areaHeight, - node: position.node, - position: position.position - }); - } - areaTop += areaHeight; - i += 1; - } - } - } - class DragElement { - constructor(nodeName, offsetX, offsetY, $tree, autoEscape) { - this.offsetX = offsetX; - this.offsetY = offsetY; - this.$element = jQuery("").addClass("jqtree-title jqtree-dragging"); - if (autoEscape) { - this.$element.text(nodeName); - } else { - this.$element.html(nodeName); - } - this.$element.css("position", "absolute"); - $tree.append(this.$element); - } - move(pageX, pageY) { - this.$element.offset({ - left: pageX - this.offsetX, - top: pageY - this.offsetY - }); - } - remove() { - this.$element.remove(); - } - } - - const isInt = n => typeof n === "number" && n % 1 === 0; - const isFunction = v => typeof v === "function"; - const getBoolString = value => value ? "true" : "false"; class ElementsRenderer { constructor(treeWidget) { @@ -1236,6 +1225,10 @@ var jqtree = (function (exports) { const div = document.createElement("div"); div.innerHTML = value; return document.createTextNode(div.innerHTML); + } else if (value == null) { + return undefined; + } else if (value.nodeType) { + return value; } else { return jQuery(value)[0]; } @@ -1335,18 +1328,18 @@ var jqtree = (function (exports) { } class KeyHandler { - static LEFT = 37; - static UP = 38; - static RIGHT = 39; - static DOWN = 40; + handleKeyDownHandler = null; constructor(treeWidget) { this.treeWidget = treeWidget; if (treeWidget.options.keyboardSupport) { - jQuery(document).on("keydown.jqtree", this.handleKeyDown); + this.handleKeyDownHandler = this.handleKeyDown.bind(this); + document.addEventListener("keydown", this.handleKeyDownHandler); } } deinit() { - jQuery(document).off("keydown.jqtree"); + if (this.handleKeyDownHandler) { + document.removeEventListener("keydown", this.handleKeyDownHandler); + } } moveDown(selectedNode) { return this.selectNode(selectedNode.getNextVisibleNode()); @@ -1395,15 +1388,14 @@ var jqtree = (function (exports) { if (!selectedNode) { return true; } - const key = e.which; - switch (key) { - case KeyHandler.DOWN: + switch (e.key) { + case "ArrowDown": return this.moveDown(selectedNode); - case KeyHandler.UP: + case "ArrowUp": return this.moveUp(selectedNode); - case KeyHandler.RIGHT: + case "ArrowRight": return this.moveRight(selectedNode); - case KeyHandler.LEFT: + case "ArrowLeft": return this.moveLeft(selectedNode); default: return true; @@ -2310,6 +2302,76 @@ var jqtree = (function (exports) { } } + class BorderDropHint { + constructor(element, scrollLeft) { + const div = element.querySelector(":scope > .jqtree-element"); + if (!div) { + this.hint = undefined; + return; + } + const width = Math.max(element.offsetWidth + scrollLeft - 4, 0); + const height = Math.max(element.clientHeight - 4, 0); + const hint = document.createElement("span"); + hint.className = "jqtree-border"; + hint.style.width = `${width}px`; + hint.style.height = `${height}px`; + this.hint = hint; + div.append(this.hint); + } + remove() { + this.hint?.remove(); + } + } + + class GhostDropHint { + constructor(node, element, position) { + this.element = element; + this.node = node; + this.ghost = this.createGhostElement(); + if (position === Position.After) { + this.moveAfter(); + } else if (position === Position.Before) { + this.moveBefore(); + } else if (position === Position.Inside) { + if (node.isFolder() && node.is_open) { + this.moveInsideOpenFolder(); + } else { + this.moveInside(); + } + } + } + remove() { + this.ghost.remove(); + } + moveAfter() { + this.element.after(this.ghost); + } + moveBefore() { + this.element.before(this.ghost); + } + moveInsideOpenFolder() { + const childElement = this.node.children[0]?.element; + if (childElement) { + childElement.before(this.ghost); + } + } + moveInside() { + this.element.after(this.ghost); + this.ghost.classList.add("jqtree-inside"); + } + createGhostElement() { + const ghost = document.createElement("li"); + ghost.className = "jqtree_common jqtree-ghost"; + const circleSpan = document.createElement("span"); + circleSpan.className = "jqtree_common jqtree-circle"; + ghost.append(circleSpan); + const lineSpan = document.createElement("span"); + lineSpan.className = "jqtree_common jqtree-line"; + ghost.append(lineSpan); + return ghost; + } + } + class NodeElement { constructor(node, treeWidget) { this.init(node, treeWidget); @@ -2324,47 +2386,48 @@ var jqtree = (function (exports) { } } if (node.element) { - this.$element = jQuery(node.element); + this.element = node.element; } } addDropHint(position) { if (this.mustShowBorderDropHint(position)) { - return new BorderDropHint(this.$element, this.treeWidget._getScrollLeft()); + return new BorderDropHint(this.element, this.treeWidget._getScrollLeft()); } else { - return new GhostDropHint(this.node, this.$element, position); + return new GhostDropHint(this.node, this.element, position); } } select(mustSetFocus) { - const $li = this.getLi(); - $li.addClass("jqtree-selected"); - const $span = this.getSpan(); - $span.attr("tabindex", this.treeWidget.options.tabIndex ?? null); - $span.attr("aria-selected", "true"); + this.element.classList.add("jqtree-selected"); + const titleSpan = this.getTitleSpan(); + const tabIndex = this.treeWidget.options.tabIndex; + + // Check for null or undefined + if (tabIndex != null) { + titleSpan.setAttribute("tabindex", tabIndex.toString()); + } + titleSpan.setAttribute("aria-selected", "true"); if (mustSetFocus) { - $span.trigger("focus"); + titleSpan.focus(); } } deselect() { - const $li = this.getLi(); - $li.removeClass("jqtree-selected"); - const $span = this.getSpan(); - $span.removeAttr("tabindex"); - $span.attr("aria-selected", "false"); - $span.trigger("blur"); + this.element.classList.remove("jqtree-selected"); + const titleSpan = this.getTitleSpan(); + titleSpan.removeAttribute("tabindex"); + titleSpan.setAttribute("aria-selected", "false"); + titleSpan.blur(); } getUl() { - return this.$element.children("ul:first"); - } - getSpan() { - return this.$element.children(".jqtree-element").find("span.jqtree-title"); + return this.element.querySelector(":scope > ul"); } - getLi() { - return this.$element; + getTitleSpan() { + return this.element.querySelector(":scope > .jqtree-element > span.jqtree-title"); } mustShowBorderDropHint(position) { return position === Position.Inside; } } + class FolderElement extends NodeElement { open(onFinished) { let slide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; @@ -2373,22 +2436,18 @@ var jqtree = (function (exports) { return; } this.node.is_open = true; - const $button = this.getButton(); - $button.removeClass("jqtree-closed"); - $button.html(""); - const buttonEl = $button.get(0); - if (buttonEl) { - const openedIconElement = this.treeWidget.renderer.openedIconElement; - if (openedIconElement) { - const icon = openedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } + const button = this.getButton(); + button.classList.remove("jqtree-closed"); + button.innerHTML = ""; + const openedIconElement = this.treeWidget.renderer.openedIconElement; + if (openedIconElement) { + const icon = openedIconElement.cloneNode(true); + button.appendChild(icon); } const doOpen = () => { - const $li = this.getLi(); - $li.removeClass("jqtree-closed"); - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "true"); + this.element.classList.remove("jqtree-closed"); + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "true"); if (onFinished) { onFinished(this.node); } @@ -2397,9 +2456,9 @@ var jqtree = (function (exports) { }); }; if (slide) { - this.getUl().slideDown(animationSpeed, doOpen); + jQuery(this.getUl()).slideDown(animationSpeed, doOpen); } else { - this.getUl().show(); + jQuery(this.getUl()).show(); doOpen(); } } @@ -2410,30 +2469,26 @@ var jqtree = (function (exports) { return; } this.node.is_open = false; - const $button = this.getButton(); - $button.addClass("jqtree-closed"); - $button.html(""); - const buttonEl = $button.get(0); - if (buttonEl) { - const closedIconElement = this.treeWidget.renderer.closedIconElement; - if (closedIconElement) { - const icon = closedIconElement.cloneNode(true); - buttonEl.appendChild(icon); - } + const button = this.getButton(); + button.classList.add("jqtree-closed"); + button.innerHTML = ""; + const closedIconElement = this.treeWidget.renderer.closedIconElement; + if (closedIconElement) { + const icon = closedIconElement.cloneNode(true); + button.appendChild(icon); } const doClose = () => { - const $li = this.getLi(); - $li.addClass("jqtree-closed"); - const $titleSpan = this.getSpan(); - $titleSpan.attr("aria-expanded", "false"); + this.element.classList.add("jqtree-closed"); + const titleSpan = this.getTitleSpan(); + titleSpan.setAttribute("aria-expanded", "false"); this.treeWidget._triggerEvent("tree.close", { node: this.node }); }; if (slide) { - this.getUl().slideUp(animationSpeed, doClose); + jQuery(this.getUl()).slideUp(animationSpeed, doClose); } else { - this.getUl().hide(); + jQuery(this.getUl()).hide(); doClose(); } } @@ -2441,63 +2496,7 @@ var jqtree = (function (exports) { return !this.node.is_open && position === Position.Inside; } getButton() { - return this.$element.children(".jqtree-element").find("a.jqtree-toggler"); - } - } - class BorderDropHint { - constructor($element, scrollLeft) { - const $div = $element.children(".jqtree-element"); - const elWidth = $element.width() || 0; - const width = Math.max(elWidth + scrollLeft - 4, 0); - const elHeight = $div.outerHeight() || 0; - const height = Math.max(elHeight - 4, 0); - this.$hint = jQuery(''); - $div.append(this.$hint); - this.$hint.css({ - width, - height - }); - } - remove() { - this.$hint.remove(); - } - } - class GhostDropHint { - constructor(node, $element, position) { - this.$element = $element; - this.node = node; - this.$ghost = jQuery(`
  • -
  • `); - if (position === Position.After) { - this.moveAfter(); - } else if (position === Position.Before) { - this.moveBefore(); - } else if (position === Position.Inside) { - if (node.isFolder() && node.is_open) { - this.moveInsideOpenFolder(); - } else { - this.moveInside(); - } - } - } - remove() { - this.$ghost.remove(); - } - moveAfter() { - this.$element.after(this.$ghost); - } - moveBefore() { - this.$element.before(this.$ghost); - } - moveInsideOpenFolder() { - const childElement = this.node.children[0]?.element; - if (childElement) { - jQuery(childElement).before(this.$ghost); - } - } - moveInside() { - this.$element.after(this.$ghost); - this.$ghost.addClass("jqtree-inside"); + return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler"); } } @@ -2624,8 +2623,12 @@ var jqtree = (function (exports) { getNodesByProperty(key, value) { return this.tree.getNodesByProperty(key, value); } - getNodeByHtmlElement(element) { - return this.getNode(jQuery(element)); + getNodeByHtmlElement(inputElement) { + const element = inputElement instanceof HTMLElement ? inputElement : inputElement[0]; + if (!element) { + return null; + } + return this.getNode(element); } getNodeByCallback(callback) { return this.tree.getNodeByCallback(callback); @@ -2886,8 +2889,8 @@ var jqtree = (function (exports) { return new NodeElement(node, this); } } - _getNodeElement($element) { - const node = this.getNode($element); + _getNodeElement(element) { + const node = this.getNode(element); if (node) { return this._getNodeElementForNode(node); } else { @@ -2895,7 +2898,7 @@ var jqtree = (function (exports) { } } _containsElement(element) { - const node = this.getNode(jQuery(element)); + const node = this.getNode(element); return node != null && node.tree === this.tree; } _getScrollLeft() { @@ -3179,10 +3182,9 @@ var jqtree = (function (exports) { } }; getClickTarget(element) { - const $target = jQuery(element); - const $button = $target.closest(".jqtree-toggler"); - if ($button.length) { - const node = this.getNode($button); + const button = element.closest(".jqtree-toggler"); + if (button) { + const node = this.getNode(button); if (node) { return { type: "button", @@ -3190,9 +3192,9 @@ var jqtree = (function (exports) { }; } } else { - const $el = $target.closest(".jqtree-element"); - if ($el.length) { - const node = this.getNode($el); + const jqTreeElement = element.closest(".jqtree-element"); + if (jqTreeElement) { + const node = this.getNode(jqTreeElement); if (node) { return { type: "label", @@ -3203,18 +3205,18 @@ var jqtree = (function (exports) { } return null; } - getNode($element) { - const $li = $element.closest("li.jqtree_common"); - if ($li.length === 0) { - return null; + getNode(element) { + const liElement = element.closest("li.jqtree_common"); + if (liElement) { + return jQuery(liElement).data("node"); } else { - return $li.data("node"); + return null; } } handleContextmenu = e => { - const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element"); - if ($div.length) { - const node = this.getNode($div); + const div = e.target.closest("ul.jqtree-tree .jqtree-element"); + if (div) { + const node = this.getNode(div); if (node) { e.preventDefault(); e.stopPropagation(); diff --git a/tree.jquery.debug.js.map b/tree.jquery.debug.js.map index b0873658..c4420687 100644 --- a/tree.jquery.debug.js.map +++ b/tree.jquery.debug.js.map @@ -1 +1 @@ -{"version":3,"file":"tree.jquery.debug.js","sources":["src/version.ts","src/nodeUtils.ts","src/node.ts","src/dragAndDropHandler.ts","src/util.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.7.5\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\n\nexport enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { getPositionName, Node, Position } from \"./node\";\nimport { DropHint, HitArea, PositionInfo } from \"./types\";\nimport { NodeElement } from \"./nodeElement\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const $element = jQuery(positionInfo.target);\n\n if (!this.mustCaptureElement($element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle($element)\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement($element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true,\n );\n\n this.isDragging = true;\n this.currentItem.$element.addClass(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.treeWidget.options.onDragMove) {\n this.treeWidget.options.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.$element.removeClass(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.treeWidget._getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.$element.addClass(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement($element: JQuery): boolean {\n return !$element.is(\"input,select,textarea\");\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName,\n );\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.treeWidget._getNodeElementForNode(\n this.hoveredArea.node,\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n },\n );\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.treeWidget.options.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let $element: JQuery | null = null;\n\n if (node.element) {\n $element = jQuery(node.element);\n\n if (!$element.is(\":visible\")) {\n return;\n }\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, $element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, $element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, $element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n _iterateNode(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n _iterateNode(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && $element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n $element: JQuery,\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n $element: JQuery,\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null,\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport class HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom,\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, $element: JQuery): boolean {\n if (node === this.currentNode) {\n // Cannot move inside current item\n\n // Dnd over the current element is not possible: add a position with type None for the top and the bottom.\n const top = this.getTop($element);\n const height = $element.height() || 0;\n this.addPosition(node, Position.None, top);\n\n if (height > 5) {\n // Subtract 5 pixels to allow more space for the next element.\n this.addPosition(node, Position.None, top + height - 5);\n }\n\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== this.currentNode) {\n this.addPosition(node, Position.Inside, this.getTop($element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n $element: JQuery,\n ): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(\n node,\n Position.Before,\n this.getTop(jQuery(node.element)),\n );\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(node: Node, nextNode: Node, $element: JQuery): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private getTop($element: JQuery): number {\n const offset = $element.offset();\n\n return offset ? offset.top : 0;\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n ): void {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position && position.position !== Position.None) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean,\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"\").addClass(\n \"jqtree-title jqtree-dragging\",\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = string | HTMLElement | JQuery;\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\",\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\",\n );\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n const $element = this.treeWidget.element;\n $element.empty();\n\n if ($element[0]) {\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 1,\n );\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(\n this.treeWidget.selectNodeHandler.isNodeSelected(node),\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.treeWidget.options.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.treeWidget.options.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const { dataFilter } = this.treeWidget.options;\n\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class KeyHandler {\n private static LEFT = 37;\n private static UP = 38;\n private static RIGHT = 39;\n private static DOWN = 40;\n\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n jQuery(document).on(\"keydown.jqtree\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n jQuery(document).off(\"keydown.jqtree\");\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n } else {\n // Right expands a closed node\n this.treeWidget.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.treeWidget.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.treeWidget.selectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: JQuery.Event): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n const key = e.which;\n\n switch (key) {\n case KeyHandler.DOWN:\n return this.moveDown(selectedNode);\n\n case KeyHandler.UP:\n return this.moveUp(selectedNode);\n\n case KeyHandler.RIGHT:\n return this.moveRight(selectedNode);\n\n case KeyHandler.LEFT:\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\n );\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget extends SimpleWidget {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.mouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo\n ): void {\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.treeWidget.tree.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.treeWidget.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n $container: JQuery;\n refreshHitAreas: () => void;\n $treeElement: JQuery;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private $container: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ $container, refreshHitAreas }: Params) {\n this.$container = $container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.$container.scrollLeft() || 0;\n }\n\n public scrollToY(top: number): void {\n const container = this.$container.get(0) as HTMLElement;\n container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = this.$container.offset();\n if (!scrollParentOffset) {\n return undefined;\n }\n\n const container = this.$container.get(0) as HTMLElement;\n\n const rightEdge = scrollParentOffset.left + container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = this.$container.offset()?.top || 0;\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom =\n this.getScrollParentTop() +\n (this.$container.innerHeight() ?? 0);\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\nexport default class DocumentScrollParent implements ScrollParent {\n private $element: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n\n constructor($element: JQuery, refreshHitAreas: () => void) {\n this.$element = $element;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const offset = this.$element.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst hasOverFlow = ($element: JQuery): boolean => {\n for (const attr of [\"overflow\", \"overflow-y\"]) {\n const overflowValue = $element.css(attr);\n if (overflowValue === \"auto\" || overflowValue === \"scroll\") {\n return true;\n }\n }\n\n return false;\n};\n\nconst getParentWithOverflow = (\n $treeElement: JQuery,\n): JQuery | null => {\n if (hasOverFlow($treeElement)) {\n return $treeElement;\n }\n\n for (const element of $treeElement.parents().get()) {\n const $element = jQuery(element);\n if (hasOverFlow($element)) {\n return $element;\n }\n }\n\n return null;\n};\n\nconst createScrollParent = (\n $treeElement: JQuery,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const $container = getParentWithOverflow($treeElement);\n\n if ($container?.length && $container[0]?.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n $container,\n refreshHitAreas,\n $treeElement,\n });\n } else {\n return new DocumentScrollParent($treeElement, refreshHitAreas);\n }\n};\n\nexport default createScrollParent;\n","import { JqTreeWidget } from \"./tree.jquery\";\nimport { PositionInfo } from \"./types\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private scrollParent?: ScrollParent;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.scrollParent = undefined;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageY == null) {\n return;\n }\n\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageX == null) {\n return;\n }\n\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeWidget.$el,\n this.treeWidget.refreshHitAreas.bind(this.treeWidget),\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.treeWidget.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.treeWidget.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n\n public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { Position, Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { DropHint } from \"./types\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nexport class NodeElement {\n public node: Node;\n public $element: JQuery;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.$element = jQuery(node.element);\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.$element,\n this.treeWidget._getScrollLeft(),\n );\n } else {\n return new GhostDropHint(this.node, this.$element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n const $li = this.getLi();\n\n $li.addClass(\"jqtree-selected\");\n\n const $span = this.getSpan();\n $span.attr(\"tabindex\", this.treeWidget.options.tabIndex ?? null);\n $span.attr(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n $span.trigger(\"focus\");\n }\n }\n\n public deselect(): void {\n const $li = this.getLi();\n\n $li.removeClass(\"jqtree-selected\");\n\n const $span = this.getSpan();\n $span.removeAttr(\"tabindex\");\n $span.attr(\"aria-selected\", \"false\");\n\n $span.trigger(\"blur\");\n }\n\n protected getUl(): JQuery {\n return this.$element.children(\"ul:first\");\n }\n\n protected getSpan(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"span.jqtree-title\");\n }\n\n protected getLi(): JQuery {\n return this.$element;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport class FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const $button = this.getButton();\n $button.removeClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const openedIconElement =\n this.treeWidget.renderer.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n buttonEl.appendChild(icon);\n }\n }\n\n const doOpen = (): void => {\n const $li = this.getLi();\n $li.removeClass(\"jqtree-closed\");\n\n const $titleSpan = this.getSpan();\n $titleSpan.attr(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideDown(animationSpeed, doOpen);\n } else {\n this.getUl().show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const $button = this.getButton();\n $button.addClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const closedIconElement =\n this.treeWidget.renderer.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n buttonEl.appendChild(icon);\n }\n }\n\n const doClose = (): void => {\n const $li = this.getLi();\n $li.addClass(\"jqtree-closed\");\n\n const $titleSpan = this.getSpan();\n $titleSpan.attr(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideUp(animationSpeed, doClose);\n } else {\n this.getUl().hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"a.jqtree-toggler\");\n }\n}\n\nexport class BorderDropHint implements DropHint {\n private $hint: JQuery;\n\n constructor($element: JQuery, scrollLeft: number) {\n const $div = $element.children(\".jqtree-element\");\n\n const elWidth = $element.width() || 0;\n const width = Math.max(elWidth + scrollLeft - 4, 0);\n\n const elHeight = $div.outerHeight() || 0;\n const height = Math.max(elHeight - 4, 0);\n\n this.$hint = jQuery('');\n $div.append(this.$hint);\n\n this.$hint.css({ width, height });\n }\n\n public remove(): void {\n this.$hint.remove();\n }\n}\n\nclass GhostDropHint implements DropHint {\n private $element: JQuery;\n private node: Node;\n private $ghost: JQuery;\n\n constructor(node: Node, $element: JQuery, position: Position) {\n this.$element = $element;\n\n this.node = node;\n this.$ghost = jQuery(\n `
  • \n
  • `,\n );\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.$ghost.remove();\n }\n\n public moveAfter(): void {\n this.$element.after(this.$ghost);\n }\n\n public moveBefore(): void {\n this.$element.before(this.$ghost);\n }\n\n public moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n jQuery(childElement).before(this.$ghost);\n }\n }\n\n public moveInside(): void {\n this.$element.after(this.$ghost);\n this.$ghost.addClass(\"jqtree-inside\");\n }\n}\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport { FolderElement, NodeElement, OnFinishOpenNode } from \"./nodeElement\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends MouseWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this._refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n element: HTMLElement | JQuery,\n ): Node | null {\n return this.getNode(jQuery(element));\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this._openNode(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n new FolderElement(node, this).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this._refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data[\"children\"] &&\n data[\"children\"] instanceof Array\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children as Node[]);\n }\n }\n\n this._refreshElements(node);\n\n return this.element;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (!selectedNode) {\n return false;\n } else {\n return subtree === selectedNode || subtree.isParentOf(selectedNode);\n }\n }\n\n public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this._refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n\n this._getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this._getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const nodeTop = jQuery(node.element).offset()?.top ?? 0;\n const treeTop = this.$el.offset()?.top ?? 0;\n const top = nodeTop - treeTop;\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this._refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n public _triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null,\n ): void => {\n const folderElement = new FolderElement(_node, this);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false, null);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this._triggerEvent(\"tree.refresh\");\n }\n\n public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement($element: JQuery): NodeElement | null {\n const node = this.getNode($element);\n if (node) {\n return this._getNodeElementForNode(node);\n } else {\n return null;\n }\n }\n\n public _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(jQuery(element));\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\n }\n\n public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (!this.isInitialized) {\n this.isInitialized = true;\n this._triggerEvent(\"tree.init\");\n }\n };\n\n if (!this.options.nodeClass) {\n return;\n }\n\n this.tree = new this.options.nodeClass(\n null,\n true,\n this.options.nodeClass,\n );\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this._refreshElements(null);\n\n if (!mustLoadOnDemand) {\n doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\n }\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n if (!this.options.saveState) {\n return [false, false];\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return [false, false];\n } else {\n const mustLoadOnDemand =\n this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n }\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n } else if (!node.hasChildren()) {\n return false;\n } else {\n node.is_open = true;\n return level !== maxLevel;\n }\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\n }\n };\n\n const autoOpenNodes = (): void => {\n const maxLevel = this.getAutoOpenMaxLevel();\n let loadingCount = 0;\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n const openNodes = (): void => {\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loadAndOpenNode(node);\n }\n\n return false;\n } else {\n this._openNode(node, false, null);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n } else if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n } else if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n } else {\n return 0;\n }\n }\n\n private handleClick = (\n e: JQuery.ClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget?.type === \"label\") {\n this._triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private getClickTarget(element: EventTarget): ClickTarget | null {\n const $target = jQuery(element);\n\n const $button = $target.closest(\".jqtree-toggler\");\n\n if ($button.length) {\n const node = this.getNode($button as JQuery);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const $el = $target.closest(\".jqtree-element\");\n if ($el.length) {\n const node = this.getNode($el as JQuery);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode($element: JQuery): null | Node {\n const $li = $element.closest(\"li.jqtree_common\");\n if ($li.length === 0) {\n return null;\n } else {\n return $li.data(\"node\") as Node;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent,\n ) => {\n const $div = jQuery(e.target).closest(\"ul.jqtree-tree .jqtree-element\");\n if ($div.length) {\n const node = this.getNode($div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this._triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this._getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this._triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this._triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n openParents();\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this._triggerEvent(\"tree.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this._refreshElements(parentNode);\n }\n\n private doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["version","isNodeRecordWithChildren","data","Array","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","getPosition","Node","constructor","nodeData","arguments","length","undefined","isRoot","nodeClass","load_on_demand","isEmptyFolder","children","setData","parent","idMapping","Map","tree","o","key","value","loadFromData","removeChildren","childData","node","createNode","addChild","push","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","hasChildren","isFolder","iterate","callback","_iterate","level","child","result","moveNode","movedNode","targetNode","isParentOf","getData","includeParent","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","n","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","remove","append","prepend","getLevel","getNodeById","nodeId","get","addNodeToIndex","id","set","removeNodeFromIndex","delete","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","includeChildren","nextSibling","getNextVisibleNode","is_open","getPreviousNode","previousSibling","getParent","getLastChild","getPreviousVisibleNode","lastChild","initFromData","addNode","addChildren","childrenData","getNodeClass","DragAndDropHandler","treeWidget","hoveredArea","hitAreas","isDragging","currentItem","mouseCapture","positionInfo","$element","jQuery","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","mouseStart","pageX","pageY","refresh","offset","left","top","dragElement","DragElement","element","autoEscape","addClass","mouseDrag","move","area","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","removeClass","onDragStop","generateHitAreas","_getNodeElementForNode","hitAreasGenerator","HitAreasGenerator","getTreeDimensions","bottom","generate","is","onCanMoveTo","positionName","previousGhost","x","y","dimensions","right","low","high","mid","addDropHint","folder","openFolder","_openNode","slide","openFolderDelay","openFolderTimer","window","setTimeout","clearTimeout","previousParent","doMove","empty","_refreshElements","event","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","VisibleNodeIterator","isFirstNode","_iterateNode","nextNode","mustIterateInside","handleFirstNode","handleNode","handleOpenFolder","handleClosedFolder","childrenLength","forEach","_","i","nextChild","handleAfterOpenFolder","currentNode","treeBottom","positions","lastTop","previousTop","group","generateHitAreasForGroup","getTop","addPosition","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","nodeName","offsetX","offsetY","$tree","text","html","css","isInt","isFunction","getBoolString","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","render","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","mustShowFolder","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","titleSpan","createTitleSpan","liClasses","join","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","DataLoader","loadFromUrl","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","handleSuccess","loadData","parseData","handleError","jqXHR","onLoadFailed","submitRequest","isLoading","onLoading","urlInfoInput","url","ajaxSettings","method","cache","dataType","success","error","toUpperCase","ajax","dataFilter","getParsedData","JSON","parse","parsedData","KeyHandler","LEFT","UP","RIGHT","DOWN","keyboardSupport","on","handleKeyDown","deinit","off","moveDown","selectedNode","selectNode","moveUp","moveRight","openNode","moveLeft","closeNode","e","canHandleKeyboard","getSelectedNode","which","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","existingWidget","simpleWidgetClass","init","destroyWidget","destroy","removeData","callFunction","functionName","args","simpleWidget","widgetFunction","apply","fn","argument1","_len","_key","defaults","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","addEventListener","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeEventListener","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","handleMouseMove","touches","changedTouches","SaveStateHandler","saveState","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","getOpenNodeIds","openNodes","getSelectedNodeIds","selectedNodeIds","getSelectedNodes","open_nodes","selected_node","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","onGetStateFromStorage","getItem","nodeIds","selectCount","addToSelection","selectedNodes","removeFromSelection","nodeIdsParam","loadingCount","newNodesIds","loadAndOpenNode","testSupport","sessionStorage","removeItem","_supportsLocalStorage","ContainerScrollParent","_ref","$container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","bind","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","getScrollLeft","scrollLeft","scrollToY","container","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","clientWidth","leftEdge","isNearRightEdge","isNearLeftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","innerHeight","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","$document","windowWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","clientHeight","getDocumentScrollHeight","scrollHeight","scrollWidth","distanceTop","windowHeight","hasOverFlow","attr","overflowValue","getParentWithOverflow","$treeElement","parents","createScrollParent","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","has","add","activeElement","_containsElement","NodeElement","mustShowBorderDropHint","BorderDropHint","GhostDropHint","select","mustSetFocus","$li","getLi","$span","getSpan","trigger","deselect","removeAttr","getUl","find","FolderElement","open","animationSpeed","$button","getButton","buttonEl","renderer","icon","doOpen","$titleSpan","slideDown","show","close","doClose","slideUp","hide","$div","elWidth","max","elHeight","outerHeight","$hint","$ghost","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","useContextMenu","toggle","slideParam","Error","getTree","optionsParam","doSelectNode","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","getNode","parseParams","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","scrollToNode","nodeTop","scrollHandler","setState","setOption","option","keyHandler","getVersion","__version__","eventName","values","Event","doOpenNode","_node","_slide","_onFinished","folderElement","loadFolderOnDemand","mustSelect","selectCurrentNode","isInitialized","getRtlOption","getDefaultClosedIcon","dataLoader","initData","handleClick","handleDblclick","handleContextmenu","getDataUrlInfo","getUrlFromString","setUrlInfoData","selectedNodeId","initTree","doInit","restoreState","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","parseInt","clickTarget","getClickTarget","type","stopPropagation","click_event","$target","closest","deselectCurrentNode","dataRtl","defaultOptions","mustToggle","selectOptions","canSelect","openParents","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree.jquery.debug.js","sources":["src/version.ts","src/nodeUtils.ts","src/node.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/visibleNodeIterator.ts","src/dragAndDropHandler/hitAreasGenerator.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.7.5\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\n\nexport enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","class DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean,\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"\").addClass(\n \"jqtree-title jqtree-dragging\",\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n element.getBoundingClientRect().y + window.scrollY;\n","import { Node } from \"../node\";\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n _iterateNode(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n _iterateNode(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(\n node: Node,\n element: HTMLElement,\n ): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null,\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport default VisibleNodeIterator;\n","import { HitArea } from \"../types\";\nimport { Node, Position } from \"../node\";\nimport { getOffsetTop } from \"../util\";\nimport VisibleNodeIterator from \"./visibleNodeIterator\";\n\nclass HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom,\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, element: HTMLElement): boolean {\n if (node === this.currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== this.currentNode) {\n this.addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n element: HTMLElement,\n ): void {\n const top = getOffsetTop(element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(\n node: Node,\n nextNode: Node,\n element: HTMLElement,\n ): void {\n const top = getOffsetTop(element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n ): void {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nexport default HitAreasGenerator;\n","import { getPositionName, Node, Position } from \"../node\";\nimport { DropHint, HitArea, PositionInfo } from \"../types\";\nimport NodeElement from \"../nodeElement\";\nimport { JqTreeWidget } from \"../tree.jquery\";\nimport DragElement from \"./dragElement\";\nimport HitAreasGenerator from \"./hitAreasGenerator\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle(jQuery(element))\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement(element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true,\n );\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.treeWidget.options.onDragMove) {\n this.treeWidget.options.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.treeWidget._getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName,\n );\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.treeWidget._getNodeElementForNode(\n this.hoveredArea.node,\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n },\n );\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.treeWidget.options.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = string | HTMLElement | JQuery;\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\",\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\",\n );\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n const $element = this.treeWidget.element;\n $element.empty();\n\n if ($element[0]) {\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 1,\n );\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(\n this.treeWidget.selectNodeHandler.isNodeSelected(node),\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.treeWidget.options.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.treeWidget.options.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const { dataFilter } = this.treeWidget.options;\n\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\nexport default class KeyHandler {\n private treeWidget: JqTreeWidget;\n private handleKeyDownHandler: KeyboardEventHandler | null = null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n } else {\n // Right expands a closed node\n this.treeWidget.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.treeWidget.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.treeWidget.selectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\n );\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget extends SimpleWidget {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.mouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo\n ): void {\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.treeWidget.tree.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.treeWidget.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n $container: JQuery;\n refreshHitAreas: () => void;\n $treeElement: JQuery;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private $container: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ $container, refreshHitAreas }: Params) {\n this.$container = $container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.$container.scrollLeft() || 0;\n }\n\n public scrollToY(top: number): void {\n const container = this.$container.get(0) as HTMLElement;\n container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = this.$container.offset();\n if (!scrollParentOffset) {\n return undefined;\n }\n\n const container = this.$container.get(0) as HTMLElement;\n\n const rightEdge = scrollParentOffset.left + container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = this.$container.offset()?.top || 0;\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom =\n this.getScrollParentTop() +\n (this.$container.innerHeight() ?? 0);\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\nexport default class DocumentScrollParent implements ScrollParent {\n private $element: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n\n constructor($element: JQuery, refreshHitAreas: () => void) {\n this.$element = $element;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const offset = this.$element.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst hasOverFlow = ($element: JQuery): boolean => {\n for (const attr of [\"overflow\", \"overflow-y\"]) {\n const overflowValue = $element.css(attr);\n if (overflowValue === \"auto\" || overflowValue === \"scroll\") {\n return true;\n }\n }\n\n return false;\n};\n\nconst getParentWithOverflow = (\n $treeElement: JQuery,\n): JQuery | null => {\n if (hasOverFlow($treeElement)) {\n return $treeElement;\n }\n\n for (const element of $treeElement.parents().get()) {\n const $element = jQuery(element);\n if (hasOverFlow($element)) {\n return $element;\n }\n }\n\n return null;\n};\n\nconst createScrollParent = (\n $treeElement: JQuery,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const $container = getParentWithOverflow($treeElement);\n\n if ($container?.length && $container[0]?.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n $container,\n refreshHitAreas,\n $treeElement,\n });\n } else {\n return new DocumentScrollParent($treeElement, refreshHitAreas);\n }\n};\n\nexport default createScrollParent;\n","import { JqTreeWidget } from \"./tree.jquery\";\nimport { PositionInfo } from \"./types\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private scrollParent?: ScrollParent;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.scrollParent = undefined;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageY == null) {\n return;\n }\n\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageX == null) {\n return;\n }\n\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeWidget.$el,\n this.treeWidget.refreshHitAreas.bind(this.treeWidget),\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.treeWidget.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.treeWidget.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n\n public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { DropHint } from \"..//types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Position, Node } from \"../node\";\nimport { DropHint } from \"../types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Position, Node } from \"../node\";\nimport { JqTreeWidget } from \"../tree.jquery\";\nimport { DropHint } from \"../types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.element,\n this.treeWidget._getScrollLeft(),\n );\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.treeWidget.options.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position, Node } from \"../node\";\nimport NodeElement from \"./index\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nclass FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.treeWidget.renderer.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.treeWidget.renderer.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement, { OnFinishOpenNode } from \"./nodeElement/folderElement\";\n\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends MouseWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this._refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this._openNode(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n new FolderElement(node, this).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this._refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data[\"children\"] &&\n data[\"children\"] instanceof Array\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children as Node[]);\n }\n }\n\n this._refreshElements(node);\n\n return this.element;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (!selectedNode) {\n return false;\n } else {\n return subtree === selectedNode || subtree.isParentOf(selectedNode);\n }\n }\n\n public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this._refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n\n this._getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this._getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const nodeTop = jQuery(node.element).offset()?.top ?? 0;\n const treeTop = this.$el.offset()?.top ?? 0;\n const top = nodeTop - treeTop;\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this._refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n public _triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null,\n ): void => {\n const folderElement = new FolderElement(_node, this);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false, null);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this._triggerEvent(\"tree.refresh\");\n }\n\n public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n if (node) {\n return this._getNodeElementForNode(node);\n } else {\n return null;\n }\n }\n\n public _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\n }\n\n public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (!this.isInitialized) {\n this.isInitialized = true;\n this._triggerEvent(\"tree.init\");\n }\n };\n\n if (!this.options.nodeClass) {\n return;\n }\n\n this.tree = new this.options.nodeClass(\n null,\n true,\n this.options.nodeClass,\n );\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this._refreshElements(null);\n\n if (!mustLoadOnDemand) {\n doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\n }\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n if (!this.options.saveState) {\n return [false, false];\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return [false, false];\n } else {\n const mustLoadOnDemand =\n this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n }\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n } else if (!node.hasChildren()) {\n return false;\n } else {\n node.is_open = true;\n return level !== maxLevel;\n }\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\n }\n };\n\n const autoOpenNodes = (): void => {\n const maxLevel = this.getAutoOpenMaxLevel();\n let loadingCount = 0;\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n const openNodes = (): void => {\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loadAndOpenNode(node);\n }\n\n return false;\n } else {\n this._openNode(node, false, null);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n } else if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n } else if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n } else {\n return 0;\n }\n }\n\n private handleClick = (\n e: JQuery.ClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget?.type === \"label\") {\n this._triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button as HTMLElement);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement = element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement as HTMLElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent,\n ) => {\n const div = e.target.closest(\"ul.jqtree-tree .jqtree-element\");\n\n if (div) {\n const node = this.getNode(div as HTMLElement);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this._triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this._getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this._triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this._triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n openParents();\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this._triggerEvent(\"tree.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this._refreshElements(parentNode);\n }\n\n private doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["version","isNodeRecordWithChildren","data","Array","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","getPosition","Node","constructor","nodeData","arguments","length","undefined","isRoot","nodeClass","load_on_demand","isEmptyFolder","children","setData","parent","idMapping","Map","tree","o","key","value","loadFromData","removeChildren","childData","node","createNode","addChild","push","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","hasChildren","isFolder","iterate","callback","_iterate","level","child","result","moveNode","movedNode","targetNode","isParentOf","getData","includeParent","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","n","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","remove","append","prepend","getLevel","getNodeById","nodeId","get","addNodeToIndex","id","set","removeNodeFromIndex","delete","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","includeChildren","nextSibling","getNextVisibleNode","is_open","getPreviousNode","previousSibling","getParent","getLastChild","getPreviousVisibleNode","lastChild","initFromData","addNode","addChildren","childrenData","getNodeClass","DragElement","nodeName","offsetX","offsetY","$tree","autoEscape","$element","jQuery","addClass","text","html","css","move","pageX","pageY","offset","left","top","isInt","isFunction","getBoolString","getOffsetTop","element","getBoundingClientRect","y","window","scrollY","VisibleNodeIterator","isFirstNode","_iterateNode","nextNode","mustIterateInside","offsetParent","handleFirstNode","handleNode","handleOpenFolder","handleClosedFolder","childrenLength","forEach","_","i","nextChild","handleAfterOpenFolder","HitAreasGenerator","currentNode","treeBottom","generate","positions","lastTop","generateHitAreas","previousTop","group","hitAreas","generateHitAreasForGroup","addPosition","area","bottom","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","DragAndDropHandler","treeWidget","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","mouseStart","refresh","dragElement","classList","add","mouseDrag","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","onDragStop","_getNodeElementForNode","hitAreasGenerator","getTreeDimensions","onCanMoveTo","positionName","previousGhost","x","dimensions","right","low","high","mid","addDropHint","folder","openFolder","_openNode","slide","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","previousParent","doMove","empty","_refreshElements","event","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","render","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","mustShowFolder","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","titleSpan","createTitleSpan","liClasses","join","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","nodeType","DataLoader","loadFromUrl","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","handleSuccess","loadData","parseData","handleError","jqXHR","onLoadFailed","submitRequest","removeClass","isLoading","onLoading","urlInfoInput","url","ajaxSettings","method","cache","dataType","success","error","toUpperCase","ajax","dataFilter","getParsedData","JSON","parse","parsedData","KeyHandler","handleKeyDownHandler","keyboardSupport","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","selectNode","moveUp","moveRight","openNode","moveLeft","closeNode","e","canHandleKeyboard","getSelectedNode","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","existingWidget","simpleWidgetClass","init","destroyWidget","destroy","removeData","callFunction","functionName","args","simpleWidget","widgetFunction","apply","fn","argument1","_len","_key","defaults","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","handleMouseMove","touches","changedTouches","SaveStateHandler","saveState","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","getOpenNodeIds","openNodes","getSelectedNodeIds","selectedNodeIds","getSelectedNodes","open_nodes","selected_node","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","onGetStateFromStorage","getItem","nodeIds","selectCount","addToSelection","selectedNodes","removeFromSelection","nodeIdsParam","loadingCount","newNodesIds","loadAndOpenNode","testSupport","sessionStorage","removeItem","_supportsLocalStorage","ContainerScrollParent","_ref","$container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","getScrollLeft","scrollLeft","scrollToY","container","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","rightEdge","clientWidth","leftEdge","isNearRightEdge","isNearLeftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","innerHeight","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","$document","windowWidth","canScrollRight","getDocumentScrollWidth","canScrollDown","clientHeight","getDocumentScrollHeight","scrollHeight","scrollWidth","distanceTop","windowHeight","hasOverFlow","attr","overflowValue","getParentWithOverflow","$treeElement","parents","createScrollParent","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","has","activeElement","_containsElement","BorderDropHint","querySelector","hint","max","offsetWidth","style","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","open","animationSpeed","getButton","renderer","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","useContextMenu","toggle","slideParam","Error","getTree","optionsParam","doSelectNode","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","getNode","parseParams","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","scrollToNode","nodeTop","scrollHandler","setState","setOption","option","keyHandler","getVersion","__version__","eventName","values","Event","trigger","doOpenNode","_node","_slide","_onFinished","folderElement","loadFolderOnDemand","mustSelect","selectCurrentNode","isInitialized","getRtlOption","getDefaultClosedIcon","dataLoader","initData","on","handleClick","handleDblclick","handleContextmenu","off","getDataUrlInfo","getUrlFromString","setUrlInfoData","selectedNodeId","initTree","doInit","restoreState","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","parseInt","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","liElement","deselectCurrentNode","dataRtl","defaultOptions","mustToggle","selectOptions","canSelect","openParents","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam"],"mappings":"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"} \ No newline at end of file diff --git a/tree.jquery.js b/tree.jquery.js index 9e3acbf2..cb931bb6 100644 --- a/tree.jquery.js +++ b/tree.jquery.js @@ -17,5 +17,5 @@ limitations under the License. @license */ -var jqtree=function(e){"use strict";const t=e=>"object"==typeof e&&"children"in e&&e.children instanceof Array;let o=function(e){return e[e.Before=1]="Before",e[e.After=2]="After",e[e.Inside=3]="Inside",e[e.None=4]="None",e}({});const i={before:o.Before,after:o.After,inside:o.Inside,none:o.None},r=e=>{for(const t in i)if(Object.prototype.hasOwnProperty.call(i,t)&&i[t]===e)return t;return""};class s{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s;this.name="",this.load_on_demand=!1,this.isEmptyFolder=null!=e&&t(e)&&0===e.children.length,this.setData(e),this.children=[],this.parent=null,o&&(this.idMapping=new Map,this.tree=this,this.nodeClass=i)}setData(e){if(e)if("string"==typeof e)this.name=e;else if("object"==typeof e)for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)){const o=e[t];"label"===t||"name"===t?"string"==typeof o&&(this.name=o):"children"!==t&&"parent"!==t&&(this[t]=o)}}loadFromData(e){this.removeChildren();for(const o of e){const e=this.createNode(o);this.addChild(e),t(o)&&e.loadFromData(o.children)}return this}addChild(e){this.children.push(e),e.setParent(this)}addChildAtPosition(e,t){this.children.splice(t,0,e),e.setParent(this)}removeChild(e){e.removeChildren(),this.doRemoveChild(e)}getChildIndex(e){return this.children.indexOf(e)}hasChildren(){return 0!==this.children.length}isFolder(){return this.hasChildren()||this.load_on_demand}iterate(e){const t=(o,i)=>{if(o.children)for(const r of o.children){e(r,i)&&r.hasChildren()&&t(r,i+1)}};t(this,0)}moveNode(e,t,i){if(!e.parent||e.isParentOf(t))return!1;switch(e.parent.doRemoveChild(e),i){case o.After:return!!t.parent&&(t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)+1),!0);case o.Before:return!!t.parent&&(t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)),!0);case o.Inside:return t.addChildAtPosition(e,0),!0;default:return!1}}getData(){const e=t=>t.map((t=>{const o={};for(const e in t)if(-1===["parent","children","element","idMapping","load_on_demand","nodeClass","tree","isEmptyFolder"].indexOf(e)&&Object.prototype.hasOwnProperty.call(t,e)){const i=t[e];o[e]=i}return t.hasChildren()&&(o.children=e(t.children)),o}));return e(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?[this]:this.children)}getNodeByName(e){return this.getNodeByCallback((t=>t.name===e))}getNodeByNameMustExist(e){const t=this.getNodeByCallback((t=>t.name===e));if(!t)throw`Node with name ${e} not found`;return t}getNodeByCallback(e){let t=null;return this.iterate((o=>!t&&(!e(o)||(t=o,!1)))),t}addAfter(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o+1),t.loadChildrenFromData(e),t}return null}addBefore(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o),t.loadChildrenFromData(e),t}return null}addParent(e){if(this.parent){const t=this.createNode(e);this.tree&&t.setParent(this.tree);const o=this.parent;for(const e of o.children)t.addChild(e);return o.children=[],o.addChild(t),t}return null}remove(){this.parent&&(this.parent.removeChild(this),this.parent=null)}append(e){const t=this.createNode(e);return this.addChild(t),t.loadChildrenFromData(e),t}prepend(e){const t=this.createNode(e);return this.addChildAtPosition(t,0),t.loadChildrenFromData(e),t}isParentOf(e){let t=e.parent;for(;t;){if(t===this)return!0;t=t.parent}return!1}getLevel(){let e=0,t=this;for(;t.parent;)e+=1,t=t.parent;return e}getNodeById(e){return this.idMapping.get(e)||null}addNodeToIndex(e){null!=e.id&&this.idMapping.set(e.id,e)}removeNodeFromIndex(e){null!=e.id&&this.idMapping.delete(e.id)}removeChildren(){this.iterate((e=>(this.tree?.removeNodeFromIndex(e),!0))),this.children=[]}getPreviousSibling(){if(this.parent){const e=this.parent.getChildIndex(this)-1;return e>=0&&this.parent.children[e]||null}return null}getNextSibling(){if(this.parent){const e=this.parent.getChildIndex(this)+1;return eo[e]===t))}filter(e){const t=[];return this.iterate((o=>(e(o)&&t.push(o),!0))),t}getNextNode(){if((!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&this.hasChildren())return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getNextVisibleNode(){if(this.hasChildren()&&this.is_open)return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getPreviousNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()?e.getLastChild():e:this.getParent()}return null}getPreviousVisibleNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()&&e.is_open?e.getLastChild():e:this.getParent()}return null}getParent(){return this.parent&&this.parent.parent?this.parent:null}getLastChild(){if(this.hasChildren()){const e=this.children[this.children.length-1];return e?e.hasChildren()&&e.is_open?e?.getLastChild():e:null}return null}initFromData(e){const o=e=>{for(const t of e){const e=this.createNode();e.initFromData(t),this.addChild(e)}};(e=>{this.setData(e),t(e)&&e.children.length&&o(e.children)})(e)}setParent(e){this.parent=e,this.tree=e.tree,this.tree?.addNodeToIndex(this)}doRemoveChild(e){this.children.splice(this.getChildIndex(e),1),this.tree?.removeNodeFromIndex(e)}getNodeClass(){return this.nodeClass||this?.tree?.nodeClass||s}createNode(e){return new(this.getNodeClass())(e)}loadChildrenFromData(e){t(e)&&e.children.length&&this.loadFromData(e.children)}}class n{constructor(e){this.treeWidget=e,this.hoveredArea=null,this.hitAreas=[],this.isDragging=!1,this.currentItem=null}mouseCapture(e){const t=jQuery(e.target);if(!this.mustCaptureElement(t))return null;if(this.treeWidget.options.onIsMoveHandle&&!this.treeWidget.options.onIsMoveHandle(t))return null;let o=this.treeWidget._getNodeElement(t);return o&&this.treeWidget.options.onCanMove&&(this.treeWidget.options.onCanMove(o.node)||(o=null)),this.currentItem=o,null!=this.currentItem}mouseStart(e){if(!this.currentItem||void 0===e.pageX||void 0===e.pageY)return!1;this.refresh();const t=jQuery(e.target).offset(),o=t?t.left:0,i=t?t.top:0,r=this.currentItem.node;return this.dragElement=new h(r.name,e.pageX-o,e.pageY-i,this.treeWidget.element,this.treeWidget.options.autoEscape??!0),this.isDragging=!0,this.currentItem.$element.addClass("jqtree-moving"),!0}mouseDrag(e){if(!this.currentItem||!this.dragElement||void 0===e.pageX||void 0===e.pageY)return!1;this.dragElement.move(e.pageX,e.pageY);const t=this.findHoveredArea(e.pageX,e.pageY);return t&&this.canMoveToArea(t)?(t.node.isFolder()||this.stopOpenFolderTimer(),this.hoveredArea!==t&&(this.hoveredArea=t,this.mustOpenFolderTimer(t)?this.startOpenFolderTimer(t.node):this.stopOpenFolderTimer(),this.updateDropHint())):(this.removeDropHint(),this.stopOpenFolderTimer(),this.hoveredArea=t),t||this.treeWidget.options.onDragMove&&this.treeWidget.options.onDragMove(this.currentItem.node,e.originalEvent),!0}mouseStop(e){this.moveItem(e),this.clear(),this.removeHover(),this.removeDropHint(),this.removeHitAreas();const t=this.currentItem;return this.currentItem&&(this.currentItem.$element.removeClass("jqtree-moving"),this.currentItem=null),this.isDragging=!1,!this.hoveredArea&&t&&this.treeWidget.options.onDragStop&&this.treeWidget.options.onDragStop(t.node,e.originalEvent),!1}refresh(){this.removeHitAreas(),this.currentItem&&(this.generateHitAreas(),this.currentItem=this.treeWidget._getNodeElementForNode(this.currentItem.node),this.isDragging&&this.currentItem.$element.addClass("jqtree-moving"))}generateHitAreas(){if(this.currentItem){const e=new d(this.treeWidget.tree,this.currentItem.node,this.getTreeDimensions().bottom);this.hitAreas=e.generate()}else this.hitAreas=[]}mustCaptureElement(e){return!e.is("input,select,textarea")}canMoveToArea(e){if(!this.treeWidget.options.onCanMoveTo)return!0;if(!this.currentItem)return!1;const t=r(e.position);return this.treeWidget.options.onCanMoveTo(this.currentItem.node,e.node,t)}removeHitAreas(){this.hitAreas=[]}clear(){this.dragElement&&(this.dragElement.remove(),this.dragElement=null)}removeDropHint(){this.previousGhost&&this.previousGhost.remove()}removeHover(){this.hoveredArea=null}findHoveredArea(e,t){const o=this.getTreeDimensions();if(eo.right||t>o.bottom)return null;let i=0,r=this.hitAreas.length;for(;i>1,o=this.hitAreas[e];if(!o)return null;if(to.bottom))return o;i=e+1}}return null}mustOpenFolderTimer(e){const t=e.node;return t.isFolder()&&!t.is_open&&e.position===o.Inside}updateDropHint(){if(!this.hoveredArea)return;this.removeDropHint();const e=this.treeWidget._getNodeElementForNode(this.hoveredArea.node);this.previousGhost=e.addDropHint(this.hoveredArea.position)}startOpenFolderTimer(e){const t=()=>{this.treeWidget._openNode(e,this.treeWidget.options.slide,(()=>{this.refresh(),this.updateDropHint()}))};this.stopOpenFolderTimer();const o=this.treeWidget.options.openFolderDelay;!1!==o&&(this.openFolderTimer=window.setTimeout(t,o))}stopOpenFolderTimer(){this.openFolderTimer&&(clearTimeout(this.openFolderTimer),this.openFolderTimer=null)}moveItem(e){if(this.currentItem&&this.hoveredArea&&this.hoveredArea.position!==o.None&&this.canMoveToArea(this.hoveredArea)){const t=this.currentItem.node,i=this.hoveredArea.node,s=this.hoveredArea.position,n=t.parent;s===o.Inside&&(this.hoveredArea.node.is_open=!0);const l=()=>{this.treeWidget.tree.moveNode(t,i,s),this.treeWidget.element.empty(),this.treeWidget._refreshElements(null)};this.treeWidget._triggerEvent("tree.move",{move_info:{moved_node:t,target_node:i,position:r(s),previous_parent:n,do_move:l,original_event:e.originalEvent}}).isDefaultPrevented()||l()}}getTreeDimensions(){const e=this.treeWidget.element.offset();if(e){const t=this.treeWidget.element,o=t.width()||0,i=t.height()||0,r=e.left+this.treeWidget._getScrollLeft();return{left:r,top:e.top,right:r+o,bottom:e.top+i+16}}return{left:0,top:0,right:0,bottom:0}}}class l{constructor(e){this.tree=e}iterate(){let e=!0;const t=(o,i)=>{let r=(o.is_open||!o.element)&&o.hasChildren(),s=null;if(o.element){if(s=jQuery(o.element),!s.is(":visible"))return;e&&(this.handleFirstNode(o),e=!1),o.hasChildren()?o.is_open?this.handleOpenFolder(o,s)||(r=!1):this.handleClosedFolder(o,i,s):this.handleNode(o,i,s)}if(r){const e=o.children.length;o.children.forEach(((i,r)=>{const s=o.children[r];if(s)if(r===e-1)t(s,null);else{const e=o.children[r+1];e&&t(s,e)}})),o.is_open&&s&&this.handleAfterOpenFolder(o,i)}};t(this.tree,null)}}class d extends l{constructor(e,t,o){super(e),this.currentNode=t,this.treeBottom=o}generate(){return this.positions=[],this.lastTop=0,this.iterate(),this.generateHitAreas(this.positions)}generateHitAreas(e){let t=e[0]?.top??0,o=[];const i=[];for(const r of e)r.top!==t&&o.length&&(this.generateHitAreasForGroup(i,o,t,r.top),t=r.top,o=[]),o.push(r);return this.generateHitAreasForGroup(i,o,t,this.treeBottom),i}handleOpenFolder(e,t){if(e===this.currentNode){const i=this.getTop(t),r=t.height()||0;return this.addPosition(e,o.None,i),r>5&&this.addPosition(e,o.None,i+r-5),!1}return e.children[0]!==this.currentNode&&this.addPosition(e,o.Inside,this.getTop(t)),!0}handleClosedFolder(e,t,i){const r=this.getTop(i);e===this.currentNode?this.addPosition(e,o.None,r):(this.addPosition(e,o.Inside,r),t!==this.currentNode&&this.addPosition(e,o.After,r))}handleFirstNode(e){e!==this.currentNode&&this.addPosition(e,o.Before,this.getTop(jQuery(e.element)))}handleAfterOpenFolder(e,t){e===this.currentNode||t===this.currentNode?this.addPosition(e,o.None,this.lastTop):this.addPosition(e,o.After,this.lastTop)}handleNode(e,t,i){const r=this.getTop(i);e===this.currentNode?this.addPosition(e,o.None,r):this.addPosition(e,o.Inside,r),t===this.currentNode||e===this.currentNode?this.addPosition(e,o.None,r):this.addPosition(e,o.After,r)}getTop(e){const t=e.offset();return t?t.top:0}addPosition(e,t,o){const i={top:o,bottom:0,node:e,position:t};this.positions.push(i),this.lastTop=o}generateHitAreasForGroup(e,t,i,r){const s=Math.min(t.length,4),n=Math.round((r-i)/s);let l=i,d=0;for(;d").addClass("jqtree-title jqtree-dragging"),r?this.$element.text(e):this.$element.html(e),this.$element.css("position","absolute"),i.append(this.$element)}move(e,t){this.$element.offset({left:e-this.offsetX,top:t-this.offsetY})}remove(){this.$element.remove()}}const a=e=>e?"true":"false";class c{constructor(e){this.treeWidget=e,this.openedIconElement=this.createButtonElement(e.options.openedIcon||"+"),this.closedIconElement=this.createButtonElement(e.options.closedIcon||"-")}render(e){e&&e.parent?this.renderFromNode(e):this.renderFromRoot()}renderFromRoot(){const e=this.treeWidget.element;e.empty(),e[0]&&this.createDomElements(e[0],this.treeWidget.tree.children,!0,1)}renderFromNode(e){const t=jQuery(e.element),o=this.createLi(e,e.getLevel());this.attachNodeData(e,o),t.after(o),t.remove(),e.children&&this.createDomElements(o,e.children,!1,e.getLevel()+1)}createDomElements(e,t,o,i){const r=this.createUl(o);e.appendChild(r);for(const e of t){const t=this.createLi(e,i);r.appendChild(t),this.attachNodeData(e,t),e.hasChildren()&&this.createDomElements(t,e.children,!1,i+1)}}attachNodeData(e,t){e.element=t,jQuery(t).data("node",e)}createUl(e){let t,o;e?(t="jqtree-tree",o="tree",this.treeWidget.options.rtl&&(t+=" jqtree-rtl")):(t="",o="group"),this.treeWidget.options.dragAndDrop&&(t+=" jqtree-dnd");const i=document.createElement("ul");return i.className=`jqtree_common ${t}`,i.setAttribute("role",o),i}createLi(e,t){const o=Boolean(this.treeWidget.selectNodeHandler.isNodeSelected(e)),i=e.isFolder()||e.isEmptyFolder&&this.treeWidget.options.showEmptyFolder?this.createFolderLi(e,t,o):this.createNodeLi(e,t,o);return this.treeWidget.options.onCreateLi&&this.treeWidget.options.onCreateLi(e,jQuery(i),o),i}setTreeItemAriaAttributes(e,t,o,i){e.setAttribute("aria-label",t),e.setAttribute("aria-level",`${o}`),e.setAttribute("aria-selected",a(i)),e.setAttribute("role","treeitem")}createFolderLi(e,t,o){const i=this.getButtonClasses(e),r=this.getFolderClasses(e,o),s=e.is_open?this.openedIconElement:this.closedIconElement,n=document.createElement("li");n.className=`jqtree_common ${r}`,n.setAttribute("role","none");const l=document.createElement("div");l.className="jqtree-element jqtree_common",l.setAttribute("role","none"),n.appendChild(l);const d=document.createElement("a");d.className=i,s&&d.appendChild(s.cloneNode(!0)),this.treeWidget.options.buttonLeft&&l.appendChild(d);const h=this.createTitleSpan(e.name,o,!0,t);return h.setAttribute("aria-expanded",a(e.is_open)),l.appendChild(h),this.treeWidget.options.buttonLeft||l.appendChild(d),n}createNodeLi(e,t,o){const i=["jqtree_common"];o&&i.push("jqtree-selected");const r=i.join(" "),s=document.createElement("li");s.className=r,s.setAttribute("role","none");const n=document.createElement("div");n.className="jqtree-element jqtree_common",n.setAttribute("role","none"),s.appendChild(n);const l=this.createTitleSpan(e.name,o,!1,t);return n.appendChild(l),s}createTitleSpan(e,t,o,i){const r=document.createElement("span");let s="jqtree-title jqtree_common";if(o&&(s+=" jqtree-title-folder"),s+=" jqtree-title-button-"+(this.treeWidget.options.buttonLeft?"left":"right"),r.className=s,t){const e=this.treeWidget.options.tabIndex;void 0!==e&&r.setAttribute("tabindex",`${e}`)}return this.setTreeItemAriaAttributes(r,e,i,t),this.treeWidget.options.autoEscape?r.textContent=e:r.innerHTML=e,r}getButtonClasses(e){const t=["jqtree-toggler","jqtree_common"];return e.is_open||t.push("jqtree-closed"),this.treeWidget.options.buttonLeft?t.push("jqtree-toggler-left"):t.push("jqtree-toggler-right"),t.join(" ")}getFolderClasses(e,t){const o=["jqtree-folder"];return e.is_open||o.push("jqtree-closed"),t&&o.push("jqtree-selected"),e.is_loading&&o.push("jqtree-loading"),o.join(" ")}createButtonElement(e){if("string"==typeof e){const t=document.createElement("div");return t.innerHTML=e,document.createTextNode(t.innerHTML)}return jQuery(e)[0]}}class u{constructor(e){this.treeWidget=e}loadFromUrl(e,t,o){if(!e)return;const i=this.getDomElement(t);this.addLoadingClass(i),this.notifyLoading(!0,t,i);const r=()=>{this.removeLoadingClass(i),this.notifyLoading(!1,t,i)};this.submitRequest(e,(e=>{r(),this.treeWidget.loadData(this.parseData(e),t),o&&"function"==typeof o&&o()}),(e=>{r(),this.treeWidget.options.onLoadFailed&&this.treeWidget.options.onLoadFailed(e)}))}addLoadingClass(e){e&&e.addClass("jqtree-loading")}removeLoadingClass(e){e&&e.removeClass("jqtree-loading")}getDomElement(e){return e?jQuery(e.element):this.treeWidget.element}notifyLoading(e,t,o){this.treeWidget.options.onLoading&&this.treeWidget.options.onLoading(e,t,o),this.treeWidget._triggerEvent("tree.loading_data",{isLoading:e,node:t,$el:o})}submitRequest(e,t,o){const i={method:"GET",cache:!1,dataType:"json",success:t,error:o,..."string"==typeof e?{url:e}:e};i.method=i.method?.toUpperCase()||"GET",jQuery.ajax(i)}parseData(e){const{dataFilter:t}=this.treeWidget.options,o="string"==typeof e?JSON.parse(e):e;return t?t(o):o}}class g{static LEFT=37;static UP=38;static RIGHT=39;static DOWN=40;constructor(e){this.treeWidget=e,e.options.keyboardSupport&&jQuery(document).on("keydown.jqtree",this.handleKeyDown)}deinit(){jQuery(document).off("keydown.jqtree")}moveDown(e){return this.selectNode(e.getNextVisibleNode())}moveUp(e){return this.selectNode(e.getPreviousVisibleNode())}moveRight(e){return!e.isFolder()||(e.is_open?this.selectNode(e.getNextVisibleNode()):(this.treeWidget.openNode(e),!1))}moveLeft(e){return e.isFolder()&&e.is_open?(this.treeWidget.closeNode(e),!1):this.selectNode(e.getParent())}selectNode(e){return!e||(this.treeWidget.selectNode(e),!1)}handleKeyDown=e=>{if(!this.canHandleKeyboard())return!0;const t=this.treeWidget.getSelectedNode();if(!t)return!0;switch(e.which){case g.DOWN:return this.moveDown(t);case g.UP:return this.moveUp(t);case g.RIGHT:return this.moveRight(t);case g.LEFT:return this.moveLeft(t);default:return!0}};canHandleKeyboard(){return!!this.treeWidget.options.keyboardSupport&&this.treeWidget.selectNodeHandler.isFocusOnTree()}}const m=(e,t)=>{const o=()=>`simple_widget_${t}`,i=(e,t)=>{const o=jQuery.data(e,t);return o&&o instanceof p?o:null},r=(t,r)=>{const s=o();for(const o of t.get()){if(!i(o,s)){const t=new e(o,r);jQuery.data(o,s)||jQuery.data(o,s,t),t.init()}}return t};jQuery.fn[t]=function(t){if(!t)return r(this,null);if("object"==typeof t){return r(this,t)}if("string"==typeof t&&"_"!==t[0]){const r=t;if("destroy"===r)return(e=>{const t=o();for(const o of e.get()){const e=i(o,t);e&&e.destroy(),jQuery.removeData(o,t)}})(this);if("get_widget_class"===r)return e;for(var s=arguments.length,n=new Array(s>1?s-1:0),l=1;l{let r=null;for(const s of e.get()){const e=jQuery.data(s,o());if(e&&e instanceof p){const o=e[t];o&&"function"==typeof o&&(r=o.apply(e,i))}}return r})(this,r,n)}}};class p{static register(e,t){m(e,t)}static defaults={};constructor(e,t){this.$el=jQuery(e);const o=this.constructor.defaults;this.options={...o,...t}}destroy(){this.deinit()}init(){}deinit(){}}const f=e=>({pageX:e.pageX,pageY:e.pageY,target:e.target,originalEvent:e}),v=(e,t)=>({pageX:e.pageX,pageY:e.pageY,target:e.target,originalEvent:t});class S extends p{init(){const e=this.$el.get(0);e&&(e.addEventListener("mousedown",this.mouseDown,{passive:!1}),e.addEventListener("touchstart",this.touchStart,{passive:!1})),this.isMouseStarted=!1,this.mouseDelayTimer=null,this.isMouseDelayMet=!1,this.mouseDownInfo=null}deinit(){const e=this.$el.get(0);e&&(e.removeEventListener("mousedown",this.mouseDown,{passive:!1}),e.removeEventListener("touchstart",this.touchStart,{passive:!1})),this.removeMouseMoveEventListeners()}mouseDown=e=>{if(0!==e.button)return;this.handleMouseDown(f(e))&&e.cancelable&&e.preventDefault()};handleMouseDown(e){return this.isMouseStarted&&this.handleMouseUp(e),this.mouseDownInfo=e,!!this.mouseCapture(e)&&(this.handleStartMouse(),!0)}handleStartMouse(){document.addEventListener("mousemove",this.mouseMove,{passive:!1}),document.addEventListener("touchmove",this.touchMove,{passive:!1}),document.addEventListener("mouseup",this.mouseUp,{passive:!1}),document.addEventListener("touchend",this.touchEnd,{passive:!1});const e=this.getMouseDelay();e?this.startMouseDelayTimer(e):this.isMouseDelayMet=!0}startMouseDelayTimer(e){this.mouseDelayTimer&&clearTimeout(this.mouseDelayTimer),this.mouseDelayTimer=window.setTimeout((()=>{this.mouseDownInfo&&(this.isMouseDelayMet=!0)}),e),this.isMouseDelayMet=!1}mouseMove=e=>{this.handleMouseMove(e,f(e))};handleMouseMove(e,t){if(this.isMouseStarted)return this.mouseDrag(t),void(e.cancelable&&e.preventDefault());this.isMouseDelayMet&&(this.mouseDownInfo&&(this.isMouseStarted=!1!==this.mouseStart(this.mouseDownInfo)),this.isMouseStarted?(this.mouseDrag(t),e.cancelable&&e.preventDefault()):this.handleMouseUp(t))}mouseUp=e=>{this.handleMouseUp(f(e))};handleMouseUp(e){this.removeMouseMoveEventListeners(),this.isMouseDelayMet=!1,this.mouseDownInfo=null,this.isMouseStarted&&(this.isMouseStarted=!1,this.mouseStop(e))}removeMouseMoveEventListeners(){document.removeEventListener("mousemove",this.mouseMove,{passive:!1}),document.removeEventListener("touchmove",this.touchMove,{passive:!1}),document.removeEventListener("mouseup",this.mouseUp,{passive:!1}),document.removeEventListener("touchend",this.touchEnd,{passive:!1})}touchStart=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseDown(v(t,e))};touchMove=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseMove(e,v(t,e))};touchEnd=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseUp(v(t,e))}}class N{constructor(e){this.treeWidget=e}saveState(){const e=JSON.stringify(this.getState());this.treeWidget.options.onSetStateFromStorage?this.treeWidget.options.onSetStateFromStorage(e):this.supportsLocalStorage()&&localStorage.setItem(this.getKeyName(),e)}getStateFromStorage(){const e=this.loadFromStorage();return e?this.parseState(e):null}getState(){return{open_nodes:(()=>{const e=[];return this.treeWidget.tree.iterate((t=>(t.is_open&&t.id&&t.hasChildren()&&e.push(t.id),!0))),e})(),selected_node:(()=>{const e=[];return this.treeWidget.getSelectedNodes().forEach((t=>{null!=t.id&&e.push(t.id)})),e})()}}setInitialState(e){if(e){let t=!1;return e.open_nodes&&(t=this.openInitialNodes(e.open_nodes)),e.selected_node&&(this.resetSelection(),this.selectInitialNodes(e.selected_node)),t}return!1}setInitialStateOnDemand(e,t){e?this.doSetInitialStateOnDemand(e.open_nodes,e.selected_node,t):t()}getNodeIdToBeSelected(){const e=this.getStateFromStorage();return e&&e.selected_node&&e.selected_node[0]||null}parseState(e){const t=JSON.parse(e);var o;return t&&t.selected_node&&("number"==typeof(o=t.selected_node)&&o%1==0)&&(t.selected_node=[t.selected_node]),t}loadFromStorage(){return this.treeWidget.options.onGetStateFromStorage?this.treeWidget.options.onGetStateFromStorage():this.supportsLocalStorage()?localStorage.getItem(this.getKeyName()):null}openInitialNodes(e){let t=!1;for(const o of e){const e=this.treeWidget.getNodeById(o);e&&(e.load_on_demand?t=!0:e.is_open=!0)}return t}selectInitialNodes(e){let t=0;for(const o of e){const e=this.treeWidget.getNodeById(o);e&&(t+=1,this.treeWidget.selectNodeHandler.addToSelection(e))}return 0!==t}resetSelection(){const e=this.treeWidget.selectNodeHandler;e.getSelectedNodes().forEach((t=>{e.removeFromSelection(t)}))}doSetInitialStateOnDemand(e,t,o){let i=0,r=e;const s=()=>{const e=[];for(const t of r){const o=this.treeWidget.getNodeById(t);o?o.is_loading||(o.load_on_demand?n(o):this.treeWidget._openNode(o,!1,null)):e.push(t)}r=e,this.selectInitialNodes(t)&&this.treeWidget._refreshElements(null),0===i&&o()},n=e=>{i+=1,this.treeWidget._openNode(e,!1,(()=>{i-=1,s()}))};s()}getKeyName(){return"string"==typeof this.treeWidget.options.saveState?this.treeWidget.options.saveState:"tree"}supportsLocalStorage(){return null==this._supportsLocalStorage&&(this._supportsLocalStorage=(()=>{if(null==localStorage)return!1;try{const e="_storage_test";sessionStorage.setItem(e,"value"),sessionStorage.removeItem(e)}catch(e){return!1}return!0})()),this._supportsLocalStorage}}class D{constructor(e){let{$container:t,refreshHitAreas:o}=e;this.$container=t,this.refreshHitAreas=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.verticalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return this.$container.scrollLeft()||0}scrollToY(e){this.$container.get(0).scrollTop=e}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.scrollParentTop=void 0,this.scrollParentBottom=void 0}getNewHorizontalScrollDirection(e){const t=this.$container.offset();if(!t)return;const o=this.$container.get(0),i=t.left+o.clientWidth,r=t.left;return e>i-20?"right":ethis.getScrollParentBottom()?"bottom":void 0}scrollHorizontally(){if(!this.horizontalScrollDirection)return;const e="left"===this.horizontalScrollDirection?-20:20;this.$container.get(0).scrollBy({left:e,top:0,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollHorizontally.bind(this),40)}scrollVertically(){if(!this.verticalScrollDirection)return;const e="top"===this.verticalScrollDirection?-20:20;this.$container.get(0).scrollBy({left:0,top:e,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollVertically.bind(this),40)}getScrollParentTop(){return null==this.scrollParentTop&&(this.scrollParentTop=this.$container.offset()?.top||0),this.scrollParentTop}getScrollParentBottom(){return null==this.scrollParentBottom&&(this.scrollParentBottom=this.getScrollParentTop()+(this.$container.innerHeight()??0)),this.scrollParentBottom}}class y{constructor(e,t){this.$element=e,this.refreshHitAreas=t}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.horizontalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return document.documentElement.scrollLeft}scrollToY(e){const t=this.$element.offset(),o=t?t.top:0;jQuery(document).scrollTop(e+o)}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.documentScrollHeight=void 0,this.documentScrollWidth=void 0}getNewHorizontalScrollDirection(e){const t=e-(jQuery(document).scrollLeft()||0)<20;return e>(jQuery(window).width()||0)-20&&this.canScrollRight()?"right":t?"left":void 0}canScrollRight(){const e=document.documentElement;return e.scrollLeft+e.clientWidth{for(const t of["overflow","overflow-y"]){const o=e.css(t);if("auto"===o||"scroll"===o)return!0}return!1},C=(e,t)=>{const o=(e=>{if(_(e))return e;for(const t of e.parents().get()){const e=jQuery(t);if(_(e))return e}return null})(e);return o?.length&&"HTML"!==o[0]?.tagName?new D({$container:o,refreshHitAreas:t,$treeElement:e}):new y(e,t)};class E{constructor(e){this.treeWidget=e,this.scrollParent=void 0}checkScrolling(e){this.checkVerticalScrolling(e),this.checkHorizontalScrolling(e)}stopScrolling(){this.getScrollParent().stopScrolling()}scrollToY(e){this.getScrollParent().scrollToY(e)}getScrollLeft(){return this.getScrollParent().getScrollLeft()}checkVerticalScrolling(e){null!=e.pageY&&this.getScrollParent().checkVerticalScrolling(e.pageY)}checkHorizontalScrolling(e){null!=e.pageX&&this.getScrollParent().checkHorizontalScrolling(e.pageX)}getScrollParent(){return this.scrollParent||(this.scrollParent=C(this.treeWidget.$el,this.treeWidget.refreshHitAreas.bind(this.treeWidget))),this.scrollParent}}class T{constructor(e){this.treeWidget=e,this.selectedNodes=new Set,this.clear()}getSelectedNode(){const e=this.getSelectedNodes();return e.length&&e[0]||!1}getSelectedNodes(){if(this.selectedSingleNode)return[this.selectedSingleNode];{const e=[];return this.selectedNodes.forEach((t=>{const o=this.treeWidget.getNodeById(t);o&&e.push(o)})),e}}getSelectedNodesUnder(e){if(this.selectedSingleNode)return e.isParentOf(this.selectedSingleNode)?[this.selectedSingleNode]:[];{const t=[];for(const o in this.selectedNodes)if(Object.prototype.hasOwnProperty.call(this.selectedNodes,o)){const i=this.treeWidget.getNodeById(o);i&&e.isParentOf(i)&&t.push(i)}return t}}isNodeSelected(e){return null!=e.id?this.selectedNodes.has(e.id):!!this.selectedSingleNode&&this.selectedSingleNode.element===e.element}clear(){this.selectedNodes.clear(),this.selectedSingleNode=null}removeFromSelection(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];null==e.id?this.selectedSingleNode&&e.element===this.selectedSingleNode.element&&(this.selectedSingleNode=null):(this.selectedNodes.delete(e.id),t&&e.iterate((()=>(null!=e.id&&this.selectedNodes.delete(e.id),!0))))}addToSelection(e){null!=e.id?this.selectedNodes.add(e.id):this.selectedSingleNode=e}isFocusOnTree(){const e=document.activeElement;return Boolean(e&&"SPAN"===e.tagName&&this.treeWidget._containsElement(e))}}class I{constructor(e,t){this.init(e,t)}init(e,t){if(this.node=e,this.treeWidget=t,!e.element){const t=this.treeWidget.element.get(0);t&&(e.element=t)}e.element&&(this.$element=jQuery(e.element))}addDropHint(e){return this.mustShowBorderDropHint(e)?new F(this.$element,this.treeWidget._getScrollLeft()):new H(this.node,this.$element,e)}select(e){this.getLi().addClass("jqtree-selected");const t=this.getSpan();t.attr("tabindex",this.treeWidget.options.tabIndex??null),t.attr("aria-selected","true"),e&&t.trigger("focus")}deselect(){this.getLi().removeClass("jqtree-selected");const e=this.getSpan();e.removeAttr("tabindex"),e.attr("aria-selected","false"),e.trigger("blur")}getUl(){return this.$element.children("ul:first")}getSpan(){return this.$element.children(".jqtree-element").find("span.jqtree-title")}getLi(){return this.$element}mustShowBorderDropHint(e){return e===o.Inside}}class w extends I{open(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"fast";if(this.node.is_open)return;this.node.is_open=!0;const i=this.getButton();i.removeClass("jqtree-closed"),i.html("");const r=i.get(0);if(r){const e=this.treeWidget.renderer.openedIconElement;if(e){const t=e.cloneNode(!0);r.appendChild(t)}}const s=()=>{this.getLi().removeClass("jqtree-closed");this.getSpan().attr("aria-expanded","true"),e&&e(this.node),this.treeWidget._triggerEvent("tree.open",{node:this.node})};t?this.getUl().slideDown(o,s):(this.getUl().show(),s())}close(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fast";if(!this.node.is_open)return;this.node.is_open=!1;const o=this.getButton();o.addClass("jqtree-closed"),o.html("");const i=o.get(0);if(i){const e=this.treeWidget.renderer.closedIconElement;if(e){const t=e.cloneNode(!0);i.appendChild(t)}}const r=()=>{this.getLi().addClass("jqtree-closed");this.getSpan().attr("aria-expanded","false"),this.treeWidget._triggerEvent("tree.close",{node:this.node})};e?this.getUl().slideUp(t,r):(this.getUl().hide(),r())}mustShowBorderDropHint(e){return!this.node.is_open&&e===o.Inside}getButton(){return this.$element.children(".jqtree-element").find("a.jqtree-toggler")}}class F{constructor(e,t){const o=e.children(".jqtree-element"),i=e.width()||0,r=Math.max(i+t-4,0),s=o.outerHeight()||0,n=Math.max(s-4,0);this.$hint=jQuery(''),o.append(this.$hint),this.$hint.css({width:r,height:n})}remove(){this.$hint.remove()}}class H{constructor(e,t,i){this.$element=t,this.node=e,this.$ghost=jQuery('
  • \n
  • '),i===o.After?this.moveAfter():i===o.Before?this.moveBefore():i===o.Inside&&(e.isFolder()&&e.is_open?this.moveInsideOpenFolder():this.moveInside())}remove(){this.$ghost.remove()}moveAfter(){this.$element.after(this.$ghost)}moveBefore(){this.$element.before(this.$ghost)}moveInsideOpenFolder(){const e=this.node.children[0]?.element;e&&jQuery(e).before(this.$ghost)}moveInside(){this.$element.after(this.$ghost),this.$ghost.addClass("jqtree-inside")}}const b="Node parameter is empty",j="Parameter is empty: ";class W extends S{static defaults={animationSpeed:"fast",autoEscape:!0,autoOpen:!1,buttonLeft:!0,closedIcon:void 0,data:void 0,dataFilter:void 0,dataUrl:void 0,dragAndDrop:!1,keyboardSupport:!0,nodeClass:s,onCanMove:void 0,onCanMoveTo:void 0,onCanSelectNode:void 0,onCreateLi:void 0,onDragMove:void 0,onDragStop:void 0,onGetStateFromStorage:void 0,onIsMoveHandle:void 0,onLoadFailed:void 0,onLoading:void 0,onSetStateFromStorage:void 0,openedIcon:"▼",openFolderDelay:500,rtl:void 0,saveState:!1,selectable:!0,showEmptyFolder:!1,slide:!0,startDndDelay:300,tabIndex:0,useContextMenu:!0};toggle(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!e)throw Error(b);const o=t??this.options.slide;return e.is_open?this.closeNode(e,o):this.openNode(e,o),this.element}getTree(){return this.tree}selectNode(e,t){return this.doSelectNode(e,t),this.element}getSelectedNode(){return this.selectNodeHandler.getSelectedNode()}toJson(){return JSON.stringify(this.tree.getData())}loadData(e,t){return this.doLoadData(e,t),this.element}loadDataFromUrl(e,t,o){return"string"==typeof e?this.doLoadDataFromUrl(e,t,o??null):this.doLoadDataFromUrl(null,e,t),this.element}reload(e){return this.doLoadDataFromUrl(null,null,e),this.element}refresh(){return this._refreshElements(null),this.element}getNodeById(e){return this.tree.getNodeById(e)}getNodeByName(e){return this.tree.getNodeByName(e)}getNodeByNameMustExist(e){return this.tree.getNodeByNameMustExist(e)}getNodesByProperty(e,t){return this.tree.getNodesByProperty(e,t)}getNodeByHtmlElement(e){return this.getNode(jQuery(e))}getNodeByCallback(e){return this.tree.getNodeByCallback(e)}openNode(e,t,o){if(!e)throw Error(b);const[i,r]=(()=>{let e,i;return"function"==typeof t?(e=t,i=null):(i=t,e=o),null==i&&(i=this.options.slide??!1),[i,e]})();return this._openNode(e,i,r),this.element}closeNode(e,t){if(!e)throw Error(b);const o=t??this.options.slide;return(e.isFolder()||e.isEmptyFolder)&&(new w(e,this).close(o,this.options.animationSpeed),this.saveState()),this.element}isDragging(){return this.dndHandler.isDragging}refreshHitAreas(){return this.dndHandler.refresh(),this.element}addNodeAfter(e,t){const o=t.addAfter(e);return o&&this._refreshElements(t.parent),o}addNodeBefore(e,t){if(!t)throw Error(j+"existingNode");const o=t.addBefore(e);return o&&this._refreshElements(t.parent),o}addParentNode(e,t){if(!t)throw Error(j+"existingNode");const o=t.addParent(e);return o&&this._refreshElements(o.parent),o}removeNode(e){if(!e)throw Error(b);if(!e.parent)throw Error("Node has no parent");this.selectNodeHandler.removeFromSelection(e,!0);const t=e.parent;return e.remove(),this._refreshElements(t),this.element}appendNode(e,t){const o=t||this.tree,i=o.append(e);return this._refreshElements(o),i}prependNode(e,t){const o=t??this.tree,i=o.prepend(e);return this._refreshElements(o),i}updateNode(e,t){if(!e)throw Error(b);const o="object"==typeof t&&t.id&&t.id!==e.id;return o&&this.tree.removeNodeFromIndex(e),e.setData(t),o&&this.tree.addNodeToIndex(e),"object"==typeof t&&t.children&&t.children instanceof Array&&(e.removeChildren(),t.children.length&&e.loadFromData(t.children)),this._refreshElements(e),this.element}isSelectedNodeInSubtree(e){const t=this.getSelectedNode();return!!t&&(e===t||e.isParentOf(t))}moveNode(e,t,o){if(!e)throw Error(b);if(!t)throw Error(j+"targetNode");const r=i[o];return void 0!==r&&(this.tree.moveNode(e,t,r),this._refreshElements(null)),this.element}getStateFromStorage(){return this.saveStateHandler.getStateFromStorage()}addToSelection(e,t){if(!e)throw Error(b);return this.selectNodeHandler.addToSelection(e),this._getNodeElementForNode(e).select(void 0===t||t),this.saveState(),this.element}getSelectedNodes(){return this.selectNodeHandler.getSelectedNodes()}isNodeSelected(e){if(!e)throw Error(b);return this.selectNodeHandler.isNodeSelected(e)}removeFromSelection(e){if(!e)throw Error(b);return this.selectNodeHandler.removeFromSelection(e),this._getNodeElementForNode(e).deselect(),this.saveState(),this.element}scrollToNode(e){if(!e)throw Error(b);const t=(jQuery(e.element).offset()?.top??0)-(this.$el.offset()?.top??0);return this.scrollHandler.scrollToY(t),this.element}getState(){return this.saveStateHandler.getState()}setState(e){return this.saveStateHandler.setInitialState(e),this._refreshElements(null),this.element}setOption(e,t){return this.options[e]=t,this.element}moveDown(){const e=this.getSelectedNode();return e&&this.keyHandler.moveDown(e),this.element}moveUp(){const e=this.getSelectedNode();return e&&this.keyHandler.moveUp(e),this.element}getVersion(){return"1.7.5"}_triggerEvent(e,t){const o=jQuery.Event(e,t);return this.element.trigger(o),o}_openNode(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;const i=(e,t,o)=>{new w(e,this).open(o,t,this.options.animationSpeed)};if(e.isFolder()||e.isEmptyFolder)if(e.load_on_demand)this.loadFolderOnDemand(e,t,o);else{let r=e.parent;for(;r;)r.parent&&i(r,!1,null),r=r.parent;i(e,t,o),this.saveState()}}_refreshElements(e){const t=this.selectNodeHandler.isFocusOnTree(),o=!!e&&this.isSelectedNodeInSubtree(e);this.renderer.render(e),o&&this.selectCurrentNode(t),this._triggerEvent("tree.refresh")}_getNodeElementForNode(e){return e.isFolder()?new w(e,this):new I(e,this)}_getNodeElement(e){const t=this.getNode(e);return t?this._getNodeElementForNode(t):null}_containsElement(e){const t=this.getNode(jQuery(e));return null!=t&&t.tree===this.tree}_getScrollLeft(){return this.scrollHandler.getScrollLeft()}init(){super.init(),this.element=this.$el,this.isInitialized=!1,this.options.rtl=this.getRtlOption(),null==this.options.closedIcon&&(this.options.closedIcon=this.getDefaultClosedIcon()),this.renderer=new c(this),this.dataLoader=new u(this),this.saveStateHandler=new N(this),this.selectNodeHandler=new T(this),this.dndHandler=new n(this),this.scrollHandler=new E(this),this.keyHandler=new g(this),this.initData(),this.element.on("click",this.handleClick),this.element.on("dblclick",this.handleDblclick),this.options.useContextMenu&&this.element.on("contextmenu",this.handleContextmenu)}deinit(){this.element.empty(),this.element.off(),this.keyHandler.deinit(),this.tree=new s({},!0),super.deinit()}mouseCapture(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseCapture(e)}mouseStart(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseStart(e)}mouseDrag(e){if(this.options.dragAndDrop){const t=this.dndHandler.mouseDrag(e);return this.scrollHandler.checkScrolling(e),t}return!1}mouseStop(e){return!!this.options.dragAndDrop&&(this.scrollHandler.stopScrolling(),this.dndHandler.mouseStop(e))}getMouseDelay(){return this.options.startDndDelay??0}initData(){if(this.options.data)this.doLoadData(this.options.data,null);else{this.getDataUrlInfo(null)?this.doLoadDataFromUrl(null,null,null):this.doLoadData([],null)}}getDataUrlInfo(e){const t=this.options.dataUrl||this.element.data("url"),o=t=>{if(e?.id){const o={node:e.id};t.data=o}else{const e=this.getNodeIdToBeSelected();if(e){const o={selected_node:e};t.data=o}}};return"function"==typeof t?t(e):"string"==typeof t?(e=>{const t={url:e};return o(t),t})(t):t&&"object"==typeof t?(o(t),t):null}getNodeIdToBeSelected(){return this.options.saveState?this.saveStateHandler.getNodeIdToBeSelected():null}initTree(e){const t=()=>{this.isInitialized||(this.isInitialized=!0,this._triggerEvent("tree.init"))};if(!this.options.nodeClass)return;this.tree=new this.options.nodeClass(null,!0,this.options.nodeClass),this.selectNodeHandler.clear(),this.tree.loadFromData(e);const o=this.setInitialState();this._refreshElements(null),o?this.setInitialStateOnDemand(t):t()}setInitialState(){const e=()=>{if(!1===this.options.autoOpen)return!1;const e=this.getAutoOpenMaxLevel();let t=!1;return this.tree.iterate(((o,i)=>o.load_on_demand?(t=!0,!1):!!o.hasChildren()&&(o.is_open=!0,i!==e))),t};let[t,o]=(()=>{if(this.options.saveState){const e=this.saveStateHandler.getStateFromStorage();if(e){return[!0,this.saveStateHandler.setInitialState(e)]}return[!1,!1]}return[!1,!1]})();return t||(o=e()),o}setInitialStateOnDemand(e){const t=()=>{const t=this.getAutoOpenMaxLevel();let o=0;const i=e=>{o+=1,this._openNode(e,!1,(()=>{o-=1,r()}))},r=()=>{this.tree.iterate(((e,o)=>e.load_on_demand?(e.is_loading||i(e),!1):(this._openNode(e,!1,null),o!==t))),0===o&&e()};r()};(()=>{if(this.options.saveState){const t=this.saveStateHandler.getStateFromStorage();return!!t&&(this.saveStateHandler.setInitialStateOnDemand(t,e),!0)}return!1})()||t()}getAutoOpenMaxLevel(){return!0===this.options.autoOpen?-1:"number"==typeof this.options.autoOpen?this.options.autoOpen:"string"==typeof this.options.autoOpen?parseInt(this.options.autoOpen,10):0}handleClick=e=>{const t=this.getClickTarget(e.target);if(t)if("button"===t.type)this.toggle(t.node,this.options.slide),e.preventDefault(),e.stopPropagation();else if("label"===t.type){const o=t.node;this._triggerEvent("tree.click",{node:o,click_event:e}).isDefaultPrevented()||this.doSelectNode(o)}};handleDblclick=e=>{const t=this.getClickTarget(e.target);"label"===t?.type&&this._triggerEvent("tree.dblclick",{node:t.node,click_event:e})};getClickTarget(e){const t=jQuery(e),o=t.closest(".jqtree-toggler");if(o.length){const e=this.getNode(o);if(e)return{type:"button",node:e}}else{const e=t.closest(".jqtree-element");if(e.length){const t=this.getNode(e);if(t)return{type:"label",node:t}}}return null}getNode(e){const t=e.closest("li.jqtree_common");return 0===t.length?null:t.data("node")}handleContextmenu=e=>{const t=jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");if(t.length){const o=this.getNode(t);if(o)return e.preventDefault(),e.stopPropagation(),this._triggerEvent("tree.contextmenu",{node:o,click_event:e}),!1}return null};saveState(){this.options.saveState&&this.saveStateHandler.saveState()}selectCurrentNode(e){const t=this.getSelectedNode();if(t){const o=this._getNodeElementForNode(t);o&&o.select(e)}}deselectCurrentNode(){const e=this.getSelectedNode();e&&this.removeFromSelection(e)}getDefaultClosedIcon(){return this.options.rtl?"◀":"►"}getRtlOption(){if(null!=this.options.rtl)return this.options.rtl;{const e=this.element.data("rtl");return null!==e&&!1!==e&&void 0!==e}}doSelectNode(e,t){const o=()=>{this.options.saveState&&this.saveStateHandler.saveState()};if(!e)return this.deselectCurrentNode(),void o();const i={mustSetFocus:!0,mustToggle:!0,...t||{}},r=()=>{const t=e.parent;t&&t.parent&&!t.is_open&&this.openNode(t,!1)};if((()=>this.options.onCanSelectNode?!0===this.options.selectable&&this.options.onCanSelectNode(e):!0===this.options.selectable)()){if(this.selectNodeHandler.isNodeSelected(e))i.mustToggle&&(this.deselectCurrentNode(),this._triggerEvent("tree.select",{node:null,previous_node:e}));else{const t=this.getSelectedNode()||null;this.deselectCurrentNode(),this.addToSelection(e,i.mustSetFocus),this._triggerEvent("tree.select",{node:e,deselected_node:t}),r()}o()}}doLoadData(e,t){e&&(t?(this.deselectNodes(t),this.loadSubtree(e,t)):this.initTree(e),this.isDragging()&&this.dndHandler.refresh()),this._triggerEvent("tree.load_data",{tree_data:e,parent_node:t})}deselectNodes(e){const t=this.selectNodeHandler.getSelectedNodesUnder(e);for(const e of t)this.selectNodeHandler.removeFromSelection(e)}loadSubtree(e,t){t.loadFromData(e),t.load_on_demand=!1,t.is_loading=!1,this._refreshElements(t)}doLoadDataFromUrl(e,t,o){const i=e||this.getDataUrlInfo(t);this.dataLoader.loadFromUrl(i,t,o)}loadFolderOnDemand(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;e.is_loading=!0,this.doLoadDataFromUrl(null,e,(()=>{this._openNode(e,t,o)}))}}return p.register(W,"tree"),e.JqTreeWidget=W,e}({}); +var jqtree=function(e){"use strict";const t=e=>"object"==typeof e&&"children"in e&&e.children instanceof Array;let o=function(e){return e[e.Before=1]="Before",e[e.After=2]="After",e[e.Inside=3]="Inside",e[e.None=4]="None",e}({});const i={before:o.Before,after:o.After,inside:o.Inside,none:o.None},r=e=>{for(const t in i)if(Object.prototype.hasOwnProperty.call(i,t)&&i[t]===e)return t;return""};class s{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,o=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:s;this.name="",this.load_on_demand=!1,this.isEmptyFolder=null!=e&&t(e)&&0===e.children.length,this.setData(e),this.children=[],this.parent=null,o&&(this.idMapping=new Map,this.tree=this,this.nodeClass=i)}setData(e){if(e)if("string"==typeof e)this.name=e;else if("object"==typeof e)for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)){const o=e[t];"label"===t||"name"===t?"string"==typeof o&&(this.name=o):"children"!==t&&"parent"!==t&&(this[t]=o)}}loadFromData(e){this.removeChildren();for(const o of e){const e=this.createNode(o);this.addChild(e),t(o)&&e.loadFromData(o.children)}return this}addChild(e){this.children.push(e),e.setParent(this)}addChildAtPosition(e,t){this.children.splice(t,0,e),e.setParent(this)}removeChild(e){e.removeChildren(),this.doRemoveChild(e)}getChildIndex(e){return this.children.indexOf(e)}hasChildren(){return 0!==this.children.length}isFolder(){return this.hasChildren()||this.load_on_demand}iterate(e){const t=(o,i)=>{if(o.children)for(const r of o.children){e(r,i)&&r.hasChildren()&&t(r,i+1)}};t(this,0)}moveNode(e,t,i){if(!e.parent||e.isParentOf(t))return!1;switch(e.parent.doRemoveChild(e),i){case o.After:return!!t.parent&&(t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)+1),!0);case o.Before:return!!t.parent&&(t.parent.addChildAtPosition(e,t.parent.getChildIndex(t)),!0);case o.Inside:return t.addChildAtPosition(e,0),!0;default:return!1}}getData(){const e=t=>t.map((t=>{const o={};for(const e in t)if(-1===["parent","children","element","idMapping","load_on_demand","nodeClass","tree","isEmptyFolder"].indexOf(e)&&Object.prototype.hasOwnProperty.call(t,e)){const i=t[e];o[e]=i}return t.hasChildren()&&(o.children=e(t.children)),o}));return e(arguments.length>0&&void 0!==arguments[0]&&arguments[0]?[this]:this.children)}getNodeByName(e){return this.getNodeByCallback((t=>t.name===e))}getNodeByNameMustExist(e){const t=this.getNodeByCallback((t=>t.name===e));if(!t)throw`Node with name ${e} not found`;return t}getNodeByCallback(e){let t=null;return this.iterate((o=>!t&&(!e(o)||(t=o,!1)))),t}addAfter(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o+1),t.loadChildrenFromData(e),t}return null}addBefore(e){if(this.parent){const t=this.createNode(e),o=this.parent.getChildIndex(this);return this.parent.addChildAtPosition(t,o),t.loadChildrenFromData(e),t}return null}addParent(e){if(this.parent){const t=this.createNode(e);this.tree&&t.setParent(this.tree);const o=this.parent;for(const e of o.children)t.addChild(e);return o.children=[],o.addChild(t),t}return null}remove(){this.parent&&(this.parent.removeChild(this),this.parent=null)}append(e){const t=this.createNode(e);return this.addChild(t),t.loadChildrenFromData(e),t}prepend(e){const t=this.createNode(e);return this.addChildAtPosition(t,0),t.loadChildrenFromData(e),t}isParentOf(e){let t=e.parent;for(;t;){if(t===this)return!0;t=t.parent}return!1}getLevel(){let e=0,t=this;for(;t.parent;)e+=1,t=t.parent;return e}getNodeById(e){return this.idMapping.get(e)||null}addNodeToIndex(e){null!=e.id&&this.idMapping.set(e.id,e)}removeNodeFromIndex(e){null!=e.id&&this.idMapping.delete(e.id)}removeChildren(){this.iterate((e=>(this.tree?.removeNodeFromIndex(e),!0))),this.children=[]}getPreviousSibling(){if(this.parent){const e=this.parent.getChildIndex(this)-1;return e>=0&&this.parent.children[e]||null}return null}getNextSibling(){if(this.parent){const e=this.parent.getChildIndex(this)+1;return eo[e]===t))}filter(e){const t=[];return this.iterate((o=>(e(o)&&t.push(o),!0))),t}getNextNode(){if((!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&this.hasChildren())return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getNextVisibleNode(){if(this.hasChildren()&&this.is_open)return this.children[0]||null;if(this.parent){const e=this.getNextSibling();return e||this.parent.getNextNode(!1)}return null}getPreviousNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()?e.getLastChild():e:this.getParent()}return null}getPreviousVisibleNode(){if(this.parent){const e=this.getPreviousSibling();return e?e.hasChildren()&&e.is_open?e.getLastChild():e:this.getParent()}return null}getParent(){return this.parent&&this.parent.parent?this.parent:null}getLastChild(){if(this.hasChildren()){const e=this.children[this.children.length-1];return e?e.hasChildren()&&e.is_open?e?.getLastChild():e:null}return null}initFromData(e){const o=e=>{for(const t of e){const e=this.createNode();e.initFromData(t),this.addChild(e)}};(e=>{this.setData(e),t(e)&&e.children.length&&o(e.children)})(e)}setParent(e){this.parent=e,this.tree=e.tree,this.tree?.addNodeToIndex(this)}doRemoveChild(e){this.children.splice(this.getChildIndex(e),1),this.tree?.removeNodeFromIndex(e)}getNodeClass(){return this.nodeClass||this?.tree?.nodeClass||s}createNode(e){return new(this.getNodeClass())(e)}loadChildrenFromData(e){t(e)&&e.children.length&&this.loadFromData(e.children)}}class n{constructor(e,t,o,i,r){this.offsetX=t,this.offsetY=o,this.$element=jQuery("").addClass("jqtree-title jqtree-dragging"),r?this.$element.text(e):this.$element.html(e),this.$element.css("position","absolute"),i.append(this.$element)}move(e,t){this.$element.offset({left:e-this.offsetX,top:t-this.offsetY})}remove(){this.$element.remove()}}const l=e=>e?"true":"false",d=e=>e.getBoundingClientRect().y+window.scrollY;class a{constructor(e){this.tree=e}iterate(){let e=!0;const t=(o,i)=>{let r=(o.is_open||!o.element)&&o.hasChildren(),s=null;if(o.element?.offsetParent&&(s=o.element,e&&(this.handleFirstNode(o),e=!1),o.hasChildren()?o.is_open?this.handleOpenFolder(o,o.element)||(r=!1):this.handleClosedFolder(o,i,s):this.handleNode(o,i,o.element)),r){const e=o.children.length;o.children.forEach(((i,r)=>{const s=o.children[r];if(s)if(r===e-1)t(s,null);else{const e=o.children[r+1];e&&t(s,e)}})),o.is_open&&s&&this.handleAfterOpenFolder(o,i)}};t(this.tree,null)}}class h extends a{constructor(e,t,o){super(e),this.currentNode=t,this.treeBottom=o}generate(){return this.positions=[],this.lastTop=0,this.iterate(),this.generateHitAreas(this.positions)}generateHitAreas(e){let t=e[0]?.top??0,o=[];const i=[];for(const r of e)r.top!==t&&o.length&&(this.generateHitAreasForGroup(i,o,t,r.top),t=r.top,o=[]),o.push(r);return this.generateHitAreasForGroup(i,o,t,this.treeBottom),i}handleOpenFolder(e,t){return e!==this.currentNode&&(e.children[0]!==this.currentNode&&this.addPosition(e,o.Inside,d(t)),!0)}handleClosedFolder(e,t,i){const r=d(i);e===this.currentNode?this.addPosition(e,o.None,r):(this.addPosition(e,o.Inside,r),t!==this.currentNode&&this.addPosition(e,o.After,r))}handleFirstNode(e){e!==this.currentNode&&this.addPosition(e,o.Before,d(e.element))}handleAfterOpenFolder(e,t){e===this.currentNode||t===this.currentNode?this.addPosition(e,o.None,this.lastTop):this.addPosition(e,o.After,this.lastTop)}handleNode(e,t,i){const r=d(i);e===this.currentNode?this.addPosition(e,o.None,r):this.addPosition(e,o.Inside,r),t===this.currentNode||e===this.currentNode?this.addPosition(e,o.None,r):this.addPosition(e,o.After,r)}addPosition(e,t,o){const i={top:o,bottom:0,node:e,position:t};this.positions.push(i),this.lastTop=o}generateHitAreasForGroup(e,t,o,i){const r=Math.min(t.length,4),s=Math.round((i-o)/r);let n=o,l=0;for(;lo.right||t>o.bottom)return null;let i=0,r=this.hitAreas.length;for(;i>1,o=this.hitAreas[e];if(!o)return null;if(to.bottom))return o;i=e+1}}return null}mustOpenFolderTimer(e){const t=e.node;return t.isFolder()&&!t.is_open&&e.position===o.Inside}updateDropHint(){if(!this.hoveredArea)return;this.removeDropHint();const e=this.treeWidget._getNodeElementForNode(this.hoveredArea.node);this.previousGhost=e.addDropHint(this.hoveredArea.position)}startOpenFolderTimer(e){const t=()=>{this.treeWidget._openNode(e,this.treeWidget.options.slide,(()=>{this.refresh(),this.updateDropHint()}))};this.stopOpenFolderTimer();const o=this.treeWidget.options.openFolderDelay;!1!==o&&(this.openFolderTimer=window.setTimeout(t,o))}stopOpenFolderTimer(){this.openFolderTimer&&(clearTimeout(this.openFolderTimer),this.openFolderTimer=null)}moveItem(e){if(this.currentItem&&this.hoveredArea&&this.hoveredArea.position!==o.None&&this.canMoveToArea(this.hoveredArea)){const t=this.currentItem.node,i=this.hoveredArea.node,s=this.hoveredArea.position,n=t.parent;s===o.Inside&&(this.hoveredArea.node.is_open=!0);const l=()=>{this.treeWidget.tree.moveNode(t,i,s),this.treeWidget.element.empty(),this.treeWidget._refreshElements(null)};this.treeWidget._triggerEvent("tree.move",{move_info:{moved_node:t,target_node:i,position:r(s),previous_parent:n,do_move:l,original_event:e.originalEvent}}).isDefaultPrevented()||l()}}getTreeDimensions(){const e=this.treeWidget.element.offset();if(e){const t=this.treeWidget.element,o=t.width()||0,i=t.height()||0,r=e.left+this.treeWidget._getScrollLeft();return{left:r,top:e.top,right:r+o,bottom:e.top+i+16}}return{left:0,top:0,right:0,bottom:0}}}class u{constructor(e){this.treeWidget=e,this.openedIconElement=this.createButtonElement(e.options.openedIcon||"+"),this.closedIconElement=this.createButtonElement(e.options.closedIcon||"-")}render(e){e&&e.parent?this.renderFromNode(e):this.renderFromRoot()}renderFromRoot(){const e=this.treeWidget.element;e.empty(),e[0]&&this.createDomElements(e[0],this.treeWidget.tree.children,!0,1)}renderFromNode(e){const t=jQuery(e.element),o=this.createLi(e,e.getLevel());this.attachNodeData(e,o),t.after(o),t.remove(),e.children&&this.createDomElements(o,e.children,!1,e.getLevel()+1)}createDomElements(e,t,o,i){const r=this.createUl(o);e.appendChild(r);for(const e of t){const t=this.createLi(e,i);r.appendChild(t),this.attachNodeData(e,t),e.hasChildren()&&this.createDomElements(t,e.children,!1,i+1)}}attachNodeData(e,t){e.element=t,jQuery(t).data("node",e)}createUl(e){let t,o;e?(t="jqtree-tree",o="tree",this.treeWidget.options.rtl&&(t+=" jqtree-rtl")):(t="",o="group"),this.treeWidget.options.dragAndDrop&&(t+=" jqtree-dnd");const i=document.createElement("ul");return i.className=`jqtree_common ${t}`,i.setAttribute("role",o),i}createLi(e,t){const o=Boolean(this.treeWidget.selectNodeHandler.isNodeSelected(e)),i=e.isFolder()||e.isEmptyFolder&&this.treeWidget.options.showEmptyFolder?this.createFolderLi(e,t,o):this.createNodeLi(e,t,o);return this.treeWidget.options.onCreateLi&&this.treeWidget.options.onCreateLi(e,jQuery(i),o),i}setTreeItemAriaAttributes(e,t,o,i){e.setAttribute("aria-label",t),e.setAttribute("aria-level",`${o}`),e.setAttribute("aria-selected",l(i)),e.setAttribute("role","treeitem")}createFolderLi(e,t,o){const i=this.getButtonClasses(e),r=this.getFolderClasses(e,o),s=e.is_open?this.openedIconElement:this.closedIconElement,n=document.createElement("li");n.className=`jqtree_common ${r}`,n.setAttribute("role","none");const d=document.createElement("div");d.className="jqtree-element jqtree_common",d.setAttribute("role","none"),n.appendChild(d);const a=document.createElement("a");a.className=i,s&&a.appendChild(s.cloneNode(!0)),this.treeWidget.options.buttonLeft&&d.appendChild(a);const h=this.createTitleSpan(e.name,o,!0,t);return h.setAttribute("aria-expanded",l(e.is_open)),d.appendChild(h),this.treeWidget.options.buttonLeft||d.appendChild(a),n}createNodeLi(e,t,o){const i=["jqtree_common"];o&&i.push("jqtree-selected");const r=i.join(" "),s=document.createElement("li");s.className=r,s.setAttribute("role","none");const n=document.createElement("div");n.className="jqtree-element jqtree_common",n.setAttribute("role","none"),s.appendChild(n);const l=this.createTitleSpan(e.name,o,!1,t);return n.appendChild(l),s}createTitleSpan(e,t,o,i){const r=document.createElement("span");let s="jqtree-title jqtree_common";if(o&&(s+=" jqtree-title-folder"),s+=" jqtree-title-button-"+(this.treeWidget.options.buttonLeft?"left":"right"),r.className=s,t){const e=this.treeWidget.options.tabIndex;void 0!==e&&r.setAttribute("tabindex",`${e}`)}return this.setTreeItemAriaAttributes(r,e,i,t),this.treeWidget.options.autoEscape?r.textContent=e:r.innerHTML=e,r}getButtonClasses(e){const t=["jqtree-toggler","jqtree_common"];return e.is_open||t.push("jqtree-closed"),this.treeWidget.options.buttonLeft?t.push("jqtree-toggler-left"):t.push("jqtree-toggler-right"),t.join(" ")}getFolderClasses(e,t){const o=["jqtree-folder"];return e.is_open||o.push("jqtree-closed"),t&&o.push("jqtree-selected"),e.is_loading&&o.push("jqtree-loading"),o.join(" ")}createButtonElement(e){if("string"==typeof e){const t=document.createElement("div");return t.innerHTML=e,document.createTextNode(t.innerHTML)}return null==e?void 0:e.nodeType?e:jQuery(e)[0]}}class m{constructor(e){this.treeWidget=e}loadFromUrl(e,t,o){if(!e)return;const i=this.getDomElement(t);this.addLoadingClass(i),this.notifyLoading(!0,t,i);const r=()=>{this.removeLoadingClass(i),this.notifyLoading(!1,t,i)};this.submitRequest(e,(e=>{r(),this.treeWidget.loadData(this.parseData(e),t),o&&"function"==typeof o&&o()}),(e=>{r(),this.treeWidget.options.onLoadFailed&&this.treeWidget.options.onLoadFailed(e)}))}addLoadingClass(e){e&&e.addClass("jqtree-loading")}removeLoadingClass(e){e&&e.removeClass("jqtree-loading")}getDomElement(e){return e?jQuery(e.element):this.treeWidget.element}notifyLoading(e,t,o){this.treeWidget.options.onLoading&&this.treeWidget.options.onLoading(e,t,o),this.treeWidget._triggerEvent("tree.loading_data",{isLoading:e,node:t,$el:o})}submitRequest(e,t,o){const i={method:"GET",cache:!1,dataType:"json",success:t,error:o,..."string"==typeof e?{url:e}:e};i.method=i.method?.toUpperCase()||"GET",jQuery.ajax(i)}parseData(e){const{dataFilter:t}=this.treeWidget.options,o="string"==typeof e?JSON.parse(e):e;return t?t(o):o}}class g{handleKeyDownHandler=null;constructor(e){this.treeWidget=e,e.options.keyboardSupport&&(this.handleKeyDownHandler=this.handleKeyDown.bind(this),document.addEventListener("keydown",this.handleKeyDownHandler))}deinit(){this.handleKeyDownHandler&&document.removeEventListener("keydown",this.handleKeyDownHandler)}moveDown(e){return this.selectNode(e.getNextVisibleNode())}moveUp(e){return this.selectNode(e.getPreviousVisibleNode())}moveRight(e){return!e.isFolder()||(e.is_open?this.selectNode(e.getNextVisibleNode()):(this.treeWidget.openNode(e),!1))}moveLeft(e){return e.isFolder()&&e.is_open?(this.treeWidget.closeNode(e),!1):this.selectNode(e.getParent())}selectNode(e){return!e||(this.treeWidget.selectNode(e),!1)}handleKeyDown=e=>{if(!this.canHandleKeyboard())return!0;const t=this.treeWidget.getSelectedNode();if(!t)return!0;switch(e.key){case"ArrowDown":return this.moveDown(t);case"ArrowUp":return this.moveUp(t);case"ArrowRight":return this.moveRight(t);case"ArrowLeft":return this.moveLeft(t);default:return!0}};canHandleKeyboard(){return!!this.treeWidget.options.keyboardSupport&&this.treeWidget.selectNodeHandler.isFocusOnTree()}}const p=(e,t)=>{const o=()=>`simple_widget_${t}`,i=(e,t)=>{const o=jQuery.data(e,t);return o&&o instanceof f?o:null},r=(t,r)=>{const s=o();for(const o of t.get()){if(!i(o,s)){const t=new e(o,r);jQuery.data(o,s)||jQuery.data(o,s,t),t.init()}}return t};jQuery.fn[t]=function(t){if(!t)return r(this,null);if("object"==typeof t){return r(this,t)}if("string"==typeof t&&"_"!==t[0]){const r=t;if("destroy"===r)return(e=>{const t=o();for(const o of e.get()){const e=i(o,t);e&&e.destroy(),jQuery.removeData(o,t)}})(this);if("get_widget_class"===r)return e;for(var s=arguments.length,n=new Array(s>1?s-1:0),l=1;l{let r=null;for(const s of e.get()){const e=jQuery.data(s,o());if(e&&e instanceof f){const o=e[t];o&&"function"==typeof o&&(r=o.apply(e,i))}}return r})(this,r,n)}}};class f{static register(e,t){p(e,t)}static defaults={};constructor(e,t){this.$el=jQuery(e);const o=this.constructor.defaults;this.options={...o,...t}}destroy(){this.deinit()}init(){}deinit(){}}const v=e=>({pageX:e.pageX,pageY:e.pageY,target:e.target,originalEvent:e}),S=(e,t)=>({pageX:e.pageX,pageY:e.pageY,target:e.target,originalEvent:t});class N extends f{init(){const e=this.$el.get(0);e&&(e.addEventListener("mousedown",this.mouseDown,{passive:!1}),e.addEventListener("touchstart",this.touchStart,{passive:!1})),this.isMouseStarted=!1,this.mouseDelayTimer=null,this.isMouseDelayMet=!1,this.mouseDownInfo=null}deinit(){const e=this.$el.get(0);e&&(e.removeEventListener("mousedown",this.mouseDown,{passive:!1}),e.removeEventListener("touchstart",this.touchStart,{passive:!1})),this.removeMouseMoveEventListeners()}mouseDown=e=>{if(0!==e.button)return;this.handleMouseDown(v(e))&&e.cancelable&&e.preventDefault()};handleMouseDown(e){return this.isMouseStarted&&this.handleMouseUp(e),this.mouseDownInfo=e,!!this.mouseCapture(e)&&(this.handleStartMouse(),!0)}handleStartMouse(){document.addEventListener("mousemove",this.mouseMove,{passive:!1}),document.addEventListener("touchmove",this.touchMove,{passive:!1}),document.addEventListener("mouseup",this.mouseUp,{passive:!1}),document.addEventListener("touchend",this.touchEnd,{passive:!1});const e=this.getMouseDelay();e?this.startMouseDelayTimer(e):this.isMouseDelayMet=!0}startMouseDelayTimer(e){this.mouseDelayTimer&&clearTimeout(this.mouseDelayTimer),this.mouseDelayTimer=window.setTimeout((()=>{this.mouseDownInfo&&(this.isMouseDelayMet=!0)}),e),this.isMouseDelayMet=!1}mouseMove=e=>{this.handleMouseMove(e,v(e))};handleMouseMove(e,t){if(this.isMouseStarted)return this.mouseDrag(t),void(e.cancelable&&e.preventDefault());this.isMouseDelayMet&&(this.mouseDownInfo&&(this.isMouseStarted=!1!==this.mouseStart(this.mouseDownInfo)),this.isMouseStarted?(this.mouseDrag(t),e.cancelable&&e.preventDefault()):this.handleMouseUp(t))}mouseUp=e=>{this.handleMouseUp(v(e))};handleMouseUp(e){this.removeMouseMoveEventListeners(),this.isMouseDelayMet=!1,this.mouseDownInfo=null,this.isMouseStarted&&(this.isMouseStarted=!1,this.mouseStop(e))}removeMouseMoveEventListeners(){document.removeEventListener("mousemove",this.mouseMove,{passive:!1}),document.removeEventListener("touchmove",this.touchMove,{passive:!1}),document.removeEventListener("mouseup",this.mouseUp,{passive:!1}),document.removeEventListener("touchend",this.touchEnd,{passive:!1})}touchStart=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseDown(S(t,e))};touchMove=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseMove(e,S(t,e))};touchEnd=e=>{if(!e)return;if(e.touches.length>1)return;const t=e.changedTouches[0];t&&this.handleMouseUp(S(t,e))}}class D{constructor(e){this.treeWidget=e}saveState(){const e=JSON.stringify(this.getState());this.treeWidget.options.onSetStateFromStorage?this.treeWidget.options.onSetStateFromStorage(e):this.supportsLocalStorage()&&localStorage.setItem(this.getKeyName(),e)}getStateFromStorage(){const e=this.loadFromStorage();return e?this.parseState(e):null}getState(){return{open_nodes:(()=>{const e=[];return this.treeWidget.tree.iterate((t=>(t.is_open&&t.id&&t.hasChildren()&&e.push(t.id),!0))),e})(),selected_node:(()=>{const e=[];return this.treeWidget.getSelectedNodes().forEach((t=>{null!=t.id&&e.push(t.id)})),e})()}}setInitialState(e){if(e){let t=!1;return e.open_nodes&&(t=this.openInitialNodes(e.open_nodes)),e.selected_node&&(this.resetSelection(),this.selectInitialNodes(e.selected_node)),t}return!1}setInitialStateOnDemand(e,t){e?this.doSetInitialStateOnDemand(e.open_nodes,e.selected_node,t):t()}getNodeIdToBeSelected(){const e=this.getStateFromStorage();return e&&e.selected_node&&e.selected_node[0]||null}parseState(e){const t=JSON.parse(e);var o;return t&&t.selected_node&&("number"==typeof(o=t.selected_node)&&o%1==0)&&(t.selected_node=[t.selected_node]),t}loadFromStorage(){return this.treeWidget.options.onGetStateFromStorage?this.treeWidget.options.onGetStateFromStorage():this.supportsLocalStorage()?localStorage.getItem(this.getKeyName()):null}openInitialNodes(e){let t=!1;for(const o of e){const e=this.treeWidget.getNodeById(o);e&&(e.load_on_demand?t=!0:e.is_open=!0)}return t}selectInitialNodes(e){let t=0;for(const o of e){const e=this.treeWidget.getNodeById(o);e&&(t+=1,this.treeWidget.selectNodeHandler.addToSelection(e))}return 0!==t}resetSelection(){const e=this.treeWidget.selectNodeHandler;e.getSelectedNodes().forEach((t=>{e.removeFromSelection(t)}))}doSetInitialStateOnDemand(e,t,o){let i=0,r=e;const s=()=>{const e=[];for(const t of r){const o=this.treeWidget.getNodeById(t);o?o.is_loading||(o.load_on_demand?n(o):this.treeWidget._openNode(o,!1,null)):e.push(t)}r=e,this.selectInitialNodes(t)&&this.treeWidget._refreshElements(null),0===i&&o()},n=e=>{i+=1,this.treeWidget._openNode(e,!1,(()=>{i-=1,s()}))};s()}getKeyName(){return"string"==typeof this.treeWidget.options.saveState?this.treeWidget.options.saveState:"tree"}supportsLocalStorage(){return null==this._supportsLocalStorage&&(this._supportsLocalStorage=(()=>{if(null==localStorage)return!1;try{const e="_storage_test";sessionStorage.setItem(e,"value"),sessionStorage.removeItem(e)}catch(e){return!1}return!0})()),this._supportsLocalStorage}}class y{constructor(e){let{$container:t,refreshHitAreas:o}=e;this.$container=t,this.refreshHitAreas=o}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.verticalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return this.$container.scrollLeft()||0}scrollToY(e){this.$container.get(0).scrollTop=e}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.scrollParentTop=void 0,this.scrollParentBottom=void 0}getNewHorizontalScrollDirection(e){const t=this.$container.offset();if(!t)return;const o=this.$container.get(0),i=t.left+o.clientWidth,r=t.left;return e>i-20?"right":ethis.getScrollParentBottom()?"bottom":void 0}scrollHorizontally(){if(!this.horizontalScrollDirection)return;const e="left"===this.horizontalScrollDirection?-20:20;this.$container.get(0).scrollBy({left:e,top:0,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollHorizontally.bind(this),40)}scrollVertically(){if(!this.verticalScrollDirection)return;const e="top"===this.verticalScrollDirection?-20:20;this.$container.get(0).scrollBy({left:0,top:e,behavior:"instant"}),this.refreshHitAreas(),setTimeout(this.scrollVertically.bind(this),40)}getScrollParentTop(){return null==this.scrollParentTop&&(this.scrollParentTop=this.$container.offset()?.top||0),this.scrollParentTop}getScrollParentBottom(){return null==this.scrollParentBottom&&(this.scrollParentBottom=this.getScrollParentTop()+(this.$container.innerHeight()??0)),this.scrollParentBottom}}class _{constructor(e,t){this.$element=e,this.refreshHitAreas=t}checkHorizontalScrolling(e){const t=this.getNewHorizontalScrollDirection(e);this.horizontalScrollDirection!==t&&(this.horizontalScrollDirection=t,null!=this.horizontalScrollTimeout&&window.clearTimeout(this.horizontalScrollTimeout),t&&(this.horizontalScrollTimeout=window.setTimeout(this.scrollHorizontally.bind(this),40)))}checkVerticalScrolling(e){const t=this.getNewVerticalScrollDirection(e);this.verticalScrollDirection!==t&&(this.verticalScrollDirection=t,null!=this.verticalScrollTimeout&&(window.clearTimeout(this.verticalScrollTimeout),this.verticalScrollTimeout=void 0),t&&(this.verticalScrollTimeout=window.setTimeout(this.scrollVertically.bind(this),40)))}getScrollLeft(){return document.documentElement.scrollLeft}scrollToY(e){const t=this.$element.offset(),o=t?t.top:0;jQuery(document).scrollTop(e+o)}stopScrolling(){this.horizontalScrollDirection=void 0,this.verticalScrollDirection=void 0,this.documentScrollHeight=void 0,this.documentScrollWidth=void 0}getNewHorizontalScrollDirection(e){const t=e-(jQuery(document).scrollLeft()||0)<20;return e>(jQuery(window).width()||0)-20&&this.canScrollRight()?"right":t?"left":void 0}canScrollRight(){const e=document.documentElement;return e.scrollLeft+e.clientWidth{for(const t of["overflow","overflow-y"]){const o=e.css(t);if("auto"===o||"scroll"===o)return!0}return!1},w=(e,t)=>{const o=(e=>{if(E(e))return e;for(const t of e.parents().get()){const e=jQuery(t);if(E(e))return e}return null})(e);return o?.length&&"HTML"!==o[0]?.tagName?new y({$container:o,refreshHitAreas:t,$treeElement:e}):new _(e,t)};class C{constructor(e){this.treeWidget=e,this.scrollParent=void 0}checkScrolling(e){this.checkVerticalScrolling(e),this.checkHorizontalScrolling(e)}stopScrolling(){this.getScrollParent().stopScrolling()}scrollToY(e){this.getScrollParent().scrollToY(e)}getScrollLeft(){return this.getScrollParent().getScrollLeft()}checkVerticalScrolling(e){null!=e.pageY&&this.getScrollParent().checkVerticalScrolling(e.pageY)}checkHorizontalScrolling(e){null!=e.pageX&&this.getScrollParent().checkHorizontalScrolling(e.pageX)}getScrollParent(){return this.scrollParent||(this.scrollParent=w(this.treeWidget.$el,this.treeWidget.refreshHitAreas.bind(this.treeWidget))),this.scrollParent}}class T{constructor(e){this.treeWidget=e,this.selectedNodes=new Set,this.clear()}getSelectedNode(){const e=this.getSelectedNodes();return e.length&&e[0]||!1}getSelectedNodes(){if(this.selectedSingleNode)return[this.selectedSingleNode];{const e=[];return this.selectedNodes.forEach((t=>{const o=this.treeWidget.getNodeById(t);o&&e.push(o)})),e}}getSelectedNodesUnder(e){if(this.selectedSingleNode)return e.isParentOf(this.selectedSingleNode)?[this.selectedSingleNode]:[];{const t=[];for(const o in this.selectedNodes)if(Object.prototype.hasOwnProperty.call(this.selectedNodes,o)){const i=this.treeWidget.getNodeById(o);i&&e.isParentOf(i)&&t.push(i)}return t}}isNodeSelected(e){return null!=e.id?this.selectedNodes.has(e.id):!!this.selectedSingleNode&&this.selectedSingleNode.element===e.element}clear(){this.selectedNodes.clear(),this.selectedSingleNode=null}removeFromSelection(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];null==e.id?this.selectedSingleNode&&e.element===this.selectedSingleNode.element&&(this.selectedSingleNode=null):(this.selectedNodes.delete(e.id),t&&e.iterate((()=>(null!=e.id&&this.selectedNodes.delete(e.id),!0))))}addToSelection(e){null!=e.id?this.selectedNodes.add(e.id):this.selectedSingleNode=e}isFocusOnTree(){const e=document.activeElement;return Boolean(e&&"SPAN"===e.tagName&&this.treeWidget._containsElement(e))}}class I{constructor(e,t){const o=e.querySelector(":scope > .jqtree-element");if(!o)return void(this.hint=void 0);const i=Math.max(e.offsetWidth+t-4,0),r=Math.max(e.clientHeight-4,0),s=document.createElement("span");s.className="jqtree-border",s.style.width=`${i}px`,s.style.height=`${r}px`,this.hint=s,o.append(this.hint)}remove(){this.hint?.remove()}}class H{constructor(e,t,i){this.element=t,this.node=e,this.ghost=this.createGhostElement(),i===o.After?this.moveAfter():i===o.Before?this.moveBefore():i===o.Inside&&(e.isFolder()&&e.is_open?this.moveInsideOpenFolder():this.moveInside())}remove(){this.ghost.remove()}moveAfter(){this.element.after(this.ghost)}moveBefore(){this.element.before(this.ghost)}moveInsideOpenFolder(){const e=this.node.children[0]?.element;e&&e.before(this.ghost)}moveInside(){this.element.after(this.ghost),this.ghost.classList.add("jqtree-inside")}createGhostElement(){const e=document.createElement("li");e.className="jqtree_common jqtree-ghost";const t=document.createElement("span");t.className="jqtree_common jqtree-circle",e.append(t);const o=document.createElement("span");return o.className="jqtree_common jqtree-line",e.append(o),e}}class b{constructor(e,t){this.init(e,t)}init(e,t){if(this.node=e,this.treeWidget=t,!e.element){const t=this.treeWidget.element.get(0);t&&(e.element=t)}e.element&&(this.element=e.element)}addDropHint(e){return this.mustShowBorderDropHint(e)?new I(this.element,this.treeWidget._getScrollLeft()):new H(this.node,this.element,e)}select(e){this.element.classList.add("jqtree-selected");const t=this.getTitleSpan(),o=this.treeWidget.options.tabIndex;null!=o&&t.setAttribute("tabindex",o.toString()),t.setAttribute("aria-selected","true"),e&&t.focus()}deselect(){this.element.classList.remove("jqtree-selected");const e=this.getTitleSpan();e.removeAttribute("tabindex"),e.setAttribute("aria-selected","false"),e.blur()}getUl(){return this.element.querySelector(":scope > ul")}getTitleSpan(){return this.element.querySelector(":scope > .jqtree-element > span.jqtree-title")}mustShowBorderDropHint(e){return e===o.Inside}}class F extends b{open(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"fast";if(this.node.is_open)return;this.node.is_open=!0;const i=this.getButton();i.classList.remove("jqtree-closed"),i.innerHTML="";const r=this.treeWidget.renderer.openedIconElement;if(r){const e=r.cloneNode(!0);i.appendChild(e)}const s=()=>{this.element.classList.remove("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","true"),e&&e(this.node),this.treeWidget._triggerEvent("tree.open",{node:this.node})};t?jQuery(this.getUl()).slideDown(o,s):(jQuery(this.getUl()).show(),s())}close(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"fast";if(!this.node.is_open)return;this.node.is_open=!1;const o=this.getButton();o.classList.add("jqtree-closed"),o.innerHTML="";const i=this.treeWidget.renderer.closedIconElement;if(i){const e=i.cloneNode(!0);o.appendChild(e)}const r=()=>{this.element.classList.add("jqtree-closed");this.getTitleSpan().setAttribute("aria-expanded","false"),this.treeWidget._triggerEvent("tree.close",{node:this.node})};e?jQuery(this.getUl()).slideUp(t,r):(jQuery(this.getUl()).hide(),r())}mustShowBorderDropHint(e){return!this.node.is_open&&e===o.Inside}getButton(){return this.element.querySelector(":scope > .jqtree-element > a.jqtree-toggler")}}const A="Node parameter is empty",L="Parameter is empty: ";class W extends N{static defaults={animationSpeed:"fast",autoEscape:!0,autoOpen:!1,buttonLeft:!0,closedIcon:void 0,data:void 0,dataFilter:void 0,dataUrl:void 0,dragAndDrop:!1,keyboardSupport:!0,nodeClass:s,onCanMove:void 0,onCanMoveTo:void 0,onCanSelectNode:void 0,onCreateLi:void 0,onDragMove:void 0,onDragStop:void 0,onGetStateFromStorage:void 0,onIsMoveHandle:void 0,onLoadFailed:void 0,onLoading:void 0,onSetStateFromStorage:void 0,openedIcon:"▼",openFolderDelay:500,rtl:void 0,saveState:!1,selectable:!0,showEmptyFolder:!1,slide:!0,startDndDelay:300,tabIndex:0,useContextMenu:!0};toggle(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!e)throw Error(A);const o=t??this.options.slide;return e.is_open?this.closeNode(e,o):this.openNode(e,o),this.element}getTree(){return this.tree}selectNode(e,t){return this.doSelectNode(e,t),this.element}getSelectedNode(){return this.selectNodeHandler.getSelectedNode()}toJson(){return JSON.stringify(this.tree.getData())}loadData(e,t){return this.doLoadData(e,t),this.element}loadDataFromUrl(e,t,o){return"string"==typeof e?this.doLoadDataFromUrl(e,t,o??null):this.doLoadDataFromUrl(null,e,t),this.element}reload(e){return this.doLoadDataFromUrl(null,null,e),this.element}refresh(){return this._refreshElements(null),this.element}getNodeById(e){return this.tree.getNodeById(e)}getNodeByName(e){return this.tree.getNodeByName(e)}getNodeByNameMustExist(e){return this.tree.getNodeByNameMustExist(e)}getNodesByProperty(e,t){return this.tree.getNodesByProperty(e,t)}getNodeByHtmlElement(e){const t=e instanceof HTMLElement?e:e[0];return t?this.getNode(t):null}getNodeByCallback(e){return this.tree.getNodeByCallback(e)}openNode(e,t,o){if(!e)throw Error(A);const[i,r]=(()=>{let e,i;return"function"==typeof t?(e=t,i=null):(i=t,e=o),null==i&&(i=this.options.slide??!1),[i,e]})();return this._openNode(e,i,r),this.element}closeNode(e,t){if(!e)throw Error(A);const o=t??this.options.slide;return(e.isFolder()||e.isEmptyFolder)&&(new F(e,this).close(o,this.options.animationSpeed),this.saveState()),this.element}isDragging(){return this.dndHandler.isDragging}refreshHitAreas(){return this.dndHandler.refresh(),this.element}addNodeAfter(e,t){const o=t.addAfter(e);return o&&this._refreshElements(t.parent),o}addNodeBefore(e,t){if(!t)throw Error(L+"existingNode");const o=t.addBefore(e);return o&&this._refreshElements(t.parent),o}addParentNode(e,t){if(!t)throw Error(L+"existingNode");const o=t.addParent(e);return o&&this._refreshElements(o.parent),o}removeNode(e){if(!e)throw Error(A);if(!e.parent)throw Error("Node has no parent");this.selectNodeHandler.removeFromSelection(e,!0);const t=e.parent;return e.remove(),this._refreshElements(t),this.element}appendNode(e,t){const o=t||this.tree,i=o.append(e);return this._refreshElements(o),i}prependNode(e,t){const o=t??this.tree,i=o.prepend(e);return this._refreshElements(o),i}updateNode(e,t){if(!e)throw Error(A);const o="object"==typeof t&&t.id&&t.id!==e.id;return o&&this.tree.removeNodeFromIndex(e),e.setData(t),o&&this.tree.addNodeToIndex(e),"object"==typeof t&&t.children&&t.children instanceof Array&&(e.removeChildren(),t.children.length&&e.loadFromData(t.children)),this._refreshElements(e),this.element}isSelectedNodeInSubtree(e){const t=this.getSelectedNode();return!!t&&(e===t||e.isParentOf(t))}moveNode(e,t,o){if(!e)throw Error(A);if(!t)throw Error(L+"targetNode");const r=i[o];return void 0!==r&&(this.tree.moveNode(e,t,r),this._refreshElements(null)),this.element}getStateFromStorage(){return this.saveStateHandler.getStateFromStorage()}addToSelection(e,t){if(!e)throw Error(A);return this.selectNodeHandler.addToSelection(e),this._getNodeElementForNode(e).select(void 0===t||t),this.saveState(),this.element}getSelectedNodes(){return this.selectNodeHandler.getSelectedNodes()}isNodeSelected(e){if(!e)throw Error(A);return this.selectNodeHandler.isNodeSelected(e)}removeFromSelection(e){if(!e)throw Error(A);return this.selectNodeHandler.removeFromSelection(e),this._getNodeElementForNode(e).deselect(),this.saveState(),this.element}scrollToNode(e){if(!e)throw Error(A);const t=(jQuery(e.element).offset()?.top??0)-(this.$el.offset()?.top??0);return this.scrollHandler.scrollToY(t),this.element}getState(){return this.saveStateHandler.getState()}setState(e){return this.saveStateHandler.setInitialState(e),this._refreshElements(null),this.element}setOption(e,t){return this.options[e]=t,this.element}moveDown(){const e=this.getSelectedNode();return e&&this.keyHandler.moveDown(e),this.element}moveUp(){const e=this.getSelectedNode();return e&&this.keyHandler.moveUp(e),this.element}getVersion(){return"1.7.5"}_triggerEvent(e,t){const o=jQuery.Event(e,t);return this.element.trigger(o),o}_openNode(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;const i=(e,t,o)=>{new F(e,this).open(o,t,this.options.animationSpeed)};if(e.isFolder()||e.isEmptyFolder)if(e.load_on_demand)this.loadFolderOnDemand(e,t,o);else{let r=e.parent;for(;r;)r.parent&&i(r,!1,null),r=r.parent;i(e,t,o),this.saveState()}}_refreshElements(e){const t=this.selectNodeHandler.isFocusOnTree(),o=!!e&&this.isSelectedNodeInSubtree(e);this.renderer.render(e),o&&this.selectCurrentNode(t),this._triggerEvent("tree.refresh")}_getNodeElementForNode(e){return e.isFolder()?new F(e,this):new b(e,this)}_getNodeElement(e){const t=this.getNode(e);return t?this._getNodeElementForNode(t):null}_containsElement(e){const t=this.getNode(e);return null!=t&&t.tree===this.tree}_getScrollLeft(){return this.scrollHandler.getScrollLeft()}init(){super.init(),this.element=this.$el,this.isInitialized=!1,this.options.rtl=this.getRtlOption(),null==this.options.closedIcon&&(this.options.closedIcon=this.getDefaultClosedIcon()),this.renderer=new u(this),this.dataLoader=new m(this),this.saveStateHandler=new D(this),this.selectNodeHandler=new T(this),this.dndHandler=new c(this),this.scrollHandler=new C(this),this.keyHandler=new g(this),this.initData(),this.element.on("click",this.handleClick),this.element.on("dblclick",this.handleDblclick),this.options.useContextMenu&&this.element.on("contextmenu",this.handleContextmenu)}deinit(){this.element.empty(),this.element.off(),this.keyHandler.deinit(),this.tree=new s({},!0),super.deinit()}mouseCapture(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseCapture(e)}mouseStart(e){return!!this.options.dragAndDrop&&this.dndHandler.mouseStart(e)}mouseDrag(e){if(this.options.dragAndDrop){const t=this.dndHandler.mouseDrag(e);return this.scrollHandler.checkScrolling(e),t}return!1}mouseStop(e){return!!this.options.dragAndDrop&&(this.scrollHandler.stopScrolling(),this.dndHandler.mouseStop(e))}getMouseDelay(){return this.options.startDndDelay??0}initData(){if(this.options.data)this.doLoadData(this.options.data,null);else{this.getDataUrlInfo(null)?this.doLoadDataFromUrl(null,null,null):this.doLoadData([],null)}}getDataUrlInfo(e){const t=this.options.dataUrl||this.element.data("url"),o=t=>{if(e?.id){const o={node:e.id};t.data=o}else{const e=this.getNodeIdToBeSelected();if(e){const o={selected_node:e};t.data=o}}};return"function"==typeof t?t(e):"string"==typeof t?(e=>{const t={url:e};return o(t),t})(t):t&&"object"==typeof t?(o(t),t):null}getNodeIdToBeSelected(){return this.options.saveState?this.saveStateHandler.getNodeIdToBeSelected():null}initTree(e){const t=()=>{this.isInitialized||(this.isInitialized=!0,this._triggerEvent("tree.init"))};if(!this.options.nodeClass)return;this.tree=new this.options.nodeClass(null,!0,this.options.nodeClass),this.selectNodeHandler.clear(),this.tree.loadFromData(e);const o=this.setInitialState();this._refreshElements(null),o?this.setInitialStateOnDemand(t):t()}setInitialState(){const e=()=>{if(!1===this.options.autoOpen)return!1;const e=this.getAutoOpenMaxLevel();let t=!1;return this.tree.iterate(((o,i)=>o.load_on_demand?(t=!0,!1):!!o.hasChildren()&&(o.is_open=!0,i!==e))),t};let[t,o]=(()=>{if(this.options.saveState){const e=this.saveStateHandler.getStateFromStorage();if(e){return[!0,this.saveStateHandler.setInitialState(e)]}return[!1,!1]}return[!1,!1]})();return t||(o=e()),o}setInitialStateOnDemand(e){const t=()=>{const t=this.getAutoOpenMaxLevel();let o=0;const i=e=>{o+=1,this._openNode(e,!1,(()=>{o-=1,r()}))},r=()=>{this.tree.iterate(((e,o)=>e.load_on_demand?(e.is_loading||i(e),!1):(this._openNode(e,!1,null),o!==t))),0===o&&e()};r()};(()=>{if(this.options.saveState){const t=this.saveStateHandler.getStateFromStorage();return!!t&&(this.saveStateHandler.setInitialStateOnDemand(t,e),!0)}return!1})()||t()}getAutoOpenMaxLevel(){return!0===this.options.autoOpen?-1:"number"==typeof this.options.autoOpen?this.options.autoOpen:"string"==typeof this.options.autoOpen?parseInt(this.options.autoOpen,10):0}handleClick=e=>{const t=this.getClickTarget(e.target);if(t)if("button"===t.type)this.toggle(t.node,this.options.slide),e.preventDefault(),e.stopPropagation();else if("label"===t.type){const o=t.node;this._triggerEvent("tree.click",{node:o,click_event:e}).isDefaultPrevented()||this.doSelectNode(o)}};handleDblclick=e=>{const t=this.getClickTarget(e.target);"label"===t?.type&&this._triggerEvent("tree.dblclick",{node:t.node,click_event:e})};getClickTarget(e){const t=e.closest(".jqtree-toggler");if(t){const e=this.getNode(t);if(e)return{type:"button",node:e}}else{const t=e.closest(".jqtree-element");if(t){const e=this.getNode(t);if(e)return{type:"label",node:e}}}return null}getNode(e){const t=e.closest("li.jqtree_common");return t?jQuery(t).data("node"):null}handleContextmenu=e=>{const t=e.target.closest("ul.jqtree-tree .jqtree-element");if(t){const o=this.getNode(t);if(o)return e.preventDefault(),e.stopPropagation(),this._triggerEvent("tree.contextmenu",{node:o,click_event:e}),!1}return null};saveState(){this.options.saveState&&this.saveStateHandler.saveState()}selectCurrentNode(e){const t=this.getSelectedNode();if(t){const o=this._getNodeElementForNode(t);o&&o.select(e)}}deselectCurrentNode(){const e=this.getSelectedNode();e&&this.removeFromSelection(e)}getDefaultClosedIcon(){return this.options.rtl?"◀":"►"}getRtlOption(){if(null!=this.options.rtl)return this.options.rtl;{const e=this.element.data("rtl");return null!==e&&!1!==e&&void 0!==e}}doSelectNode(e,t){const o=()=>{this.options.saveState&&this.saveStateHandler.saveState()};if(!e)return this.deselectCurrentNode(),void o();const i={mustSetFocus:!0,mustToggle:!0,...t||{}},r=()=>{const t=e.parent;t&&t.parent&&!t.is_open&&this.openNode(t,!1)};if((()=>this.options.onCanSelectNode?!0===this.options.selectable&&this.options.onCanSelectNode(e):!0===this.options.selectable)()){if(this.selectNodeHandler.isNodeSelected(e))i.mustToggle&&(this.deselectCurrentNode(),this._triggerEvent("tree.select",{node:null,previous_node:e}));else{const t=this.getSelectedNode()||null;this.deselectCurrentNode(),this.addToSelection(e,i.mustSetFocus),this._triggerEvent("tree.select",{node:e,deselected_node:t}),r()}o()}}doLoadData(e,t){e&&(t?(this.deselectNodes(t),this.loadSubtree(e,t)):this.initTree(e),this.isDragging()&&this.dndHandler.refresh()),this._triggerEvent("tree.load_data",{tree_data:e,parent_node:t})}deselectNodes(e){const t=this.selectNodeHandler.getSelectedNodesUnder(e);for(const e of t)this.selectNodeHandler.removeFromSelection(e)}loadSubtree(e,t){t.loadFromData(e),t.load_on_demand=!1,t.is_loading=!1,this._refreshElements(t)}doLoadDataFromUrl(e,t,o){const i=e||this.getDataUrlInfo(t);this.dataLoader.loadFromUrl(i,t,o)}loadFolderOnDemand(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2?arguments[2]:void 0;e.is_loading=!0,this.doLoadDataFromUrl(null,e,(()=>{this._openNode(e,t,o)}))}}return f.register(W,"tree"),e.JqTreeWidget=W,e}({}); //# sourceMappingURL=tree.jquery.js.map diff --git a/tree.jquery.js.map b/tree.jquery.js.map index 8acbd057..6efbaf43 100644 --- a/tree.jquery.js.map +++ b/tree.jquery.js.map @@ -1 +1 @@ -{"version":3,"file":"tree.jquery.js","sources":["src/version.ts","src/nodeUtils.ts","src/node.ts","src/dragAndDropHandler.ts","src/util.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.7.5\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\n\nexport enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","import { getPositionName, Node, Position } from \"./node\";\nimport { DropHint, HitArea, PositionInfo } from \"./types\";\nimport { NodeElement } from \"./nodeElement\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const $element = jQuery(positionInfo.target);\n\n if (!this.mustCaptureElement($element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle($element)\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement($element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true,\n );\n\n this.isDragging = true;\n this.currentItem.$element.addClass(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.treeWidget.options.onDragMove) {\n this.treeWidget.options.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.$element.removeClass(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.treeWidget._getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.$element.addClass(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement($element: JQuery): boolean {\n return !$element.is(\"input,select,textarea\");\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName,\n );\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.treeWidget._getNodeElementForNode(\n this.hoveredArea.node,\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n },\n );\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.treeWidget.options.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let $element: JQuery | null = null;\n\n if (node.element) {\n $element = jQuery(node.element);\n\n if (!$element.is(\":visible\")) {\n return;\n }\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, $element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, $element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, $element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n _iterateNode(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n _iterateNode(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && $element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n $element: JQuery,\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(node: Node, $element: JQuery): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n $element: JQuery,\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null,\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport class HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom,\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, $element: JQuery): boolean {\n if (node === this.currentNode) {\n // Cannot move inside current item\n\n // Dnd over the current element is not possible: add a position with type None for the top and the bottom.\n const top = this.getTop($element);\n const height = $element.height() || 0;\n this.addPosition(node, Position.None, top);\n\n if (height > 5) {\n // Subtract 5 pixels to allow more space for the next element.\n this.addPosition(node, Position.None, top + height - 5);\n }\n\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== this.currentNode) {\n this.addPosition(node, Position.Inside, this.getTop($element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n $element: JQuery,\n ): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(\n node,\n Position.Before,\n this.getTop(jQuery(node.element)),\n );\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(node: Node, nextNode: Node, $element: JQuery): void {\n const top = this.getTop($element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private getTop($element: JQuery): number {\n const offset = $element.offset();\n\n return offset ? offset.top : 0;\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n ): void {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position && position.position !== Position.None) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nclass DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean,\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"\").addClass(\n \"jqtree-title jqtree-dragging\",\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = string | HTMLElement | JQuery;\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\",\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\",\n );\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n const $element = this.treeWidget.element;\n $element.empty();\n\n if ($element[0]) {\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 1,\n );\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(\n this.treeWidget.selectNodeHandler.isNodeSelected(node),\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.treeWidget.options.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.treeWidget.options.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const { dataFilter } = this.treeWidget.options;\n\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class KeyHandler {\n private static LEFT = 37;\n private static UP = 38;\n private static RIGHT = 39;\n private static DOWN = 40;\n\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n jQuery(document).on(\"keydown.jqtree\", this.handleKeyDown);\n }\n }\n\n public deinit(): void {\n jQuery(document).off(\"keydown.jqtree\");\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n } else {\n // Right expands a closed node\n this.treeWidget.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.treeWidget.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.treeWidget.selectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: JQuery.Event): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n const key = e.which;\n\n switch (key) {\n case KeyHandler.DOWN:\n return this.moveDown(selectedNode);\n\n case KeyHandler.UP:\n return this.moveUp(selectedNode);\n\n case KeyHandler.RIGHT:\n return this.moveRight(selectedNode);\n\n case KeyHandler.LEFT:\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\n );\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget extends SimpleWidget {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.mouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo\n ): void {\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.treeWidget.tree.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.treeWidget.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n $container: JQuery;\n refreshHitAreas: () => void;\n $treeElement: JQuery;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private $container: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ $container, refreshHitAreas }: Params) {\n this.$container = $container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.$container.scrollLeft() || 0;\n }\n\n public scrollToY(top: number): void {\n const container = this.$container.get(0) as HTMLElement;\n container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = this.$container.offset();\n if (!scrollParentOffset) {\n return undefined;\n }\n\n const container = this.$container.get(0) as HTMLElement;\n\n const rightEdge = scrollParentOffset.left + container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = this.$container.offset()?.top || 0;\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom =\n this.getScrollParentTop() +\n (this.$container.innerHeight() ?? 0);\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\nexport default class DocumentScrollParent implements ScrollParent {\n private $element: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n\n constructor($element: JQuery, refreshHitAreas: () => void) {\n this.$element = $element;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const offset = this.$element.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst hasOverFlow = ($element: JQuery): boolean => {\n for (const attr of [\"overflow\", \"overflow-y\"]) {\n const overflowValue = $element.css(attr);\n if (overflowValue === \"auto\" || overflowValue === \"scroll\") {\n return true;\n }\n }\n\n return false;\n};\n\nconst getParentWithOverflow = (\n $treeElement: JQuery,\n): JQuery | null => {\n if (hasOverFlow($treeElement)) {\n return $treeElement;\n }\n\n for (const element of $treeElement.parents().get()) {\n const $element = jQuery(element);\n if (hasOverFlow($element)) {\n return $element;\n }\n }\n\n return null;\n};\n\nconst createScrollParent = (\n $treeElement: JQuery,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const $container = getParentWithOverflow($treeElement);\n\n if ($container?.length && $container[0]?.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n $container,\n refreshHitAreas,\n $treeElement,\n });\n } else {\n return new DocumentScrollParent($treeElement, refreshHitAreas);\n }\n};\n\nexport default createScrollParent;\n","import { JqTreeWidget } from \"./tree.jquery\";\nimport { PositionInfo } from \"./types\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private scrollParent?: ScrollParent;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.scrollParent = undefined;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageY == null) {\n return;\n }\n\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageX == null) {\n return;\n }\n\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeWidget.$el,\n this.treeWidget.refreshHitAreas.bind(this.treeWidget),\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.treeWidget.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.treeWidget.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n\n public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { Position, Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { DropHint } from \"./types\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nexport class NodeElement {\n public node: Node;\n public $element: JQuery;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.$element = jQuery(node.element);\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.$element,\n this.treeWidget._getScrollLeft(),\n );\n } else {\n return new GhostDropHint(this.node, this.$element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n const $li = this.getLi();\n\n $li.addClass(\"jqtree-selected\");\n\n const $span = this.getSpan();\n $span.attr(\"tabindex\", this.treeWidget.options.tabIndex ?? null);\n $span.attr(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n $span.trigger(\"focus\");\n }\n }\n\n public deselect(): void {\n const $li = this.getLi();\n\n $li.removeClass(\"jqtree-selected\");\n\n const $span = this.getSpan();\n $span.removeAttr(\"tabindex\");\n $span.attr(\"aria-selected\", \"false\");\n\n $span.trigger(\"blur\");\n }\n\n protected getUl(): JQuery {\n return this.$element.children(\"ul:first\");\n }\n\n protected getSpan(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"span.jqtree-title\");\n }\n\n protected getLi(): JQuery {\n return this.$element;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport class FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const $button = this.getButton();\n $button.removeClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const openedIconElement =\n this.treeWidget.renderer.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n buttonEl.appendChild(icon);\n }\n }\n\n const doOpen = (): void => {\n const $li = this.getLi();\n $li.removeClass(\"jqtree-closed\");\n\n const $titleSpan = this.getSpan();\n $titleSpan.attr(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideDown(animationSpeed, doOpen);\n } else {\n this.getUl().show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const $button = this.getButton();\n $button.addClass(\"jqtree-closed\");\n $button.html(\"\");\n\n const buttonEl = $button.get(0);\n\n if (buttonEl) {\n const closedIconElement =\n this.treeWidget.renderer.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n buttonEl.appendChild(icon);\n }\n }\n\n const doClose = (): void => {\n const $li = this.getLi();\n $li.addClass(\"jqtree-closed\");\n\n const $titleSpan = this.getSpan();\n $titleSpan.attr(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n this.getUl().slideUp(animationSpeed, doClose);\n } else {\n this.getUl().hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): JQuery {\n return this.$element\n .children(\".jqtree-element\")\n .find(\"a.jqtree-toggler\");\n }\n}\n\nexport class BorderDropHint implements DropHint {\n private $hint: JQuery;\n\n constructor($element: JQuery, scrollLeft: number) {\n const $div = $element.children(\".jqtree-element\");\n\n const elWidth = $element.width() || 0;\n const width = Math.max(elWidth + scrollLeft - 4, 0);\n\n const elHeight = $div.outerHeight() || 0;\n const height = Math.max(elHeight - 4, 0);\n\n this.$hint = jQuery('');\n $div.append(this.$hint);\n\n this.$hint.css({ width, height });\n }\n\n public remove(): void {\n this.$hint.remove();\n }\n}\n\nclass GhostDropHint implements DropHint {\n private $element: JQuery;\n private node: Node;\n private $ghost: JQuery;\n\n constructor(node: Node, $element: JQuery, position: Position) {\n this.$element = $element;\n\n this.node = node;\n this.$ghost = jQuery(\n `
  • \n
  • `,\n );\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.$ghost.remove();\n }\n\n public moveAfter(): void {\n this.$element.after(this.$ghost);\n }\n\n public moveBefore(): void {\n this.$element.before(this.$ghost);\n }\n\n public moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n jQuery(childElement).before(this.$ghost);\n }\n }\n\n public moveInside(): void {\n this.$element.after(this.$ghost);\n this.$ghost.addClass(\"jqtree-inside\");\n }\n}\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport { FolderElement, NodeElement, OnFinishOpenNode } from \"./nodeElement\";\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends MouseWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this._refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n element: HTMLElement | JQuery,\n ): Node | null {\n return this.getNode(jQuery(element));\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this._openNode(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n new FolderElement(node, this).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this._refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data[\"children\"] &&\n data[\"children\"] instanceof Array\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children as Node[]);\n }\n }\n\n this._refreshElements(node);\n\n return this.element;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (!selectedNode) {\n return false;\n } else {\n return subtree === selectedNode || subtree.isParentOf(selectedNode);\n }\n }\n\n public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this._refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n\n this._getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this._getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const nodeTop = jQuery(node.element).offset()?.top ?? 0;\n const treeTop = this.$el.offset()?.top ?? 0;\n const top = nodeTop - treeTop;\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this._refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n public _triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null,\n ): void => {\n const folderElement = new FolderElement(_node, this);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false, null);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this._triggerEvent(\"tree.refresh\");\n }\n\n public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement($element: JQuery): NodeElement | null {\n const node = this.getNode($element);\n if (node) {\n return this._getNodeElementForNode(node);\n } else {\n return null;\n }\n }\n\n public _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(jQuery(element));\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\n }\n\n public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (!this.isInitialized) {\n this.isInitialized = true;\n this._triggerEvent(\"tree.init\");\n }\n };\n\n if (!this.options.nodeClass) {\n return;\n }\n\n this.tree = new this.options.nodeClass(\n null,\n true,\n this.options.nodeClass,\n );\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this._refreshElements(null);\n\n if (!mustLoadOnDemand) {\n doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\n }\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n if (!this.options.saveState) {\n return [false, false];\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return [false, false];\n } else {\n const mustLoadOnDemand =\n this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n }\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n } else if (!node.hasChildren()) {\n return false;\n } else {\n node.is_open = true;\n return level !== maxLevel;\n }\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\n }\n };\n\n const autoOpenNodes = (): void => {\n const maxLevel = this.getAutoOpenMaxLevel();\n let loadingCount = 0;\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n const openNodes = (): void => {\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loadAndOpenNode(node);\n }\n\n return false;\n } else {\n this._openNode(node, false, null);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n } else if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n } else if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n } else {\n return 0;\n }\n }\n\n private handleClick = (\n e: JQuery.ClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget?.type === \"label\") {\n this._triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private getClickTarget(element: EventTarget): ClickTarget | null {\n const $target = jQuery(element);\n\n const $button = $target.closest(\".jqtree-toggler\");\n\n if ($button.length) {\n const node = this.getNode($button as JQuery);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const $el = $target.closest(\".jqtree-element\");\n if ($el.length) {\n const node = this.getNode($el as JQuery);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode($element: JQuery): null | Node {\n const $li = $element.closest(\"li.jqtree_common\");\n if ($li.length === 0) {\n return null;\n } else {\n return $li.data(\"node\") as Node;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent,\n ) => {\n const $div = jQuery(e.target).closest(\"ul.jqtree-tree .jqtree-element\");\n if ($div.length) {\n const node = this.getNode($div);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this._triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this._getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this._triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this._triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n openParents();\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this._triggerEvent(\"tree.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this._refreshElements(parentNode);\n }\n\n private doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["isNodeRecordWithChildren","data","Array","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","Node","constructor","nodeData","arguments","length","undefined","isRoot","nodeClass","this","load_on_demand","isEmptyFolder","children","setData","parent","idMapping","Map","tree","o","key","value","loadFromData","removeChildren","childData","node","createNode","addChild","push","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","hasChildren","isFolder","iterate","callback","_iterate","level","child","moveNode","movedNode","targetNode","isParentOf","getData","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","n","result","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","remove","append","prepend","getLevel","getNodeById","nodeId","get","addNodeToIndex","id","set","removeNodeFromIndex","delete","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getNextVisibleNode","is_open","getPreviousNode","previousSibling","getLastChild","getParent","getPreviousVisibleNode","lastChild","initFromData","addChildren","childrenData","addNode","getNodeClass","DragAndDropHandler","treeWidget","hoveredArea","hitAreas","isDragging","currentItem","mouseCapture","positionInfo","$element","jQuery","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","mouseStart","pageX","pageY","refresh","offset","left","top","dragElement","DragElement","element","autoEscape","addClass","mouseDrag","move","area","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","removeClass","onDragStop","generateHitAreas","_getNodeElementForNode","hitAreasGenerator","HitAreasGenerator","getTreeDimensions","bottom","generate","is","onCanMoveTo","positionName","previousGhost","x","y","dimensions","right","low","high","mid","addDropHint","folder","openFolder","_openNode","slide","openFolderDelay","openFolderTimer","window","setTimeout","clearTimeout","previousParent","doMove","empty","_refreshElements","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","VisibleNodeIterator","isFirstNode","_iterateNode","nextNode","mustIterateInside","handleFirstNode","handleOpenFolder","handleClosedFolder","handleNode","childrenLength","forEach","_","i","nextChild","handleAfterOpenFolder","currentNode","treeBottom","super","positions","lastTop","previousTop","group","generateHitAreasForGroup","getTop","addPosition","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","nodeName","offsetX","offsetY","$tree","text","html","css","getBoolString","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","render","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","titleSpan","createTitleSpan","liClasses","join","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","DataLoader","loadFromUrl","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","loadData","parseData","jqXHR","onLoadFailed","isLoading","onLoading","urlInfoInput","handleSuccess","handleError","ajaxSettings","method","cache","dataType","success","error","url","toUpperCase","ajax","dataFilter","parsedData","JSON","parse","KeyHandler","static","keyboardSupport","on","handleKeyDown","deinit","off","moveDown","selectedNode","selectNode","moveUp","moveRight","openNode","moveLeft","closeNode","e","canHandleKeyboard","getSelectedNode","which","DOWN","UP","RIGHT","LEFT","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","init","fn","argument1","functionName","destroy","removeData","destroyWidget","_len","args","_key","callFunction","widgetFunction","apply","defaults","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","addEventListener","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeEventListener","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","handleMouseMove","touches","changedTouches","SaveStateHandler","saveState","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","open_nodes","getOpenNodeIds","openNodes","selected_node","getSelectedNodeIds","selectedNodeIds","getSelectedNodes","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","onGetStateFromStorage","getItem","nodeIds","selectCount","addToSelection","removeFromSelection","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","_supportsLocalStorage","testSupport","sessionStorage","removeItem","ContainerScrollParent","_ref","$container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","bind","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","getScrollLeft","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","container","rightEdge","clientWidth","leftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","innerHeight","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","isNearLeftEdge","canScrollRight","getDocumentScrollWidth","canScrollDown","clientHeight","getDocumentScrollHeight","scrollHeight","scrollWidth","hasOverFlow","attr","overflowValue","createScrollParent","$treeElement","parents","getParentWithOverflow","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","has","includeChildren","add","activeElement","_containsElement","NodeElement","mustShowBorderDropHint","BorderDropHint","GhostDropHint","select","mustSetFocus","getLi","$span","getSpan","trigger","deselect","removeAttr","getUl","find","FolderElement","open","animationSpeed","$button","getButton","buttonEl","renderer","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","$div","elWidth","max","elHeight","outerHeight","$hint","$ghost","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","useContextMenu","toggle","slideParam","Error","getTree","optionsParam","doSelectNode","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","getNode","parseParams","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","eventName","values","event","Event","doOpenNode","_node","_slide","_onFinished","loadFolderOnDemand","mustSelect","selectCurrentNode","isInitialized","getRtlOption","getDefaultClosedIcon","dataLoader","initData","handleClick","handleDblclick","handleContextmenu","getDataUrlInfo","setUrlInfoData","selectedNodeId","getUrlFromString","initTree","doInit","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","restoreState","parseInt","clickTarget","getClickTarget","type","stopPropagation","click_event","$target","closest","$li","deselectCurrentNode","dataRtl","selectOptions","mustToggle","openParents","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tree.jquery.js","sources":["src/version.ts","src/nodeUtils.ts","src/node.ts","src/dragAndDropHandler/dragElement.ts","src/util.ts","src/dragAndDropHandler/visibleNodeIterator.ts","src/dragAndDropHandler/hitAreasGenerator.ts","src/dragAndDropHandler/index.ts","src/elementsRenderer.ts","src/dataLoader.ts","src/keyHandler.ts","src/simple.widget.ts","src/mouse.widget.ts","src/saveStateHandler.ts","src/scrollHandler/containerScrollParent.ts","src/scrollHandler/documentScrollParent.ts","src/scrollHandler/createScrollParent.ts","src/scrollHandler.ts","src/selectNodeHandler.ts","src/nodeElement/borderDropHint.ts","src/nodeElement/ghostDropHint.ts","src/nodeElement/index.ts","src/nodeElement/folderElement.ts","src/tree.jquery.ts"],"sourcesContent":["const version = \"1.7.5\";\n\nexport default version;\n","interface NodeRecordWithChildren extends NodeRecord {\n children: NodeData[];\n}\n\nexport const isNodeRecordWithChildren = (\n data: NodeData,\n): data is NodeRecordWithChildren =>\n typeof data === \"object\" &&\n \"children\" in data &&\n data[\"children\"] instanceof Array;\n","import { isNodeRecordWithChildren } from \"./nodeUtils\";\n\nexport enum Position {\n Before = 1,\n After,\n Inside,\n None,\n}\n\nconst positionNames: Record = {\n before: Position.Before,\n after: Position.After,\n inside: Position.Inside,\n none: Position.None,\n};\n\ntype IterateCallback = (node: Node, level: number) => boolean;\n\nexport const getPositionName = (position: Position): string => {\n for (const name in positionNames) {\n if (Object.prototype.hasOwnProperty.call(positionNames, name)) {\n if (positionNames[name] === position) {\n return name;\n }\n }\n }\n\n return \"\";\n};\n\nexport const getPosition = (name: string): Position | undefined =>\n positionNames[name];\n\nexport class Node implements INode {\n public id?: NodeId;\n public name: string;\n public children: Node[];\n public parent: Node | null;\n public idMapping: Map;\n public tree?: Node;\n public nodeClass?: typeof Node;\n public load_on_demand: boolean;\n public is_open: boolean;\n public element: HTMLElement;\n public is_loading: boolean;\n public isEmptyFolder: boolean;\n\n [key: string]: unknown;\n\n constructor(\n nodeData: NodeData | null = null,\n isRoot = false,\n nodeClass = Node,\n ) {\n this.name = \"\";\n this.load_on_demand = false;\n\n this.isEmptyFolder =\n nodeData != null &&\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length === 0;\n\n this.setData(nodeData);\n\n this.children = [];\n this.parent = null;\n\n if (isRoot) {\n this.idMapping = new Map();\n this.tree = this;\n this.nodeClass = nodeClass;\n }\n }\n\n /*\n Set the data of this node.\n\n setData(string): set the name of the node\n setData(object): set attributes of the node\n\n Examples:\n setData('node1')\n\n setData({ name: 'node1', id: 1});\n\n setData({ name: 'node2', id: 2, color: 'green'});\n\n * This is an internal function; it is not in the docs\n * Does not remove existing node values\n */\n public setData(o: NodeData | null): void {\n if (!o) {\n return;\n } else if (typeof o === \"string\") {\n this.name = o;\n } else if (typeof o === \"object\") {\n for (const key in o) {\n if (Object.prototype.hasOwnProperty.call(o, key)) {\n const value = o[key];\n\n if (key === \"label\" || key === \"name\") {\n // You can use the 'label' key instead of 'name'; this is a legacy feature\n if (typeof value === \"string\") {\n this.name = value;\n }\n } else if (key !== \"children\" && key !== \"parent\") {\n // You can't update the children or the parent using this function\n this[key] = value;\n }\n }\n }\n }\n }\n\n /*\n Create tree from data.\n\n Structure of data is:\n [\n {\n name: 'node1',\n children: [\n { name: 'child1' },\n { name: 'child2' }\n ]\n },\n {\n name: 'node2'\n }\n ]\n */\n public loadFromData(data: NodeData[]): Node {\n this.removeChildren();\n\n for (const childData of data) {\n const node = this.createNode(childData);\n this.addChild(node);\n\n if (isNodeRecordWithChildren(childData)) {\n node.loadFromData(childData.children);\n }\n }\n\n return this;\n }\n\n /*\n Add child.\n\n tree.addChild(\n new Node('child1')\n );\n */\n public addChild(node: Node): void {\n this.children.push(node);\n node.setParent(this);\n }\n\n /*\n Add child at position. Index starts at 0.\n\n tree.addChildAtPosition(\n new Node('abc'),\n 1\n );\n */\n public addChildAtPosition(node: Node, index: number): void {\n this.children.splice(index, 0, node);\n node.setParent(this);\n }\n\n /*\n Remove child. This also removes the children of the node.\n\n tree.removeChild(tree.children[0]);\n */\n public removeChild(node: Node): void {\n // remove children from the index\n node.removeChildren();\n\n this.doRemoveChild(node);\n }\n\n /*\n Get child index.\n\n var index = getChildIndex(node);\n */\n public getChildIndex(node: Node): number {\n return this.children.indexOf(node);\n }\n\n /*\n Does the tree have children?\n\n if (tree.hasChildren()) {\n //\n }\n */\n public hasChildren(): boolean {\n return this.children.length !== 0;\n }\n\n public isFolder(): boolean {\n return this.hasChildren() || this.load_on_demand;\n }\n\n /*\n Iterate over all the nodes in the tree.\n\n Calls callback with (node, level).\n\n The callback must return true to continue the iteration on current node.\n\n tree.iterate(\n function(node, level) {\n console.log(node.name);\n\n // stop iteration after level 2\n return (level <= 2);\n }\n );\n\n */\n public iterate(callback: IterateCallback): void {\n const _iterate = (node: Node, level: number): void => {\n if (node.children) {\n for (const child of node.children) {\n const result = callback(child, level);\n\n if (result && child.hasChildren()) {\n _iterate(child, level + 1);\n }\n }\n }\n };\n\n _iterate(this, 0);\n }\n\n /*\n Move node relative to another node.\n\n Argument position: Position.BEFORE, Position.AFTER or Position.Inside\n\n // move node1 after node2\n tree.moveNode(node1, node2, Position.AFTER);\n */\n public moveNode(\n movedNode: Node,\n targetNode: Node,\n position: Position,\n ): boolean {\n if (!movedNode.parent || movedNode.isParentOf(targetNode)) {\n // - Node is parent of target node\n // - Or, parent is empty\n return false;\n } else {\n movedNode.parent.doRemoveChild(movedNode);\n\n switch (position) {\n case Position.After: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode) + 1,\n );\n return true;\n }\n return false;\n }\n\n case Position.Before: {\n if (targetNode.parent) {\n targetNode.parent.addChildAtPosition(\n movedNode,\n targetNode.parent.getChildIndex(targetNode),\n );\n return true;\n }\n return false;\n }\n\n case Position.Inside: {\n // move inside as first child\n targetNode.addChildAtPosition(movedNode, 0);\n return true;\n }\n\n default:\n return false;\n }\n }\n }\n\n /*\n Get the tree as data.\n */\n public getData(includeParent = false): NodeRecord[] {\n const getDataFromNodes = (nodes: Node[]): Record[] => {\n return nodes.map((node) => {\n const tmpNode: Record = {};\n\n for (const k in node) {\n if (\n [\n \"parent\",\n \"children\",\n \"element\",\n \"idMapping\",\n \"load_on_demand\",\n \"nodeClass\",\n \"tree\",\n \"isEmptyFolder\",\n ].indexOf(k) === -1 &&\n Object.prototype.hasOwnProperty.call(node, k)\n ) {\n const v = node[k];\n tmpNode[k] = v;\n }\n }\n\n if (node.hasChildren()) {\n tmpNode[\"children\"] = getDataFromNodes(node.children);\n }\n\n return tmpNode;\n });\n };\n\n if (includeParent) {\n return getDataFromNodes([this]);\n } else {\n return getDataFromNodes(this.children);\n }\n }\n\n public getNodeByName(name: string): Node | null {\n return this.getNodeByCallback((node: Node) => node.name === name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n const node = this.getNodeByCallback((n: Node) => n.name === name);\n\n if (!node) {\n throw `Node with name ${name} not found`;\n }\n\n return node;\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n let result: Node | null = null;\n\n this.iterate((node: Node) => {\n if (result) {\n return false;\n } else if (callback(node)) {\n result = node;\n return false;\n } else {\n return true;\n }\n });\n\n return result;\n }\n\n public addAfter(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex + 1);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addBefore(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const node = this.createNode(nodeInfo);\n\n const childIndex = this.parent.getChildIndex(this);\n this.parent.addChildAtPosition(node, childIndex);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n }\n\n public addParent(nodeInfo: NodeData): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const newParent = this.createNode(nodeInfo);\n\n if (this.tree) {\n newParent.setParent(this.tree);\n }\n const originalParent = this.parent;\n\n for (const child of originalParent.children) {\n newParent.addChild(child);\n }\n\n originalParent.children = [];\n originalParent.addChild(newParent);\n return newParent;\n }\n }\n\n public remove(): void {\n if (this.parent) {\n this.parent.removeChild(this);\n this.parent = null;\n }\n }\n\n public append(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChild(node);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public prepend(nodeInfo: NodeData): Node {\n const node = this.createNode(nodeInfo);\n this.addChildAtPosition(node, 0);\n\n node.loadChildrenFromData(nodeInfo);\n return node;\n }\n\n public isParentOf(node: Node): boolean {\n let parent = node.parent;\n\n while (parent) {\n if (parent === this) {\n return true;\n }\n\n parent = parent.parent;\n }\n\n return false;\n }\n\n public getLevel(): number {\n let level = 0;\n let node: Node = this; // eslint-disable-line @typescript-eslint/no-this-alias\n\n while (node.parent) {\n level += 1;\n node = node.parent;\n }\n\n return level;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.idMapping.get(nodeId) || null;\n }\n\n public addNodeToIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.set(node.id, node);\n }\n }\n\n public removeNodeFromIndex(node: Node): void {\n if (node.id != null) {\n this.idMapping.delete(node.id);\n }\n }\n\n public removeChildren(): void {\n this.iterate((child: Node) => {\n this.tree?.removeNodeFromIndex(child);\n return true;\n });\n\n this.children = [];\n }\n\n public getPreviousSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousIndex = this.parent.getChildIndex(this) - 1;\n if (previousIndex >= 0) {\n return this.parent.children[previousIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNextSibling(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const nextIndex = this.parent.getChildIndex(this) + 1;\n if (nextIndex < this.parent.children.length) {\n return this.parent.children[nextIndex] || null;\n } else {\n return null;\n }\n }\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.filter((node: Node) => node[key] === value);\n }\n\n public filter(f: (node: Node) => boolean): Node[] {\n const result: Node[] = [];\n\n this.iterate((node: Node) => {\n if (f(node)) {\n result.push(node);\n }\n\n return true;\n });\n\n return result;\n }\n\n public getNextNode(includeChildren = true): Node | null {\n if (includeChildren && this.hasChildren()) {\n return this.children[0] || null;\n } else if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n\n if (nextSibling) {\n return nextSibling;\n } else {\n return this.parent.getNextNode(false);\n }\n }\n }\n\n public getNextVisibleNode(): Node | null {\n if (this.hasChildren() && this.is_open) {\n // First child\n return this.children[0] || null;\n } else {\n if (!this.parent) {\n return null;\n } else {\n const nextSibling = this.getNextSibling();\n if (nextSibling) {\n // Next sibling\n return nextSibling;\n } else {\n // Next node of parent\n return this.parent.getNextNode(false);\n }\n }\n }\n }\n\n public getPreviousNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (previousSibling.hasChildren()) {\n return previousSibling.getLastChild();\n } else {\n return previousSibling;\n }\n }\n }\n\n public getPreviousVisibleNode(): Node | null {\n if (!this.parent) {\n return null;\n } else {\n const previousSibling = this.getPreviousSibling();\n\n if (!previousSibling) {\n return this.getParent();\n } else if (\n !previousSibling.hasChildren() ||\n !previousSibling.is_open\n ) {\n // Previous sibling\n return previousSibling;\n } else {\n // Last child of previous sibling\n return previousSibling.getLastChild();\n }\n }\n }\n\n public getParent(): Node | null {\n // Return parent except if it is the root node\n if (!this.parent) {\n return null;\n } else if (!this.parent.parent) {\n // Root node -> null\n return null;\n } else {\n return this.parent;\n }\n }\n\n public getLastChild(): Node | null {\n if (!this.hasChildren()) {\n return null;\n } else {\n const lastChild = this.children[this.children.length - 1];\n\n if (!lastChild) {\n return null;\n }\n\n if (!(lastChild.hasChildren() && lastChild.is_open)) {\n return lastChild;\n } else {\n return lastChild?.getLastChild();\n }\n }\n }\n\n // Init Node from data without making it the root of the tree\n public initFromData(data: NodeData): void {\n const addNode = (nodeData: NodeData): void => {\n this.setData(nodeData);\n\n if (\n isNodeRecordWithChildren(nodeData) &&\n nodeData.children.length\n ) {\n addChildren(nodeData.children);\n }\n };\n\n const addChildren = (childrenData: NodeData[]): void => {\n for (const child of childrenData) {\n const node = this.createNode();\n node.initFromData(child);\n this.addChild(node);\n }\n };\n\n addNode(data);\n }\n\n private setParent(parent: Node): void {\n this.parent = parent;\n this.tree = parent.tree;\n this.tree?.addNodeToIndex(this);\n }\n\n private doRemoveChild(node: Node): void {\n this.children.splice(this.getChildIndex(node), 1);\n this.tree?.removeNodeFromIndex(node);\n }\n\n private getNodeClass(): typeof Node {\n return this.nodeClass || this?.tree?.nodeClass || Node;\n }\n\n private createNode(nodeData?: NodeData): Node {\n const nodeClass = this.getNodeClass();\n return new nodeClass(nodeData);\n }\n\n // Load children data from nodeInfo if it has children\n private loadChildrenFromData(nodeInfo: NodeData) {\n if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {\n this.loadFromData(nodeInfo.children);\n }\n }\n}\n","class DragElement {\n private offsetX: number;\n private offsetY: number;\n private $element: JQuery;\n\n constructor(\n nodeName: string,\n offsetX: number,\n offsetY: number,\n $tree: JQuery,\n autoEscape: boolean,\n ) {\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n this.$element = jQuery(\"\").addClass(\n \"jqtree-title jqtree-dragging\",\n );\n\n if (autoEscape) {\n this.$element.text(nodeName);\n } else {\n this.$element.html(nodeName);\n }\n\n this.$element.css(\"position\", \"absolute\");\n $tree.append(this.$element);\n }\n\n public move(pageX: number, pageY: number): void {\n this.$element.offset({\n left: pageX - this.offsetX,\n top: pageY - this.offsetY,\n });\n }\n\n public remove(): void {\n this.$element.remove();\n }\n}\n\nexport default DragElement;\n","export const isInt = (n: unknown): boolean =>\n typeof n === \"number\" && n % 1 === 0;\n\nexport const isFunction = (v: unknown): boolean => typeof v === \"function\";\n\nexport const getBoolString = (value: unknown): string =>\n value ? \"true\" : \"false\";\n\nexport const getOffsetTop = (element: HTMLElement) =>\n element.getBoundingClientRect().y + window.scrollY;\n","import { Node } from \"../node\";\n\nabstract class VisibleNodeIterator {\n private tree: Node;\n\n constructor(tree: Node) {\n this.tree = tree;\n }\n\n protected iterate(): void {\n let isFirstNode = true;\n\n const _iterateNode = (node: Node, nextNode: Node | null): void => {\n let mustIterateInside =\n (node.is_open || !node.element) && node.hasChildren();\n\n let element: HTMLElement | null = null;\n\n // Is the element visible?\n if (node.element?.offsetParent) {\n element = node.element;\n\n if (isFirstNode) {\n this.handleFirstNode(node);\n isFirstNode = false;\n }\n\n if (!node.hasChildren()) {\n this.handleNode(node, nextNode, node.element);\n } else if (node.is_open) {\n if (!this.handleOpenFolder(node, node.element)) {\n mustIterateInside = false;\n }\n } else {\n this.handleClosedFolder(node, nextNode, element);\n }\n }\n\n if (mustIterateInside) {\n const childrenLength = node.children.length;\n node.children.forEach((_, i) => {\n const child = node.children[i];\n\n if (child) {\n if (i === childrenLength - 1) {\n _iterateNode(child, null);\n } else {\n const nextChild = node.children[i + 1];\n\n if (nextChild) {\n _iterateNode(child, nextChild);\n }\n }\n }\n });\n\n if (node.is_open && element) {\n this.handleAfterOpenFolder(node, nextNode);\n }\n }\n };\n\n _iterateNode(this.tree, null);\n }\n\n protected abstract handleNode(\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ): void;\n\n /*\n override\n return\n - true: continue iterating\n - false: stop iterating\n */\n protected abstract handleOpenFolder(\n node: Node,\n element: HTMLElement,\n ): boolean;\n\n protected abstract handleClosedFolder(\n node: Node,\n nextNode: Node | null,\n element: HTMLElement,\n ): void;\n\n protected abstract handleAfterOpenFolder(\n node: Node,\n nextNode: Node | null,\n ): void;\n\n protected abstract handleFirstNode(node: Node): void;\n}\n\nexport default VisibleNodeIterator;\n","import { HitArea } from \"../types\";\nimport { Node, Position } from \"../node\";\nimport { getOffsetTop } from \"../util\";\nimport VisibleNodeIterator from \"./visibleNodeIterator\";\n\nclass HitAreasGenerator extends VisibleNodeIterator {\n private currentNode: Node;\n private treeBottom: number;\n private positions: HitArea[];\n private lastTop: number;\n\n constructor(tree: Node, currentNode: Node, treeBottom: number) {\n super(tree);\n\n this.currentNode = currentNode;\n this.treeBottom = treeBottom;\n }\n\n public generate(): HitArea[] {\n this.positions = [];\n this.lastTop = 0;\n\n this.iterate();\n\n return this.generateHitAreas(this.positions);\n }\n\n protected generateHitAreas(positions: HitArea[]): HitArea[] {\n let previousTop = positions[0]?.top ?? 0;\n let group = [];\n const hitAreas: HitArea[] = [];\n\n for (const position of positions) {\n if (position.top !== previousTop && group.length) {\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n position.top,\n );\n\n previousTop = position.top;\n group = [];\n }\n\n group.push(position);\n }\n\n this.generateHitAreasForGroup(\n hitAreas,\n group,\n previousTop,\n this.treeBottom,\n );\n\n return hitAreas;\n }\n\n protected handleOpenFolder(node: Node, element: HTMLElement): boolean {\n if (node === this.currentNode) {\n // Cannot move inside current item\n // Stop iterating\n return false;\n }\n\n // Cannot move before current item\n if (node.children[0] !== this.currentNode) {\n this.addPosition(node, Position.Inside, getOffsetTop(element));\n }\n\n // Continue iterating\n return true;\n }\n\n protected handleClosedFolder(\n node: Node,\n nextNode: Node,\n element: HTMLElement,\n ): void {\n const top = getOffsetTop(element);\n\n if (node === this.currentNode) {\n // Cannot move after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n\n // Cannot move before current item\n if (nextNode !== this.currentNode) {\n this.addPosition(node, Position.After, top);\n }\n }\n }\n\n protected handleFirstNode(node: Node): void {\n if (node !== this.currentNode) {\n this.addPosition(node, Position.Before, getOffsetTop(node.element));\n }\n }\n\n protected handleAfterOpenFolder(node: Node, nextNode: Node): void {\n if (node === this.currentNode || nextNode === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, this.lastTop);\n } else {\n this.addPosition(node, Position.After, this.lastTop);\n }\n }\n\n protected handleNode(\n node: Node,\n nextNode: Node,\n element: HTMLElement,\n ): void {\n const top = getOffsetTop(element);\n\n if (node === this.currentNode) {\n // Cannot move inside current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.Inside, top);\n }\n\n if (nextNode === this.currentNode || node === this.currentNode) {\n // Cannot move before or after current item\n this.addPosition(node, Position.None, top);\n } else {\n this.addPosition(node, Position.After, top);\n }\n }\n\n private addPosition(node: Node, position: number, top: number): void {\n const area = {\n top,\n bottom: 0,\n node,\n position,\n };\n\n this.positions.push(area);\n this.lastTop = top;\n }\n\n private generateHitAreasForGroup(\n hitAreas: HitArea[],\n positionsInGroup: HitArea[],\n top: number,\n bottom: number,\n ): void {\n // limit positions in group\n const positionCount = Math.min(positionsInGroup.length, 4);\n\n const areaHeight = Math.round((bottom - top) / positionCount);\n let areaTop = top;\n\n let i = 0;\n while (i < positionCount) {\n const position = positionsInGroup[i];\n\n if (position) {\n hitAreas.push({\n top: areaTop,\n bottom: areaTop + areaHeight,\n node: position.node,\n position: position.position,\n });\n }\n\n areaTop += areaHeight;\n i += 1;\n }\n }\n}\n\nexport default HitAreasGenerator;\n","import { getPositionName, Node, Position } from \"../node\";\nimport { DropHint, HitArea, PositionInfo } from \"../types\";\nimport NodeElement from \"../nodeElement\";\nimport { JqTreeWidget } from \"../tree.jquery\";\nimport DragElement from \"./dragElement\";\nimport HitAreasGenerator from \"./hitAreasGenerator\";\n\ninterface Dimensions {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport class DragAndDropHandler {\n public hitAreas: HitArea[];\n public isDragging: boolean;\n public currentItem: NodeElement | null;\n public hoveredArea: HitArea | null;\n\n private treeWidget: JqTreeWidget;\n private dragElement: DragElement | null;\n private previousGhost: DropHint | null;\n private openFolderTimer: number | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.hoveredArea = null;\n this.hitAreas = [];\n this.isDragging = false;\n this.currentItem = null;\n }\n\n public mouseCapture(positionInfo: PositionInfo): boolean | null {\n const element = positionInfo.target;\n\n if (!this.mustCaptureElement(element)) {\n return null;\n }\n\n if (\n this.treeWidget.options.onIsMoveHandle &&\n !this.treeWidget.options.onIsMoveHandle(jQuery(element))\n ) {\n return null;\n }\n\n let nodeElement = this.treeWidget._getNodeElement(element);\n\n if (nodeElement && this.treeWidget.options.onCanMove) {\n if (!this.treeWidget.options.onCanMove(nodeElement.node)) {\n nodeElement = null;\n }\n }\n\n this.currentItem = nodeElement;\n return this.currentItem != null;\n }\n\n public mouseStart(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.refresh();\n\n const offset = jQuery(positionInfo.target).offset();\n const left = offset ? offset.left : 0;\n const top = offset ? offset.top : 0;\n\n const node = this.currentItem.node;\n\n this.dragElement = new DragElement(\n node.name,\n positionInfo.pageX - left,\n positionInfo.pageY - top,\n this.treeWidget.element,\n this.treeWidget.options.autoEscape ?? true,\n );\n\n this.isDragging = true;\n this.currentItem.element.classList.add(\"jqtree-moving\");\n\n return true;\n }\n\n public mouseDrag(positionInfo: PositionInfo): boolean {\n if (\n !this.currentItem ||\n !this.dragElement ||\n positionInfo.pageX === undefined ||\n positionInfo.pageY === undefined\n ) {\n return false;\n }\n\n this.dragElement.move(positionInfo.pageX, positionInfo.pageY);\n\n const area = this.findHoveredArea(\n positionInfo.pageX,\n positionInfo.pageY,\n );\n\n if (area && this.canMoveToArea(area)) {\n if (!area.node.isFolder()) {\n this.stopOpenFolderTimer();\n }\n\n if (this.hoveredArea !== area) {\n this.hoveredArea = area;\n\n // If this is a closed folder, start timer to open it\n if (this.mustOpenFolderTimer(area)) {\n this.startOpenFolderTimer(area.node);\n } else {\n this.stopOpenFolderTimer();\n }\n\n this.updateDropHint();\n }\n } else {\n this.removeDropHint();\n this.stopOpenFolderTimer();\n this.hoveredArea = area;\n }\n\n if (!area) {\n if (this.treeWidget.options.onDragMove) {\n this.treeWidget.options.onDragMove(\n this.currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return true;\n }\n\n public mouseStop(positionInfo: PositionInfo): boolean {\n this.moveItem(positionInfo);\n this.clear();\n this.removeHover();\n this.removeDropHint();\n this.removeHitAreas();\n\n const currentItem = this.currentItem;\n\n if (this.currentItem) {\n this.currentItem.element.classList.remove(\"jqtree-moving\");\n this.currentItem = null;\n }\n\n this.isDragging = false;\n\n if (!this.hoveredArea && currentItem) {\n if (this.treeWidget.options.onDragStop) {\n this.treeWidget.options.onDragStop(\n currentItem.node,\n positionInfo.originalEvent,\n );\n }\n }\n\n return false;\n }\n\n public refresh(): void {\n this.removeHitAreas();\n\n if (this.currentItem) {\n this.generateHitAreas();\n\n this.currentItem = this.treeWidget._getNodeElementForNode(\n this.currentItem.node,\n );\n\n if (this.isDragging) {\n this.currentItem.element.classList.add(\"jqtree-moving\");\n }\n }\n }\n\n private generateHitAreas(): void {\n if (!this.currentItem) {\n this.hitAreas = [];\n } else {\n const hitAreasGenerator = new HitAreasGenerator(\n this.treeWidget.tree,\n this.currentItem.node,\n this.getTreeDimensions().bottom,\n );\n this.hitAreas = hitAreasGenerator.generate();\n }\n }\n\n private mustCaptureElement(element: HTMLElement): boolean {\n const nodeName = element.nodeName;\n\n return (\n nodeName !== \"INPUT\" &&\n nodeName !== \"SELECT\" &&\n nodeName !== \"TEXTAREA\"\n );\n }\n\n private canMoveToArea(area: HitArea): boolean {\n if (!this.treeWidget.options.onCanMoveTo) {\n return true;\n }\n\n if (!this.currentItem) {\n return false;\n }\n\n const positionName = getPositionName(area.position);\n\n return this.treeWidget.options.onCanMoveTo(\n this.currentItem.node,\n area.node,\n positionName,\n );\n }\n\n private removeHitAreas(): void {\n this.hitAreas = [];\n }\n\n private clear(): void {\n if (this.dragElement) {\n this.dragElement.remove();\n this.dragElement = null;\n }\n }\n\n private removeDropHint(): void {\n if (this.previousGhost) {\n this.previousGhost.remove();\n }\n }\n\n private removeHover(): void {\n this.hoveredArea = null;\n }\n\n private findHoveredArea(x: number, y: number): HitArea | null {\n const dimensions = this.getTreeDimensions();\n\n if (\n x < dimensions.left ||\n y < dimensions.top ||\n x > dimensions.right ||\n y > dimensions.bottom\n ) {\n return null;\n }\n\n let low = 0;\n let high = this.hitAreas.length;\n while (low < high) {\n const mid = (low + high) >> 1;\n const area = this.hitAreas[mid];\n\n if (!area) {\n return null;\n }\n\n if (y < area.top) {\n high = mid;\n } else if (y > area.bottom) {\n low = mid + 1;\n } else {\n return area;\n }\n }\n\n return null;\n }\n\n private mustOpenFolderTimer(area: HitArea): boolean {\n const node = area.node;\n\n return (\n node.isFolder() &&\n !node.is_open &&\n area.position === Position.Inside\n );\n }\n\n private updateDropHint(): void {\n if (!this.hoveredArea) {\n return;\n }\n\n // remove previous drop hint\n this.removeDropHint();\n\n // add new drop hint\n const nodeElement = this.treeWidget._getNodeElementForNode(\n this.hoveredArea.node,\n );\n this.previousGhost = nodeElement.addDropHint(this.hoveredArea.position);\n }\n\n private startOpenFolderTimer(folder: Node): void {\n const openFolder = (): void => {\n this.treeWidget._openNode(\n folder,\n this.treeWidget.options.slide,\n () => {\n this.refresh();\n this.updateDropHint();\n },\n );\n };\n\n this.stopOpenFolderTimer();\n\n const openFolderDelay = this.treeWidget.options.openFolderDelay;\n\n if (openFolderDelay !== false) {\n this.openFolderTimer = window.setTimeout(\n openFolder,\n openFolderDelay,\n );\n }\n }\n\n private stopOpenFolderTimer(): void {\n if (this.openFolderTimer) {\n clearTimeout(this.openFolderTimer);\n this.openFolderTimer = null;\n }\n }\n\n private moveItem(positionInfo: PositionInfo): void {\n if (\n this.currentItem &&\n this.hoveredArea &&\n this.hoveredArea.position !== Position.None &&\n this.canMoveToArea(this.hoveredArea)\n ) {\n const movedNode = this.currentItem.node;\n const targetNode = this.hoveredArea.node;\n const position = this.hoveredArea.position;\n const previousParent = movedNode.parent;\n\n if (position === Position.Inside) {\n this.hoveredArea.node.is_open = true;\n }\n\n const doMove = (): void => {\n this.treeWidget.tree.moveNode(movedNode, targetNode, position);\n this.treeWidget.element.empty();\n this.treeWidget._refreshElements(null);\n };\n\n const event = this.treeWidget._triggerEvent(\"tree.move\", {\n move_info: {\n moved_node: movedNode,\n target_node: targetNode,\n position: getPositionName(position),\n previous_parent: previousParent,\n do_move: doMove,\n original_event: positionInfo.originalEvent,\n },\n });\n\n if (!event.isDefaultPrevented()) {\n doMove();\n }\n }\n }\n\n private getTreeDimensions(): Dimensions {\n // Return the dimensions of the tree. Add a margin to the bottom to allow\n // to drag-and-drop after the last element.\n const offset = this.treeWidget.element.offset();\n\n if (!offset) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n } else {\n const el = this.treeWidget.element;\n const width = el.width() || 0;\n const height = el.height() || 0;\n const left = offset.left + this.treeWidget._getScrollLeft();\n\n return {\n left,\n top: offset.top,\n right: left + width,\n bottom: offset.top + height + 16,\n };\n }\n }\n}\n","import { getBoolString } from \"./util\";\nimport { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype IconElement = string | HTMLElement | JQuery;\n\nexport default class ElementsRenderer {\n public openedIconElement?: HTMLElement | Text;\n public closedIconElement?: HTMLElement | Text;\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n this.openedIconElement = this.createButtonElement(\n treeWidget.options.openedIcon || \"+\",\n );\n this.closedIconElement = this.createButtonElement(\n treeWidget.options.closedIcon || \"-\",\n );\n }\n\n public render(fromNode: Node | null): void {\n if (fromNode && fromNode.parent) {\n this.renderFromNode(fromNode);\n } else {\n this.renderFromRoot();\n }\n }\n\n public renderFromRoot(): void {\n const $element = this.treeWidget.element;\n $element.empty();\n\n if ($element[0]) {\n this.createDomElements(\n $element[0],\n this.treeWidget.tree.children,\n true,\n 1,\n );\n }\n }\n\n public renderFromNode(node: Node): void {\n // remember current li\n const $previousLi = jQuery(node.element);\n\n // create element\n const li = this.createLi(node, node.getLevel());\n this.attachNodeData(node, li);\n\n // add element to dom\n $previousLi.after(li);\n\n // remove previous li\n $previousLi.remove();\n\n // create children\n if (node.children) {\n this.createDomElements(\n li,\n node.children,\n false,\n node.getLevel() + 1,\n );\n }\n }\n\n private createDomElements(\n element: Element,\n children: Node[],\n isRootNode: boolean,\n level: number,\n ): void {\n const ul = this.createUl(isRootNode);\n element.appendChild(ul);\n\n for (const child of children) {\n const li = this.createLi(child, level);\n ul.appendChild(li);\n\n this.attachNodeData(child, li);\n\n if (child.hasChildren()) {\n this.createDomElements(li, child.children, false, level + 1);\n }\n }\n }\n\n private attachNodeData(node: Node, li: HTMLElement): void {\n node.element = li;\n jQuery(li).data(\"node\", node);\n }\n\n private createUl(isRootNode: boolean): HTMLUListElement {\n let classString;\n let role;\n\n if (!isRootNode) {\n classString = \"\";\n role = \"group\";\n } else {\n classString = \"jqtree-tree\";\n role = \"tree\";\n\n if (this.treeWidget.options.rtl) {\n classString += \" jqtree-rtl\";\n }\n }\n\n if (this.treeWidget.options.dragAndDrop) {\n classString += \" jqtree-dnd\";\n }\n\n const ul = document.createElement(\"ul\");\n ul.className = `jqtree_common ${classString}`;\n\n ul.setAttribute(\"role\", role);\n\n return ul;\n }\n\n private createLi(node: Node, level: number): HTMLLIElement {\n const isSelected = Boolean(\n this.treeWidget.selectNodeHandler.isNodeSelected(node),\n );\n\n const mustShowFolder =\n node.isFolder() ||\n (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);\n\n const li = mustShowFolder\n ? this.createFolderLi(node, level, isSelected)\n : this.createNodeLi(node, level, isSelected);\n\n if (this.treeWidget.options.onCreateLi) {\n this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);\n }\n\n return li;\n }\n\n private setTreeItemAriaAttributes(\n element: HTMLElement,\n name: string,\n level: number,\n isSelected: boolean,\n ) {\n element.setAttribute(\"aria-label\", name);\n element.setAttribute(\"aria-level\", `${level}`);\n element.setAttribute(\"aria-selected\", getBoolString(isSelected));\n element.setAttribute(\"role\", \"treeitem\");\n }\n\n private createFolderLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const buttonClasses = this.getButtonClasses(node);\n const folderClasses = this.getFolderClasses(node, isSelected);\n\n const iconElement = node.is_open\n ? this.openedIconElement\n : this.closedIconElement;\n\n // li\n const li = document.createElement(\"li\");\n li.className = `jqtree_common ${folderClasses}`;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // button link\n const buttonLink = document.createElement(\"a\");\n buttonLink.className = buttonClasses;\n\n if (iconElement) {\n buttonLink.appendChild(iconElement.cloneNode(true));\n }\n\n if (this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n true,\n level,\n );\n titleSpan.setAttribute(\"aria-expanded\", getBoolString(node.is_open));\n div.appendChild(titleSpan);\n\n if (!this.treeWidget.options.buttonLeft) {\n div.appendChild(buttonLink);\n }\n\n return li;\n }\n\n private createNodeLi(\n node: Node,\n level: number,\n isSelected: boolean,\n ): HTMLLIElement {\n const liClasses = [\"jqtree_common\"];\n\n if (isSelected) {\n liClasses.push(\"jqtree-selected\");\n }\n\n const classString = liClasses.join(\" \");\n\n // li\n const li = document.createElement(\"li\");\n li.className = classString;\n li.setAttribute(\"role\", \"none\");\n\n // div\n const div = document.createElement(\"div\");\n div.className = \"jqtree-element jqtree_common\";\n div.setAttribute(\"role\", \"none\");\n\n li.appendChild(div);\n\n // title span\n const titleSpan = this.createTitleSpan(\n node.name,\n isSelected,\n false,\n level,\n );\n div.appendChild(titleSpan);\n\n return li;\n }\n\n private createTitleSpan(\n nodeName: string,\n isSelected: boolean,\n isFolder: boolean,\n level: number,\n ): HTMLSpanElement {\n const titleSpan = document.createElement(\"span\");\n\n let classes = \"jqtree-title jqtree_common\";\n\n if (isFolder) {\n classes += \" jqtree-title-folder\";\n }\n\n classes += ` jqtree-title-button-${\n this.treeWidget.options.buttonLeft ? \"left\" : \"right\"\n }`;\n\n titleSpan.className = classes;\n\n if (isSelected) {\n const tabIndex = this.treeWidget.options.tabIndex;\n\n if (tabIndex !== undefined) {\n titleSpan.setAttribute(\"tabindex\", `${tabIndex}`);\n }\n }\n\n this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);\n\n if (this.treeWidget.options.autoEscape) {\n titleSpan.textContent = nodeName;\n } else {\n titleSpan.innerHTML = nodeName;\n }\n\n return titleSpan;\n }\n\n private getButtonClasses(node: Node): string {\n const classes = [\"jqtree-toggler\", \"jqtree_common\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (this.treeWidget.options.buttonLeft) {\n classes.push(\"jqtree-toggler-left\");\n } else {\n classes.push(\"jqtree-toggler-right\");\n }\n\n return classes.join(\" \");\n }\n\n private getFolderClasses(node: Node, isSelected: boolean): string {\n const classes = [\"jqtree-folder\"];\n\n if (!node.is_open) {\n classes.push(\"jqtree-closed\");\n }\n\n if (isSelected) {\n classes.push(\"jqtree-selected\");\n }\n\n if (node.is_loading) {\n classes.push(\"jqtree-loading\");\n }\n\n return classes.join(\" \");\n }\n\n private createButtonElement(\n value: IconElement,\n ): HTMLElement | Text | undefined {\n if (typeof value === \"string\") {\n // convert value to html\n const div = document.createElement(\"div\");\n div.innerHTML = value;\n\n return document.createTextNode(div.innerHTML);\n } else if (value == null) {\n return undefined;\n } else if ((value as HTMLElement).nodeType) {\n return value as HTMLElement;\n } else {\n return jQuery(value)[0];\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport type HandleFinishedLoading = () => void;\n\nexport default class DataLoader {\n private treeWidget: JqTreeWidget;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public loadFromUrl(\n urlInfo: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null\n ): void {\n if (!urlInfo) {\n return;\n }\n\n const $el = this.getDomElement(parentNode);\n this.addLoadingClass($el);\n this.notifyLoading(true, parentNode, $el);\n\n const stopLoading = (): void => {\n this.removeLoadingClass($el);\n this.notifyLoading(false, parentNode, $el);\n };\n\n const handleSuccess = (data: string | NodeData[]): void => {\n stopLoading();\n this.treeWidget.loadData(this.parseData(data), parentNode);\n\n if (onFinished && typeof onFinished === \"function\") {\n onFinished();\n }\n };\n\n const handleError = (jqXHR: JQuery.jqXHR): void => {\n stopLoading();\n\n if (this.treeWidget.options.onLoadFailed) {\n this.treeWidget.options.onLoadFailed(jqXHR);\n }\n };\n\n this.submitRequest(urlInfo, handleSuccess, handleError);\n }\n\n private addLoadingClass($el: JQuery): void {\n if ($el) {\n $el.addClass(\"jqtree-loading\");\n }\n }\n\n private removeLoadingClass($el: JQuery): void {\n if ($el) {\n $el.removeClass(\"jqtree-loading\");\n }\n }\n\n private getDomElement(parentNode: Node | null): JQuery {\n if (parentNode) {\n return jQuery(parentNode.element);\n } else {\n return this.treeWidget.element;\n }\n }\n\n private notifyLoading(\n isLoading: boolean,\n node: Node | null,\n $el: JQuery\n ): void {\n if (this.treeWidget.options.onLoading) {\n this.treeWidget.options.onLoading(isLoading, node, $el);\n }\n\n this.treeWidget._triggerEvent(\"tree.loading_data\", {\n isLoading,\n node,\n $el,\n });\n }\n\n private submitRequest(\n urlInfoInput: string | JQuery.AjaxSettings,\n handleSuccess: JQuery.Ajax.SuccessCallback,\n handleError: JQuery.Ajax.ErrorCallback\n ): void {\n const urlInfo =\n typeof urlInfoInput === \"string\"\n ? { url: urlInfoInput }\n : urlInfoInput;\n\n const ajaxSettings: JQuery.AjaxSettings = {\n method: \"GET\",\n cache: false,\n dataType: \"json\",\n success: handleSuccess,\n error: handleError,\n ...urlInfo,\n };\n\n ajaxSettings.method = ajaxSettings.method?.toUpperCase() || \"GET\";\n\n void jQuery.ajax(ajaxSettings);\n }\n\n private parseData(data: string | NodeData[]): NodeData[] {\n const { dataFilter } = this.treeWidget.options;\n\n const getParsedData = () => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as NodeData[];\n } else {\n return data;\n }\n };\n\n const parsedData = getParsedData();\n\n if (dataFilter) {\n return dataFilter(parsedData);\n } else {\n return parsedData;\n }\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\ntype KeyboardEventHandler = (event: KeyboardEvent) => boolean;\n\nexport default class KeyHandler {\n private treeWidget: JqTreeWidget;\n private handleKeyDownHandler: KeyboardEventHandler | null = null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n\n if (treeWidget.options.keyboardSupport) {\n this.handleKeyDownHandler = this.handleKeyDown.bind(this);\n\n document.addEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public deinit(): void {\n if (this.handleKeyDownHandler) {\n document.removeEventListener(\"keydown\", this.handleKeyDownHandler);\n }\n }\n\n public moveDown(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getNextVisibleNode());\n }\n\n public moveUp(selectedNode: Node): boolean {\n return this.selectNode(selectedNode.getPreviousVisibleNode());\n }\n\n public moveRight(selectedNode: Node): boolean {\n if (!selectedNode.isFolder()) {\n return true;\n } else {\n // folder node\n if (selectedNode.is_open) {\n // Right moves to the first child of an open node\n return this.selectNode(selectedNode.getNextVisibleNode());\n } else {\n // Right expands a closed node\n this.treeWidget.openNode(selectedNode);\n return false;\n }\n }\n }\n\n public moveLeft(selectedNode: Node): boolean {\n if (selectedNode.isFolder() && selectedNode.is_open) {\n // Left on an open node closes the node\n this.treeWidget.closeNode(selectedNode);\n return false;\n } else {\n // Left on a closed or end node moves focus to the node's parent\n return this.selectNode(selectedNode.getParent());\n }\n }\n\n public selectNode(node: Node | null): boolean {\n if (!node) {\n return true;\n } else {\n this.treeWidget.selectNode(node);\n\n return false;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): boolean => {\n if (!this.canHandleKeyboard()) {\n return true;\n }\n\n const selectedNode = this.treeWidget.getSelectedNode();\n if (!selectedNode) {\n return true;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n return this.moveDown(selectedNode);\n\n case \"ArrowUp\":\n return this.moveUp(selectedNode);\n\n case \"ArrowRight\":\n return this.moveRight(selectedNode);\n\n case \"ArrowLeft\":\n return this.moveLeft(selectedNode);\n\n default:\n return true;\n }\n };\n\n private canHandleKeyboard(): boolean {\n return (\n (this.treeWidget.options.keyboardSupport || false) &&\n this.treeWidget.selectNodeHandler.isFocusOnTree()\n );\n }\n}\n","const register = (widgetClass: unknown, widgetName: string): void => {\n const getDataKey = (): string => `simple_widget_${widgetName}`;\n\n const getWidgetData = (\n el: HTMLElement,\n dataKey: string\n ): SimpleWidget | null => {\n const widget = jQuery.data(el, dataKey) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n return widget;\n } else {\n return null;\n }\n };\n\n const createWidget = ($el: JQuery, options: unknown): JQuery => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const existingWidget = getWidgetData(el, dataKey);\n\n if (!existingWidget) {\n const simpleWidgetClass = widgetClass as typeof SimpleWidget;\n const widget = new simpleWidgetClass(el, options);\n\n if (!jQuery.data(el, dataKey)) {\n jQuery.data(el, dataKey, widget);\n }\n\n // Call init after setting data, so we can call methods\n widget.init();\n }\n }\n\n return $el;\n };\n\n const destroyWidget = ($el: JQuery): void => {\n const dataKey = getDataKey();\n\n for (const el of $el.get()) {\n const widget = getWidgetData(el, dataKey);\n\n if (widget) {\n widget.destroy();\n }\n\n jQuery.removeData(el, dataKey);\n }\n };\n\n const callFunction = (\n $el: JQuery,\n functionName: string,\n args: unknown[]\n ): unknown => {\n let result = null;\n\n for (const el of $el.get()) {\n const widget = jQuery.data(el, getDataKey()) as unknown;\n\n if (widget && widget instanceof SimpleWidget) {\n const simpleWidget = widget as SimpleWidget;\n const widgetFunction = simpleWidget[functionName];\n\n if (widgetFunction && typeof widgetFunction === \"function\") {\n result = widgetFunction.apply(widget, args) as unknown;\n }\n }\n }\n\n return result;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n (jQuery.fn as any)[widgetName] = function (\n this: JQuery,\n argument1: unknown,\n ...args: unknown[]\n ) {\n if (!argument1) {\n return createWidget(this, null);\n } else if (typeof argument1 === \"object\") {\n const options = argument1 as unknown;\n return createWidget(this, options);\n } else if (typeof argument1 === \"string\" && argument1[0] !== \"_\") {\n const functionName = argument1;\n\n if (functionName === \"destroy\") {\n return destroyWidget(this);\n } else if (functionName === \"get_widget_class\") {\n return widgetClass;\n } else {\n return callFunction(this, functionName, args);\n }\n } else {\n return undefined;\n }\n };\n};\n\nexport default class SimpleWidget {\n public static register(widgetClass: unknown, widgetName: string): void {\n register(widgetClass, widgetName);\n }\n\n [key: string]: unknown;\n\n protected static defaults: unknown = {};\n\n public options: WidgetOptions;\n\n public $el: JQuery;\n\n constructor(el: HTMLElement, options: WidgetOptions) {\n this.$el = jQuery(el);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const defaults = (this.constructor as any)[\"defaults\"] as WidgetOptions;\n this.options = { ...defaults, ...options };\n }\n\n public destroy(): void {\n this.deinit();\n }\n\n public init(): void {\n //\n }\n\n public deinit(): void {\n //\n }\n}\n","/*\nThis widget does the same a the mouse widget in jqueryui.\n*/\nimport SimpleWidget from \"./simple.widget\";\nimport { PositionInfo } from \"./types\";\n\nconst getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.target as HTMLElement,\n originalEvent: e,\n});\n\nconst getPositionInfoFromTouch = (\n touch: Touch,\n e: TouchEvent\n): PositionInfo => ({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target as HTMLElement,\n originalEvent: e,\n});\n\nabstract class MouseWidget extends SimpleWidget {\n protected isMouseStarted: boolean;\n protected mouseDownInfo: PositionInfo | null;\n private mouseDelayTimer: number | null;\n private isMouseDelayMet: boolean;\n\n public init(): void {\n const element = this.$el.get(0);\n\n if (element) {\n element.addEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n element.addEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.isMouseStarted = false;\n this.mouseDelayTimer = null;\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n }\n\n public deinit(): void {\n const el = this.$el.get(0);\n\n if (el) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"mousedown\", this.mouseDown, {\n passive: false,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (el as any).removeEventListener(\"touchstart\", this.touchStart, {\n passive: false,\n });\n }\n\n this.removeMouseMoveEventListeners();\n }\n\n protected abstract mouseCapture(positionInfo: PositionInfo): boolean | null;\n\n protected abstract mouseStart(positionInfo: PositionInfo): boolean;\n\n protected abstract mouseDrag(positionInfo: PositionInfo): void;\n\n protected abstract mouseStop(positionInfo: PositionInfo): void;\n\n protected abstract getMouseDelay(): number;\n\n private mouseDown = (e: MouseEvent): void => {\n // Left mouse button?\n if (e.button !== 0) {\n return;\n }\n\n const result = this.handleMouseDown(getPositionInfoFromMouseEvent(e));\n\n if (result && e.cancelable) {\n e.preventDefault();\n }\n };\n\n private handleMouseDown(positionInfo: PositionInfo): boolean {\n // We may have missed mouseup (out of window)\n if (this.isMouseStarted) {\n this.handleMouseUp(positionInfo);\n }\n\n this.mouseDownInfo = positionInfo;\n\n if (!this.mouseCapture(positionInfo)) {\n return false;\n }\n\n this.handleStartMouse();\n\n return true;\n }\n\n private handleStartMouse(): void {\n document.addEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n document.addEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n document.addEventListener(\"mouseup\", this.mouseUp, { passive: false });\n document.addEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n\n const mouseDelay = this.getMouseDelay();\n\n if (mouseDelay) {\n this.startMouseDelayTimer(mouseDelay);\n } else {\n this.isMouseDelayMet = true;\n }\n }\n\n private startMouseDelayTimer(mouseDelay: number): void {\n if (this.mouseDelayTimer) {\n clearTimeout(this.mouseDelayTimer);\n }\n\n this.mouseDelayTimer = window.setTimeout(() => {\n if (this.mouseDownInfo) {\n this.isMouseDelayMet = true;\n }\n }, mouseDelay);\n\n this.isMouseDelayMet = false;\n }\n\n private mouseMove = (e: MouseEvent): void => {\n this.handleMouseMove(e, getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseMove(\n e: MouseEvent | TouchEvent,\n positionInfo: PositionInfo\n ): void {\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n return;\n }\n\n if (!this.isMouseDelayMet) {\n return;\n }\n\n if (this.mouseDownInfo) {\n this.isMouseStarted = this.mouseStart(this.mouseDownInfo) !== false;\n }\n\n if (this.isMouseStarted) {\n this.mouseDrag(positionInfo);\n\n if (e.cancelable) {\n e.preventDefault();\n }\n } else {\n this.handleMouseUp(positionInfo);\n }\n }\n\n private mouseUp = (e: MouseEvent): void => {\n this.handleMouseUp(getPositionInfoFromMouseEvent(e));\n };\n\n private handleMouseUp(positionInfo: PositionInfo): void {\n this.removeMouseMoveEventListeners();\n this.isMouseDelayMet = false;\n this.mouseDownInfo = null;\n\n if (this.isMouseStarted) {\n this.isMouseStarted = false;\n this.mouseStop(positionInfo);\n }\n }\n\n private removeMouseMoveEventListeners() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mousemove\", this.mouseMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchmove\", this.touchMove, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"mouseup\", this.mouseUp, {\n passive: false,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (document as any).removeEventListener(\"touchend\", this.touchEnd, {\n passive: false,\n });\n }\n\n private touchStart = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseDown(getPositionInfoFromTouch(touch, e));\n };\n\n private touchMove = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseMove(e, getPositionInfoFromTouch(touch, e));\n };\n\n private touchEnd = (e: TouchEvent): void => {\n if (!e) {\n return;\n }\n\n if (e.touches.length > 1) {\n return;\n }\n\n const touch = e.changedTouches[0];\n\n if (!touch) {\n return;\n }\n\n this.handleMouseUp(getPositionInfoFromTouch(touch, e));\n };\n}\n\nexport default MouseWidget;\n","import { isInt } from \"./util\";\nimport { JqTreeWidget } from \"./tree.jquery\";\nimport { Node } from \"./node\";\n\nexport interface SavedState {\n open_nodes: NodeId[];\n selected_node: NodeId[];\n}\n\nexport default class SaveStateHandler {\n private treeWidget: JqTreeWidget;\n private _supportsLocalStorage: boolean | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n }\n\n public saveState(): void {\n const state = JSON.stringify(this.getState());\n\n if (this.treeWidget.options.onSetStateFromStorage) {\n this.treeWidget.options.onSetStateFromStorage(state);\n } else if (this.supportsLocalStorage()) {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n public getStateFromStorage(): SavedState | null {\n const jsonData = this.loadFromStorage();\n\n if (jsonData) {\n return this.parseState(jsonData) as unknown as SavedState;\n } else {\n return null;\n }\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.treeWidget.tree.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n this.treeWidget.getSelectedNodes().forEach((node) => {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n });\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand\n */\n public setInitialState(state: SavedState): boolean {\n if (!state) {\n return false;\n } else {\n let mustLoadOnDemand = false;\n\n if (state.open_nodes) {\n mustLoadOnDemand = this.openInitialNodes(state.open_nodes);\n }\n\n if (state.selected_node) {\n this.resetSelection();\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n }\n\n public setInitialStateOnDemand(\n state: SavedState,\n cbFinished: () => void\n ): void {\n if (state) {\n this.doSetInitialStateOnDemand(\n state.open_nodes,\n state.selected_node,\n cbFinished\n );\n } else {\n cbFinished();\n }\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n const state = this.getStateFromStorage();\n\n if (state && state.selected_node) {\n return state.selected_node[0] || null;\n } else {\n return null;\n }\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record;\n\n // Check if selected_node is an int (instead of an array)\n if (state && state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state as unknown as SavedState;\n }\n\n private loadFromStorage(): string | null {\n if (this.treeWidget.options.onGetStateFromStorage) {\n return this.treeWidget.options.onGetStateFromStorage();\n } else if (this.supportsLocalStorage()) {\n return localStorage.getItem(this.getKeyName());\n } else {\n return null;\n }\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n if (!node.load_on_demand) {\n node.is_open = true;\n } else {\n mustLoadOnDemand = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (node) {\n selectCount += 1;\n\n this.treeWidget.selectNodeHandler.addToSelection(node);\n }\n }\n\n return selectCount !== 0;\n }\n\n private resetSelection(): void {\n const selectNodeHandler = this.treeWidget.selectNodeHandler;\n\n const selectedNodes = selectNodeHandler.getSelectedNodes();\n\n selectedNodes.forEach((node) => {\n selectNodeHandler.removeFromSelection(node);\n });\n }\n\n private doSetInitialStateOnDemand(\n nodeIdsParam: NodeId[],\n selectedNodes: NodeId[],\n cbFinished: () => void\n ): void {\n let loadingCount = 0;\n let nodeIds = nodeIdsParam;\n\n const openNodes = (): void => {\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.treeWidget.getNodeById(nodeId);\n\n if (!node) {\n newNodesIds.push(nodeId);\n } else {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n loadAndOpenNode(node);\n } else {\n this.treeWidget._openNode(node, false, null);\n }\n }\n }\n }\n\n nodeIds = newNodesIds;\n\n if (this.selectInitialNodes(selectedNodes)) {\n this.treeWidget._refreshElements(null);\n }\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this.treeWidget._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n openNodes();\n }\n\n private getKeyName(): string {\n if (typeof this.treeWidget.options.saveState === \"string\") {\n return this.treeWidget.options.saveState;\n } else {\n return \"tree\";\n }\n }\n\n private supportsLocalStorage(): boolean {\n const testSupport = (): boolean => {\n // Is local storage supported?\n if (localStorage == null) {\n return false;\n } else {\n // Check if it's possible to store an item. Safari does not allow this in private browsing mode.\n try {\n const key = \"_storage_test\";\n sessionStorage.setItem(key, \"value\");\n sessionStorage.removeItem(key);\n } catch (error) {\n return false;\n }\n\n return true;\n }\n };\n\n if (this._supportsLocalStorage == null) {\n this._supportsLocalStorage = testSupport();\n }\n\n return this._supportsLocalStorage;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\ninterface Params {\n $container: JQuery;\n refreshHitAreas: () => void;\n $treeElement: JQuery;\n}\n\nexport default class ContainerScrollParent implements ScrollParent {\n private $container: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private scrollParentBottom?: number;\n private scrollParentTop?: number;\n private verticalScrollTimeout?: number;\n private verticalScrollDirection?: VerticalScrollDirection;\n\n constructor({ $container, refreshHitAreas }: Params) {\n this.$container = $container;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return this.$container.scrollLeft() || 0;\n }\n\n public scrollToY(top: number): void {\n const container = this.$container.get(0) as HTMLElement;\n container.scrollTop = top;\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.scrollParentTop = undefined;\n this.scrollParentBottom = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const scrollParentOffset = this.$container.offset();\n if (!scrollParentOffset) {\n return undefined;\n }\n\n const container = this.$container.get(0) as HTMLElement;\n\n const rightEdge = scrollParentOffset.left + container.clientWidth;\n const leftEdge = scrollParentOffset.left;\n const isNearRightEdge = pageX > rightEdge - 20;\n const isNearLeftEdge = pageX < leftEdge + 20;\n\n if (isNearRightEdge) {\n return \"right\";\n } else if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n if (pageY < this.getScrollParentTop()) {\n return \"top\";\n }\n\n if (pageY > this.getScrollParentBottom()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: distance,\n top: 0,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n const container = this.$container.get(0) as HTMLElement;\n\n container.scrollBy({\n left: 0,\n top: distance,\n behavior: \"instant\",\n });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n\n private getScrollParentTop() {\n if (this.scrollParentTop == null) {\n this.scrollParentTop = this.$container.offset()?.top || 0;\n }\n\n return this.scrollParentTop;\n }\n\n private getScrollParentBottom() {\n if (this.scrollParentBottom == null) {\n this.scrollParentBottom =\n this.getScrollParentTop() +\n (this.$container.innerHeight() ?? 0);\n }\n\n return this.scrollParentBottom;\n }\n}\n","import type { ScrollParent } from \"./types\";\n\ntype HorizontalScrollDirection = \"left\" | \"right\";\ntype VerticalScrollDirection = \"bottom\" | \"top\";\n\nexport default class DocumentScrollParent implements ScrollParent {\n private $element: JQuery;\n private horizontalScrollDirection?: HorizontalScrollDirection;\n private horizontalScrollTimeout?: number;\n private refreshHitAreas: () => void;\n private verticalScrollDirection?: VerticalScrollDirection;\n private verticalScrollTimeout?: number;\n private documentScrollHeight?: number;\n private documentScrollWidth?: number;\n\n constructor($element: JQuery, refreshHitAreas: () => void) {\n this.$element = $element;\n this.refreshHitAreas = refreshHitAreas;\n }\n\n public checkHorizontalScrolling(pageX: number): void {\n const newHorizontalScrollDirection =\n this.getNewHorizontalScrollDirection(pageX);\n\n if (this.horizontalScrollDirection !== newHorizontalScrollDirection) {\n this.horizontalScrollDirection = newHorizontalScrollDirection;\n\n if (this.horizontalScrollTimeout != null) {\n window.clearTimeout(this.horizontalScrollTimeout);\n }\n\n if (newHorizontalScrollDirection) {\n this.horizontalScrollTimeout = window.setTimeout(\n this.scrollHorizontally.bind(this),\n 40,\n );\n }\n }\n }\n\n public checkVerticalScrolling(pageY: number) {\n const newVerticalScrollDirection =\n this.getNewVerticalScrollDirection(pageY);\n\n if (this.verticalScrollDirection !== newVerticalScrollDirection) {\n this.verticalScrollDirection = newVerticalScrollDirection;\n\n if (this.verticalScrollTimeout != null) {\n window.clearTimeout(this.verticalScrollTimeout);\n this.verticalScrollTimeout = undefined;\n }\n\n if (newVerticalScrollDirection) {\n this.verticalScrollTimeout = window.setTimeout(\n this.scrollVertically.bind(this),\n 40,\n );\n }\n }\n }\n\n public getScrollLeft(): number {\n return document.documentElement.scrollLeft;\n }\n\n public scrollToY(top: number): void {\n const offset = this.$element.offset();\n const treeTop = offset ? offset.top : 0;\n\n jQuery(document).scrollTop(top + treeTop);\n }\n\n public stopScrolling() {\n this.horizontalScrollDirection = undefined;\n this.verticalScrollDirection = undefined;\n this.documentScrollHeight = undefined;\n this.documentScrollWidth = undefined;\n }\n\n private getNewHorizontalScrollDirection(\n pageX: number,\n ): HorizontalScrollDirection | undefined {\n const $document = jQuery(document);\n\n const scrollLeft = $document.scrollLeft() || 0;\n const windowWidth = jQuery(window).width() || 0;\n\n const isNearRightEdge = pageX > windowWidth - 20;\n const isNearLeftEdge = pageX - scrollLeft < 20;\n\n if (isNearRightEdge && this.canScrollRight()) {\n return \"right\";\n }\n\n if (isNearLeftEdge) {\n return \"left\";\n }\n\n return undefined;\n }\n\n private canScrollRight() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollLeft + documentElement.clientWidth <\n this.getDocumentScrollWidth()\n );\n }\n\n private canScrollDown() {\n const documentElement = document.documentElement;\n\n return (\n documentElement.scrollTop + documentElement.clientHeight <\n this.getDocumentScrollHeight()\n );\n }\n\n private getDocumentScrollHeight() {\n // Store the original scroll height because the scroll height can increase when the drag element is moved beyond the scroll height.\n if (this.documentScrollHeight == null) {\n this.documentScrollHeight = document.documentElement.scrollHeight;\n }\n\n return this.documentScrollHeight;\n }\n\n private getDocumentScrollWidth() {\n // Store the original scroll width because the scroll width can increase when the drag element is moved beyond the scroll width.\n if (this.documentScrollWidth == null) {\n this.documentScrollWidth = document.documentElement.scrollWidth;\n }\n\n return this.documentScrollWidth;\n }\n\n private getNewVerticalScrollDirection(\n pageY: number,\n ): VerticalScrollDirection | undefined {\n const scrollTop = jQuery(document).scrollTop() || 0;\n const distanceTop = pageY - scrollTop;\n\n if (distanceTop < 20) {\n return \"top\";\n }\n\n const windowHeight = jQuery(window).height() || 0;\n\n if (windowHeight - (pageY - scrollTop) < 20 && this.canScrollDown()) {\n return \"bottom\";\n }\n\n return undefined;\n }\n\n private scrollHorizontally() {\n if (!this.horizontalScrollDirection) {\n return;\n }\n\n const distance = this.horizontalScrollDirection === \"left\" ? -20 : 20;\n window.scrollBy({ left: distance, top: 0, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollHorizontally.bind(this), 40);\n }\n\n private scrollVertically() {\n if (!this.verticalScrollDirection) {\n return;\n }\n\n const distance = this.verticalScrollDirection === \"top\" ? -20 : 20;\n window.scrollBy({ left: 0, top: distance, behavior: \"instant\" });\n\n this.refreshHitAreas();\n\n setTimeout(this.scrollVertically.bind(this), 40);\n }\n}\n","import type { ScrollParent } from \"./types\";\nimport ContainerScrollParent from \"./containerScrollParent\";\nimport DocumentScrollParent from \"./documentScrollParent\";\n\nconst hasOverFlow = ($element: JQuery): boolean => {\n for (const attr of [\"overflow\", \"overflow-y\"]) {\n const overflowValue = $element.css(attr);\n if (overflowValue === \"auto\" || overflowValue === \"scroll\") {\n return true;\n }\n }\n\n return false;\n};\n\nconst getParentWithOverflow = (\n $treeElement: JQuery,\n): JQuery | null => {\n if (hasOverFlow($treeElement)) {\n return $treeElement;\n }\n\n for (const element of $treeElement.parents().get()) {\n const $element = jQuery(element);\n if (hasOverFlow($element)) {\n return $element;\n }\n }\n\n return null;\n};\n\nconst createScrollParent = (\n $treeElement: JQuery,\n refreshHitAreas: () => void,\n): ScrollParent => {\n const $container = getParentWithOverflow($treeElement);\n\n if ($container?.length && $container[0]?.tagName !== \"HTML\") {\n return new ContainerScrollParent({\n $container,\n refreshHitAreas,\n $treeElement,\n });\n } else {\n return new DocumentScrollParent($treeElement, refreshHitAreas);\n }\n};\n\nexport default createScrollParent;\n","import { JqTreeWidget } from \"./tree.jquery\";\nimport { PositionInfo } from \"./types\";\nimport { ScrollParent } from \"./scrollHandler/types\";\nimport createScrollParent from \"./scrollHandler/createScrollParent\";\n\nexport default class ScrollHandler {\n private treeWidget: JqTreeWidget;\n private scrollParent?: ScrollParent;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.scrollParent = undefined;\n }\n\n public checkScrolling(positionInfo: PositionInfo): void {\n this.checkVerticalScrolling(positionInfo);\n this.checkHorizontalScrolling(positionInfo);\n }\n\n public stopScrolling() {\n this.getScrollParent().stopScrolling();\n }\n\n public scrollToY(top: number): void {\n this.getScrollParent().scrollToY(top);\n }\n\n public getScrollLeft(): number {\n return this.getScrollParent().getScrollLeft();\n }\n\n private checkVerticalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageY == null) {\n return;\n }\n\n this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);\n }\n\n private checkHorizontalScrolling(positionInfo: PositionInfo): void {\n if (positionInfo.pageX == null) {\n return;\n }\n\n this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);\n }\n\n private getScrollParent(): ScrollParent {\n if (!this.scrollParent) {\n this.scrollParent = createScrollParent(\n this.treeWidget.$el,\n this.treeWidget.refreshHitAreas.bind(this.treeWidget),\n );\n }\n\n return this.scrollParent;\n }\n}\n","import { Node } from \"./node\";\nimport { JqTreeWidget } from \"./tree.jquery\";\n\nexport default class SelectNodeHandler {\n private treeWidget: JqTreeWidget;\n private selectedNodes: Set;\n private selectedSingleNode: Node | null;\n\n constructor(treeWidget: JqTreeWidget) {\n this.treeWidget = treeWidget;\n this.selectedNodes = new Set();\n this.clear();\n }\n\n public getSelectedNode(): Node | false {\n const selectedNodes = this.getSelectedNodes();\n\n if (selectedNodes.length) {\n return selectedNodes[0] || false;\n } else {\n return false;\n }\n }\n\n public getSelectedNodes(): Node[] {\n if (this.selectedSingleNode) {\n return [this.selectedSingleNode];\n } else {\n const selectedNodes: Node[] = [];\n\n this.selectedNodes.forEach((id) => {\n const node = this.treeWidget.getNodeById(id);\n if (node) {\n selectedNodes.push(node);\n }\n });\n\n return selectedNodes;\n }\n }\n\n public getSelectedNodesUnder(parent: Node): Node[] {\n if (this.selectedSingleNode) {\n if (parent.isParentOf(this.selectedSingleNode)) {\n return [this.selectedSingleNode];\n } else {\n return [];\n }\n } else {\n const selectedNodes = [];\n\n for (const id in this.selectedNodes) {\n if (\n Object.prototype.hasOwnProperty.call(this.selectedNodes, id)\n ) {\n const node = this.treeWidget.getNodeById(id);\n if (node && parent.isParentOf(node)) {\n selectedNodes.push(node);\n }\n }\n }\n\n return selectedNodes;\n }\n }\n\n public isNodeSelected(node: Node): boolean {\n if (node.id != null) {\n return this.selectedNodes.has(node.id);\n } else if (this.selectedSingleNode) {\n return this.selectedSingleNode.element === node.element;\n } else {\n return false;\n }\n }\n\n public clear(): void {\n this.selectedNodes.clear();\n this.selectedSingleNode = null;\n }\n\n public removeFromSelection(node: Node, includeChildren = false): void {\n if (node.id == null) {\n if (\n this.selectedSingleNode &&\n node.element === this.selectedSingleNode.element\n ) {\n this.selectedSingleNode = null;\n }\n } else {\n this.selectedNodes.delete(node.id);\n\n if (includeChildren) {\n node.iterate(() => {\n if (node.id != null) {\n this.selectedNodes.delete(node.id);\n }\n return true;\n });\n }\n }\n }\n\n public addToSelection(node: Node): void {\n if (node.id != null) {\n this.selectedNodes.add(node.id);\n } else {\n this.selectedSingleNode = node;\n }\n }\n\n public isFocusOnTree(): boolean {\n const activeElement = document.activeElement;\n\n return Boolean(\n activeElement &&\n activeElement.tagName === \"SPAN\" &&\n this.treeWidget._containsElement(activeElement as HTMLElement)\n );\n }\n}\n","import { DropHint } from \"..//types\";\n\nclass BorderDropHint implements DropHint {\n private hint?: HTMLElement;\n\n constructor(element: HTMLElement, scrollLeft: number) {\n const div = element.querySelector(\":scope > .jqtree-element\");\n\n if (!div) {\n this.hint = undefined;\n return;\n }\n\n const width = Math.max(element.offsetWidth + scrollLeft - 4, 0);\n const height = Math.max(element.clientHeight - 4, 0);\n\n const hint = document.createElement(\"span\");\n hint.className = \"jqtree-border\";\n hint.style.width = `${width}px`;\n hint.style.height = `${height}px`;\n\n this.hint = hint;\n\n div.append(this.hint);\n }\n\n public remove(): void {\n this.hint?.remove();\n }\n}\n\nexport default BorderDropHint;\n","import { Position, Node } from \"../node\";\nimport { DropHint } from \"../types\";\n\nclass GhostDropHint implements DropHint {\n private element: HTMLElement;\n private node: Node;\n private ghost: HTMLElement;\n\n constructor(node: Node, element: HTMLElement, position: Position) {\n this.element = element;\n this.node = node;\n this.ghost = this.createGhostElement();\n\n if (position === Position.After) {\n this.moveAfter();\n } else if (position === Position.Before) {\n this.moveBefore();\n } else if (position === Position.Inside) {\n if (node.isFolder() && node.is_open) {\n this.moveInsideOpenFolder();\n } else {\n this.moveInside();\n }\n }\n }\n\n public remove(): void {\n this.ghost.remove();\n }\n\n private moveAfter(): void {\n this.element.after(this.ghost);\n }\n\n private moveBefore(): void {\n this.element.before(this.ghost);\n }\n\n private moveInsideOpenFolder(): void {\n const childElement = this.node.children[0]?.element;\n\n if (childElement) {\n childElement.before(this.ghost);\n }\n }\n\n private moveInside(): void {\n this.element.after(this.ghost);\n this.ghost.classList.add(\"jqtree-inside\");\n }\n\n private createGhostElement() {\n const ghost = document.createElement(\"li\");\n ghost.className = \"jqtree_common jqtree-ghost\";\n\n const circleSpan = document.createElement(\"span\");\n circleSpan.className = \"jqtree_common jqtree-circle\";\n ghost.append(circleSpan);\n\n const lineSpan = document.createElement(\"span\");\n lineSpan.className = \"jqtree_common jqtree-line\";\n ghost.append(lineSpan);\n\n return ghost;\n }\n}\n\nexport default GhostDropHint;\n","import { Position, Node } from \"../node\";\nimport { JqTreeWidget } from \"../tree.jquery\";\nimport { DropHint } from \"../types\";\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nclass NodeElement {\n public node: Node;\n public element: HTMLElement;\n protected treeWidget: JqTreeWidget;\n\n constructor(node: Node, treeWidget: JqTreeWidget) {\n this.init(node, treeWidget);\n }\n\n public init(node: Node, treeWidget: JqTreeWidget): void {\n this.node = node;\n this.treeWidget = treeWidget;\n\n if (!node.element) {\n const element = this.treeWidget.element.get(0);\n\n if (element) {\n node.element = element;\n }\n }\n\n if (node.element) {\n this.element = node.element;\n }\n }\n\n public addDropHint(position: number): DropHint {\n if (this.mustShowBorderDropHint(position)) {\n return new BorderDropHint(\n this.element,\n this.treeWidget._getScrollLeft(),\n );\n } else {\n return new GhostDropHint(this.node, this.element, position);\n }\n }\n\n public select(mustSetFocus: boolean): void {\n this.element.classList.add(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.treeWidget.options.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n public deselect(): void {\n this.element.classList.remove(\"jqtree-selected\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.removeAttribute(\"tabindex\");\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.blur();\n }\n\n protected getUl(): HTMLUListElement {\n return this.element.querySelector(\":scope > ul\") as HTMLUListElement;\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > span.jqtree-title\",\n ) as HTMLSpanElement;\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === Position.Inside;\n }\n}\n\nexport default NodeElement;\n","import { Position, Node } from \"../node\";\nimport NodeElement from \"./index\";\n\nexport type OnFinishOpenNode = (node: Node) => void;\n\nclass FolderElement extends NodeElement {\n public open(\n onFinished: OnFinishOpenNode | null,\n slide = true,\n animationSpeed: JQuery.Duration = \"fast\",\n ): void {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n const button = this.getButton();\n button.classList.remove(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const openedIconElement = this.treeWidget.renderer.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doOpen = (): void => {\n this.element.classList.remove(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n if (onFinished) {\n onFinished(this.node);\n }\n\n this.treeWidget._triggerEvent(\"tree.open\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideDown(animationSpeed, doOpen);\n } else {\n jQuery(this.getUl()).show();\n doOpen();\n }\n }\n\n public close(\n slide = true,\n animationSpeed: JQuery.Duration | undefined = \"fast\",\n ): void {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n const button = this.getButton();\n button.classList.add(\"jqtree-closed\");\n button.innerHTML = \"\";\n\n const closedIconElement = this.treeWidget.renderer.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.appendChild(icon);\n }\n\n const doClose = (): void => {\n this.element.classList.add(\"jqtree-closed\");\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.treeWidget._triggerEvent(\"tree.close\", {\n node: this.node,\n });\n };\n\n if (slide) {\n jQuery(this.getUl()).slideUp(animationSpeed, doClose);\n } else {\n jQuery(this.getUl()).hide();\n doClose();\n }\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === Position.Inside;\n }\n\n private getButton(): HTMLLinkElement {\n return this.element.querySelector(\n \":scope > .jqtree-element > a.jqtree-toggler\",\n ) as HTMLLinkElement;\n }\n}\n\nexport default FolderElement;\n","import __version__ from \"./version\";\nimport { DragAndDropHandler } from \"./dragAndDropHandler\";\nimport ElementsRenderer from \"./elementsRenderer\";\nimport DataLoader, { HandleFinishedLoading } from \"./dataLoader\";\nimport KeyHandler from \"./keyHandler\";\nimport MouseWidget from \"./mouse.widget\";\nimport { PositionInfo } from \"./types\";\nimport SaveStateHandler, { SavedState } from \"./saveStateHandler\";\nimport ScrollHandler from \"./scrollHandler\";\nimport SelectNodeHandler from \"./selectNodeHandler\";\nimport SimpleWidget from \"./simple.widget\";\nimport { Node, getPosition } from \"./node\";\nimport { isFunction } from \"./util\";\nimport NodeElement from \"./nodeElement\";\nimport FolderElement, { OnFinishOpenNode } from \"./nodeElement/folderElement\";\n\nimport { JQTreeOptions } from \"./jqtreeOptions\";\n\ninterface ClickTarget {\n node: Node;\n type: \"button\" | \"label\";\n}\n\ninterface SelectNodeOptions {\n mustToggle?: boolean;\n mustSetFocus?: boolean;\n}\n\nconst NODE_PARAM_IS_EMPTY = \"Node parameter is empty\";\nconst PARAM_IS_EMPTY = \"Parameter is empty: \";\n\nexport class JqTreeWidget extends MouseWidget {\n protected static defaults: JQTreeOptions = {\n animationSpeed: \"fast\",\n autoEscape: true,\n autoOpen: false, // true / false / int (open n levels starting at 0)\n buttonLeft: true,\n // The symbol to use for a closed node - ► BLACK RIGHT-POINTING POINTER\n // http://www.fileformat.info/info/unicode/char/25ba/index.htm\n closedIcon: undefined,\n data: undefined,\n dataFilter: undefined,\n dataUrl: undefined,\n dragAndDrop: false,\n keyboardSupport: true,\n nodeClass: Node,\n onCanMove: undefined, // Can this node be moved?\n onCanMoveTo: undefined, // Can this node be moved to this position? function(moved_node, target_node, position)\n onCanSelectNode: undefined,\n onCreateLi: undefined,\n onDragMove: undefined,\n onDragStop: undefined,\n onGetStateFromStorage: undefined,\n onIsMoveHandle: undefined,\n onLoadFailed: undefined,\n onLoading: undefined,\n onSetStateFromStorage: undefined,\n openedIcon: \"▼\",\n openFolderDelay: 500, // The delay for opening a folder during drag and drop; the value is in milliseconds\n // The symbol to use for an open node - ▼ BLACK DOWN-POINTING TRIANGLE\n // http://www.fileformat.info/info/unicode/char/25bc/index.htm\n rtl: undefined, // right-to-left support; true / false (default)\n saveState: false, // true / false / string (cookie name)\n selectable: true,\n showEmptyFolder: false,\n slide: true, // must display slide animation?\n startDndDelay: 300, // The delay for starting dnd (in milliseconds)\n tabIndex: 0,\n useContextMenu: true,\n };\n\n public element: JQuery;\n public tree: Node;\n public dndHandler: DragAndDropHandler;\n public renderer: ElementsRenderer;\n public dataLoader: DataLoader;\n public scrollHandler: ScrollHandler;\n public selectNodeHandler: SelectNodeHandler;\n\n private isInitialized: boolean;\n private saveStateHandler: SaveStateHandler;\n private keyHandler: KeyHandler;\n\n public toggle(node: Node, slideParam: null | boolean = null): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.is_open) {\n this.closeNode(node, slide);\n } else {\n this.openNode(node, slide);\n }\n\n return this.element;\n }\n\n public getTree(): Node {\n return this.tree;\n }\n\n public selectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): JQuery {\n this.doSelectNode(node, optionsParam);\n return this.element;\n }\n\n public getSelectedNode(): Node | false {\n return this.selectNodeHandler.getSelectedNode();\n }\n\n public toJson(): string {\n return JSON.stringify(this.tree.getData());\n }\n\n public loadData(data: NodeData[], parentNode: Node | null): JQuery {\n this.doLoadData(data, parentNode);\n return this.element;\n }\n\n /*\n signatures:\n - loadDataFromUrl(url, parent_node=null, on_finished=null)\n loadDataFromUrl('/my_data');\n loadDataFromUrl('/my_data', node1);\n loadDataFromUrl('/my_data', node1, function() { console.log('finished'); });\n loadDataFromUrl('/my_data', null, function() { console.log('finished'); });\n\n - loadDataFromUrl(parent_node=null, on_finished=null)\n loadDataFromUrl();\n loadDataFromUrl(node1);\n loadDataFromUrl(null, function() { console.log('finished'); });\n loadDataFromUrl(node1, function() { console.log('finished'); });\n */\n public loadDataFromUrl(\n param1: string | null | Node,\n param2?: Node | null | HandleFinishedLoading,\n param3?: HandleFinishedLoading,\n ): JQuery {\n if (typeof param1 === \"string\") {\n // first parameter is url\n this.doLoadDataFromUrl(\n param1,\n param2 as Node | null,\n param3 ?? null,\n );\n } else {\n // first parameter is not url\n this.doLoadDataFromUrl(\n null,\n param1,\n param2 as HandleFinishedLoading | null,\n );\n }\n\n return this.element;\n }\n\n public reload(onFinished: HandleFinishedLoading | null): JQuery {\n this.doLoadDataFromUrl(null, null, onFinished);\n return this.element;\n }\n\n public refresh(): JQuery {\n this._refreshElements(null);\n return this.element;\n }\n\n public getNodeById(nodeId: NodeId): Node | null {\n return this.tree.getNodeById(nodeId);\n }\n\n public getNodeByName(name: string): Node | null {\n return this.tree.getNodeByName(name);\n }\n\n public getNodeByNameMustExist(name: string): Node {\n return this.tree.getNodeByNameMustExist(name);\n }\n\n public getNodesByProperty(key: string, value: unknown): Node[] {\n return this.tree.getNodesByProperty(key, value);\n }\n\n public getNodeByHtmlElement(\n inputElement: HTMLElement | JQuery,\n ): Node | null {\n const element =\n inputElement instanceof HTMLElement\n ? inputElement\n : inputElement[0];\n\n if (!element) {\n return null;\n }\n\n return this.getNode(element);\n }\n\n public getNodeByCallback(callback: (node: Node) => boolean): Node | null {\n return this.tree.getNodeByCallback(callback);\n }\n\n public openNode(\n node: Node,\n param1?: boolean | OnFinishOpenNode,\n param2?: OnFinishOpenNode,\n ): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const parseParams = (): [boolean, OnFinishOpenNode | null] => {\n let onFinished: OnFinishOpenNode | null;\n let slide: boolean | null;\n\n if (isFunction(param1)) {\n onFinished = param1 as OnFinishOpenNode | null;\n slide = null;\n } else {\n slide = param1 as boolean;\n onFinished = param2 as OnFinishOpenNode;\n }\n\n if (slide == null) {\n slide = this.options.slide ?? false;\n }\n\n return [slide, onFinished];\n };\n\n const [slide, onFinished] = parseParams();\n\n this._openNode(node, slide, onFinished);\n return this.element;\n }\n\n public closeNode(node: Node, slideParam?: null | boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const slide = slideParam ?? this.options.slide;\n\n if (node.isFolder() || node.isEmptyFolder) {\n new FolderElement(node, this).close(\n slide,\n this.options.animationSpeed,\n );\n\n this.saveState();\n }\n\n return this.element;\n }\n\n public isDragging(): boolean {\n return this.dndHandler.isDragging;\n }\n\n public refreshHitAreas(): JQuery {\n this.dndHandler.refresh();\n return this.element;\n }\n\n public addNodeAfter(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n const newNode = existingNode.addAfter(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addNodeBefore(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addBefore(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(existingNode.parent);\n }\n\n return newNode;\n }\n\n public addParentNode(\n newNodeInfo: NodeData,\n existingNode: Node,\n ): Node | null {\n if (!existingNode) {\n throw Error(PARAM_IS_EMPTY + \"existingNode\");\n }\n\n const newNode = existingNode.addParent(newNodeInfo);\n\n if (newNode) {\n this._refreshElements(newNode.parent);\n }\n\n return newNode;\n }\n\n public removeNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!node.parent) {\n throw Error(\"Node has no parent\");\n }\n\n this.selectNodeHandler.removeFromSelection(node, true); // including children\n\n const parent = node.parent;\n node.remove();\n this._refreshElements(parent);\n\n return this.element;\n }\n\n public appendNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam || this.tree;\n\n const node = parentNode.append(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public prependNode(newNodeInfo: NodeData, parentNodeParam?: Node): Node {\n const parentNode = parentNodeParam ?? this.tree;\n\n const node = parentNode.prepend(newNodeInfo);\n\n this._refreshElements(parentNode);\n\n return node;\n }\n\n public updateNode(node: Node, data: NodeData): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const idIsChanged =\n typeof data === \"object\" && data.id && data.id !== node.id;\n\n if (idIsChanged) {\n this.tree.removeNodeFromIndex(node);\n }\n\n node.setData(data);\n\n if (idIsChanged) {\n this.tree.addNodeToIndex(node);\n }\n\n if (\n typeof data === \"object\" &&\n data[\"children\"] &&\n data[\"children\"] instanceof Array\n ) {\n node.removeChildren();\n\n if (data.children.length) {\n node.loadFromData(data.children as Node[]);\n }\n }\n\n this._refreshElements(node);\n\n return this.element;\n }\n\n private isSelectedNodeInSubtree(subtree: Node): boolean {\n const selectedNode = this.getSelectedNode();\n\n if (!selectedNode) {\n return false;\n } else {\n return subtree === selectedNode || subtree.isParentOf(selectedNode);\n }\n }\n\n public moveNode(node: Node, targetNode: Node, position: string): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n if (!targetNode) {\n throw Error(PARAM_IS_EMPTY + \"targetNode\");\n }\n\n const positionIndex = getPosition(position);\n\n if (positionIndex !== undefined) {\n this.tree.moveNode(node, targetNode, positionIndex);\n this._refreshElements(null);\n }\n\n return this.element;\n }\n\n public getStateFromStorage(): SavedState | null {\n return this.saveStateHandler.getStateFromStorage();\n }\n\n public addToSelection(node: Node, mustSetFocus?: boolean): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.addToSelection(node);\n\n this._getNodeElementForNode(node).select(\n mustSetFocus === undefined ? true : mustSetFocus,\n );\n\n this.saveState();\n\n return this.element;\n }\n\n public getSelectedNodes(): Node[] {\n return this.selectNodeHandler.getSelectedNodes();\n }\n\n public isNodeSelected(node: Node): boolean {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n return this.selectNodeHandler.isNodeSelected(node);\n }\n\n public removeFromSelection(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n this.selectNodeHandler.removeFromSelection(node);\n\n this._getNodeElementForNode(node).deselect();\n this.saveState();\n\n return this.element;\n }\n\n public scrollToNode(node: Node): JQuery {\n if (!node) {\n throw Error(NODE_PARAM_IS_EMPTY);\n }\n\n const nodeTop = jQuery(node.element).offset()?.top ?? 0;\n const treeTop = this.$el.offset()?.top ?? 0;\n const top = nodeTop - treeTop;\n\n this.scrollHandler.scrollToY(top);\n\n return this.element;\n }\n\n public getState(): SavedState | null {\n return this.saveStateHandler.getState();\n }\n\n public setState(state: SavedState): JQuery {\n this.saveStateHandler.setInitialState(state);\n this._refreshElements(null);\n\n return this.element;\n }\n\n public setOption(option: string, value: unknown): JQuery {\n (this.options as unknown as Record)[option] = value;\n return this.element;\n }\n\n public moveDown(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveDown(selectedNode);\n }\n\n return this.element;\n }\n\n public moveUp(): JQuery {\n const selectedNode = this.getSelectedNode();\n if (selectedNode) {\n this.keyHandler.moveUp(selectedNode);\n }\n\n return this.element;\n }\n\n public getVersion(): string {\n return __version__;\n }\n\n public _triggerEvent(\n eventName: string,\n values?: Record,\n ): JQuery.Event {\n const event = jQuery.Event(eventName, values);\n this.element.trigger(event);\n return event;\n }\n\n public _openNode(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n const doOpenNode = (\n _node: Node,\n _slide: boolean,\n _onFinished: OnFinishOpenNode | null,\n ): void => {\n const folderElement = new FolderElement(_node, this);\n folderElement.open(\n _onFinished,\n _slide,\n this.options.animationSpeed,\n );\n };\n\n if (node.isFolder() || node.isEmptyFolder) {\n if (node.load_on_demand) {\n this.loadFolderOnDemand(node, slide, onFinished);\n } else {\n let parent = node.parent;\n\n while (parent) {\n // nb: do not open root element\n if (parent.parent) {\n doOpenNode(parent, false, null);\n }\n parent = parent.parent;\n }\n\n doOpenNode(node, slide, onFinished);\n this.saveState();\n }\n }\n }\n\n /*\n Redraw the tree or part of the tree.\n from_node: redraw this subtree\n */\n public _refreshElements(fromNode: Node | null): void {\n const mustSetFocus = this.selectNodeHandler.isFocusOnTree();\n const mustSelect = fromNode\n ? this.isSelectedNodeInSubtree(fromNode)\n : false;\n\n this.renderer.render(fromNode);\n\n if (mustSelect) {\n this.selectCurrentNode(mustSetFocus);\n }\n\n this._triggerEvent(\"tree.refresh\");\n }\n\n public _getNodeElementForNode(node: Node): NodeElement {\n if (node.isFolder()) {\n return new FolderElement(node, this);\n } else {\n return new NodeElement(node, this);\n }\n }\n\n public _getNodeElement(element: HTMLElement): NodeElement | null {\n const node = this.getNode(element);\n if (node) {\n return this._getNodeElementForNode(node);\n } else {\n return null;\n }\n }\n\n public _containsElement(element: HTMLElement): boolean {\n const node = this.getNode(element);\n\n return node != null && node.tree === this.tree;\n }\n\n public _getScrollLeft(): number {\n return this.scrollHandler.getScrollLeft();\n }\n\n public init(): void {\n super.init();\n\n this.element = this.$el;\n this.isInitialized = false;\n\n this.options.rtl = this.getRtlOption();\n\n if (this.options.closedIcon == null) {\n this.options.closedIcon = this.getDefaultClosedIcon();\n }\n\n this.renderer = new ElementsRenderer(this);\n this.dataLoader = new DataLoader(this);\n this.saveStateHandler = new SaveStateHandler(this);\n this.selectNodeHandler = new SelectNodeHandler(this);\n this.dndHandler = new DragAndDropHandler(this);\n this.scrollHandler = new ScrollHandler(this);\n this.keyHandler = new KeyHandler(this);\n\n this.initData();\n\n this.element.on(\"click\", this.handleClick);\n this.element.on(\"dblclick\", this.handleDblclick);\n\n if (this.options.useContextMenu) {\n this.element.on(\"contextmenu\", this.handleContextmenu);\n }\n }\n\n public deinit(): void {\n this.element.empty();\n this.element.off();\n\n this.keyHandler.deinit();\n\n this.tree = new Node({}, true);\n\n super.deinit();\n }\n\n protected mouseCapture(positionInfo: PositionInfo): boolean | null {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseCapture(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseStart(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n return this.dndHandler.mouseStart(positionInfo);\n } else {\n return false;\n }\n }\n\n protected mouseDrag(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n const result = this.dndHandler.mouseDrag(positionInfo);\n\n this.scrollHandler.checkScrolling(positionInfo);\n return result;\n } else {\n return false;\n }\n }\n\n protected mouseStop(positionInfo: PositionInfo): boolean {\n if (this.options.dragAndDrop) {\n this.scrollHandler.stopScrolling();\n return this.dndHandler.mouseStop(positionInfo);\n } else {\n return false;\n }\n }\n\n protected getMouseDelay(): number {\n return this.options.startDndDelay ?? 0;\n }\n\n private initData(): void {\n if (this.options.data) {\n this.doLoadData(this.options.data, null);\n } else {\n const dataUrl = this.getDataUrlInfo(null);\n\n if (dataUrl) {\n this.doLoadDataFromUrl(null, null, null);\n } else {\n this.doLoadData([], null);\n }\n }\n }\n\n private getDataUrlInfo(node: Node | null): JQuery.AjaxSettings | null {\n const dataUrl =\n this.options.dataUrl || (this.element.data(\"url\") as string | null);\n\n const getUrlFromString = (url: string): JQuery.AjaxSettings => {\n const urlInfo: JQuery.AjaxSettings = { url };\n\n setUrlInfoData(urlInfo);\n\n return urlInfo;\n };\n\n const setUrlInfoData = (urlInfo: JQuery.AjaxSettings): void => {\n if (node?.id) {\n // Load on demand of a subtree; add node parameter\n const data = { node: node.id };\n urlInfo[\"data\"] = data;\n } else {\n // Add selected_node parameter\n const selectedNodeId = this.getNodeIdToBeSelected();\n if (selectedNodeId) {\n const data = { selected_node: selectedNodeId };\n urlInfo[\"data\"] = data;\n }\n }\n };\n\n if (typeof dataUrl === \"function\") {\n return dataUrl(node);\n } else if (typeof dataUrl === \"string\") {\n return getUrlFromString(dataUrl);\n } else if (dataUrl && typeof dataUrl === \"object\") {\n setUrlInfoData(dataUrl);\n return dataUrl;\n } else {\n return null;\n }\n }\n\n private getNodeIdToBeSelected(): NodeId | null {\n if (this.options.saveState) {\n return this.saveStateHandler.getNodeIdToBeSelected();\n } else {\n return null;\n }\n }\n\n private initTree(data: NodeData[]): void {\n const doInit = (): void => {\n if (!this.isInitialized) {\n this.isInitialized = true;\n this._triggerEvent(\"tree.init\");\n }\n };\n\n if (!this.options.nodeClass) {\n return;\n }\n\n this.tree = new this.options.nodeClass(\n null,\n true,\n this.options.nodeClass,\n );\n\n this.selectNodeHandler.clear();\n\n this.tree.loadFromData(data);\n\n const mustLoadOnDemand = this.setInitialState();\n\n this._refreshElements(null);\n\n if (!mustLoadOnDemand) {\n doInit();\n } else {\n // Load data on demand and then init the tree\n this.setInitialStateOnDemand(doInit);\n }\n }\n\n // Set initial state, either by restoring the state or auto-opening nodes\n // result: must load nodes on demand?\n private setInitialState(): boolean {\n const restoreState = (): [boolean, boolean] => {\n // result: is state restored, must load on demand?\n if (!this.options.saveState) {\n return [false, false];\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return [false, false];\n } else {\n const mustLoadOnDemand =\n this.saveStateHandler.setInitialState(state);\n\n // return true: the state is restored\n return [true, mustLoadOnDemand];\n }\n }\n };\n\n const autoOpenNodes = (): boolean => {\n // result: must load on demand?\n if (this.options.autoOpen === false) {\n return false;\n }\n\n const maxLevel = this.getAutoOpenMaxLevel();\n let mustLoadOnDemand = false;\n\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n return false;\n } else if (!node.hasChildren()) {\n return false;\n } else {\n node.is_open = true;\n return level !== maxLevel;\n }\n });\n\n return mustLoadOnDemand;\n };\n\n let [isRestored, mustLoadOnDemand] = restoreState(); // eslint-disable-line prefer-const\n\n if (!isRestored) {\n mustLoadOnDemand = autoOpenNodes();\n }\n\n return mustLoadOnDemand;\n }\n\n // Set the initial state for nodes that are loaded on demand\n // Call cb_finished when done\n private setInitialStateOnDemand(cbFinished: () => void): void {\n const restoreState = (): boolean => {\n if (!this.options.saveState) {\n return false;\n } else {\n const state = this.saveStateHandler.getStateFromStorage();\n\n if (!state) {\n return false;\n } else {\n this.saveStateHandler.setInitialStateOnDemand(\n state,\n cbFinished,\n );\n\n return true;\n }\n }\n };\n\n const autoOpenNodes = (): void => {\n const maxLevel = this.getAutoOpenMaxLevel();\n let loadingCount = 0;\n\n const loadAndOpenNode = (node: Node): void => {\n loadingCount += 1;\n this._openNode(node, false, () => {\n loadingCount -= 1;\n openNodes();\n });\n };\n\n const openNodes = (): void => {\n this.tree.iterate((node: Node, level: number) => {\n if (node.load_on_demand) {\n if (!node.is_loading) {\n loadAndOpenNode(node);\n }\n\n return false;\n } else {\n this._openNode(node, false, null);\n\n return level !== maxLevel;\n }\n });\n\n if (loadingCount === 0) {\n cbFinished();\n }\n };\n\n openNodes();\n };\n\n if (!restoreState()) {\n autoOpenNodes();\n }\n }\n\n private getAutoOpenMaxLevel(): number {\n if (this.options.autoOpen === true) {\n return -1;\n } else if (typeof this.options.autoOpen === \"number\") {\n return this.options.autoOpen;\n } else if (typeof this.options.autoOpen === \"string\") {\n return parseInt(this.options.autoOpen, 10);\n } else {\n return 0;\n }\n }\n\n private handleClick = (\n e: JQuery.ClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget) {\n if (clickTarget.type === \"button\") {\n this.toggle(clickTarget.node, this.options.slide);\n\n e.preventDefault();\n e.stopPropagation();\n } else if (clickTarget.type === \"label\") {\n const node = clickTarget.node;\n const event = this._triggerEvent(\"tree.click\", {\n node,\n click_event: e,\n });\n\n if (!event.isDefaultPrevented()) {\n this.doSelectNode(node);\n }\n }\n }\n };\n\n private handleDblclick = (\n e: JQuery.DoubleClickEvent,\n ): void => {\n const clickTarget = this.getClickTarget(e.target);\n\n if (clickTarget?.type === \"label\") {\n this._triggerEvent(\"tree.dblclick\", {\n node: clickTarget.node,\n click_event: e,\n });\n }\n };\n\n private getClickTarget(element: HTMLElement): ClickTarget | null {\n const button = element.closest(\".jqtree-toggler\");\n\n if (button) {\n const node = this.getNode(button as HTMLElement);\n\n if (node) {\n return {\n type: \"button\",\n node,\n };\n }\n } else {\n const jqTreeElement = element.closest(\".jqtree-element\");\n\n if (jqTreeElement) {\n const node = this.getNode(jqTreeElement as HTMLElement);\n if (node) {\n return {\n type: \"label\",\n node,\n };\n }\n }\n }\n\n return null;\n }\n\n private getNode(element: HTMLElement): null | Node {\n const liElement = element.closest(\"li.jqtree_common\");\n\n if (liElement) {\n return jQuery(liElement).data(\"node\") as Node;\n } else {\n return null;\n }\n }\n\n private handleContextmenu = (\n e: JQuery.ContextMenuEvent,\n ) => {\n const div = e.target.closest(\"ul.jqtree-tree .jqtree-element\");\n\n if (div) {\n const node = this.getNode(div as HTMLElement);\n if (node) {\n e.preventDefault();\n e.stopPropagation();\n\n this._triggerEvent(\"tree.contextmenu\", {\n node,\n click_event: e,\n });\n return false;\n }\n }\n\n return null;\n };\n\n private saveState(): void {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n }\n\n private selectCurrentNode(mustSetFocus: boolean): void {\n const node = this.getSelectedNode();\n if (node) {\n const nodeElement = this._getNodeElementForNode(node);\n if (nodeElement) {\n nodeElement.select(mustSetFocus);\n }\n }\n }\n\n private deselectCurrentNode(): void {\n const node = this.getSelectedNode();\n if (node) {\n this.removeFromSelection(node);\n }\n }\n\n private getDefaultClosedIcon(): string {\n if (this.options.rtl) {\n // triangle to the left\n return \"◀\";\n } else {\n // triangle to the right\n return \"►\";\n }\n }\n\n private getRtlOption(): boolean {\n if (this.options.rtl != null) {\n return this.options.rtl;\n } else {\n const dataRtl = this.element.data(\"rtl\") as unknown;\n\n if (\n dataRtl !== null &&\n dataRtl !== false &&\n dataRtl !== undefined\n ) {\n return true;\n } else {\n return false;\n }\n }\n }\n\n private doSelectNode(\n node: Node | null,\n optionsParam?: SelectNodeOptions,\n ): void {\n const saveState = (): void => {\n if (this.options.saveState) {\n this.saveStateHandler.saveState();\n }\n };\n\n if (!node) {\n // Called with empty node -> deselect current node\n this.deselectCurrentNode();\n saveState();\n return;\n }\n const defaultOptions = { mustSetFocus: true, mustToggle: true };\n const selectOptions = { ...defaultOptions, ...(optionsParam || {}) };\n\n const canSelect = (): boolean => {\n if (this.options.onCanSelectNode) {\n return (\n this.options.selectable === true &&\n this.options.onCanSelectNode(node)\n );\n } else {\n return this.options.selectable === true;\n }\n };\n\n const openParents = (): void => {\n const parent = node.parent;\n\n if (parent && parent.parent && !parent.is_open) {\n this.openNode(parent, false);\n }\n };\n\n if (!canSelect()) {\n return;\n }\n\n if (this.selectNodeHandler.isNodeSelected(node)) {\n if (selectOptions.mustToggle) {\n this.deselectCurrentNode();\n this._triggerEvent(\"tree.select\", {\n node: null,\n previous_node: node,\n });\n }\n } else {\n const deselectedNode = this.getSelectedNode() || null;\n this.deselectCurrentNode();\n this.addToSelection(node, selectOptions.mustSetFocus);\n\n this._triggerEvent(\"tree.select\", {\n node,\n deselected_node: deselectedNode,\n });\n openParents();\n }\n\n saveState();\n }\n\n private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {\n if (data) {\n if (parentNode) {\n this.deselectNodes(parentNode);\n this.loadSubtree(data, parentNode);\n } else {\n this.initTree(data);\n }\n\n if (this.isDragging()) {\n this.dndHandler.refresh();\n }\n }\n\n this._triggerEvent(\"tree.load_data\", {\n tree_data: data,\n parent_node: parentNode,\n });\n }\n\n private deselectNodes(parentNode: Node): void {\n const selectedNodesUnderParent =\n this.selectNodeHandler.getSelectedNodesUnder(parentNode);\n for (const n of selectedNodesUnderParent) {\n this.selectNodeHandler.removeFromSelection(n);\n }\n }\n\n private loadSubtree(data: NodeData[], parentNode: Node): void {\n parentNode.loadFromData(data);\n\n parentNode.load_on_demand = false;\n parentNode.is_loading = false;\n\n this._refreshElements(parentNode);\n }\n\n private doLoadDataFromUrl(\n urlInfoParam: string | JQuery.AjaxSettings | null,\n parentNode: Node | null,\n onFinished: HandleFinishedLoading | null,\n ): void {\n const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);\n\n this.dataLoader.loadFromUrl(urlInfo, parentNode, onFinished);\n }\n\n private loadFolderOnDemand(\n node: Node,\n slide = true,\n onFinished: OnFinishOpenNode | null,\n ): void {\n node.is_loading = true;\n\n this.doLoadDataFromUrl(null, node, () => {\n this._openNode(node, slide, onFinished);\n });\n }\n}\n\nSimpleWidget.register(JqTreeWidget, \"tree\");\n"],"names":["isNodeRecordWithChildren","data","Array","Position","positionNames","before","Before","after","After","inside","Inside","none","None","getPositionName","position","name","Object","prototype","hasOwnProperty","call","Node","constructor","nodeData","arguments","length","undefined","isRoot","nodeClass","this","load_on_demand","isEmptyFolder","children","setData","parent","idMapping","Map","tree","o","key","value","loadFromData","removeChildren","childData","node","createNode","addChild","push","setParent","addChildAtPosition","index","splice","removeChild","doRemoveChild","getChildIndex","indexOf","hasChildren","isFolder","iterate","callback","_iterate","level","child","moveNode","movedNode","targetNode","isParentOf","getData","getDataFromNodes","nodes","map","tmpNode","k","v","getNodeByName","getNodeByCallback","getNodeByNameMustExist","n","result","addAfter","nodeInfo","childIndex","loadChildrenFromData","addBefore","addParent","newParent","originalParent","remove","append","prepend","getLevel","getNodeById","nodeId","get","addNodeToIndex","id","set","removeNodeFromIndex","delete","getPreviousSibling","previousIndex","getNextSibling","nextIndex","getNodesByProperty","filter","f","getNextNode","nextSibling","getNextVisibleNode","is_open","getPreviousNode","previousSibling","getLastChild","getParent","getPreviousVisibleNode","lastChild","initFromData","addChildren","childrenData","addNode","getNodeClass","DragElement","nodeName","offsetX","offsetY","$tree","autoEscape","$element","jQuery","addClass","text","html","css","move","pageX","pageY","offset","left","top","getBoolString","getOffsetTop","element","getBoundingClientRect","y","window","scrollY","VisibleNodeIterator","isFirstNode","_iterateNode","nextNode","mustIterateInside","offsetParent","handleFirstNode","handleOpenFolder","handleClosedFolder","handleNode","childrenLength","forEach","_","i","nextChild","handleAfterOpenFolder","HitAreasGenerator","currentNode","treeBottom","super","generate","positions","lastTop","generateHitAreas","previousTop","group","hitAreas","generateHitAreasForGroup","addPosition","area","bottom","positionsInGroup","positionCount","Math","min","areaHeight","round","areaTop","DragAndDropHandler","treeWidget","hoveredArea","isDragging","currentItem","mouseCapture","positionInfo","target","mustCaptureElement","options","onIsMoveHandle","nodeElement","_getNodeElement","onCanMove","mouseStart","refresh","dragElement","classList","add","mouseDrag","findHoveredArea","canMoveToArea","stopOpenFolderTimer","mustOpenFolderTimer","startOpenFolderTimer","updateDropHint","removeDropHint","onDragMove","originalEvent","mouseStop","moveItem","clear","removeHover","removeHitAreas","onDragStop","_getNodeElementForNode","hitAreasGenerator","getTreeDimensions","onCanMoveTo","positionName","previousGhost","x","dimensions","right","low","high","mid","addDropHint","folder","openFolder","_openNode","slide","openFolderDelay","openFolderTimer","setTimeout","clearTimeout","previousParent","doMove","empty","_refreshElements","_triggerEvent","move_info","moved_node","target_node","previous_parent","do_move","original_event","isDefaultPrevented","el","width","height","_getScrollLeft","ElementsRenderer","openedIconElement","createButtonElement","openedIcon","closedIconElement","closedIcon","render","fromNode","renderFromNode","renderFromRoot","createDomElements","$previousLi","li","createLi","attachNodeData","isRootNode","ul","createUl","appendChild","classString","role","rtl","dragAndDrop","document","createElement","className","setAttribute","isSelected","Boolean","selectNodeHandler","isNodeSelected","showEmptyFolder","createFolderLi","createNodeLi","onCreateLi","setTreeItemAriaAttributes","buttonClasses","getButtonClasses","folderClasses","getFolderClasses","iconElement","div","buttonLink","cloneNode","buttonLeft","titleSpan","createTitleSpan","liClasses","join","classes","tabIndex","textContent","innerHTML","is_loading","createTextNode","nodeType","DataLoader","loadFromUrl","urlInfo","parentNode","onFinished","$el","getDomElement","addLoadingClass","notifyLoading","stopLoading","removeLoadingClass","submitRequest","loadData","parseData","jqXHR","onLoadFailed","removeClass","isLoading","onLoading","urlInfoInput","handleSuccess","handleError","ajaxSettings","method","cache","dataType","success","error","url","toUpperCase","ajax","dataFilter","parsedData","JSON","parse","KeyHandler","handleKeyDownHandler","keyboardSupport","handleKeyDown","bind","addEventListener","deinit","removeEventListener","moveDown","selectedNode","selectNode","moveUp","moveRight","openNode","moveLeft","closeNode","e","canHandleKeyboard","getSelectedNode","isFocusOnTree","register","widgetClass","widgetName","getDataKey","getWidgetData","dataKey","widget","SimpleWidget","createWidget","init","fn","argument1","functionName","destroy","removeData","destroyWidget","_len","args","_key","callFunction","widgetFunction","apply","static","defaults","getPositionInfoFromMouseEvent","getPositionInfoFromTouch","touch","MouseWidget","mouseDown","passive","touchStart","isMouseStarted","mouseDelayTimer","isMouseDelayMet","mouseDownInfo","removeMouseMoveEventListeners","button","handleMouseDown","cancelable","preventDefault","handleMouseUp","handleStartMouse","mouseMove","touchMove","mouseUp","touchEnd","mouseDelay","getMouseDelay","startMouseDelayTimer","handleMouseMove","touches","changedTouches","SaveStateHandler","saveState","state","stringify","getState","onSetStateFromStorage","supportsLocalStorage","localStorage","setItem","getKeyName","getStateFromStorage","jsonData","loadFromStorage","parseState","open_nodes","getOpenNodeIds","openNodes","selected_node","getSelectedNodeIds","selectedNodeIds","getSelectedNodes","setInitialState","mustLoadOnDemand","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand","cbFinished","doSetInitialStateOnDemand","getNodeIdToBeSelected","onGetStateFromStorage","getItem","nodeIds","selectCount","addToSelection","removeFromSelection","nodeIdsParam","selectedNodes","loadingCount","newNodesIds","loadAndOpenNode","_supportsLocalStorage","testSupport","sessionStorage","removeItem","ContainerScrollParent","_ref","$container","refreshHitAreas","checkHorizontalScrolling","newHorizontalScrollDirection","getNewHorizontalScrollDirection","horizontalScrollDirection","horizontalScrollTimeout","verticalScrollTimeout","scrollHorizontally","checkVerticalScrolling","newVerticalScrollDirection","getNewVerticalScrollDirection","verticalScrollDirection","scrollVertically","getScrollLeft","scrollLeft","scrollToY","scrollTop","stopScrolling","scrollParentTop","scrollParentBottom","scrollParentOffset","container","rightEdge","clientWidth","leftEdge","getScrollParentTop","getScrollParentBottom","distance","scrollBy","behavior","innerHeight","DocumentScrollParent","documentElement","treeTop","documentScrollHeight","documentScrollWidth","isNearLeftEdge","canScrollRight","getDocumentScrollWidth","canScrollDown","clientHeight","getDocumentScrollHeight","scrollHeight","scrollWidth","hasOverFlow","attr","overflowValue","createScrollParent","$treeElement","parents","getParentWithOverflow","tagName","ScrollHandler","scrollParent","checkScrolling","getScrollParent","SelectNodeHandler","Set","selectedSingleNode","getSelectedNodesUnder","has","includeChildren","activeElement","_containsElement","BorderDropHint","querySelector","hint","max","offsetWidth","style","GhostDropHint","ghost","createGhostElement","moveAfter","moveBefore","moveInsideOpenFolder","moveInside","childElement","circleSpan","lineSpan","NodeElement","mustShowBorderDropHint","select","mustSetFocus","getTitleSpan","toString","focus","deselect","removeAttribute","blur","getUl","FolderElement","open","animationSpeed","getButton","renderer","icon","doOpen","slideDown","show","close","doClose","slideUp","hide","NODE_PARAM_IS_EMPTY","PARAM_IS_EMPTY","JqTreeWidget","autoOpen","dataUrl","onCanSelectNode","selectable","startDndDelay","useContextMenu","toggle","slideParam","Error","getTree","optionsParam","doSelectNode","toJson","doLoadData","loadDataFromUrl","param1","param2","param3","doLoadDataFromUrl","reload","getNodeByHtmlElement","inputElement","HTMLElement","getNode","parseParams","dndHandler","addNodeAfter","newNodeInfo","existingNode","newNode","addNodeBefore","addParentNode","removeNode","appendNode","parentNodeParam","prependNode","updateNode","idIsChanged","isSelectedNodeInSubtree","subtree","positionIndex","saveStateHandler","scrollToNode","scrollHandler","setState","setOption","option","keyHandler","getVersion","eventName","values","event","Event","trigger","doOpenNode","_node","_slide","_onFinished","loadFolderOnDemand","mustSelect","selectCurrentNode","isInitialized","getRtlOption","getDefaultClosedIcon","dataLoader","initData","on","handleClick","handleDblclick","handleContextmenu","off","getDataUrlInfo","setUrlInfoData","selectedNodeId","getUrlFromString","initTree","doInit","autoOpenNodes","maxLevel","getAutoOpenMaxLevel","isRestored","restoreState","parseInt","clickTarget","getClickTarget","type","stopPropagation","click_event","closest","jqTreeElement","liElement","deselectCurrentNode","dataRtl","selectOptions","mustToggle","openParents","canSelect","previous_node","deselectedNode","deselected_node","deselectNodes","loadSubtree","tree_data","parent_node","selectedNodesUnderParent","urlInfoParam"],"mappings":"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"} \ No newline at end of file