all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH manager 3/4] ui: tree: show nested pools in a nested way
Date: Thu, 22 Jan 2026 14:58:33 +0100	[thread overview]
Message-ID: <20260122140143.2256222-4-d.csapak@proxmox.com> (raw)
In-Reply-To: <20260122140143.2256222-1-d.csapak@proxmox.com>

instead of using a flat list.

This dynamically inserts the necessary nodes into the tree when
inserting a pool node or a node below.

For that, we might need to insert all parent pools in a recursive way
(since they might not exist yet).

Also add an option to the 'tree settings' to choose the old behavior.

For this we have to change the way we 'redraw' the tree when applying
the tree settings, because the code handling these changes can only
handle reordering in one level (e.g. when changing from vmid to name
sorting), but cannot handle a change in the grouping/nesting.

For that we have to completely clear the tree and update fresh.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/manager6/UIOptions.js               |  1 +
 www/manager6/Workspace.js               |  5 +++-
 www/manager6/tree/ResourceTree.js       | 31 +++++++++++++++++++++----
 www/manager6/window/TreeSettingsEdit.js | 13 +++++++++++
 4 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/www/manager6/UIOptions.js b/www/manager6/UIOptions.js
index 7c836b65..99b999b7 100644
--- a/www/manager6/UIOptions.js
+++ b/www/manager6/UIOptions.js
@@ -93,6 +93,7 @@ Ext.define('PVE.UIOptions', {
             'sort-field': 'vmid',
             'group-templates': true,
             'group-guest-types': true,
+            'nest-pools': true,
         };
 
         return browserValues?.[key] ?? defaults[key];
diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
index 3d3b5f62..b8061c2a 100644
--- a/www/manager6/Workspace.js
+++ b/www/manager6/Workspace.js
@@ -508,7 +508,10 @@ Ext.define('PVE.StdWorkspace', {
                                     handler: () => {
                                         Ext.create('PVE.window.TreeSettingsEdit', {
                                             autoShow: true,
-                                            apiCallDone: () => PVE.UIOptions.fireUIConfigChanged(),
+                                            apiCallDone: () => {
+                                                rtree.refreshTree();
+                                                PVE.UIOptions.fireUIConfigChanged();
+                                            },
                                         });
                                     },
                                 },
diff --git a/www/manager6/tree/ResourceTree.js b/www/manager6/tree/ResourceTree.js
index 76d58e2f..99b33670 100644
--- a/www/manager6/tree/ResourceTree.js
+++ b/www/manager6/tree/ResourceTree.js
@@ -202,11 +202,29 @@ Ext.define('PVE.tree.ResourceTree', {
     },
 
     // private
-    addChildSorted: function (node, info) {
+    addChildSorted: function (node, info, insertPool = false) {
         let me = this;
 
         me.setIconCls(info);
 
+        let nestPools = PVE.UIOptions.getTreeSortingValue('nest-pools');
+        if (info.type === 'pool' && info.pool && !insertPool && nestPools) {
+            let parentPool = info.pool.split('/').slice(0, -1).join('/');
+            if (parentPool.length > 0) {
+                let parent = node.findChild('id', `/pool/${parentPool}`, true);
+                if (parent !== node) {
+                    if (!parent) {
+                        parent = me.addChildSorted(node, {
+                            type: 'pool',
+                            id: `/pool/${parentPool}`,
+                            pool: parentPool,
+                        });
+                    }
+                    return me.addChildSorted(parent, info, true);
+                }
+            }
+        }
+
         if (info.groupbyid) {
             if (me.viewFilter.groupRenderer) {
                 info.text = me.viewFilter.groupRenderer(info);
@@ -239,7 +257,7 @@ Ext.define('PVE.tree.ResourceTree', {
         let v = info[groupBy];
 
         if (v) {
-            let group = node.findChild('groupbyid', v);
+            let group = node.findChild('groupbyid', v, true);
             if (!group) {
                 let groupinfo;
                 if (info.type === groupBy) {
@@ -270,7 +288,7 @@ Ext.define('PVE.tree.ResourceTree', {
     saveSortingOptions: function () {
         let me = this;
         let changed = false;
-        for (const key of ['sort-field', 'group-templates', 'group-guest-types']) {
+        for (const key of ['sort-field', 'group-templates', 'group-guest-types', 'nest-pools']) {
             let newValue = PVE.UIOptions.getTreeSortingValue(key);
             if (me[key] !== newValue) {
                 me[key] = newValue;
@@ -555,8 +573,7 @@ Ext.define('PVE.tree.ResourceTree', {
             },
             setViewFilter: function (view) {
                 me.viewFilter = view;
-                me.clearTree();
-                updateTree();
+                me.refreshTree();
             },
             clearTree: function () {
                 pdata.updateCount = 0;
@@ -566,6 +583,10 @@ Ext.define('PVE.tree.ResourceTree', {
                 pdata.dataIndex = {};
                 me.getSelectionModel().deselectAll();
             },
+            refreshTree: function () {
+                me.clearTree();
+                updateTree();
+            },
             selectExpand: function (node) {
                 let sm = me.getSelectionModel();
                 if (!sm.isSelected(node)) {
diff --git a/www/manager6/window/TreeSettingsEdit.js b/www/manager6/window/TreeSettingsEdit.js
index 63bbd869..9c38f741 100644
--- a/www/manager6/window/TreeSettingsEdit.js
+++ b/www/manager6/window/TreeSettingsEdit.js
@@ -55,6 +55,19 @@ Ext.define('PVE.window.TreeSettingsEdit', {
                     value: '__default__',
                     deleteEmpty: false,
                 },
+                {
+                    xtype: 'proxmoxKVComboBox',
+                    name: 'nest-pools',
+                    fieldLabel: gettext('Nest Pools'),
+                    comboItems: [
+                        ['__default__', `${Proxmox.Utils.defaultText} (${gettext('Yes')})`],
+                        [1, gettext('Yes')],
+                        [0, gettext('No')],
+                    ],
+                    defaultValue: '__default__',
+                    value: '__default__',
+                    deleteEmpty: false,
+                },
                 {
                     xtype: 'displayfield',
                     userCls: 'pmx-hint',
-- 
2.47.3



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


  parent reply	other threads:[~2026-01-22 14:02 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-22 13:58 [pve-devel] [PATCH manager 0/4] ui: improve ux for nested pools Dominik Csapak
2026-01-22 13:58 ` [pve-devel] [PATCH manager 1/4] ui: tree: don't show empty grouping nodes as expandable Dominik Csapak
2026-01-22 13:58 ` [pve-devel] [PATCH manager 2/4] ui: pool create: allow selecting parent pool via selector Dominik Csapak
2026-01-22 15:59   ` Thomas Lamprecht
2026-01-23  8:13   ` [pve-devel] superseded: " Dominik Csapak
2026-01-22 13:58 ` Dominik Csapak [this message]
2026-01-22 13:58 ` [pve-devel] [PATCH manager 4/4] ui: tree: render nested pool names without parent pools Dominik Csapak
2026-01-22 19:59 ` [pve-devel] partially-applied: [PATCH manager 0/4] ui: improve ux for nested pools Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260122140143.2256222-4-d.csapak@proxmox.com \
    --to=d.csapak@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal