[pve-devel] [PATCH manager] ui: resource tree: add collapse/expand all button
    Dominik Csapak 
    d.csapak at proxmox.com
       
    Tue Nov 19 10:22:24 CET 2024
    
    
  
which defaults to expand all, and only if all expanded, collapse all.
Changes icon dynamically when nodes expand/collapse.
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
if we'd find an icon that would fit for both cases, we could omit the
event bubbling probably. If there are many nodes, the 'hasCollapsed'
check will trigger more often, iterating over all tree nodes..
 www/manager6/Workspace.js         | 20 ++++++++++++++++++++
 www/manager6/tree/ResourceTree.js | 31 +++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)
diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
index 922e01df..7bc2aeea 100644
--- a/www/manager6/Workspace.js
+++ b/www/manager6/Workspace.js
@@ -260,6 +260,15 @@ Ext.define('PVE.StdWorkspace', {
 		    },
 		},
 	    },
+	    listeners: {
+		expansionchange: function(tree) {
+		    if (tree.hasCollapsed()) {
+			me.down('#collapseButton').setIconCls('fa fa-fw fa-plus-square-o x-btn-icon-el-default-toolbar-small');
+		    } else {
+			me.down('#collapseButton').setIconCls('fa fa-fw fa-minus-square-o x-btn-icon-el-default-toolbar-small');
+		    }
+		},
+	    },
 	});
 
 	selview.on('select', function(combo, records) {
@@ -470,6 +479,17 @@ Ext.define('PVE.StdWorkspace', {
 			    padding: '0 0 5 0',
 			    items: [
 				selview,
+				{
+				    xtype: 'button',
+				    cls: 'x-btn-default-toolbar-small',
+				    itemId: 'collapseButton',
+				    tooltip: gettext('Expand/Collapse Tree'),
+				    iconCls: 'fa fa-fw fa-plus-square-o x-btn-icon-el-default-toolbar-small',
+				    handler: () => {
+					let rt = me.down('pveResourceTree');
+					rt.toggleExpansion();
+				    },
+				},
 				{
 				    xtype: 'button',
 				    cls: 'x-btn-default-toolbar-small',
diff --git a/www/manager6/tree/ResourceTree.js b/www/manager6/tree/ResourceTree.js
index 8b7c2521..cef869f7 100644
--- a/www/manager6/tree/ResourceTree.js
+++ b/www/manager6/tree/ResourceTree.js
@@ -255,6 +255,30 @@ Ext.define('PVE.tree.ResourceTree', {
 	return changed;
     },
 
+    hasCollapsed: function() {
+	let me = this;
+	let root = me.store.getRootNode();
+	let collapsed = false;
+	root.cascade(function(rec) {
+	    if (!rec.isExpanded() && !rec.isLeaf()) {
+		collapsed = true;
+		return false;
+	    }
+	    return true;
+	});
+	return collapsed;
+    },
+
+    toggleExpansion: function() {
+	let me = this;
+	let root = me.store.getRootNode();
+	if (me.hasCollapsed()) {
+	    root.expandChildren(true);
+	} else {
+	    root.collapseChildren(false);
+	}
+    },
+
     initComponent: function() {
 	let me = this;
 	me.saveSortingOptions();
@@ -562,6 +586,13 @@ Ext.define('PVE.tree.ResourceTree', {
 	rstore.on("load", updateTree);
 	rstore.startUpdate();
 
+	store.on('nodeexpand', function() {
+	    me.fireEvent('expansionchange', me);
+	});
+	store.on('nodecollapse', function() {
+	    me.fireEvent('expansionchange', me);
+	});
+
 	me.mon(Ext.GlobalEvents, 'loadedUiOptions', () => {
 	    me.store.getRootNode().cascadeBy({
 		before: function(node) {
-- 
2.39.5
    
    
More information about the pve-devel
mailing list