public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH manager v3 12/13] ui: qemu: hardware view: inline edit/remove/revert button in general grid
Date: Fri, 15 May 2026 10:44:30 +0200	[thread overview]
Message-ID: <20260515085349.1123127-13-d.csapak@proxmox.com> (raw)
In-Reply-To: <20260515085349.1123127-1-d.csapak@proxmox.com>

This means that the enableFn function handles the enabling/disabling now
for these buttons instead of set_button_status. The logic is partially
duplicated, but it's now with the respective button instead in a central
location.

Consequently, the set_button_status function now only sets the status
for the add buttons/menuitems.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 www/manager6/qemu/HardwareView.js | 118 +++++++++++++++---------------
 1 file changed, 58 insertions(+), 60 deletions(-)

diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
index e888bb46..e16436ab 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -447,13 +447,6 @@ Ext.define('PVE.qemu.HardwareView', {
             }
         };
 
-        let edit_btn = new Proxmox.button.Button({
-            text: gettext('Edit'),
-            selModel: sm,
-            disabled: true,
-            handler: run_editor,
-        });
-
         let runEfiEnroll = function () {
             let rec = sm.getSelection()[0];
             if (!rec) {
@@ -509,19 +502,6 @@ Ext.define('PVE.qemu.HardwareView', {
                 'Otherwise, you will be prompted for the BitLocker recovery key on the next boot!',
             );
 
-        let remove_btn = new PVE.button.ConfigRemove({
-            baseurl,
-            rows,
-            renderKey: function () {
-                return me.lookup('hardwareGrid').renderKey(...arguments);
-            },
-            reloadCallback: () => me.reload(),
-        });
-
-        let revert_btn = new PVE.button.PendingRevert({
-            apiurl: '/api2/extjs/' + baseurl,
-        });
-
         let efidisk_menuitem = Ext.create('Ext.menu.Item', {
             text: gettext('EFI Disk'),
             iconCls: 'fa fa-fw fa-hdd-o black',
@@ -550,9 +530,6 @@ Ext.define('PVE.qemu.HardwareView', {
         };
 
         let set_button_status = function () {
-            let hardwareGrid = me.lookup('hardwareGrid');
-            let rec = hardwareGrid.getSelection()[0];
-
             counts = {}; // en/disable hardwarebuttons
             let hasCloudInit = false;
             let items = me.rstore.getData();
@@ -589,40 +566,6 @@ Ext.define('PVE.qemu.HardwareView', {
             me.down('#addCloudinitDrive').setDisabled(
                 noVMConfigCDROMPerm || noVMConfigCloudinitPerm || hasCloudInit,
             );
-
-            if (!rec) {
-                remove_btn.disable();
-                edit_btn.disable();
-                revert_btn.disable();
-                return;
-            }
-            const { key, value } = rec.data;
-            const row = rows[key];
-
-            const deleted = !!rec.data.delete;
-            const pending = deleted || hardwareGrid.hasPendingChanges(key);
-
-            const isCloudInit = isCloudInitKey(value);
-            const isCDRom = value && PVE.Utils.diskIsCdrom(value);
-
-            const isUnusedDisk = key.match(/^unused\d+/);
-            const isUsedDisk = !isUnusedDisk && row.isOnStorageBus && !isCDRom;
-            const isDisk = isUnusedDisk || isUsedDisk;
-
-            let cannotDelete = deleted || row.never_delete;
-            cannotDelete ||= isCDRom && !cdromCap;
-            cannotDelete ||= isCloudInit && noVMConfigCloudinitPerm;
-            remove_btn.setDisabled(cannotDelete);
-
-            edit_btn.setDisabled(
-                deleted ||
-                    !row.editor ||
-                    isCloudInit ||
-                    (isCDRom && !cdromCap) ||
-                    (isDisk && !diskCap),
-            );
-
-            revert_btn.setDisabled(!pending);
         };
 
         let editorFactory = (classPath, extraOptions) => {
@@ -793,9 +736,64 @@ Ext.define('PVE.qemu.HardwareView', {
                                 ],
                             }),
                         },
-                        edit_btn,
-                        remove_btn,
-                        revert_btn,
+                        {
+                            xtype: 'proxmoxButton',
+                            text: gettext('Edit'),
+                            enableFn: function (rec) {
+                                const row = rows[rec.data.key];
+                                if (!!rec.data.delete || !row.editor) {
+                                    return false;
+                                }
+                                if (isCloudInitKey(rec.data.value)) {
+                                    return false;
+                                }
+                                if (PVE.Utils.diskIsCdrom(rec.data.value) && !cdromCap) {
+                                    return false;
+                                }
+                                if (
+                                    row.isOnStorageBus &&
+                                    !PVE.Utils.diskIsCdrom(rec.data.value) &&
+                                    !diskCap
+                                ) {
+                                    return false;
+                                }
+                                return true;
+                            },
+                            selModel: sm,
+                            disabled: true,
+                            handler: run_editor,
+                        },
+                        {
+                            xtype: 'pveConfigRemoveButton',
+                            baseurl,
+                            rows,
+                            enableFn: function (rec) {
+                                if (!!rec.data.delete || rows[rec.data.key].never_delete) {
+                                    return false;
+                                }
+                                if (PVE.Utils.diskIsCdrom(rec.data.value) && !cdromCap) {
+                                    return false;
+                                }
+                                if (
+                                    isCloudInitKey(rec.data.value) &&
+                                    !caps.vms['VM.Config.Cloudinit']
+                                ) {
+                                    return false;
+                                }
+                                return true;
+                            },
+                            renderKey: function () {
+                                return me.lookup('hardwareGrid').renderKey(...arguments);
+                            },
+                            reloadCallback: () => me.reload(),
+                        },
+                        {
+                            xtype: 'pvePendingRevertButton',
+                            enableFn: (rec) =>
+                                !!rec.data.delete ||
+                                me.lookup('hardwareGrid').hasPendingChanges(rec.data.key),
+                            apiurl: '/api2/extjs/' + baseurl,
+                        },
                     ],
                     rows: rows,
                     sorterFn: sorterFn,
-- 
2.47.3





  parent reply	other threads:[~2026-05-15  8:54 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15  8:44 [PATCH manager v3 00/13] ui: split out disks and nics into grids Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 01/13] ui: utils: factor out 'media=cdrom' check Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 02/13] ui: factor out the guest key nic regex check Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 03/13] ui: parser: qemu drive: allow '-' in key names Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 04/13] ui: add pending grid Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 05/13] ui: revert button: add parentXType and reloadCallback Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 06/13] ui: button: add config remove button Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 07/13] ui: qemu: hardware: wrap in container Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 08/13] ui: qemu: introduce hardware disk grid Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 09/13] ui: qemu: introduce hardware net grid Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 10/13] ui: qemu: hardware view: separate disks into own grid Dominik Csapak
2026-05-15  8:44 ` [PATCH manager v3 11/13] ui: qemu: hardware view: separate nics " Dominik Csapak
2026-05-15  8:44 ` Dominik Csapak [this message]
2026-05-15  8:44 ` [PATCH manager v3 13/13] ui: qemu: hardware view: inline 'add efi' menuitem Dominik Csapak
2026-05-15  9:18 ` [PATCH manager v3 00/13] ui: split out disks and nics into grids Dominik Csapak
2026-05-15  9:20   ` Dominik Csapak

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=20260515085349.1123127-13-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal