From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 9F4901FF191 for ; Tue, 7 Oct 2025 14:13:52 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 7451117B7D; Tue, 7 Oct 2025 14:13:55 +0200 (CEST) From: Nicolas Frey To: pve-devel@lists.proxmox.com Date: Tue, 7 Oct 2025 14:13:52 +0200 Message-ID: <20251007121352.102236-1-n.frey@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.008 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [proxmox.com] Subject: [pve-devel] [PATCH pve-manager v4] ui: fix #6209: create snapshots and backups from context menu X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" The original feature request only specified the ability to take snapshots. I added the manual backup shortcut as well, since navigating through the menu for this action felt unnecessarily cumbersome when performing just a quick backup. Changes since v3: * replace anonymous functions with arrow style functions * reverted approach from v2 after some experimentation, simulating latency using chrome dev tools + traffic control * uses the same approach as in v1/v2 to match behaviour seen in the Snapshot tab Changes since v2: * rebased * use autoShow on snapshot and backup windows * improve UX and account for slow connections by only making API calls for snapshot feature on button click changes since v1, thanks @Fiona Ebner * clarified commit message * addressed several issues in the added menu options, namely: * correctly handle disabled state with async * fixed negation logic and cleaned up minor nits Fixes: https://bugzilla.proxmox.com/show_bug.cgi?id=6209 Signed-off-by: Nicolas Frey --- www/manager6/lxc/CmdMenu.js | 49 ++++++++++++++++++++++++++++++++++++ www/manager6/qemu/CmdMenu.js | 49 ++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/www/manager6/lxc/CmdMenu.js b/www/manager6/lxc/CmdMenu.js index cd60c967..a7940e04 100644 --- a/www/manager6/lxc/CmdMenu.js +++ b/www/manager6/lxc/CmdMenu.js @@ -134,6 +134,40 @@ Ext.define('PVE.lxc.CmdMenu', { }, }, { xtype: 'menuseparator' }, + { + text: gettext('Take Snapshot'), + iconCls: 'fa fa-fw fa-history', + itemId: 'takeSnapshotBtn', + disabled: true, + handler: () => { + Ext.create('PVE.window.Snapshot', { + nodename: info.node, + vmid: info.vmid, + vmname: info.name, + viewonly: false, + type: info.type, + isCreate: true, + submitText: gettext('Take Snapshot'), + autoShow: true, + running: running, + }); + }, + }, + { + text: gettext('Backup now'), + iconCls: 'fa fa-fw fa-floppy-o', + disabled: !caps.vms['VM.Backup'], + handler: () => { + Ext.create('PVE.window.Backup', { + nodename: info.node, + vmid: info.vmid, + vmtype: info.type, + vmname: info.name, + autoShow: true, + }); + }, + }, + { xtype: 'menuseparator' }, { text: gettext('Console'), iconCls: 'fa fa-fw fa-terminal', @@ -149,5 +183,20 @@ Ext.define('PVE.lxc.CmdMenu', { ]; me.callParent(); + + if (caps.vms['VM.Snapshot']) { + Proxmox.Utils.API2Request({ + url: `/nodes/${info.node}/${info.type}/${info.vmid}/feature`, + params: { feature: 'snapshot' }, + method: 'GET', + success: (response) => { + let hasFeature = response.result.data.hasFeature; + let btn = me.down('#takeSnapshotBtn'); + if (btn) { + btn.setDisabled(!hasFeature); + } + }, + }); + } }, }); diff --git a/www/manager6/qemu/CmdMenu.js b/www/manager6/qemu/CmdMenu.js index adf64672..df6045bf 100644 --- a/www/manager6/qemu/CmdMenu.js +++ b/www/manager6/qemu/CmdMenu.js @@ -169,6 +169,40 @@ Ext.define('PVE.qemu.CmdMenu', { }, }, { xtype: 'menuseparator' }, + { + text: gettext('Take Snapshot'), + iconCls: 'fa fa-fw fa-history', + itemId: 'takeSnapshotBtn', + disabled: true, + handler: () => { + Ext.create('PVE.window.Snapshot', { + nodename: info.node, + vmid: info.vmid, + vmname: info.name, + viewonly: false, + type: info.type, + isCreate: true, + submitText: gettext('Take Snapshot'), + autoShow: true, + running: running, + }); + }, + }, + { + text: gettext('Backup now'), + iconCls: 'fa fa-fw fa-floppy-o', + disabled: !caps.vms['VM.Backup'], + handler: () => { + Ext.create('PVE.window.Backup', { + nodename: info.node, + vmid: info.vmid, + vmtype: info.type, + vmname: info.name, + autoShow: true, + }); + }, + }, + { xtype: 'menuseparator' }, { text: gettext('Console'), iconCls: 'fa fa-fw fa-terminal', @@ -194,5 +228,20 @@ Ext.define('PVE.qemu.CmdMenu', { ]; me.callParent(); + + if (caps.vms['VM.Snapshot']) { + Proxmox.Utils.API2Request({ + url: `/nodes/${info.node}/${info.type}/${info.vmid}/feature`, + params: { feature: 'snapshot' }, + method: 'GET', + success: (response) => { + let hasFeature = response.result.data.hasFeature; + let btn = me.down('#takeSnapshotBtn'); + if (btn) { + btn.setDisabled(!hasFeature); + } + }, + }); + } }, }); -- 2.47.3 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel