public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [RFC proxmox-widget-toolkit 1/1] node: apt: spawn a window for adding repository
Date: Wed, 30 Jun 2021 17:07:54 +0200	[thread overview]
Message-ID: <20210630150754.9921-3-f.ebner@proxmox.com> (raw)
In-Reply-To: <20210630150754.9921-1-f.ebner@proxmox.com>

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

I couldn't get the validation to work properly and adding a repo
gives an "Unknown Error" (but does add the repo).

 src/node/APTRepositories.js | 161 ++++++++++++++++++++++++++----------
 1 file changed, 117 insertions(+), 44 deletions(-)

diff --git a/src/node/APTRepositories.js b/src/node/APTRepositories.js
index 6812d46..43297c9 100644
--- a/src/node/APTRepositories.js
+++ b/src/node/APTRepositories.js
@@ -15,6 +15,92 @@ Ext.define('apt-repolist', {
     ],
 });
 
+Ext.define('Proxmox.window.APTRepositoryAdd', {
+    extend: 'Proxmox.window.Edit',
+    alias: 'widget.pmxAPTRepositoryAdd',
+
+    isCreate: true,
+    isAdd: true,
+
+    subject: gettext('Repository'),
+
+    initComponent: function() {
+	let me = this;
+
+	if (!me.repoInfo || me.repoInfo.length === 0) {
+	    throw "repository information not initialized";
+	}
+
+	let description = Ext.create('Ext.form.field.Display', {
+	    fieldLabel: gettext('Description'),
+	    name: 'description',
+	});
+
+	let status = Ext.create('Ext.form.field.Display', {
+	    fieldLabel: gettext('Status'),
+	    name: 'status',
+	    renderer: function(value) {
+		let statusText = gettext('Not yet configured');
+		if (value !== '') {
+		    statusText = Ext.String.format(
+			'{0}: {1}',
+			gettext('Configured'),
+			value ? gettext('enabled') : gettext('disabled'),
+		    );
+		}
+
+		return statusText;
+	    },
+	});
+
+	let repoSelector = Ext.create('Proxmox.form.KVComboBox', {
+	    fieldLabel: gettext('Repository'),
+	    xtype: 'proxmoxKVComboBox',
+	    name: 'handle',
+	    allowBlank: false,
+	    comboItems: me.repoInfo.map(info => [info.handle, info.name]),
+	    isValid: function() {
+		const handle = this.value;
+
+		if (!handle) {
+		    return false;
+		}
+
+		const info = me.repoInfo.find(elem => elem.handle === handle);
+
+		if (!info) {
+		    return false;
+		}
+
+		// not yet configured
+		return info.status === undefined || info.status === null;
+	    },
+	    listeners: {
+		change: function(f, value) {
+		    const info = me.repoInfo.find(elem => elem.handle === value);
+		    description.setValue(info.description);
+		    status.setValue(info.status);
+		},
+	    },
+	});
+
+	repoSelector.setValue(me.repoInfo[0].handle);
+
+	let items = [
+	    repoSelector,
+	    description,
+	    status,
+	];
+
+	Ext.apply(me, {
+	    items: items,
+	    repoSelector: repoSelector,
+	});
+
+	me.callParent();
+    },
+});
+
 Ext.define('Proxmox.node.APTRepositoriesErrors', {
     extend: 'Ext.grid.GridPanel',
 
@@ -63,10 +149,31 @@ Ext.define('Proxmox.node.APTRepositoriesGrid', {
 	},
 	{
 	    text: gettext('Add'),
-	    menu: {
-		plain: true,
-		itemId: "addMenu",
-		items: [],
+	    id: 'addButton',
+	    disabled: true,
+	    repoInfo: undefined,
+	    handler: function(button, event, record) {
+		Proxmox.Utils.checked_command(() => {
+		    let me = this;
+		    let panel = me.up('proxmoxNodeAPTRepositories');
+
+		    let extraParams = {};
+		    if (panel.digest !== undefined) {
+		       extraParams.digest = panel.digest;
+		    }
+
+		    Ext.create('Proxmox.window.APTRepositoryAdd', {
+			repoInfo: me.repoInfo,
+			url: `/api2/json/nodes/${panel.nodename}/apt/repositories`,
+			method: 'PUT',
+			extraRequestParams: extraParams,
+			listeners: {
+			    destroy: function() {
+				panel.reload();
+			    },
+			},
+		    }).show();
+		});
 	    },
 	},
 	'-',
@@ -403,8 +510,8 @@ Ext.define('Proxmox.node.APTRepositories', {
 	let me = this;
 	let vm = me.getViewModel();
 
-	let menu = me.down('#addMenu');
-	menu.removeAll();
+	let addButton = me.down('#addButton');
+	addButton.repoInfo = [];
 
 	for (const standardRepo of standardRepos) {
 	    const handle = standardRepo.handle;
@@ -416,45 +523,11 @@ Ext.define('Proxmox.node.APTRepositories', {
 		vm.set('noSubscriptionRepo', status);
 	    }
 
-	    let status_text = '';
-	    if (status !== undefined && status !== null) {
-		status_text = Ext.String.format(
-		    ' ({0}, {1})',
-		    gettext('configured'),
-		    status ? gettext('enabled') : gettext('disabled'),
-		);
-	    }
-
-	    menu.add({
-		text: standardRepo.name + status_text,
-		disabled: status !== undefined && status !== null,
-		repoHandle: handle,
-		handler: function(menuItem) {
-		    Proxmox.Utils.checked_command(() => {
-			let params = {
-			    handle: menuItem.repoHandle,
-			};
-
-			if (me.digest !== undefined) {
-			    params.digest = me.digest;
-			}
-
-			Proxmox.Utils.API2Request({
-			    url: `/nodes/${me.nodename}/apt/repositories`,
-			    method: 'PUT',
-			    params: params,
-			    failure: function(response, opts) {
-				Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-				me.reload();
-			    },
-			    success: function(response, opts) {
-				me.reload();
-			    },
-			});
-		    });
-		},
-	    });
+	    addButton.repoInfo.push(standardRepo);
+	    addButton.digest = me.digest;
 	}
+
+	addButton.setDisabled(false);
     },
 
     reload: function() {
-- 
2.30.2





  parent reply	other threads:[~2021-06-30 15:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-30 15:07 [pve-devel] [PATCH-SERIES proxmox-apt/proxmox-widget-toolkit] Spawn a window when adding a repository Fabian Ebner
2021-06-30 15:07 ` [pve-devel] [PATCH proxmox-apt 1/1] standard repos: allow conversion from handle and improve information Fabian Ebner
2021-06-30 18:46   ` [pve-devel] applied: " Thomas Lamprecht
2021-06-30 15:07 ` Fabian Ebner [this message]
2021-06-30 19:31   ` [pve-devel] applied: [RFC proxmox-widget-toolkit 1/1] node: apt: spawn a window for adding repository 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=20210630150754.9921-3-f.ebner@proxmox.com \
    --to=f.ebner@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