* [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI
@ 2020-09-15 9:54 Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 1/10] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
` (10 more replies)
0 siblings, 11 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-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.
v4: - added patch for eslint fixes
- api2: use only unwrap in backend, not unwrap and map_or
- safe-destroy: note is now text-overflow: ellipsis and a tooltip
with the whole note is added
- safe-destroy: note component is now hidden by default
- pve-manager: fixed remove-button handler name
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 (6):
safe-destroy: move SafeDestroy from pve-manager here
safe-destroy: eslint --fix
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/Utils.js | 1 +
src/window/SafeDestroy.js | 212 ++++++++++++++++++++++++++++++++++++++
3 files changed, 214 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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 1/10] safe-destroy: move SafeDestroy from pve-manager here
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 2/10] safe-destroy: eslint --fix Hannes Laimer
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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..4cc1d89
--- /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 ? 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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 2/10] safe-destroy: eslint --fix
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 1/10] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 3/10] safe-destroy: replace type with purgeable and taskName Hannes Laimer
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
src/window/SafeDestroy.js | 58 +++++++++++++++++++--------------------
1 file changed, 29 insertions(+), 29 deletions(-)
diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
index 4cc1d89..dfb0185 100644
--- a/src/window/SafeDestroy.js
+++ b/src/window/SafeDestroy.js
@@ -11,17 +11,17 @@ Ext.define('Proxmox.window.SafeDestroy', {
buttonAlign: 'center',
bodyPadding: 10,
width: 450,
- layout: { type:'hbox' },
+ layout: { type: 'hbox' },
defaultFocus: 'confirmField',
showProgress: false,
config: {
item: {
id: undefined,
- type: undefined
+ type: undefined,
},
url: undefined,
- params: {}
+ params: {},
},
getParams: function() {
@@ -51,12 +51,12 @@ Ext.define('Proxmox.window.SafeDestroy', {
removeButton.disable();
}
},
- specialkey: function (field, event) {
+ specialkey: function(field, event) {
var removeButton = this.lookupReference('removeButton');
- if (!removeButton.isDisabled() && event.getKey() == event.ENTER) {
+ if (!removeButton.isDisabled() && event.getKey() === event.ENTER) {
removeButton.fireEvent('click', removeButton, event);
}
- }
+ },
},
'button[reference=removeButton]': {
click: function() {
@@ -70,8 +70,8 @@ Ext.define('Proxmox.window.SafeDestroy', {
Ext.Msg.alert('Error', response.htmlStatus);
},
success: function(response, options) {
- var hasProgressBar = view.showProgress &&
- response.result.data ? true : false;
+ var hasProgressBar = !!(view.showProgress &&
+ response.result.data);
if (hasProgressBar) {
// stay around so we can trigger our close events
@@ -82,40 +82,40 @@ Ext.define('Proxmox.window.SafeDestroy', {
var win = Ext.create('Proxmox.window.TaskProgress', {
upid: upid,
listeners: {
- destroy: function () {
+ destroy: function() {
view.close();
- }
- }
+ },
+ },
});
win.show();
} else {
view.close();
}
- }
+ },
});
- }
- }
- }
+ },
+ },
+ },
},
items: [
{
xtype: 'component',
- cls: [ Ext.baseCSSPrefix + 'message-box-icon',
+ cls: [Ext.baseCSSPrefix + 'message-box-icon',
Ext.baseCSSPrefix + 'message-box-warning',
- Ext.baseCSSPrefix + 'dlg-icon']
+ Ext.baseCSSPrefix + 'dlg-icon'],
},
{
xtype: 'container',
flex: 1,
layout: {
type: 'vbox',
- align: 'stretch'
+ align: 'stretch',
},
items: [
{
xtype: 'component',
- reference: 'messageCmp'
+ reference: 'messageCmp',
},
{
itemId: 'confirmField',
@@ -124,7 +124,7 @@ Ext.define('Proxmox.window.SafeDestroy', {
name: 'confirm',
labelWidth: 300,
hideTrigger: true,
- allowBlank: false
+ allowBlank: false,
},
{
xtype: 'proxmoxcheckbox',
@@ -134,21 +134,21 @@ Ext.define('Proxmox.window.SafeDestroy', {
checked: false,
autoEl: {
tag: 'div',
- 'data-qtip': gettext('Remove from replication and backup jobs')
- }
- }
- ]
- }
+ 'data-qtip': gettext('Remove from replication and backup jobs'),
+ },
+ },
+ ],
+ },
],
buttons: [
{
reference: 'removeButton',
text: gettext('Remove'),
- disabled: true
- }
+ disabled: true,
+ },
],
- initComponent : function() {
+ initComponent: function() {
var me = this;
me.callParent();
@@ -190,5 +190,5 @@ Ext.define('Proxmox.window.SafeDestroy', {
msg = gettext('Please enter the ID to confirm') +
' (' + item.id + ')';
confirmField.setFieldLabel(msg);
- }
+ },
});
--
2.20.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 3/10] safe-destroy: replace type with purgeable and taskName
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 1/10] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 2/10] safe-destroy: eslint --fix Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 4/10] safe-destroy: replace var with let/const Hannes Laimer
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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 dfb0185..fb27659 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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 4/10] safe-destroy: replace var with let/const
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (2 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 3/10] safe-destroy: replace type with purgeable and taskName Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 5/10] safe-destroy: add possibility to show a small note Hannes Laimer
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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 fb27659..39706b9 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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 5/10] safe-destroy: add possibility to show a small note
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (3 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 4/10] safe-destroy: replace var with let/const Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 6/10] utils: add task description for directory removal Hannes Laimer
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
src/window/SafeDestroy.js | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/src/window/SafeDestroy.js b/src/window/SafeDestroy.js
index 39706b9..87f81b7 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,25 @@ Ext.define('Proxmox.window.SafeDestroy', {
'data-qtip': gettext('Remove from replication and backup jobs'),
},
},
+ {
+ xtype: 'container',
+ reference: 'noteContainer',
+ flex: 1,
+ hidden: true,
+ layout: {
+ type: 'vbox',
+ align: 'middle',
+ },
+ height: 25,
+ items: [
+ {
+ xtype: 'component',
+ reference: 'noteCmp',
+ width: '300px',
+ style: 'font-size: smaller; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;',
+ },
+ ],
+ },
],
},
],
@@ -161,8 +181,16 @@ Ext.define('Proxmox.window.SafeDestroy', {
}
const messageCmp = me.lookupReference('messageCmp');
+ const noteCmp = me.lookupReference('noteCmp');
let msg;
+ if (Ext.isDefined(me.getNote())) {
+ noteCmp.setHtml(`<span title="${me.getNote()}">${me.getNote()}</span>`);
+ const noteContainer = me.lookupReference('noteContainer');
+ noteContainer.setHidden(false);
+ noteContainer.setDisabled(false);
+ }
+
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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-widget-toolkit 6/10] utils: add task description for directory removal
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (4 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 5/10] safe-destroy: add possibility to show a small note Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 7/10] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
src/Utils.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Utils.js b/src/Utils.js
index 8595cce..9017277 100644
--- a/src/Utils.js
+++ b/src/Utils.js
@@ -645,6 +645,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] 12+ messages in thread
* [pve-devel] [PATCH v4 pve-manager 7/10] safe-destroy: use SafeDestroy from proxmox-widget-toolkit
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (5 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 6/10] utils: add task description for directory removal Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 8/10] remove SafeDestroy from pve-manager Hannes Laimer
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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 194ad42e..6680e711 100644
--- a/www/manager6/storage/ContentView.js
+++ b/www/manager6/storage/ContentView.js
@@ -485,11 +485,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] 12+ messages in thread
* [pve-devel] [PATCH v4 pve-manager 8/10] remove SafeDestroy from pve-manager
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (6 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 7/10] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 09/10] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-backup 09/10] api2: add name of mount-point to DatastoreMountInfo
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (7 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 8/10] remove SafeDestroy from pve-manager Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 10/10] ui: add remove-button for directories/mount-units Hannes Laimer
2020-10-22 6:50 ` [pve-devel] partially-applied: [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Thomas Lamprecht
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
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..38a0ba74 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 = MOUNT_NAME_REGEX.captures(&name).unwrap().get(1).unwrap().as_str().to_string();
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] 12+ messages in thread
* [pve-devel] [PATCH v4 proxmox-backup 10/10] ui: add remove-button for directories/mount-units
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (8 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 09/10] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
@ 2020-09-15 9:54 ` Hannes Laimer
2020-10-22 6:50 ` [pve-devel] partially-applied: [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Thomas Lamprecht
10 siblings, 0 replies; 12+ messages in thread
From: Hannes Laimer @ 2020-09-15 9:54 UTC (permalink / raw)
To: pbs-devel, pve-devel
Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
---
www/DirectoryList.js | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/www/DirectoryList.js b/www/DirectoryList.js
index 00531fd0..e605a685 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: 'removeDirectory',
+ disabled: true,
+ iconCls: 'fa fa-trash-o',
+ },
],
columns: [
--
2.20.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [pve-devel] partially-applied: [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
` (9 preceding siblings ...)
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 10/10] ui: add remove-button for directories/mount-units Hannes Laimer
@ 2020-10-22 6:50 ` Thomas Lamprecht
10 siblings, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2020-10-22 6:50 UTC (permalink / raw)
To: Proxmox VE development discussion, Hannes Laimer, pbs-devel
On 15.09.20 11:54, 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.
>
>
> v4: - added patch for eslint fixes
> - api2: use only unwrap in backend, not unwrap and map_or
> - safe-destroy: note is now text-overflow: ellipsis and a tooltip
> with the whole note is added
> - safe-destroy: note component is now hidden by default
> - pve-manager: fixed remove-button handler name
>
> 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 (6):
> safe-destroy: move SafeDestroy from pve-manager here
> safe-destroy: eslint --fix
> 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/Utils.js | 1 +
> src/window/SafeDestroy.js | 212 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 214 insertions(+)
> create mode 100644 src/window/SafeDestroy.js
>
applied above, i.e., the widget toolkit part for now, thanks!
>
> 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] 12+ messages in thread
end of thread, other threads:[~2020-10-22 6:50 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-15 9:54 [pve-devel] [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 1/10] safe-destroy: move SafeDestroy from pve-manager here Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 2/10] safe-destroy: eslint --fix Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 3/10] safe-destroy: replace type with purgeable and taskName Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 4/10] safe-destroy: replace var with let/const Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 5/10] safe-destroy: add possibility to show a small note Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-widget-toolkit 6/10] utils: add task description for directory removal Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 7/10] safe-destroy: use SafeDestroy from proxmox-widget-toolkit Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 pve-manager 8/10] remove SafeDestroy from pve-manager Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 09/10] api2: add name of mount-point to DatastoreMountInfo Hannes Laimer
2020-09-15 9:54 ` [pve-devel] [PATCH v4 proxmox-backup 10/10] ui: add remove-button for directories/mount-units Hannes Laimer
2020-10-22 6:50 ` [pve-devel] partially-applied: [PATCH v4 proxmox-widget-toolkit 0/10] removal of directories in PBS WebUI Thomas Lamprecht
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox