From 839199e441f13d751dcdc15a9b22394ec1903578 Mon Sep 17 00:00:00 2001 From: Jakob Jensen Date: Fri, 10 Oct 2014 18:34:31 +0200 Subject: [PATCH 1/2] Able to attach new nodes to tree. Able to remove nodes from tree. --- index.html | 19 ++++++++++++++-- js/jquery.treegrid.js | 51 ++++++++++++++++++++++++++++++++++++++++++- tests/tests.js | 23 +++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 4a34aca..5132bf0 100644 --- a/index.html +++ b/index.html @@ -402,8 +402,23 @@

Public methods

$('#node-2').treegrid('render');
- - + + + attachNode + Attach node, set it up and render it + +
$('#tree').treegrid('attachNode',
+  $('<tr class="treegrid-5">' +
+    '<td>Node 1-2-1</td><td>Additional info</td></tr>'));
+ + + + removeNode + Remove node then redraw parent node + +
$('#node-2').treegrid('removeNode');
+ +

Events

diff --git a/js/jquery.treegrid.js b/js/jquery.treegrid.js index 1785e53..6b2143a 100644 --- a/js/jquery.treegrid.js +++ b/js/jquery.treegrid.js @@ -37,6 +37,51 @@ $this.treegrid('initExpander').treegrid('initIndent').treegrid('initEvents').treegrid('initState').treegrid("initSettingsEvents"); }); }, + /** + * Attach node + * + * @param {HtmlElement|String|Object} node + * @returns {Object[]} + */ + attachNode: function(node) { + return this.each(function() { + var $this = $(this); + var $node = $(node); + var $insertion; + var parentIndex = $this.treegrid('getSetting', 'getParentNodeId').apply($node); + if (parentIndex !== null) { + $insertion = $this.treegrid('getSetting', 'getNodeById').apply(this, [parentIndex, $this.treegrid('getTreeContainer')]); + } else { + $insertion = $this.find('tbody:last'); + if ($insertion.length != 0) { + $this = $insertion; + } + $insertion = $this.find('tr:last'); + } + if ($insertion.length != 0) { + $node.insertAfter($insertion).treegrid('initExpander').treegrid('initIndent').treegrid('initEvents').treegrid('initState').treegrid("initSettingsEvents"); + $node.treegrid('getParentNode').treegrid('expand'); + } + }); + }, + /** + * Remove node + * + * @returns {Object[]} + */ + removeNode: function() { + return this.each(function() { + var $this = $(this); + var $parent = $this.treegrid('getParentNode'); + $this.treegrid('getChildNodes').remove(); + $this.remove(); + if ($parent.treegrid('getChildNodes').length == 0) { + $parent.trigger("collapse").treegrid('getSetting', 'getExpander').apply($parent) + .removeClass($parent.treegrid('getSetting', 'expanderCollapsedClass')) + .removeClass($parent.treegrid('getSetting', 'expanderExpandedClass')); + } + }); + }, /** * Initialize node events * @@ -230,7 +275,11 @@ * @returns {HtmlElement} */ getTreeContainer: function() { - return $(this).data('treegrid'); + if ($(this).is("table")) { + return $(this).data('treegrid'); + } else { + return $(this).closest('table').data('treegrid'); + } }, /** * Set tree container diff --git a/tests/tests.js b/tests/tests.js index 3839f23..689f358 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -191,4 +191,27 @@ test("Global Events test", function() { $('#tree-4').find('#anode-1').treegrid("expand"); $('#tree-4').find('#anode-1').treegrid("collapse"); equal(globalCounter, count + 4); +}); + +test("Attaching and removing nodes", function() { + equal($('#tree-2').treegrid('getAllNodes').length, 11, "11"); + + var $leafNode = $('#tree-2').find('#tnode-1-1-2-1').clone(); + + $('#tree-2').find('#tnode-1-1-2-1').treegrid('removeNode'); + equal($('#tree-2').treegrid('getAllNodes').length, 10, "10"); + + $('#tree-2').treegrid('attachNode', $leafNode); + equal($('#tree-2').treegrid('getAllNodes').length, 11, "11"); + + var $branchNode = $('#tree-2').find('#tnode-1-1-2').clone(); + $('#tree-2').find('#tnode-1-1-2').treegrid('removeNode'); + equal($('#tree-2').treegrid('getAllNodes').length, 9, "9"); + + $('#tree-2').treegrid('attachNode', $branchNode); + equal($('#tree-2').treegrid('getAllNodes').length, 10, "10"); + + $('#tree-2').treegrid('attachNode', $leafNode); + equal($('#tree-2').treegrid('getAllNodes').length, 11, "11"); + }); \ No newline at end of file From fa668f5a29b2cf21430b1f1a6ca381000fe59ae1 Mon Sep 17 00:00:00 2001 From: Jakob Jensen Date: Thu, 16 Oct 2014 16:49:10 +0200 Subject: [PATCH 2/2] Recursively remove nodes, so we don't leave any hanging without a parent. --- js/jquery.treegrid.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/js/jquery.treegrid.js b/js/jquery.treegrid.js index 6b2143a..4c1f105 100644 --- a/js/jquery.treegrid.js +++ b/js/jquery.treegrid.js @@ -70,10 +70,19 @@ * @returns {Object[]} */ removeNode: function() { + var removeChildren = function($e) { + $e.treegrid('getChildNodes').each(function(i,v) { + var $v = $(v); + removeChildren($v); + $v.treegrid('getChildNodes').remove(); + }); + $e.treegrid('getChildNodes').remove(); + } + return this.each(function() { var $this = $(this); var $parent = $this.treegrid('getParentNode'); - $this.treegrid('getChildNodes').remove(); + removeChildren($this); $this.remove(); if ($parent.treegrid('getChildNodes').length == 0) { $parent.trigger("collapse").treegrid('getSetting', 'getExpander').apply($parent)