From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 4B06F6941A for ; Wed, 23 Mar 2022 11:35:19 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8FC7D2590B for ; Wed, 23 Mar 2022 11:34:55 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id CB793258FC for ; Wed, 23 Mar 2022 11:34:52 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 9F95041C87 for ; Wed, 23 Mar 2022 11:34:52 +0100 (CET) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Wed, 23 Mar 2022 11:34:43 +0100 Message-Id: <20220323103445.2075649-11-d.csapak@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220323103445.2075649-1-d.csapak@proxmox.com> References: <20220323103445.2075649-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.149 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pve-devel] [PATCH manager v4 08/10] ui: {lxc, qemu}/Config: show Tags and make them editable 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: , X-List-Received-Date: Wed, 23 Mar 2022 10:35:19 -0000 add the tags in the status line, and add a button for adding new ones Signed-off-by: Dominik Csapak --- www/manager6/lxc/Config.js | 68 +++++++++++++++++++++++++++++++++++-- www/manager6/qemu/Config.js | 66 +++++++++++++++++++++++++++++++++-- 2 files changed, 130 insertions(+), 4 deletions(-) diff --git a/www/manager6/lxc/Config.js b/www/manager6/lxc/Config.js index 89b59c9b..4e2b4bb8 100644 --- a/www/manager6/lxc/Config.js +++ b/www/manager6/lxc/Config.js @@ -4,6 +4,8 @@ Ext.define('PVE.lxc.Config', { onlineHelp: 'chapter_pct', + userCls: 'proxmox-tags-full', + initComponent: function() { var me = this; var vm = me.pveSelNode.data; @@ -182,12 +184,43 @@ Ext.define('PVE.lxc.Config', { ], }); + let tagsContainer = Ext.create('Ext.container.Container', { + userCls: 'proxmox-tags-full', + layout: { + type: 'hbox', + align: 'stretch', + }, + }); + + let tagAddBtn = Ext.create('Proxmox.Tag', { + xtype: 'pmxTag', + addTag: true, + layoutCallback: () => me.query('>toolbar[dock=top]')?.[0].updateLayout(), + updateCallback: function(newTag) { + let rec = me.statusStore.data.get('tags'); + let tags = rec?.data?.value?.split(/[;, ]/) || []; + tags.push(newTag); + Proxmox.Utils.API2Request({ + url: base_url + '/config', + method: 'PUT', + params: { + tags: tags.filter(t => !!t).join(','), + }, + success: function() { + me.statusStore.load(); + }, + failure: function(response) { + Ext.Msg.alert('Error', response.htmlStatus); + }, + }); + }, + }); Ext.apply(me, { title: Ext.String.format(gettext("Container {0} on node '{1}'"), vm.text, nodename), hstateid: 'lxctab', tbarSpacing: false, - tbar: [statusTxt, '->', startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn], + tbar: [statusTxt, tagsContainer, '-', tagAddBtn, '->', startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn], defaults: { statusStore: me.statusStore }, items: [ { @@ -344,10 +377,12 @@ Ext.define('PVE.lxc.Config', { me.mon(me.statusStore, 'load', function(s, records, success) { var status; var lock; + var rec; + if (!success) { status = 'unknown'; } else { - var rec = s.data.get('status'); + rec = s.data.get('status'); status = rec ? rec.data.value : 'unknown'; rec = s.data.get('template'); template = rec ? rec.data.value : false; @@ -357,6 +392,35 @@ Ext.define('PVE.lxc.Config', { statusTxt.update({ lock: lock }); + rec = s.data.get('tags'); + if (me.oldtags === undefined || me.oldtags !== rec?.data?.value) { + let tags = rec?.data?.value.split(/[,; ]/).filter(t => !!t) ?? []; + me.oldtags = rec?.data?.value; + tagsContainer.removeAll(); + for (let i = 0; i < tags.length; i++) { + let tag = tags[i]; + tagsContainer.add({ + xtype: 'pmxTag', + tag, + layoutCallback: () => tagsContainer.updateLayout(), + updateCallback: function(newTag) { + tags[i] = newTag; + Proxmox.Utils.API2Request({ + url: base_url + '/config', + method: 'PUT', + params: { + tags: tags.filter(t => !!t).join(','), + }, + failure: function(response) { + Ext.Msg.alert('Error', response.htmlStatus); + }, + }); + me.oldtags = tags.join(','); + }, + }); + } + } + startBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status === 'running' || template); shutdownBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status !== 'running'); me.down('#removeBtn').setDisabled(!caps.vms['VM.Allocate'] || status !== 'stopped'); diff --git a/www/manager6/qemu/Config.js b/www/manager6/qemu/Config.js index 9fe933df..df5f688f 100644 --- a/www/manager6/qemu/Config.js +++ b/www/manager6/qemu/Config.js @@ -3,6 +3,7 @@ Ext.define('PVE.qemu.Config', { alias: 'widget.PVE.qemu.Config', onlineHelp: 'chapter_virtual_machines', + userCls: 'proxmox-tags-full', initComponent: function() { var me = this; @@ -219,11 +220,42 @@ Ext.define('PVE.qemu.Config', { ], }); + let tagsContainer = Ext.create('Ext.container.Container', { + layout: { + type: 'hbox', + align: 'stretch', + }, + }); + + let tagAddBtn = Ext.create('Proxmox.Tag', { + xtype: 'pmxTag', + addTag: true, + layoutCallback: () => me.query('>toolbar[dock=top]')?.[0].updateLayout(), + updateCallback: function(newTag) { + let rec = me.statusStore.data.get('tags'); + let tags = rec?.data?.value?.split(/[;, ]/) || []; + tags.push(newTag); + Proxmox.Utils.API2Request({ + url: base_url + '/config', + method: 'PUT', + params: { + tags: tags.filter(t => !!t).join(','), + }, + success: function() { + me.statusStore.load(); + }, + failure: function(response) { + Ext.Msg.alert('Error', response.htmlStatus); + }, + }); + }, + }); + Ext.apply(me, { title: Ext.String.format(gettext("Virtual Machine {0} on node '{1}'"), vm.text, nodename), hstateid: 'kvmtab', tbarSpacing: false, - tbar: [statusTxt, '->', resumeBtn, startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn], + tbar: [statusTxt, tagsContainer, '-', tagAddBtn, '->', resumeBtn, startBtn, shutdownBtn, migrateBtn, consoleBtn, moreBtn], defaults: { statusStore: me.statusStore }, items: [ { @@ -382,11 +414,12 @@ Ext.define('PVE.qemu.Config', { var spice = false; var xtermjs = false; var lock; + var rec; if (!success) { status = qmpstatus = 'unknown'; } else { - var rec = s.data.get('status'); + rec = s.data.get('status'); status = rec ? rec.data.value : 'unknown'; rec = s.data.get('qmpstatus'); qmpstatus = rec ? rec.data.value : 'unknown'; @@ -399,6 +432,35 @@ Ext.define('PVE.qemu.Config', { xtermjs = !!s.data.get('serial'); } + rec = s.data.get('tags'); + if (me.oldtags === undefined || me.oldtags !== rec?.data?.value) { + let tags = rec?.data?.value.split(/[,; ]/).filter(t => !!t) ?? []; + me.oldtags = rec?.data?.value; + tagsContainer.removeAll(); + for (let i = 0; i < tags.length; i++) { + let tag = tags[i]; + tagsContainer.add({ + xtype: 'pmxTag', + tag, + layoutCallback: () => tagsContainer.updateLayout(), + updateCallback: function(newTag) { + tags[i] = newTag; + Proxmox.Utils.API2Request({ + url: base_url + '/config', + method: 'PUT', + params: { + tags: tags.filter(t => !!t).join(','), + }, + failure: function(response) { + Ext.Msg.alert('Error', response.htmlStatus); + }, + }); + me.oldtags = tags.join(','); + }, + }); + } + } + if (template) { return; } -- 2.30.2