JavaScript DHTML/Ext JS/Tree
Содержание
Check Tree
<source lang="html4strict">
<html> <head> <title>Hello World Window</title> <link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" /> <script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="ext-3.0.0/ext-all.js"></script> <script type="text/javascript"> /*!
* Ext JS Library 3.0.0 * Copyright(c) 2006-2009 Ext JS, LLC * licensing@extjs.ru * http://www.extjs.ru/license */
Ext.onReady(function(){
var tree = new Ext.tree.TreePanel({ renderTo:"tree-div", title: "My Task List", height: 300, width: 400, useArrows:true, autoScroll:true, animate:true, enableDD:true, containerScroll: true, rootVisible: false, frame: true, root: { nodeType: "async" }, // auto create TreeLoader dataUrl: "ext-3.0.0/examples/tree/check-nodes.json", listeners: { "checkchange": function(node, checked){ if(checked){ node.getUI().addClass("complete"); }else{ node.getUI().removeClass("complete"); } } }, buttons: [{ text: "Get Completed Tasks", handler: function(){ var msg = "", selNodes = tree.getChecked(); Ext.each(selNodes, function(node){ if(msg.length > 0){ msg += ", "; } msg += node.text; }); Ext.Msg.show({ title: "Completed Tasks", msg: msg.length > 0 ? msg : "None", icon: Ext.Msg.INFO, minWidth: 200, buttons: Ext.Msg.OK }); } }] }); tree.getRootNode().expand(true);
}); </script> </head> <body>
</body> </html>
</source>
Column tree
<source lang="html4strict">
<html> <head> <title>Hello World Window</title> <link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" /> <script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="ext-3.0.0/ext-all.js"></script>
<link rel="stylesheet" type="text/css" href="ext-3.0.0/examples/ux/css/ColumnNodeUI.css" /> <script type="text/javascript" src="ext-3.0.0/examples/ux/ColumnNodeUI.js"></script>
<script> /*!
* Ext JS Library 3.0.0 * Copyright(c) 2006-2009 Ext JS, LLC * licensing@extjs.ru * http://www.extjs.ru/license */
Ext.onReady(function(){
var tree = new Ext.ux.tree.ColumnTree({ width: 550, height: 300, rootVisible:false, autoScroll:true, title: "Example Tasks", renderTo: Ext.getBody(), columns:[{ header:"Task", width:330, dataIndex:"task" },{ header:"Duration", width:100, dataIndex:"duration" },{ header:"Assigned To", width:100, dataIndex:"user" }], loader: new Ext.tree.TreeLoader({ dataUrl:"ext-3.0.0/examples/tree/column-data.json", uiProviders:{ "col": Ext.ux.tree.ColumnNodeUI } }), root: new Ext.tree.AsyncTreeNode({ text:"Tasks" }) });
}); </script> </head> <body>
ColumnTree Example
</body> </html>
</source>
Drop anything into the tree
<source lang="html4strict">
<html> <head> <title>Hello World Window</title> <link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" /> <script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="ext-3.0.0/ext-all.js"></script> <script type="text/javascript" src="ext-3.0.0/examples/ux/DataView-more.js"></script> </head>
<body> <script type="text/javascript"> /*!
* Ext JS Library 3.0.0 * Copyright(c) 2006-2009 Ext JS, LLC * licensing@extjs.ru * http://www.extjs.ru/license */
Ext.onReady(function(){
Ext.QuickTips.init(); // Album toolbar var newIndex = 3; var tb = new Ext.Toolbar({ items:[{ text: "New Album", iconCls: "album-btn", handler: function(){ var node = root.appendChild(new Ext.tree.TreeNode({ text:"Album " + (++newIndex), cls:"album-node", allowDrag:false })); tree.getSelectionModel().select(node); setTimeout(function(){ ge.editNode = node; ge.startEdit(node.ui.textNode); }, 10); } }] }); // set up the Album tree var tree = new Ext.tree.TreePanel({ // tree animate:true, enableDD:true, containerScroll: true, ddGroup: "organizerDD", rootVisible:false, // layout region:"west", width:200, split:true, // panel title:"My Albums", autoScroll:true, tbar: tb, margins: "5 0 5 5" }); var root = new Ext.tree.TreeNode({ text: "Albums", allowDrag:false, allowDrop:false }); tree.setRootNode(root); root.appendChild( new Ext.tree.TreeNode({text:"Album 1", cls:"album-node", allowDrag:false}), new Ext.tree.TreeNode({text:"Album 2", cls:"album-node", allowDrag:false}), new Ext.tree.TreeNode({text:"Album 3", cls:"album-node", allowDrag:false}) ); // add an inline editor for the nodes var ge = new Ext.tree.TreeEditor(tree, {/* fieldconfig here */ }, { allowBlank:false, blankText:"A name is required", selectOnFocus:true }); // Set up images view var view = new Ext.DataView({ itemSelector: "div.thumb-wrap", style:"overflow:auto", multiSelect: true, plugins: new Ext.DataView.DragSelector({dragSafe:true}), store: new Ext.data.JsonStore({ url: "../view/get-images.php", autoLoad: true, root: "images", id:"name", fields:[ "name", "url", {name: "shortName", mapping: "name", convert: shortName} ] }), tpl: new Ext.XTemplate( "<tpl for=".">","
"</tpl>" ) }); var images = new Ext.Panel({ id:"images", title:"My Images", region:"center", margins: "5 5 5 0", layout:"fit", items: view }); var layout = new Ext.Panel({ layout: "border", width:650, height:400, items: [tree, images] }); layout.render("layout"); var dragZone = new ImageDragZone(view, {containerScroll:true, ddGroup: "organizerDD"});
});
/**
* Create a DragZone instance for our JsonView */
ImageDragZone = function(view, config){
this.view = view; ImageDragZone.superclass.constructor.call(this, view.getEl(), config);
}; Ext.extend(ImageDragZone, Ext.dd.DragZone, {
// We don"t want to register our image elements, so let"s // override the default registry lookup to fetch the image // from the event instead getDragData : function(e){ var target = e.getTarget(".thumb-wrap"); if(target){ var view = this.view; if(!view.isSelected(target)){ view.onClick(e); } var selNodes = view.getSelectedNodes(); var dragData = { nodes: selNodes }; if(selNodes.length == 1){ dragData.ddel = target; dragData.single = true; }else{ var div = document.createElement("div"); // create the multi element drag "ghost" div.className = "multi-proxy"; for(var i = 0, len = selNodes.length; i < len; i++){ div.appendChild(selNodes[i].firstChild.firstChild.cloneNode(true)); // image nodes only if((i+1) % 3 == 0){ div.appendChild(document.createElement("br")); } } var count = document.createElement("div"); // selected image count count.innerHTML = i + " images selected"; div.appendChild(count); dragData.ddel = div; dragData.multi = true; } return dragData; } return false; }, // this method is called by the TreeDropZone after a node drop // to get the new tree node (there are also other way, but this is easiest) getTreeNode : function(){ var treeNodes = []; var nodeData = this.view.getRecords(this.dragData.nodes); for(var i = 0, len = nodeData.length; i < len; i++){ var data = nodeData[i].data; treeNodes.push(new Ext.tree.TreeNode({ text: data.name, icon: "../view/"+data.url, data: data, leaf:true, cls: "image-node" })); } return treeNodes; }, // the default action is to "highlight" after a bad drop // but since an image can"t be highlighted, let"s frame it afterRepair:function(){ for(var i = 0, len = this.dragData.nodes.length; i < len; i++){ Ext.fly(this.dragData.nodes[i]).frame("#8db2e3", 1); } this.dragging = false; }, // override the default repairXY with one offset for the margins and padding getRepairXY : function(e){ if(!this.dragData.multi){ var xy = Ext.Element.fly(this.dragData.ddel).getXY(); xy[0]+=3;xy[1]+=3; return xy; } return false; }
}); // Utility functions function shortName(name){
if(name.length > 15){ return name.substr(0, 12) + "..."; } return name;
}; </script>
</body> </html>
</source>
Two trees
<source lang="html4strict">
<head> <title>Hello World Window</title> <link rel="stylesheet" type="text/css" href="ext-3.0.0/resources/css/ext-all.css" /> <script type="text/javascript" src="ext-3.0.0/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="ext-3.0.0/ext-all.js"></script> <script> /*!
* Ext JS Library 3.0.0 * Copyright(c) 2006-2009 Ext JS, LLC * licensing@extjs.ru * http://www.extjs.ru/license */
var TreeTest = function(){
// shorthand var Tree = Ext.tree; return { init : function(){ // yui-ext tree var tree = new Tree.TreePanel({ animate:true, autoScroll:true, loader: new Tree.TreeLoader({dataUrl:"get-nodes.php"}), enableDD:true, containerScroll: true, border: false, dropConfig: {appendOnly:true} }); // add a tree sorter in folder mode new Tree.TreeSorter(tree, {folderSort:true}); // set the root node var root = new Tree.AsyncTreeNode({ text: "Ext JS", draggable:false, // disable root node dragging id:"src" }); tree.setRootNode(root); // render the tree tree.render("tree"); root.expand(false, /*no anim*/ false); //------------------------------------------------------------- // YUI tree var tree2 = new Tree.TreePanel({ animate:true, autoScroll:true, //rootVisible: false, loader: new Ext.tree.TreeLoader({ dataUrl:"get-nodes.php", baseParams: {lib:"yui"} // custom http params }), containerScroll: true, border: false, enableDD:true, dropConfig: {appendOnly:true} }); // add a tree sorter in folder mode new Tree.TreeSorter(tree2, {folderSort:true}); // add the root node var root2 = new Tree.AsyncTreeNode({ text: "My Files", draggable:false, id:"yui" }); tree2.setRootNode(root2); tree2.render("tree2"); root2.expand(false, /*no anim*/ false); } };
}(); Ext.EventManager.onDocumentReady(TreeTest.init, TreeTest, true); </script> </head> <body> </body>
</source>