ui: datastore: allow deleting currently shown namespace
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
		| @ -351,6 +351,7 @@ Ext.define('PBS.DataStoreContent', { | |||||||
| 		expandable: false, | 		expandable: false, | ||||||
| 		sortWeight: -5, | 		sortWeight: -5, | ||||||
| 		root: true, // fake root | 		root: true, // fake root | ||||||
|  | 		isRootNS, | ||||||
| 		ty: 'ns', | 		ty: 'ns', | ||||||
| 		children: children, | 		children: children, | ||||||
| 	    }); | 	    }); | ||||||
| @ -565,6 +566,30 @@ Ext.define('PBS.DataStoreContent', { | |||||||
| 	    }); | 	    }); | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	forgetNamespace: function(data) { | ||||||
|  | 	    let me = this; | ||||||
|  | 	    let view = me.getView(); | ||||||
|  | 	    if (!view.namespace || view.namespace === '') { | ||||||
|  | 		console.warn('forgetNamespace called with root NS!'); | ||||||
|  |                 return; | ||||||
|  | 	    } | ||||||
|  | 	    let parentNS = view.namespace.split('/').slice(0, -1).join('/'); | ||||||
|  |  | ||||||
|  | 	    Ext.create('PBS.window.NamespaceDelete', { | ||||||
|  | 		title: Ext.String.format(gettext("Destroy Namespace '{0}'"), view.namespace), | ||||||
|  | 		url: `/admin/datastore/${view.datastore}/namespace`, | ||||||
|  | 		datastore: view.datastore, | ||||||
|  | 		namespace: view.namespace, | ||||||
|  | 		autoShow: true, | ||||||
|  | 		apiCallDone: success => { | ||||||
|  | 		    if (success) { | ||||||
|  | 			view.namespace = parentNS; // move up before reload to avoid "ENOENT" error | ||||||
|  | 			me.reload(); | ||||||
|  | 		    } | ||||||
|  | 		}, | ||||||
|  | 	    }); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	forgetGroup: function(data) { | 	forgetGroup: function(data) { | ||||||
| 	    let me = this; | 	    let me = this; | ||||||
| 	    let view = me.getView(); | 	    let view = me.getView(); | ||||||
| @ -696,11 +721,13 @@ Ext.define('PBS.DataStoreContent', { | |||||||
| 	onForget: function(table, rI, cI, item, e, { data }) { | 	onForget: function(table, rI, cI, item, e, { data }) { | ||||||
| 	    let me = this; | 	    let me = this; | ||||||
| 	    let view = this.getView(); | 	    let view = this.getView(); | ||||||
| 	    if ((data.ty !== 'group' && data.ty !== 'dir') || !view.datastore) { | 	    if ((data.ty !== 'group' && data.ty !== 'dir' && data.ty !== 'ns') || !view.datastore) { | ||||||
| 		return; | 		return; | ||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
| 	    if (data.ty === 'dir') { | 	    if (data.ty === 'ns') { | ||||||
|  | 		me.forgetNamespace(data); | ||||||
|  | 	    } else if (data.ty === 'dir') { | ||||||
| 		me.forgetSnapshot(data); | 		me.forgetSnapshot(data); | ||||||
| 	    } else { | 	    } else { | ||||||
| 		me.forgetGroup(data); | 		me.forgetGroup(data); | ||||||
| @ -955,12 +982,23 @@ Ext.define('PBS.DataStoreContent', { | |||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 		    handler: 'onForget', | 		    handler: 'onForget', | ||||||
| 		    getTip: (v, m, { data }) => data.ty ==='dir' | 		    getTip: (v, m, { data }) => { | ||||||
| 			? Ext.String.format(gettext("Permanently forget snapshot '{0}'"), v) | 			let tip = '{0}'; | ||||||
| 			: Ext.String.format(gettext("Permanently forget group '{0}'"), v), | 			if (data.ty === 'ns') { | ||||||
|  | 			    tip = gettext("Remove namespace '{0}'"); | ||||||
|  | 			} else if (data.ty === 'dir') { | ||||||
|  | 			    tip = gettext("Permanently forget snapshot '{0}'"); | ||||||
|  | 			} else if (data.ty === 'group') { | ||||||
|  | 			    tip = gettext("Permanently forget group '{0}'"); | ||||||
|  | 			} | ||||||
|  | 			return Ext.String.format(tip, v); | ||||||
|  | 		    }, | ||||||
| 		    getClass: (v, m, { data }) => | 		    getClass: (v, m, { data }) => | ||||||
| 		        data.ty === 'group' || data.ty === 'dir' ? 'fa critical fa-trash-o' : 'pmx-hidden', | 		        (data.ty === 'ns' && !data.isRootNS && data.ns === undefined) || | ||||||
| 		    isActionDisabled: (v, r, c, i, { data }) => !(data.ty === 'group' || data.ty === 'dir'), | 		           data.ty === 'group' || data.ty === 'dir' | ||||||
|  | 		        ? 'fa critical fa-trash-o' | ||||||
|  | 		        : 'pmx-hidden', | ||||||
|  | 		    isActionDisabled: (v, r, c, i, { data }) => false, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 		    handler: 'downloadFile', | 		    handler: 'downloadFile', | ||||||
|  | |||||||
| @ -51,3 +51,58 @@ Ext.define('PBS.window.NamespaceEdit', { | |||||||
| 	], | 	], | ||||||
|     }, |     }, | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  | Ext.define('PBS.window.NamespaceDelete', { | ||||||
|  |     extend: 'Proxmox.window.Edit', | ||||||
|  |     xtype: 'pbsNamespaceDelete', | ||||||
|  |     mixins: ['Proxmox.Mixin.CBind'], | ||||||
|  |  | ||||||
|  |     //onlineHelp: 'namespaces', // TODO | ||||||
|  |  | ||||||
|  |     viewModel: {}, | ||||||
|  |  | ||||||
|  |     isRemove: true, | ||||||
|  |     isCreate: true, // because edit window is, well, a bit stupid.. | ||||||
|  |     title: gettext('Destroy Namespace'), | ||||||
|  |     // avoid that the trigger of the combogrid fields open on window show | ||||||
|  |     defaultFocus: 'proxmoxHelpButton', | ||||||
|  |  | ||||||
|  |     cbind: { | ||||||
|  | 	url: '/api2/extjs/admin/datastore/{datastore}/namespace', | ||||||
|  |     }, | ||||||
|  |     method: 'DELETE', | ||||||
|  |  | ||||||
|  |     width: 450, | ||||||
|  |  | ||||||
|  |     items: { | ||||||
|  | 	xtype: 'inputpanel', | ||||||
|  | 	items: [ | ||||||
|  | 	    { | ||||||
|  | 		xtype: 'displayfield', | ||||||
|  | 		name: 'ns', | ||||||
|  | 		fieldLabel: gettext('Namespace'), | ||||||
|  | 		cbind: { | ||||||
|  | 		    value: '{namespace}', | ||||||
|  | 		    datastore: '{datastore}', | ||||||
|  | 		}, | ||||||
|  | 		submitValue: true, | ||||||
|  | 	    }, | ||||||
|  | 	    { | ||||||
|  | 		xtype: 'proxmoxcheckbox', | ||||||
|  | 		name: 'delete-groups', | ||||||
|  | 		reference: 'rmGroups', | ||||||
|  | 		boxLabel: gettext('Delete all Backup Groups'), | ||||||
|  | 		value: false, | ||||||
|  | 	    }, | ||||||
|  | 	    { | ||||||
|  | 		xtype: 'box', | ||||||
|  | 		padding: '5 0 0 0', | ||||||
|  | 		html: `<span class="pmx-hint">${gettext('Note')}</span>: ` | ||||||
|  | 		  + gettext('This will permanently remove all backups from the current namespace and all namespaces below it!'), | ||||||
|  | 		bind: { | ||||||
|  | 		    hidden: '{!rmGroups.checked}', | ||||||
|  | 		}, | ||||||
|  | 	    }, | ||||||
|  | 	], | ||||||
|  |     }, | ||||||
|  | }); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user