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