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..4c1f105 100644 --- a/js/jquery.treegrid.js +++ b/js/jquery.treegrid.js @@ -37,6 +37,60 @@ $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() { + 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'); + removeChildren($this); + $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 +284,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