public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI
@ 2020-08-28  8:46 Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
                   ` (9 more replies)
  0 siblings, 10 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Add functionality to remove directories in the PBS WebUI. In order to do that SafeDestroy had to be moved from
pve-manager into proxmox-widget-toolkit and the possibility to show a small note in the dialog had to be added.
Furthermore specifics to pve-manager in SafeRemove were replaces with a more general approach, namely: 'type' was
replaced with 'purgeable' and 'taskName'. Due to the moving and refactorization the usages of SafeDestroy in pve-manager
had to be corrected. In order to avoid the extraction of the directory name from the path in the frontend, the api2
now also returns the name of a directory.

proxmox-widget-toolkit needs a version bump, pve-manager and proxmox-backup require that new version.

v3: - smaller patches with each doing a single thing
	- correct indentation for JS files

v2: - SafeRemove -> SafeDestroy (keep original name)
	- generalized SafeDestroy
	- fixed eslint related issues
	- split patch [3/5]v1 into two patches

proxmox-widget-toolkit: Hannes Laimer (5):
  safe-destroy: move here from pve-manager
  safe-destroy: replace type with purgeable and taskName
  safe-destroy: replace var with let/const
  safe-destroy: add possibility to show a small note
  utils: add task description for directory removal

 src/Makefile              |   1 +
 src/window/SafeDestroy.js | 210 ++++++++++++++++++++++++++++++++++++++
 src/Utils.js | 1 +
 3 files changed, 212 insertions(+)
 create mode 100644 src/window/SafeDestroy.js

pve-manager: Hannes Laimer (2):
  safe-destroy: use SafeDestroy from proxmox-widget-toolkit
  remove SafeDestroy from pve-manager

 www/manager6/Makefile               |   1 -
 www/manager6/ceph/Pool.js           |   5 +-
 www/manager6/lxc/Config.js          |   5 +-
 www/manager6/qemu/Config.js         |   5 +-
 www/manager6/storage/ContentView.js |   5 +-
 www/manager6/window/SafeDestroy.js  | 194 ----------------------------
 6 files changed, 12 insertions(+), 203 deletions(-)
 delete mode 100644 www/manager6/window/SafeDestroy.js

proxmox-backup: Hannes Laimer (2):
  api2: add name of mount-point to DatastoreMountInfo
  ui: add remove-button for directories/mount-units

 src/api2/node/disks/directory.rs |  4 ++++
 www/DirectoryList.js             | 25 +++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-09-11 11:07   ` Dominik Csapak
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 2/9] safe-destroy: replace type with purgeable and taskName Hannes Laimer
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
the file was just moved, nothing except the define changed ('PVE.window.SafeDestroy' -> 'Proxmox.window.SafeDestroy')

 src/Makefile              |   1 +
 src/window/SafeDestroy.js | 194 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 195 insertions(+)
 create mode 100644 src/window/SafeDestroy.js

diff --git a/src/Makefile b/src/Makefile
index 12dda30..ea71647 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -43,6 +43,7 @@ JSSRC=					\
 	panel/GaugeWidget.js		\
 	window/Edit.js			\
 	window/PasswordEdit.js		\
+	window/SafeDestroy.js		\
 	window/TaskViewer.js		\
 	window/LanguageEdit.js		\
 	window/DiskSmart.js		\
diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
new file mode 100644
index 0000000..b1001a8
--- /dev/null
+++ b/src/window/SafeDestroy.js
@@ -0,0 +1,194 @@
+/* Popup a message window
+ * where the user has to manually enter the resource ID
+ * to enable the destroy button
+ */
+Ext.define('Proxmox.window.SafeDestroy', {
+    extend: 'Ext.window.Window',
+    alias: 'proxmoxSafeDestroy',
+
+    title: gettext('Confirm'),
+    modal: true,
+    buttonAlign: 'center',
+    bodyPadding: 10,
+    width: 450,
+    layout: { type: 'hbox' },
+    defaultFocus: 'confirmField',
+    showProgress: false,
+
+    config: {
+	item: {
+	    id: undefined,
+	    type: undefined,
+	},
+	url: undefined,
+	params: {},
+    },
+
+    getParams: function() {
+	var me = this;
+	var purgeCheckbox = me.lookupReference('purgeCheckbox');
+	if (purgeCheckbox.checked) {
+	    me.params.purge = 1;
+	}
+	if (Ext.Object.isEmpty(me.params)) {
+	    return '';
+	}
+	return '?' + Ext.Object.toQueryString(me.params);
+    },
+
+    controller: {
+
+	xclass: 'Ext.app.ViewController',
+
+	control: {
+	    'field[name=confirm]': {
+		change: function(f, value) {
+		    var view = this.getView();
+		    var removeButton = this.lookupReference('removeButton');
+		    if (value === view.getItem().id.toString()) {
+			removeButton.enable();
+		    } else {
+			removeButton.disable();
+		    }
+		},
+		specialkey: function(field, event) {
+		    var removeButton = this.lookupReference('removeButton');
+		    if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {
+			removeButton.fireEvent('click', removeButton, event);
+		    }
+		},
+	    },
+           'button[reference=removeButton]': {
+		click: function() {
+		    var view = this.getView();
+		    Proxmox.Utils.API2Request({
+			url: view.getUrl() + view.getParams(),
+			method: 'DELETE',
+			waitMsgTarget: view,
+			failure: function(response, opts) {
+			    view.close();
+			    Ext.Msg.alert('Error', response.htmlStatus);
+			},
+			success: function(response, options) {
+			    var hasProgressBar = !!(view.showProgress &&
+				response.result.data);
+
+			    if (hasProgressBar) {
+				// stay around so we can trigger our close events
+				// when background action is completed
+				view.hide();
+
+				var upid = response.result.data;
+				var win = Ext.create('Proxmox.window.TaskProgress', {
+				    upid: upid,
+				    listeners: {
+					destroy: function() {
+					    view.close();
+					},
+				    },
+				});
+				win.show();
+			    } else {
+				view.close();
+			    }
+			},
+		    });
+		},
+            },
+	},
+    },
+
+    items: [
+	{
+	    xtype: 'component',
+	    cls: [Ext.baseCSSPrefix + 'message-box-icon',
+		   Ext.baseCSSPrefix + 'message-box-warning',
+		   Ext.baseCSSPrefix + 'dlg-icon'],
+	},
+	{
+	    xtype: 'container',
+	    flex: 1,
+	    layout: {
+		type: 'vbox',
+		align: 'stretch',
+	    },
+	    items: [
+		{
+		    xtype: 'component',
+		    reference: 'messageCmp',
+		},
+		{
+		    itemId: 'confirmField',
+		    reference: 'confirmField',
+		    xtype: 'textfield',
+		    name: 'confirm',
+		    labelWidth: 300,
+		    hideTrigger: true,
+		    allowBlank: false,
+		},
+		{
+		    xtype: 'proxmoxcheckbox',
+		    name: 'purge',
+		    reference: 'purgeCheckbox',
+		    boxLabel: gettext('Purge'),
+		    checked: false,
+		    autoEl: {
+			tag: 'div',
+			'data-qtip': gettext('Remove from replication and backup jobs'),
+		    },
+		},
+	    ],
+	},
+    ],
+    buttons: [
+	{
+	    reference: 'removeButton',
+	    text: gettext('Remove'),
+	    disabled: true,
+	},
+    ],
+
+    initComponent: function() {
+	var me = this;
+
+	me.callParent();
+
+	var item = me.getItem();
+
+	if (!Ext.isDefined(item.id)) {
+	    throw "no ID specified";
+	}
+
+	if (!Ext.isDefined(item.type)) {
+	    throw "no VM type specified";
+	}
+
+	var messageCmp = me.lookupReference('messageCmp');
+	var msg;
+
+	if (item.type === 'VM') {
+	    msg = Proxmox.Utils.format_task_description('qmdestroy', item.id);
+	} else if (item.type === 'CT') {
+	    msg = Proxmox.Utils.format_task_description('vzdestroy', item.id);
+	} else if (item.type === 'CephPool') {
+	    msg = Proxmox.Utils.format_task_description('cephdestroypool', item.id);
+	} else if (item.type === 'Image') {
+	    msg = Proxmox.Utils.format_task_description('unknownimgdel', item.id);
+	} else {
+	    throw "unknown item type specified";
+	}
+
+	messageCmp.setHtml(msg);
+
+	if (!(item.type === 'VM' || item.type === 'CT')) {
+	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
+	    purgeCheckbox.setDisabled(true);
+	    purgeCheckbox.setHidden(true);
+	}
+
+	var confirmField = me.lookupReference('confirmField');
+	msg = gettext('Please enter the ID to confirm') +
+	    ' (' + item.id + ')';
+	confirmField.setFieldLabel(msg);
+    },
+});
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 2/9] safe-destroy: replace type with purgeable and taskName
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 3/9] safe-destroy: replace var with let/const Hannes Laimer
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
type is replaced with the two fields purgeable and taskName, type was pve-manager specific

 src/window/SafeDestroy.js | 24 +++++++-----------------
 1 file changed, 7 insertions(+), 17 deletions(-)

diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
index b1001a8..71dce24 100644
--- a/src/window/SafeDestroy.js
+++ b/src/window/SafeDestroy.js
@@ -18,9 +18,10 @@ Ext.define('Proxmox.window.SafeDestroy', {
     config: {
 	item: {
 	    id: undefined,
-	    type: undefined,
+	    purgeable: false,
 	},
 	url: undefined,
+	taskName: undefined,
 	params: {},
     },
 
@@ -159,28 +160,17 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	    throw "no ID specified";
 	}
 
-	if (!Ext.isDefined(item.type)) {
-	    throw "no VM type specified";
-	}
-
 	var messageCmp = me.lookupReference('messageCmp');
 	var msg;
 
-	if (item.type === 'VM') {
-	    msg = Proxmox.Utils.format_task_description('qmdestroy', item.id);
-	} else if (item.type === 'CT') {
-	    msg = Proxmox.Utils.format_task_description('vzdestroy', item.id);
-	} else if (item.type === 'CephPool') {
-	    msg = Proxmox.Utils.format_task_description('cephdestroypool', item.id);
-	} else if (item.type === 'Image') {
-	    msg = Proxmox.Utils.format_task_description('unknownimgdel', item.id);
+	if (Ext.isDefined(me.getTaskName())) {
+	    msg = Proxmox.Utils.format_task_description(me.getTaskName(), item.id);
+	    messageCmp.setHtml(msg);
 	} else {
-	    throw "unknown item type specified";
+	    throw "no task name specified";
 	}
 
-	messageCmp.setHtml(msg);
-
-	if (!(item.type === 'VM' || item.type === 'CT')) {
+	if (!item.purgeable) {
 	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
 	    purgeCheckbox.setDisabled(true);
 	    purgeCheckbox.setHidden(true);
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 3/9] safe-destroy: replace var with let/const
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 2/9] safe-destroy: replace type with purgeable and taskName Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note Hannes Laimer
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
all instances of var are replaced with either let or const

 src/window/SafeDestroy.js | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
index 71dce24..a6ad458 100644
--- a/src/window/SafeDestroy.js
+++ b/src/window/SafeDestroy.js
@@ -26,8 +26,8 @@ Ext.define('Proxmox.window.SafeDestroy', {
     },
 
     getParams: function() {
-	var me = this;
-	var purgeCheckbox = me.lookupReference('purgeCheckbox');
+	let me = this;
+	const purgeCheckbox = me.lookupReference('purgeCheckbox');
 	if (purgeCheckbox.checked) {
 	    me.params.purge = 1;
 	}
@@ -44,8 +44,8 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	control: {
 	    'field[name=confirm]': {
 		change: function(f, value) {
-		    var view = this.getView();
-		    var removeButton = this.lookupReference('removeButton');
+		    const view = this.getView();
+		    const removeButton = this.lookupReference('removeButton');
 		    if (value === view.getItem().id.toString()) {
 			removeButton.enable();
 		    } else {
@@ -53,7 +53,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
 		    }
 		},
 		specialkey: function(field, event) {
-		    var removeButton = this.lookupReference('removeButton');
+		    const removeButton = this.lookupReference('removeButton');
 		    if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {
 			removeButton.fireEvent('click', removeButton, event);
 		    }
@@ -61,7 +61,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	    },
            'button[reference=removeButton]': {
 		click: function() {
-		    var view = this.getView();
+		    const view = this.getView();
 		    Proxmox.Utils.API2Request({
 			url: view.getUrl() + view.getParams(),
 			method: 'DELETE',
@@ -71,7 +71,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
 			    Ext.Msg.alert('Error', response.htmlStatus);
 			},
 			success: function(response, options) {
-			    var hasProgressBar = !!(view.showProgress &&
+			    const hasProgressBar = !!(view.showProgress &&
 				response.result.data);
 
 			    if (hasProgressBar) {
@@ -79,8 +79,8 @@ Ext.define('Proxmox.window.SafeDestroy', {
 				// when background action is completed
 				view.hide();
 
-				var upid = response.result.data;
-				var win = Ext.create('Proxmox.window.TaskProgress', {
+				const upid = response.result.data;
+				const win = Ext.create('Proxmox.window.TaskProgress', {
 				    upid: upid,
 				    listeners: {
 					destroy: function() {
@@ -150,18 +150,18 @@ Ext.define('Proxmox.window.SafeDestroy', {
     ],
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.callParent();
 
-	var item = me.getItem();
+	const item = me.getItem();
 
 	if (!Ext.isDefined(item.id)) {
 	    throw "no ID specified";
 	}
 
-	var messageCmp = me.lookupReference('messageCmp');
-	var msg;
+	const messageCmp = me.lookupReference('messageCmp');
+	let msg;
 
 	if (Ext.isDefined(me.getTaskName())) {
 	    msg = Proxmox.Utils.format_task_description(me.getTaskName(), item.id);
@@ -171,12 +171,12 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	}
 
 	if (!item.purgeable) {
-	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
+	    const purgeCheckbox = me.lookupReference('purgeCheckbox');
 	    purgeCheckbox.setDisabled(true);
 	    purgeCheckbox.setHidden(true);
 	}
 
-	var confirmField = me.lookupReference('confirmField');
+	const confirmField = me.lookupReference('confirmField');
 	msg = gettext('Please enter the ID to confirm') +
 	    ' (' + item.id + ')';
 	confirmField.setFieldLabel(msg);
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (2 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 3/9] safe-destroy: replace var with let/const Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-09-11 11:08   ` Dominik Csapak
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 5/9] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
add field to set the note and add ui-container for displaying it

 src/window/SafeDestroy.js | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
index a6ad458..0027e98 100644
--- a/src/window/SafeDestroy.js
+++ b/src/window/SafeDestroy.js
@@ -21,6 +21,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	    purgeable: false,
 	},
 	url: undefined,
+	note: undefined,
 	taskName: undefined,
 	params: {},
     },
@@ -138,6 +139,22 @@ Ext.define('Proxmox.window.SafeDestroy', {
 			'data-qtip': gettext('Remove from replication and backup jobs'),
 		    },
 		},
+		{
+		    xtype: 'container',
+		    reference: 'noteContainer',
+		    flex: 1,
+		    layout: {
+			type: 'vbox',
+			align: 'middle',
+		    },
+		    height: 25,
+		    items: [
+			{
+			    xtype: 'component',
+			    reference: 'noteCmp',
+			},
+		    ],
+		},
 	    ],
 	},
     ],
@@ -161,8 +178,17 @@ Ext.define('Proxmox.window.SafeDestroy', {
 	}
 
 	const messageCmp = me.lookupReference('messageCmp');
+	const noteCmp = me.lookupReference('noteCmp');
 	let msg;
 
+	if (Ext.isDefined(me.getNote())) {
+	    noteCmp.setHtml(`<small>${me.getNote()}</small>`);
+	} else {
+	    const noteContainer = me.lookupReference('noteContainer');
+	    noteContainer.setDisabled(true);
+	    noteContainer.setHidden(true);
+	}
+
 	if (Ext.isDefined(me.getTaskName())) {
 	    msg = Proxmox.Utils.format_task_description(me.getTaskName(), item.id);
 	    messageCmp.setHtml(msg);
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 pve-manager 5/9] safe-destroy: use SafeDestroy from proxmox-widget-toolkit
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (3 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 6/9] remove SafeDestroy from pve-manager Hannes Laimer
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
SafeDestroy from proxmox-widget-toolkit is now used instead of the one from pve-manager

 www/manager6/ceph/Pool.js           | 5 +++--
 www/manager6/lxc/Config.js          | 5 +++--
 www/manager6/qemu/Config.js         | 5 +++--
 www/manager6/storage/ContentView.js | 5 +++--
 4 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/www/manager6/ceph/Pool.js b/www/manager6/ceph/Pool.js
index 19eb01e9..ef7c0914 100644
--- a/www/manager6/ceph/Pool.js
+++ b/www/manager6/ceph/Pool.js
@@ -229,13 +229,14 @@ Ext.define('PVE.node.CephPoolList', {
 		var base_url = '/nodes/' + nodename + '/ceph/pools/' +
 		    rec.data.pool_name;
 
-		var win = Ext.create('PVE.window.SafeDestroy', {
+		var win = Ext.create('Proxmox.window.SafeDestroy', {
 		    showProgress: true,
 		    url: base_url,
 		    params: {
 			remove_storages: 1
 		    },
-		    item: { type: 'CephPool', id: rec.data.pool_name }
+		    item: { id: rec.data.pool_name },
+		    taskName: 'cephdestroypool'
 		}).show();
 		win.on('destroy', function() {
 		    rstore.load();
diff --git a/www/manager6/lxc/Config.js b/www/manager6/lxc/Config.js
index c2222d3a..bc5c82df 100644
--- a/www/manager6/lxc/Config.js
+++ b/www/manager6/lxc/Config.js
@@ -149,9 +149,10 @@ Ext.define('PVE.lxc.Config', {
 		    disabled: !caps.vms['VM.Allocate'],
 		    itemId: 'removeBtn',
 		    handler: function() {
-			Ext.create('PVE.window.SafeDestroy', {
+			Ext.create('Proxmox.window.SafeDestroy', {
 			    url: base_url,
-			    item: { type: 'CT', id: vmid }
+			    item: { id: vmid, purgeable: true },
+			    taskName: 'vzdestroy',
 			}).show();
 		    },
 		    iconCls: 'fa fa-trash-o'
diff --git a/www/manager6/qemu/Config.js b/www/manager6/qemu/Config.js
index a13bf0c5..c3b244ab 100644
--- a/www/manager6/qemu/Config.js
+++ b/www/manager6/qemu/Config.js
@@ -124,9 +124,10 @@ Ext.define('PVE.qemu.Config', {
 		    itemId: 'removeBtn',
 		    disabled: !caps.vms['VM.Allocate'],
 		    handler: function() {
-			Ext.create('PVE.window.SafeDestroy', {
+			Ext.create('Proxmox.window.SafeDestroy', {
 			    url: base_url,
-			    item: { type: 'VM', id: vmid }
+			    item: { id: vmid, purgeable: true },
+			    taskName: 'qmdestroy'
 			}).show();
 		    },
 		    iconCls: 'fa fa-trash-o'
diff --git a/www/manager6/storage/ContentView.js b/www/manager6/storage/ContentView.js
index c70c732c..fa288b0f 100644
--- a/www/manager6/storage/ContentView.js
+++ b/www/manager6/storage/ContentView.js
@@ -483,11 +483,12 @@ Ext.define('PVE.storage.ContentView', {
 			return;
 		    }
 		}
-		var win = Ext.create('PVE.window.SafeDestroy', {
+		var win = Ext.create('Proxmox.window.SafeDestroy', {
 		    title: Ext.String.format(gettext("Destroy '{0}'"), rec.data.volid),
 		    showProgress: true,
 		    url: url,
-		    item: { type: 'Image', id: vmid }
+		    item: { id: vmid },
+		    taskName: 'unknownimgdel'
 		}).show();
 		win.on('destroy', function() {
 		    me.statusStore = Ext.create('Proxmox.data.ObjectStore', {
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 pve-manager 6/9] remove SafeDestroy from pve-manager
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (4 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 5/9] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 7/9] utils: add task description for directory removal Hannes Laimer
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
remove SafeDestroy.js file since it was moved to proxmox-widget-toolkit, entry for SafeDestroy.js in Makefile also removed

 www/manager6/Makefile              |   1 -
 www/manager6/window/SafeDestroy.js | 194 -----------------------------
 2 files changed, 195 deletions(-)
 delete mode 100644 www/manager6/window/SafeDestroy.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 4288acdd..89a45d85 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -247,7 +247,6 @@ JSSRC= 							\
 	window/Migrate.js				\
 	window/NotesEdit.js				\
 	window/Restore.js				\
-	window/SafeDestroy.js				\
 	window/Settings.js				\
 	window/Snapshot.js				\
 	window/StartupEdit.js				\
diff --git a/www/manager6/window/SafeDestroy.js b/www/manager6/window/SafeDestroy.js
deleted file mode 100644
index cc32f6e0..00000000
--- a/www/manager6/window/SafeDestroy.js
+++ /dev/null
@@ -1,194 +0,0 @@
-/* Popup a message window
- * where the user has to manually enter the resource ID
- * to enable the destroy button
- */
-Ext.define('PVE.window.SafeDestroy', {
-    extend: 'Ext.window.Window',
-    alias: 'widget.pveSafeDestroy',
-
-    title: gettext('Confirm'),
-    modal: true,
-    buttonAlign: 'center',
-    bodyPadding: 10,
-    width: 450,
-    layout: { type:'hbox' },
-    defaultFocus: 'confirmField',
-    showProgress: false,
-
-    config: {
-	item: {
-	    id: undefined,
-	    type: undefined
-	},
-	url: undefined,
-	params: {}
-    },
-
-    getParams: function() {
-	var me = this;
-	var purgeCheckbox = me.lookupReference('purgeCheckbox');
-	if (purgeCheckbox.checked) {
-	    me.params.purge = 1;
-	}
-	if (Ext.Object.isEmpty(me.params)) {
-	    return '';
-	}
-	return '?' + Ext.Object.toQueryString(me.params);
-    },
-
-    controller: {
-
-	xclass: 'Ext.app.ViewController',
-
-	control: {
-	    'field[name=confirm]': {
-		change: function(f, value) {
-		    var view = this.getView();
-		    var removeButton = this.lookupReference('removeButton');
-		    if (value === view.getItem().id.toString()) {
-			removeButton.enable();
-		    } else {
-			removeButton.disable();
-		    }
-		},
-		specialkey: function (field, event) {
-		    var removeButton = this.lookupReference('removeButton');
-		    if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {
-			removeButton.fireEvent('click', removeButton, event);
-		    }
-		}
-	    },
-           'button[reference=removeButton]': {
-		click: function() {
-		    var view = this.getView();
-		    Proxmox.Utils.API2Request({
-			url: view.getUrl() + view.getParams(),
-			method: 'DELETE',
-			waitMsgTarget: view,
-			failure: function(response, opts) {
-			    view.close();
-			    Ext.Msg.alert('Error', response.htmlStatus);
-			},
-			success: function(response, options) {
-			    var hasProgressBar = view.showProgress &&
-				response.result.data ? true : false;
-
-			    if (hasProgressBar) {
-				// stay around so we can trigger our close events
-				// when background action is completed
-				view.hide();
-
-				var upid = response.result.data;
-				var win = Ext.create('Proxmox.window.TaskProgress', {
-				    upid: upid,
-				    listeners: {
-					destroy: function () {
-					    view.close();
-					}
-				    }
-				});
-				win.show();
-			    } else {
-				view.close();
-			    }
-			}
-		    });
-		}
-            }
-	}
-    },
-
-    items: [
-	{
-	    xtype: 'component',
-	    cls: [ Ext.baseCSSPrefix + 'message-box-icon',
-		   Ext.baseCSSPrefix + 'message-box-warning',
-		   Ext.baseCSSPrefix + 'dlg-icon']
-	},
-	{
-	    xtype: 'container',
-	    flex: 1,
-	    layout: {
-		type: 'vbox',
-		align: 'stretch'
-	    },
-	    items: [
-		{
-		    xtype: 'component',
-		    reference: 'messageCmp'
-		},
-		{
-		    itemId: 'confirmField',
-		    reference: 'confirmField',
-		    xtype: 'textfield',
-		    name: 'confirm',
-		    labelWidth: 300,
-		    hideTrigger: true,
-		    allowBlank: false
-		},
-		{
-		    xtype: 'proxmoxcheckbox',
-		    name: 'purge',
-		    reference: 'purgeCheckbox',
-		    boxLabel: gettext('Purge'),
-		    checked: false,
-		    autoEl: {
-			tag: 'div',
-			'data-qtip': gettext('Remove from replication and backup jobs')
-		    }
-		}
-	    ]
-	}
-    ],
-    buttons: [
-	{
-	    reference: 'removeButton',
-	    text: gettext('Remove'),
-	    disabled: true
-	}
-    ],
-
-    initComponent : function() {
-	var me = this;
-
-	me.callParent();
-
-	var item = me.getItem();
-
-	if (!Ext.isDefined(item.id)) {
-	    throw "no ID specified";
-	}
-
-	if (!Ext.isDefined(item.type)) {
-	    throw "no VM type specified";
-	}
-
-	var messageCmp = me.lookupReference('messageCmp');
-	var msg;
-
-	if (item.type === 'VM') {
-	    msg = Proxmox.Utils.format_task_description('qmdestroy', item.id);
-	} else if (item.type === 'CT') {
-	    msg = Proxmox.Utils.format_task_description('vzdestroy', item.id);
-	} else if (item.type === 'CephPool') {
-	    msg = Proxmox.Utils.format_task_description('cephdestroypool', item.id);
-	} else if (item.type === 'Image') {
-	    msg = Proxmox.Utils.format_task_description('unknownimgdel', item.id);
-	} else {
-	    throw "unknown item type specified";
-	}
-
-	messageCmp.setHtml(msg);
-
-	if (!(item.type === 'VM' || item.type === 'CT')) {
-	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
-	    purgeCheckbox.setDisabled(true);
-	    purgeCheckbox.setHidden(true);
-	}
-
-	var confirmField = me.lookupReference('confirmField');
-	msg = gettext('Please enter the ID to confirm') +
-	    ' (' + item.id + ')';
-	confirmField.setFieldLabel(msg);
-    }
-});
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-widget-toolbox 7/9] utils: add task description for directory removal
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (5 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 6/9] remove SafeDestroy from pve-manager Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
add task description for the removal of directories, so it may be used in the new version of SafeDestroy

 src/Utils.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/Utils.js b/src/Utils.js
index 4be95b2..6373440 100644
--- a/src/Utils.js
+++ b/src/Utils.js
@@ -641,6 +641,7 @@ utilities: {
 	stopall: ['', gettext('Stop all VMs and Containers')],
 	migrateall: ['', gettext('Migrate all VMs and Containers')],
 	dircreate: [gettext('Directory Storage'), gettext('Create')],
+	dirremove: [gettext('Directory'), gettext('Remove')],
 	lvmcreate: [gettext('LVM Storage'), gettext('Create')],
 	lvmthincreate: [gettext('LVM-Thin Storage'), gettext('Create')],
 	zfscreate: [gettext('ZFS Storage'), gettext('Create')],
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (6 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 7/9] utils: add task description for directory removal Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-09-11 11:08   ` Dominik Csapak
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units Hannes Laimer
  2020-09-11 11:07 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Dominik Csapak
  9 siblings, 1 reply; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
for the removal of dirs the id/name is needed in the frontend, therefore it has to be returned by the api

 src/api2/node/disks/directory.rs | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs
index 0d9ddeef..1f3cb0ff 100644
--- a/src/api2/node/disks/directory.rs
+++ b/src/api2/node/disks/directory.rs
@@ -34,6 +34,8 @@ pub struct DatastoreMountInfo {
     pub unitfile: String,
     /// The mount path.
     pub path: String,
+    /// The name of the mount.
+    pub id: String,
     /// The mounted device.
     pub device: String,
     /// File system type
@@ -76,6 +78,7 @@ pub fn  list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
         let item = item?;
         let name = item.file_name().to_string_lossy().to_string();
 
+        let id = String::from(MOUNT_NAME_REGEX.captures(&name).unwrap().get(1).map_or("", |m| m.as_str()));
         let unitfile = format!("{}/{}", basedir, name);
         let config = systemd::config::parse_systemd_mount(&unitfile)?;
         let data: SystemdMountSection = config.lookup("Mount", "Mount")?;
@@ -84,6 +87,7 @@ pub fn  list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
             unitfile,
             device: data.What,
             path: data.Where,
+            id,
             filesystem: data.Type,
             options: data.Options,
         });
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (7 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
@ 2020-08-28  8:46 ` Hannes Laimer
  2020-09-11 11:08   ` Dominik Csapak
  2020-09-11 11:07 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Dominik Csapak
  9 siblings, 1 reply; 15+ messages in thread
From: Hannes Laimer @ 2020-08-28  8:46 UTC (permalink / raw)
  To: pve-devel, pbs-devel

Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
add remove button to ui, all previous patches are needed for this one

 www/DirectoryList.js | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/www/DirectoryList.js b/www/DirectoryList.js
index 00531fd0..51b30c78 100644
--- a/www/DirectoryList.js
+++ b/www/DirectoryList.js
@@ -21,6 +21,24 @@ Ext.define('PBS.admin.Directorylist', {
 	    }).show();
 	},
 
+	removeDirectory: function() {
+	    let me = this;
+	    const view = me.getView();
+	    const rec = view.getSelection()[0];
+	    const id = rec.data.id;
+	    Ext.create('Proxmox.window.SafeDestroy', {
+		url: `/nodes/localhost/disks/directory/${id}`,
+		item: {
+		    id: id,
+		},
+		note: gettext('Data and partitions on the disk will be left untouched.'),
+		taskName: 'dirremove',
+		listeners: {
+		    destroy: () => me.reload(),
+		},
+	    }).show();
+	},
+
 	reload: function() {
 	    let me = this;
 	    let store = me.getView().getStore();
@@ -49,6 +67,13 @@ Ext.define('PBS.admin.Directorylist', {
 	    text: gettext('Create') + ': Directory',
 	    handler: 'createDirectory',
 	},
+	{
+	    xtype: 'proxmoxButton',
+	    text: gettext('Remove'),
+	    handler: 'removeDir',
+	    disabled: true,
+	    iconCls: 'fa fa-trash-o',
+	},
     ],
 
     columns: [
-- 
2.20.1





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI
  2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
                   ` (8 preceding siblings ...)
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units Hannes Laimer
@ 2020-09-11 11:07 ` Dominik Csapak
  9 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2020-09-11 11:07 UTC (permalink / raw)
  To: pbs-devel

On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Add functionality to remove directories in the PBS WebUI. In order to do that SafeDestroy had to be moved from
> pve-manager into proxmox-widget-toolkit and the possibility to show a small note in the dialog had to be added.
> Furthermore specifics to pve-manager in SafeRemove were replaces with a more general approach, namely: 'type' was
> replaced with 'purgeable' and 'taskName'. Due to the moving and refactorization the usages of SafeDestroy in pve-manager
> had to be corrected. In order to avoid the extraction of the directory name from the path in the frontend, the api2
> now also returns the name of a directory.
> 
> proxmox-widget-toolkit needs a version bump, pve-manager and proxmox-backup require that new version.
> 
> v3: - smaller patches with each doing a single thing
> 	- correct indentation for JS files
> 
> v2: - SafeRemove -> SafeDestroy (keep original name)
> 	- generalized SafeDestroy
> 	- fixed eslint related issues
> 	- split patch [3/5]v1 into two patches
> 

looks mostly ok, but i have some comments
  i'll reply to the separate patches for those

> proxmox-widget-toolkit: Hannes Laimer (5):
>    safe-destroy: move here from pve-manager
>    safe-destroy: replace type with purgeable and taskName
>    safe-destroy: replace var with let/const
>    safe-destroy: add possibility to show a small note
>    utils: add task description for directory removal
> 
>   src/Makefile              |   1 +
>   src/window/SafeDestroy.js | 210 ++++++++++++++++++++++++++++++++++++++
>   src/Utils.js | 1 +
>   3 files changed, 212 insertions(+)
>   create mode 100644 src/window/SafeDestroy.js
> 
> pve-manager: Hannes Laimer (2):
>    safe-destroy: use SafeDestroy from proxmox-widget-toolkit
>    remove SafeDestroy from pve-manager
> 
>   www/manager6/Makefile               |   1 -
>   www/manager6/ceph/Pool.js           |   5 +-
>   www/manager6/lxc/Config.js          |   5 +-
>   www/manager6/qemu/Config.js         |   5 +-
>   www/manager6/storage/ContentView.js |   5 +-
>   www/manager6/window/SafeDestroy.js  | 194 ----------------------------
>   6 files changed, 12 insertions(+), 203 deletions(-)
>   delete mode 100644 www/manager6/window/SafeDestroy.js
> 
> proxmox-backup: Hannes Laimer (2):
>    api2: add name of mount-point to DatastoreMountInfo
>    ui: add remove-button for directories/mount-units
> 
>   src/api2/node/disks/directory.rs |  4 ++++
>   www/DirectoryList.js             | 25 +++++++++++++++++++++++++
>   2 files changed, 29 insertions(+)
> 





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
@ 2020-09-11 11:07   ` Dominik Csapak
  0 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2020-09-11 11:07 UTC (permalink / raw)
  To: pbs-devel


On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
> the file was just moved, nothing except the define changed ('PVE.window.SafeDestroy' -> 'Proxmox.window.SafeDestroy')

that's actually not true, you changed some things, e.g. whitespace and 
trailing commas

which is ok (since its required for linting), but please mention such things

also you missed a place for fixing eslint (so i could not
build the package after the series was applied)

comment for this inline

> 
>   src/Makefile              |   1 +
>   src/window/SafeDestroy.js | 194 ++++++++++++++++++++++++++++++++++++++
>   2 files changed, 195 insertions(+)
>   create mode 100644 src/window/SafeDestroy.js
> 
> diff --git a/src/Makefile b/src/Makefile
> index 12dda30..ea71647 100644
> --- a/src/Makefile
> +++ b/src/Makefile
> @@ -43,6 +43,7 @@ JSSRC=					\
>   	panel/GaugeWidget.js		\
>   	window/Edit.js			\
>   	window/PasswordEdit.js		\
> +	window/SafeDestroy.js		\
>   	window/TaskViewer.js		\
>   	window/LanguageEdit.js		\
>   	window/DiskSmart.js		\
> diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
> new file mode 100644
> index 0000000..b1001a8
> --- /dev/null
> +++ b/src/window/SafeDestroy.js
> @@ -0,0 +1,194 @@
> +/* Popup a message window
> + * where the user has to manually enter the resource ID
> + * to enable the destroy button
> + */
> +Ext.define('Proxmox.window.SafeDestroy', {
> +    extend: 'Ext.window.Window',
> +    alias: 'proxmoxSafeDestroy',
> +
> +    title: gettext('Confirm'),
> +    modal: true,
> +    buttonAlign: 'center',
> +    bodyPadding: 10,
> +    width: 450,
> +    layout: { type: 'hbox' },
> +    defaultFocus: 'confirmField',
> +    showProgress: false,
> +
> +    config: {
> +	item: {
> +	    id: undefined,
> +	    type: undefined,
> +	},
> +	url: undefined,
> +	params: {},
> +    },
> +
> +    getParams: function() {
> +	var me = this;
> +	var purgeCheckbox = me.lookupReference('purgeCheckbox');
> +	if (purgeCheckbox.checked) {
> +	    me.params.purge = 1;
> +	}
> +	if (Ext.Object.isEmpty(me.params)) {
> +	    return '';
> +	}
> +	return '?' + Ext.Object.toQueryString(me.params);
> +    },
> +
> +    controller: {
> +
> +	xclass: 'Ext.app.ViewController',
> +
> +	control: {
> +	    'field[name=confirm]': {
> +		change: function(f, value) {
> +		    var view = this.getView();
> +		    var removeButton = this.lookupReference('removeButton');
> +		    if (value === view.getItem().id.toString()) {
> +			removeButton.enable();
> +		    } else {
> +			removeButton.disable();
> +		    }
> +		},
> +		specialkey: function(field, event) {
> +		    var removeButton = this.lookupReference('removeButton');
> +		    if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {

eslint wants a '===' instead of '==' here

> +			removeButton.fireEvent('click', removeButton, event);
> +		    }
> +		},
> +	    },
> +           'button[reference=removeButton]': {
> +		click: function() {
> +		    var view = this.getView();
> +		    Proxmox.Utils.API2Request({
> +			url: view.getUrl() + view.getParams(),
> +			method: 'DELETE',
> +			waitMsgTarget: view,
> +			failure: function(response, opts) {
> +			    view.close();
> +			    Ext.Msg.alert('Error', response.htmlStatus);
> +			},
> +			success: function(response, options) {
> +			    var hasProgressBar = !!(view.showProgress &&
> +				response.result.data);
> +
> +			    if (hasProgressBar) {
> +				// stay around so we can trigger our close events
> +				// when background action is completed
> +				view.hide();
> +
> +				var upid = response.result.data;
> +				var win = Ext.create('Proxmox.window.TaskProgress', {
> +				    upid: upid,
> +				    listeners: {
> +					destroy: function() {
> +					    view.close();
> +					},
> +				    },
> +				});
> +				win.show();
> +			    } else {
> +				view.close();
> +			    }
> +			},
> +		    });
> +		},
> +            },
> +	},
> +    },
> +
> +    items: [
> +	{
> +	    xtype: 'component',
> +	    cls: [Ext.baseCSSPrefix + 'message-box-icon',
> +		   Ext.baseCSSPrefix + 'message-box-warning',
> +		   Ext.baseCSSPrefix + 'dlg-icon'],
> +	},
> +	{
> +	    xtype: 'container',
> +	    flex: 1,
> +	    layout: {
> +		type: 'vbox',
> +		align: 'stretch',
> +	    },
> +	    items: [
> +		{
> +		    xtype: 'component',
> +		    reference: 'messageCmp',
> +		},
> +		{
> +		    itemId: 'confirmField',
> +		    reference: 'confirmField',
> +		    xtype: 'textfield',
> +		    name: 'confirm',
> +		    labelWidth: 300,
> +		    hideTrigger: true,
> +		    allowBlank: false,
> +		},
> +		{
> +		    xtype: 'proxmoxcheckbox',
> +		    name: 'purge',
> +		    reference: 'purgeCheckbox',
> +		    boxLabel: gettext('Purge'),
> +		    checked: false,
> +		    autoEl: {
> +			tag: 'div',
> +			'data-qtip': gettext('Remove from replication and backup jobs'),
> +		    },
> +		},
> +	    ],
> +	},
> +    ],
> +    buttons: [
> +	{
> +	    reference: 'removeButton',
> +	    text: gettext('Remove'),
> +	    disabled: true,
> +	},
> +    ],
> +
> +    initComponent: function() {
> +	var me = this;
> +
> +	me.callParent();
> +
> +	var item = me.getItem();
> +
> +	if (!Ext.isDefined(item.id)) {
> +	    throw "no ID specified";
> +	}
> +
> +	if (!Ext.isDefined(item.type)) {
> +	    throw "no VM type specified";
> +	}
> +
> +	var messageCmp = me.lookupReference('messageCmp');
> +	var msg;
> +
> +	if (item.type === 'VM') {
> +	    msg = Proxmox.Utils.format_task_description('qmdestroy', item.id);
> +	} else if (item.type === 'CT') {
> +	    msg = Proxmox.Utils.format_task_description('vzdestroy', item.id);
> +	} else if (item.type === 'CephPool') {
> +	    msg = Proxmox.Utils.format_task_description('cephdestroypool', item.id);
> +	} else if (item.type === 'Image') {
> +	    msg = Proxmox.Utils.format_task_description('unknownimgdel', item.id);
> +	} else {
> +	    throw "unknown item type specified";
> +	}
> +
> +	messageCmp.setHtml(msg);
> +
> +	if (!(item.type === 'VM' || item.type === 'CT')) {
> +	    let purgeCheckbox = me.lookupReference('purgeCheckbox');
> +	    purgeCheckbox.setDisabled(true);
> +	    purgeCheckbox.setHidden(true);
> +	}
> +
> +	var confirmField = me.lookupReference('confirmField');
> +	msg = gettext('Please enter the ID to confirm') +
> +	    ' (' + item.id + ')';
> +	confirmField.setFieldLabel(msg);
> +    },
> +});
> 





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note Hannes Laimer
@ 2020-09-11 11:08   ` Dominik Csapak
  0 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2020-09-11 11:08 UTC (permalink / raw)
  To: pbs-devel

comment inline

On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
> add field to set the note and add ui-container for displaying it
> 
>   src/window/SafeDestroy.js | 26 ++++++++++++++++++++++++++
>   1 file changed, 26 insertions(+)
> 
> diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
> index a6ad458..0027e98 100644
> --- a/src/window/SafeDestroy.js
> +++ b/src/window/SafeDestroy.js
> @@ -21,6 +21,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
>   	    purgeable: false,
>   	},
>   	url: undefined,
> +	note: undefined,
>   	taskName: undefined,
>   	params: {},
>       },
> @@ -138,6 +139,22 @@ Ext.define('Proxmox.window.SafeDestroy', {
>   			'data-qtip': gettext('Remove from replication and backup jobs'),
>   		    },
>   		},
> +		{
> +		    xtype: 'container',
> +		    reference: 'noteContainer',
> +		    flex: 1,
> +		    layout: {
> +			type: 'vbox',
> +			align: 'middle',
> +		    },
> +		    height: 25,
> +		    items: [
> +			{
> +			    xtype: 'component',
> +			    reference: 'noteCmp',
> +			},
> +		    ],
> +		},

2 things here:
* if i have a very long message, it gets truncated and
is not completely visible anymore. since we often
have that text in a 'gettext' where we do not often
check for the length, this could be a problem

* i would set it to hidden by default

>   	    ],
>   	},
>       ],
> @@ -161,8 +178,17 @@ Ext.define('Proxmox.window.SafeDestroy', {
>   	}
>   
>   	const messageCmp = me.lookupReference('messageCmp');
> +	const noteCmp = me.lookupReference('noteCmp');
>   	let msg;
>   
> +	if (Ext.isDefined(me.getNote())) {
> +	    noteCmp.setHtml(`<small>${me.getNote()}</small>`);
> +	} else {
> +	    const noteContainer = me.lookupReference('noteContainer');
> +	    noteContainer.setDisabled(true);
> +	    noteContainer.setHidden(true);
> +	}

and here only make it visible if getNote is defined.
this makes the code a litte more compact
e.g.

let note = me.getNote();
if (Ext.isDefined(note)) {
     ...setHtml...
     ...setHidden(false)...
}

> +
>   	if (Ext.isDefined(me.getTaskName())) {
>   	    msg = Proxmox.Utils.format_task_description(me.getTaskName(), item.id);
>   	    messageCmp.setHtml(msg);
> 





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
@ 2020-09-11 11:08   ` Dominik Csapak
  0 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2020-09-11 11:08 UTC (permalink / raw)
  To: pbs-devel

comment inline

On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
> for the removal of dirs the id/name is needed in the frontend, therefore it has to be returned by the api
> 
>   src/api2/node/disks/directory.rs | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/src/api2/node/disks/directory.rs b/src/api2/node/disks/directory.rs
> index 0d9ddeef..1f3cb0ff 100644
> --- a/src/api2/node/disks/directory.rs
> +++ b/src/api2/node/disks/directory.rs
> @@ -34,6 +34,8 @@ pub struct DatastoreMountInfo {
>       pub unitfile: String,
>       /// The mount path.
>       pub path: String,
> +    /// The name of the mount.
> +    pub id: String,
>       /// The mounted device.
>       pub device: String,
>       /// File system type
> @@ -76,6 +78,7 @@ pub fn  list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
>           let item = item?;
>           let name = item.file_name().to_string_lossy().to_string();
>   
> +        let id = String::from(MOUNT_NAME_REGEX.captures(&name).unwrap().get(1).map_or("", |m| m.as_str()));

i find that line a little weird because you mix unwrap with a map_or here

either we say that it always must match (else we would be in that loop)
then we can always use unwrap here

or we actually check if it matches, then the unwrap and the map_or has 
to be replaced by better error handling
(having an id as "" is not good imho, this will never work in the gui 
anyway)

>           let unitfile = format!("{}/{}", basedir, name);
>           let config = systemd::config::parse_systemd_mount(&unitfile)?;
>           let data: SystemdMountSection = config.lookup("Mount", "Mount")?;
> @@ -84,6 +87,7 @@ pub fn  list_datastore_mounts() -> Result<Vec<DatastoreMountInfo>, Error> {
>               unitfile,
>               device: data.What,
>               path: data.Where,
> +            id,
>               filesystem: data.Type,
>               options: data.Options,
>           });
> 





^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units
  2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units Hannes Laimer
@ 2020-09-11 11:08   ` Dominik Csapak
  0 siblings, 0 replies; 15+ messages in thread
From: Dominik Csapak @ 2020-09-11 11:08 UTC (permalink / raw)
  To: pbs-devel

comment inline

On 8/28/20 10:46 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
> ---
> add remove button to ui, all previous patches are needed for this one
> 
>   www/DirectoryList.js | 25 +++++++++++++++++++++++++
>   1 file changed, 25 insertions(+)
> 
> diff --git a/www/DirectoryList.js b/www/DirectoryList.js
> index 00531fd0..51b30c78 100644
> --- a/www/DirectoryList.js
> +++ b/www/DirectoryList.js
> @@ -21,6 +21,24 @@ Ext.define('PBS.admin.Directorylist', {
>   	    }).show();
>   	},
>   
> +	removeDirectory: function() {
> +	    let me = this;
> +	    const view = me.getView();
> +	    const rec = view.getSelection()[0];
> +	    const id = rec.data.id;
> +	    Ext.create('Proxmox.window.SafeDestroy', {
> +		url: `/nodes/localhost/disks/directory/${id}`,
> +		item: {
> +		    id: id,
> +		},
> +		note: gettext('Data and partitions on the disk will be left untouched.'),
> +		taskName: 'dirremove',
> +		listeners: {
> +		    destroy: () => me.reload(),
> +		},
> +	    }).show();
> +	},
> +
>   	reload: function() {
>   	    let me = this;
>   	    let store = me.getView().getStore();
> @@ -49,6 +67,13 @@ Ext.define('PBS.admin.Directorylist', {
>   	    text: gettext('Create') + ': Directory',
>   	    handler: 'createDirectory',
>   	},
> +	{
> +	    xtype: 'proxmoxButton',
> +	    text: gettext('Remove'),
> +	    handler: 'removeDir',

the handler name is wrong and thus will not execute anything

> +	    disabled: true,
> +	    iconCls: 'fa fa-trash-o',
> +	},
>       ],
>   
>       columns: [
> 





^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2020-09-11 11:09 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-28  8:46 [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 1/9] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
2020-09-11 11:07   ` Dominik Csapak
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 2/9] safe-destroy: replace type with purgeable and taskName Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 3/9] safe-destroy: replace var with let/const Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 4/9] safe-destroy: add possibility to show a small note Hannes Laimer
2020-09-11 11:08   ` Dominik Csapak
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 5/9] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 pve-manager 6/9] remove SafeDestroy from pve-manager Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 7/9] utils: add task description for directory removal Hannes Laimer
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 8/9] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
2020-09-11 11:08   ` Dominik Csapak
2020-08-28  8:46 ` [pbs-devel] [PATCH v3 proxmox-backup 9/9] ui: add remove-button for directories/mount-units Hannes Laimer
2020-09-11 11:08   ` Dominik Csapak
2020-09-11 11:07 ` [pbs-devel] [PATCH v3 proxmox-widget-toolbox 0/9] removal of directories in PBS WebUI Dominik Csapak

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