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 C98EA60621 for ; Wed, 2 Sep 2020 13:04:18 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1F71B101F2 for ; Wed, 2 Sep 2020 13:03:56 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (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 177481019B for ; Wed, 2 Sep 2020 13:03:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id CE703449C7 for ; Wed, 2 Sep 2020 13:03:50 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Wed, 2 Sep 2020 13:03:26 +0200 Message-Id: <20200902110337.25004-4-f.ebner@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200902110337.25004-1-f.ebner@proxmox.com> References: <20200902110337.25004-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.042 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches 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. [item.id, caps.storage] Subject: [pve-devel] [PATCH manager 03/14] use separate view for each content type 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, 02 Sep 2020 11:04:18 -0000 Organized as separate "if"s to allow changing properties easily later. statusStore is not needed anymore, now there is a single fixed content type, and the template and upload button are disabled depending on that type. Signed-off-by: Fabian Ebner --- Hope I didn't miss an easier existing mechanism to accomplish that. Note that the available contents are loaded only once, if we would want to update it periodically, we'd need to add something like removeNodes for the configPanel AFAICT www/manager6/storage/Browser.js | 71 ++++++++++++++++++++++++++--- www/manager6/storage/ContentView.js | 57 ++++++----------------- 2 files changed, 78 insertions(+), 50 deletions(-) diff --git a/www/manager6/storage/Browser.js b/www/manager6/storage/Browser.js index 7537bdf1..e3822d5b 100644 --- a/www/manager6/storage/Browser.js +++ b/www/manager6/storage/Browser.js @@ -41,14 +41,71 @@ Ext.define('PVE.storage.Browser', { if (caps.storage['Datastore.Allocate'] || caps.storage['Datastore.AllocateSpace'] || caps.storage['Datastore.Audit']) { - me.insertNodes([ - { - xtype: 'pveStorageContentView', - title: gettext('Content'), - iconCls: 'fa fa-th', - itemId: 'content' + + Proxmox.Utils.API2Request({ + url: "/nodes/" + nodename + "/storage/" + storeid + "/status", + method: 'GET', + success: function(response, opts) { + var contents = response.result.data.content.split(','); + var items = []; + + if (contents.includes('backup')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['backup'], + iconCls: 'fa fa-th', + itemId: 'contentBackup', + content: 'backup', + }); + } + if (contents.includes('images')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['images'], + iconCls: 'fa fa-th', + itemId: 'contentImages', + content: 'images', + }); + } + if (contents.includes('iso')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['iso'], + iconCls: 'fa fa-th', + itemId: 'contentIso', + content: 'iso', + }); + } + if (contents.includes('rootdir')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['rootdir'], + iconCls: 'fa fa-th', + itemId: 'contentRootdir', + content: 'rootdir', + }); + } + if (contents.includes('snippets')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['snippets'], + iconCls: 'fa fa-th', + itemId: 'contentSnippets', + content: 'snippets', + }); + } + if (contents.includes('vztmpl')) { + items.push({ + xtype: 'pveStorageContentView', + title: PVE.Utils.contentTypes['vztmpl'], + iconCls: 'fa fa-th', + itemId: 'contentVztmpl', + content: 'vztmpl', + }); + } + me.insertNodes(items); }, - ]); + }); } if (caps.storage['Permissions.Modify']) { diff --git a/www/manager6/storage/ContentView.js b/www/manager6/storage/ContentView.js index 194ad42e..c067d3e0 100644 --- a/www/manager6/storage/ContentView.js +++ b/www/manager6/storage/ContentView.js @@ -376,13 +376,18 @@ Ext.define('PVE.storage.ContentView', { throw "no storage ID specified"; } + var content = me.content; + if (!content) { + throw "no content type specified"; + } + var baseurl = "/nodes/" + nodename + "/storage/" + storage + "/content"; var store = Ext.create('Ext.data.Store',{ model: 'pve-storage-content', groupField: 'content', proxy: { type: 'proxmox', - url: '/api2/json' + baseurl + url: '/api2/json' + baseurl + '?content=' + content, }, sorters: { property: 'volid', @@ -394,7 +399,6 @@ Ext.define('PVE.storage.ContentView', { var reload = function() { store.load(); - me.statusStore.load(); }; Proxmox.Utils.monStoreErrors(me, store); @@ -411,6 +415,9 @@ Ext.define('PVE.storage.ContentView', { win.show(); } }); + if (content !== 'vztmpl') { + templateButton.setDisabled(true); + } var uploadButton = Ext.create('Proxmox.button.Button', { contents : ['iso','vztmpl'], @@ -426,6 +433,11 @@ Ext.define('PVE.storage.ContentView', { win.on('destroy', reload); } }); + if (content === 'iso' || content === 'vztmpl') { + uploadButton.contents = [content]; + } else { + uploadButton.setDisabled(true); + } var imageRemoveButton; var removeButton = Ext.create('Proxmox.button.StdRemoveButton',{ @@ -460,8 +472,6 @@ Ext.define('PVE.storage.ContentView', { return false; }, handler: function(btn, event, rec) { - me = this; - var url = baseurl + '/' + rec.data.volid; var vmid = rec.data.vmid; @@ -492,19 +502,11 @@ Ext.define('PVE.storage.ContentView', { item: { type: 'Image', id: vmid } }).show(); win.on('destroy', function() { - me.statusStore = Ext.create('Proxmox.data.ObjectStore', { - url: '/api2/json/nodes/' + nodename + '/storage/' + storage + '/status' - }); reload(); - }); } }); - me.statusStore = Ext.create('Proxmox.data.ObjectStore', { - url: '/api2/json/nodes/' + nodename + '/storage/' + storage + '/status' - }); - Ext.apply(me, { store: store, selModel: sm, @@ -617,37 +619,6 @@ Ext.define('PVE.storage.ContentView', { }); me.callParent(); - - // disable the buttons/restrict the upload window - // if templates or uploads are not allowed - me.mon(me.statusStore, 'load', function(s, records, success) { - var availcontent = []; - Ext.Array.each(records, function(item){ - if (item.id === 'content') { - availcontent = item.data.value.split(','); - } - }); - var templ = false; - var upload = false; - var cts = []; - - Ext.Array.each(availcontent, function(content) { - if (content === 'vztmpl') { - templ = true; - cts.push('vztmpl'); - } else if (content === 'iso') { - upload = true; - cts.push('iso'); - } - }); - - if (templ !== upload) { - uploadButton.contents = cts; - } - - templateButton.setDisabled(!templ); - uploadButton.setDisabled(!upload && !templ); - }); } }, function() { -- 2.20.1