jquery.fancytree
Version:
jQuery tree view / tree grid plugin with support for keyboard, inline editing, filtering, checkboxes, drag'n'drop, and lazy loading
220 lines (205 loc) • 7.16 kB
HTML
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>Test D'n'D - Fancytree</title>
<script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
<!--
<script src="//code.jquery.com/ui/1.10.4/jquery-ui.min.js"></script>
-->
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<link href="../src/skin-win8/ui.fancytree.css" rel="stylesheet">
<script src="../src/jquery.fancytree.js"></script>
<script src="../src/jquery.fancytree.columnview.js"></script>
<script src="../src/jquery.fancytree.dnd.js"></script>
<script src="../src/jquery.fancytree.table.js"></script>
<!-- Start_Exclude: This block is not part of the sample code -->
<link href="../lib/prettify.css" rel="stylesheet">
<script src="../lib/prettify.js"></script>
<link href="../demo/sample.css" rel="stylesheet">
<script src="../demo/sample.js"></script>
<!-- End_Exclude -->
<style type="text/css">
.draggable,
.droppable {
border: 1px solid green;
padding: 3px;
background-color: silver;
}
/* Prevent scrolling while DND */
ul.fancytree-container {
/*
height: 200px;
overflow: auto;
*/
/* position: inherit;*/
}
</style>
<script type="text/javascript">
$(function(){
var count = 1;
/*
TODO: option 'preventTextSelect'?
Already implemented, but doesn't always work:
}).on("selectstart" + ns, "span.fancytree-title", function(event){
// prevent mouse-drags to select text ranges
// tree.debug("<span title> got event " + event.type);
event.preventDefault();
TODO: disable auto-scroll by default:
seems to have problems to calculate helper position,
--> see here http://api.jqueryui.com/draggable/#event-drag
for a possible fix?
and enabling scrolling would always require custom changes, like
setting the container height?
TODO: Revert always flies to top-left corner of container
*/
// Attach the fancytree widget to an existing <div id="tree"> element
// and pass the tree options as an argument to the fancytree() function:
$("#tree").fancytree({
extensions: ["dnd"],
checkbox: true,
// debugLevel: 1,
source: {
url: "ajax-tree-plain.json"
},
activate: function(event, data) {
},
lazyLoad: function(event, data) {
data.result = {url: "ajax-sub2.json"}
},
dnd: {
preventVoidMoves: true, // Prevent dropping nodes 'before self', etc.
preventRecursiveMoves: true, // Prevent dropping nodes on own descendants
autoExpandMS: 400,
// focusOnClick: true,
refreshPositions: true,
draggable: {
appendTo: "body", // We don't want to clip the helper inside container
// scroll: false,
// containment: "parent", // $("ul.fancytree-container"),
// cursorAt: { left: 5 },
revert: "invalid"
// revert: function(dropped) {
// return
// }
},
dragStart: function(node, data) {
// allow dragging `node`:
return true;
},
dragEnter: function(node, data) {
return true;
},
initHelper: function(node, data) {
// Helper was just created: modify markup
var helper = data.ui.helper,
sourceNodes = data.tree.getSelectedNodes();
// Store a list of active + all selected nodes
if( !node.isSelected() ) {
sourceNodes.unshift(node);
}
helper.data("sourceNodes", sourceNodes);
// Mark selected nodes also as drag source (active node is already)
$(".fancytree-active,.fancytree-selected", tree.$container)
.addClass("fancytree-drag-source");
// Add a counter badge to helper if dragging more than one node
if( sourceNodes.length > 1 ) {
helper.append($("<span class='fancytree-childcounter'/>")
.text("+" + (sourceNodes.length - 1)));
}
// Prepare an indicator for copy-mode
helper.prepend($("<span class='fancytree-dnd-modifier'/>")
.text("+").hide());
},
updateHelper: function(node, data) {
// Mouse was moved or key pressed: update helper according to modifiers
// NOTE: pressing modifier keys stops dragging in jQueryUI 1.11
// http://bugs.jqueryui.com/ticket/14461
var event = data.originalEvent,
tree = node.tree,
copyMode = event.ctrlKey || event.altKey;
// Adjust the drop marker icon
// data.dropMarker.toggleClass("fancytree-drop-copy", copyMode);
// Show/hide the helper's copy indicator (+)
data.ui.helper.find(".fancytree-dnd-modifier").toggle(copyMode);
// tree.debug("1", $(".fancytree-active,.fancytree-selected", tree.$container).length)
// tree.debug("2", $(".fancytree-active,.fancytree-selected").length)
// Dim the source node(s) in move-mode
$(".fancytree-drag-source", tree.$container)
.toggleClass("fancytree-drag-remove", !copyMode);
// data.dropMarker.toggleClass("fancytree-drop-move", !copyMode);
},
dragDrop: function(node, data) {
var sourceNodes = data.ui.helper.data("sourceNodes"),
event = data.originalEvent,
copyMode = event.ctrlKey || event.altKey;
if( copyMode ) {
$.each(sourceNodes, function(i, o){
o.copyTo(node, data.hitMode, function(n){
delete n.key;
n.selected = false;
n.title = "Copy of " + n.title;
});
});
}else{
$.each(sourceNodes, function(i, o){
o.moveTo(node, data.hitMode);
});
}
}
}
});
$(".droppable").droppable({
drop: function(event, ui){
var node = $(ui.helper).data("ftSourceNode"),
tree = node.tree,
copyMode = event.ctrlKey || event.altKey,
sourceNodes = ui.helper.data("sourceNodes");
if( !copyMode ) {
$.each(sourceNodes, function(i, o){
o.remove();
});
}
$(this).append((copyMode ? "Copied " : "Moved ") + sourceNodes.length + " nodes. ");
}
});
});
</script>
</head>
<body class="example">
<h1>Example: extended drag'n'drop sample</h1>
<div class="description">
This sample shows how to
<ul>
<li>implement drag'n'drop with multiple selected nodes
<li>allow modfier keys <kbd>Ctrl</kbd> or <kbd>Alt</kbd> to force copy
instead of move operations
</ul>
<b>Note:</b> Due to <a href="http://bugs.jqueryui.com/ticket/14461">a draggable issue with modifier keys in jQuery UI 1.11</a>, this sample uses jQuery UI 1.10.
</div>
<p class="warning">
This is work in progress.
</p>
<div>
<label for="skinswitcher">Skin:</label> <select id="skinswitcher"></select>
</div>
<!-- Add a <table> element where the tree should appear: -->
<p class="description">
Standard tree:
</p>
<div id="tree"></div>
<p class="droppable">
Droppable.
</p>
<!-- Start_Exclude: This block is not part of the sample code -->
<hr>
<p class="sample-links no_code">
<a class="hideInsideFS" href="https://github.com/mar10/fancytree">jquery.fancytree.js project home</a>
<a class="hideOutsideFS" href="#">Link to this page</a>
<a class="hideInsideFS" href="index.html">Example Browser</a>
<a href="#" id="codeExample">View source code</a>
</p>
<pre id="sourceCode" class="prettyprint" style="display:none"></pre>
<!-- End_Exclude -->
</body>
</html>