mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-10-04 21:10:03 +00:00
close #3181: ui: display guest name in confirm dialogs
The confirmation dialogs of the following actions are affected by this change: * Remove * Clone * Migrate * Snapshot * Snapshot restore * Backup VM/CT from config view * Restore VM/CT from config view A combination of VM/CT id and name is added to each confirmation dialog. The order of id and name depends on the sort field selected in the tree settings. If "Name" is selected, the confirmation dialogs will show "VM name (VMID)". In any other case, "VMID (VM name)" will be used. The VM/CT name is considered optional in all handled cases. If it is undefined, only the VMID will be displayed in the dialog window. No exceptions are thrown in case of an undefined guest name because it only extends the information displayed to the user and is not essential for performing any of the actions above. Signed-off-by: Michael Köppl <m.koeppl@proxmox.com>
This commit is contained in:
parent
0457881c56
commit
708de5b341
@ -1970,8 +1970,19 @@ Ext.define('PVE.Utils', {
|
|||||||
return languageCookie || Proxmox.defaultLang || 'en';
|
return languageCookie || Proxmox.defaultLang || 'en';
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getFormattedGuestIdentifier: function(vmid, guestName) {
|
||||||
|
if (PVE.UIOptions.getTreeSortingValue('sort-field') === 'vmid') {
|
||||||
|
return guestName ? `${vmid} (${guestName})` : vmid;
|
||||||
|
} else {
|
||||||
|
return guestName ? `${guestName} (${vmid})` : vmid;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
formatGuestTaskConfirmation: function(taskType, vmid, guestName) {
|
formatGuestTaskConfirmation: function(taskType, vmid, guestName) {
|
||||||
let description = Proxmox.Utils.format_task_description(taskType, `${vmid} (${guestName})`);
|
let description = Proxmox.Utils.format_task_description(
|
||||||
|
taskType,
|
||||||
|
this.getFormattedGuestIdentifier(vmid, guestName),
|
||||||
|
);
|
||||||
return Ext.htmlEncode(description);
|
return Ext.htmlEncode(description);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -39,6 +39,8 @@ Ext.define('PVE.grid.BackupView', {
|
|||||||
throw "unsupported VM type '" + vmtype + "'";
|
throw "unsupported VM type '" + vmtype + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let vmname = me.pveSelNode.data.name;
|
||||||
|
|
||||||
var searchFilter = {
|
var searchFilter = {
|
||||||
property: 'volid',
|
property: 'volid',
|
||||||
value: '',
|
value: '',
|
||||||
@ -167,6 +169,7 @@ Ext.define('PVE.grid.BackupView', {
|
|||||||
nodename: nodename,
|
nodename: nodename,
|
||||||
vmid: vmid,
|
vmid: vmid,
|
||||||
vmtype: vmtype,
|
vmtype: vmtype,
|
||||||
|
vmname: vmname,
|
||||||
storage: storagesel.getValue(),
|
storage: storagesel.getValue(),
|
||||||
listeners: {
|
listeners: {
|
||||||
close: function() {
|
close: function() {
|
||||||
@ -189,6 +192,7 @@ Ext.define('PVE.grid.BackupView', {
|
|||||||
let win = Ext.create('PVE.window.Restore', {
|
let win = Ext.create('PVE.window.Restore', {
|
||||||
nodename: nodename,
|
nodename: nodename,
|
||||||
vmid: vmid,
|
vmid: vmid,
|
||||||
|
vmname: vmname,
|
||||||
volid: rec.data.volid,
|
volid: rec.data.volid,
|
||||||
volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec),
|
volidText: PVE.Utils.render_storage_content(rec.data.volid, {}, rec),
|
||||||
vmtype: vmtype,
|
vmtype: vmtype,
|
||||||
|
@ -89,7 +89,13 @@ Ext.define('PVE.lxc.CmdMenu', {
|
|||||||
text: gettext('Clone'),
|
text: gettext('Clone'),
|
||||||
iconCls: 'fa fa-fw fa-clone',
|
iconCls: 'fa fa-fw fa-clone',
|
||||||
hidden: !caps.vms['VM.Clone'],
|
hidden: !caps.vms['VM.Clone'],
|
||||||
handler: () => PVE.window.Clone.wrap(info.node, info.vmid, me.isTemplate, 'lxc'),
|
handler: () => PVE.window.Clone.wrap(
|
||||||
|
info.node,
|
||||||
|
info.vmid,
|
||||||
|
info.name,
|
||||||
|
me.isTemplate,
|
||||||
|
'lxc',
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: gettext('Migrate'),
|
text: gettext('Migrate'),
|
||||||
@ -100,6 +106,7 @@ Ext.define('PVE.lxc.CmdMenu', {
|
|||||||
vmtype: 'lxc',
|
vmtype: 'lxc',
|
||||||
nodename: info.node,
|
nodename: info.node,
|
||||||
vmid: info.vmid,
|
vmid: info.vmid,
|
||||||
|
vmname: info.name,
|
||||||
autoShow: true,
|
autoShow: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -100,6 +100,7 @@ Ext.define('PVE.lxc.Config', {
|
|||||||
vmtype: 'lxc',
|
vmtype: 'lxc',
|
||||||
nodename: nodename,
|
nodename: nodename,
|
||||||
vmid: vmid,
|
vmid: vmid,
|
||||||
|
vmname: vm.name,
|
||||||
});
|
});
|
||||||
win.show();
|
win.show();
|
||||||
},
|
},
|
||||||
@ -115,7 +116,13 @@ Ext.define('PVE.lxc.Config', {
|
|||||||
iconCls: 'fa fa-fw fa-clone',
|
iconCls: 'fa fa-fw fa-clone',
|
||||||
hidden: !caps.vms['VM.Clone'],
|
hidden: !caps.vms['VM.Clone'],
|
||||||
handler: function() {
|
handler: function() {
|
||||||
PVE.window.Clone.wrap(nodename, vmid, template, 'lxc');
|
PVE.window.Clone.wrap(
|
||||||
|
nodename,
|
||||||
|
vmid,
|
||||||
|
vm.name,
|
||||||
|
template,
|
||||||
|
'lxc',
|
||||||
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -156,7 +163,11 @@ Ext.define('PVE.lxc.Config', {
|
|||||||
handler: function() {
|
handler: function() {
|
||||||
Ext.create('PVE.window.SafeDestroyGuest', {
|
Ext.create('PVE.window.SafeDestroyGuest', {
|
||||||
url: base_url,
|
url: base_url,
|
||||||
item: { type: 'CT', id: vmid },
|
item: {
|
||||||
|
type: 'CT',
|
||||||
|
id: vmid,
|
||||||
|
formattedIdentifier: PVE.Utils.getFormattedGuestIdentifier(vmid, vm.name),
|
||||||
|
},
|
||||||
taskName: 'vzdestroy',
|
taskName: 'vzdestroy',
|
||||||
}).show();
|
}).show();
|
||||||
},
|
},
|
||||||
|
@ -121,6 +121,7 @@ Ext.define('PVE.qemu.CmdMenu', {
|
|||||||
vmtype: 'qemu',
|
vmtype: 'qemu',
|
||||||
nodename: info.node,
|
nodename: info.node,
|
||||||
vmid: info.vmid,
|
vmid: info.vmid,
|
||||||
|
vmname: info.name,
|
||||||
autoShow: true,
|
autoShow: true,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -129,7 +130,13 @@ Ext.define('PVE.qemu.CmdMenu', {
|
|||||||
text: gettext('Clone'),
|
text: gettext('Clone'),
|
||||||
iconCls: 'fa fa-fw fa-clone',
|
iconCls: 'fa fa-fw fa-clone',
|
||||||
hidden: !caps.vms['VM.Clone'],
|
hidden: !caps.vms['VM.Clone'],
|
||||||
handler: () => PVE.window.Clone.wrap(info.node, info.vmid, me.isTemplate, 'qemu'),
|
handler: () => PVE.window.Clone.wrap(
|
||||||
|
info.node,
|
||||||
|
info.vmid,
|
||||||
|
info.name,
|
||||||
|
me.isTemplate,
|
||||||
|
'qemu',
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
text: gettext('Convert to template'),
|
text: gettext('Convert to template'),
|
||||||
|
@ -73,6 +73,7 @@ Ext.define('PVE.qemu.Config', {
|
|||||||
vmtype: 'qemu',
|
vmtype: 'qemu',
|
||||||
nodename: nodename,
|
nodename: nodename,
|
||||||
vmid: vmid,
|
vmid: vmid,
|
||||||
|
vmname: vm.name,
|
||||||
});
|
});
|
||||||
win.show();
|
win.show();
|
||||||
},
|
},
|
||||||
@ -88,7 +89,13 @@ Ext.define('PVE.qemu.Config', {
|
|||||||
iconCls: 'fa fa-fw fa-clone',
|
iconCls: 'fa fa-fw fa-clone',
|
||||||
hidden: !caps.vms['VM.Clone'],
|
hidden: !caps.vms['VM.Clone'],
|
||||||
handler: function() {
|
handler: function() {
|
||||||
PVE.window.Clone.wrap(nodename, vmid, template, 'qemu');
|
PVE.window.Clone.wrap(
|
||||||
|
nodename,
|
||||||
|
vmid,
|
||||||
|
vm.name,
|
||||||
|
template,
|
||||||
|
'qemu',
|
||||||
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -128,7 +135,11 @@ Ext.define('PVE.qemu.Config', {
|
|||||||
handler: function() {
|
handler: function() {
|
||||||
Ext.create('PVE.window.SafeDestroyGuest', {
|
Ext.create('PVE.window.SafeDestroyGuest', {
|
||||||
url: base_url,
|
url: base_url,
|
||||||
item: { type: 'VM', id: vmid },
|
item: {
|
||||||
|
type: 'VM',
|
||||||
|
id: vmid,
|
||||||
|
formattedIdentifier: PVE.Utils.getFormattedGuestIdentifier(vmid, vm.name),
|
||||||
|
},
|
||||||
taskName: 'qmdestroy',
|
taskName: 'qmdestroy',
|
||||||
}).show();
|
}).show();
|
||||||
},
|
},
|
||||||
|
@ -11,6 +11,7 @@ Ext.define('PVE.guest.SnapshotTree', {
|
|||||||
type: undefined,
|
type: undefined,
|
||||||
nodename: undefined,
|
nodename: undefined,
|
||||||
vmid: undefined,
|
vmid: undefined,
|
||||||
|
vmname: undefined,
|
||||||
snapshotAllowed: false,
|
snapshotAllowed: false,
|
||||||
rollbackAllowed: false,
|
rollbackAllowed: false,
|
||||||
snapshotFeature: false,
|
snapshotFeature: false,
|
||||||
@ -50,6 +51,7 @@ Ext.define('PVE.guest.SnapshotTree', {
|
|||||||
let win = Ext.create('PVE.window.Snapshot', {
|
let win = Ext.create('PVE.window.Snapshot', {
|
||||||
nodename: vm.get('nodename'),
|
nodename: vm.get('nodename'),
|
||||||
vmid: vm.get('vmid'),
|
vmid: vm.get('vmid'),
|
||||||
|
vmname: vm.get('vmname'),
|
||||||
viewonly: !vm.get('snapshotAllowed'),
|
viewonly: !vm.get('snapshotAllowed'),
|
||||||
type: vm.get('type'),
|
type: vm.get('type'),
|
||||||
isCreate: !edit,
|
isCreate: !edit,
|
||||||
@ -213,6 +215,8 @@ Ext.define('PVE.guest.SnapshotTree', {
|
|||||||
}
|
}
|
||||||
vm.set('vmid', view.pveSelNode.data.vmid);
|
vm.set('vmid', view.pveSelNode.data.vmid);
|
||||||
|
|
||||||
|
vm.set('vmname', view.pveSelNode.data.name);
|
||||||
|
|
||||||
let caps = Ext.state.Manager.get('GuiCap');
|
let caps = Ext.state.Manager.get('GuiCap');
|
||||||
vm.set('snapshotAllowed', !!caps.vms['VM.Snapshot']);
|
vm.set('snapshotAllowed', !!caps.vms['VM.Snapshot']);
|
||||||
vm.set('rollbackAllowed', !!caps.vms['VM.Snapshot.Rollback']);
|
vm.set('rollbackAllowed', !!caps.vms['VM.Snapshot.Rollback']);
|
||||||
@ -259,8 +263,12 @@ Ext.define('PVE.guest.SnapshotTree', {
|
|||||||
let view = this.up('treepanel');
|
let view = this.up('treepanel');
|
||||||
let rec = view.getSelection()[0];
|
let rec = view.getSelection()[0];
|
||||||
let vmid = view.getViewModel().get('vmid');
|
let vmid = view.getViewModel().get('vmid');
|
||||||
let message = Proxmox.Utils.format_task_description('qmrollback', vmid) +
|
let vmname = view.getViewModel().get('vmname');
|
||||||
` '${rec.data.name}'? ${gettext("Current state will be lost.")}`;
|
let message = PVE.Utils.formatGuestTaskConfirmation(
|
||||||
|
'qmrollback',
|
||||||
|
vmid,
|
||||||
|
vmname,
|
||||||
|
) + ` '${rec.data.name}'? ${gettext("Current state will be lost.")}`;
|
||||||
return Ext.htmlEncode(message);
|
return Ext.htmlEncode(message);
|
||||||
},
|
},
|
||||||
handler: 'rollback',
|
handler: 'rollback',
|
||||||
|
@ -360,9 +360,9 @@ Ext.define('PVE.window.Backup', {
|
|||||||
hidden: false,
|
hidden: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
var title = gettext('Backup') + " " +
|
let guestTypeStr = me.vmtype === 'lxc' ? "CT" : "VM";
|
||||||
(me.vmtype === 'lxc' ? "CT" : "VM") +
|
let formattedGuestIdentifier = PVE.Utils.getFormattedGuestIdentifier(me.vmid, me.vmname);
|
||||||
" " + me.vmid;
|
let title = `${gettext('Backup')} ${guestTypeStr} ${formattedGuestIdentifier}`;
|
||||||
|
|
||||||
Ext.apply(me, {
|
Ext.apply(me, {
|
||||||
title: title,
|
title: title,
|
||||||
|
@ -21,7 +21,7 @@ Ext.define('PVE.window.Clone', {
|
|||||||
|
|
||||||
statics: {
|
statics: {
|
||||||
// display a snapshot selector only if needed
|
// display a snapshot selector only if needed
|
||||||
wrap: function(nodename, vmid, isTemplate, guestType) {
|
wrap: function(nodename, vmid, vmname, isTemplate, guestType) {
|
||||||
Proxmox.Utils.API2Request({
|
Proxmox.Utils.API2Request({
|
||||||
url: '/nodes/' + nodename + '/' + guestType + '/' + vmid +'/snapshot',
|
url: '/nodes/' + nodename + '/' + guestType + '/' + vmid +'/snapshot',
|
||||||
failure: function(response, opts) {
|
failure: function(response, opts) {
|
||||||
@ -36,6 +36,7 @@ Ext.define('PVE.window.Clone', {
|
|||||||
nodename: nodename,
|
nodename: nodename,
|
||||||
guestType: guestType,
|
guestType: guestType,
|
||||||
vmid: vmid,
|
vmid: vmid,
|
||||||
|
vmname: vmname,
|
||||||
isTemplate: isTemplate,
|
isTemplate: isTemplate,
|
||||||
hasSnapshots: hasSnapshots,
|
hasSnapshots: hasSnapshots,
|
||||||
}).show();
|
}).show();
|
||||||
@ -155,7 +156,9 @@ Ext.define('PVE.window.Clone', {
|
|||||||
if (me.isTemplate) {
|
if (me.isTemplate) {
|
||||||
titletext += ' Template';
|
titletext += ' Template';
|
||||||
}
|
}
|
||||||
me.title = "Clone " + titletext + " " + me.vmid;
|
|
||||||
|
let formattedGuestIdentifier = PVE.Utils.getFormattedGuestIdentifier(me.vmid, me.vmname);
|
||||||
|
me.title = `Clone ${titletext} ${formattedGuestIdentifier}`;
|
||||||
|
|
||||||
var col1 = [];
|
var col1 = [];
|
||||||
var col2 = [];
|
var col2 = [];
|
||||||
|
@ -4,6 +4,7 @@ Ext.define('PVE.window.Migrate', {
|
|||||||
vmtype: undefined,
|
vmtype: undefined,
|
||||||
nodename: undefined,
|
nodename: undefined,
|
||||||
vmid: undefined,
|
vmid: undefined,
|
||||||
|
vmname: undefined,
|
||||||
maxHeight: 450,
|
maxHeight: 450,
|
||||||
|
|
||||||
viewModel: {
|
viewModel: {
|
||||||
@ -92,9 +93,14 @@ Ext.define('PVE.window.Migrate', {
|
|||||||
}
|
}
|
||||||
vm.set('vmtype', view.vmtype);
|
vm.set('vmtype', view.vmtype);
|
||||||
|
|
||||||
view.setTitle(
|
let title = Ext.String.format(
|
||||||
Ext.String.format('{0} {1} {2}', gettext('Migrate'), vm.get(view.vmtype).commonName, view.vmid),
|
'{0} {1} {2}',
|
||||||
|
gettext('Migrate'),
|
||||||
|
vm.get(view.vmtype).commonName,
|
||||||
|
PVE.Utils.getFormattedGuestIdentifier(view.vmid, view.vmname),
|
||||||
);
|
);
|
||||||
|
view.setTitle(title);
|
||||||
|
|
||||||
me.lookup('proxmoxHelpButton').setHelpConfig({
|
me.lookup('proxmoxHelpButton').setHelpConfig({
|
||||||
onlineHelp: vm.get(view.vmtype).onlineHelp,
|
onlineHelp: vm.get(view.vmtype).onlineHelp,
|
||||||
});
|
});
|
||||||
|
@ -357,7 +357,8 @@ Ext.define('PVE.window.Restore', {
|
|||||||
|
|
||||||
let title = gettext('Restore') + ": " + (me.vmtype === 'lxc' ? 'CT' : 'VM');
|
let title = gettext('Restore') + ": " + (me.vmtype === 'lxc' ? 'CT' : 'VM');
|
||||||
if (me.vmid) {
|
if (me.vmid) {
|
||||||
title = `${gettext('Overwrite')} ${title} ${me.vmid}`;
|
let formattedGuestIdentifier = PVE.Utils.getFormattedGuestIdentifier(me.vmid, me.vmname);
|
||||||
|
title = `${gettext('Overwrite')} ${title} ${formattedGuestIdentifier}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ext.apply(me, {
|
Ext.apply(me, {
|
||||||
|
@ -137,7 +137,12 @@ Ext.define('PVE.window.Snapshot', {
|
|||||||
|
|
||||||
let subject;
|
let subject;
|
||||||
if (me.isCreate) {
|
if (me.isCreate) {
|
||||||
subject = (me.type === 'qemu' ? 'VM' : 'CT') + me.vmid + ' ' + gettext('Snapshot');
|
let guestTypeStr = me.type === 'qemu' ? 'VM' : 'CT';
|
||||||
|
let formattedGuestIdentifier = PVE.Utils.getFormattedGuestIdentifier(
|
||||||
|
me.vmid,
|
||||||
|
me.vmname,
|
||||||
|
);
|
||||||
|
subject = `${guestTypeStr} ${formattedGuestIdentifier} ${gettext('Snapshot')}}`;
|
||||||
me.method = 'POST';
|
me.method = 'POST';
|
||||||
me.showTaskViewer = true;
|
me.showTaskViewer = true;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user