-/*jslint confusion: true */
Ext.define('PVE.qemu.Options', {
- extend: 'PVE.grid.PendingObjectGrid',
+ extend: 'Proxmox.grid.PendingObjectGrid',
alias: ['widget.PVE.qemu.Options'],
onlineHelp: 'qm_options',
- initComponent : function() {
+ initComponent: function() {
var me = this;
- var i;
var nodename = me.pveSelNode.data.node;
if (!nodename) {
defaultValue: me.pveSelNode.data.name,
header: gettext('Name'),
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Name'),
items: {
xtype: 'inputpanel',
- items:{
+ items: {
xtype: 'textfield',
name: 'name',
vtype: 'DnsName',
value: '',
fieldLabel: gettext('Name'),
- allowBlank: true
+ allowBlank: true,
},
onGetValues: function(values) {
var params = values;
if (values.name === undefined ||
values.name === null ||
values.name === '') {
- params = { 'delete':'name'};
+ params = { 'delete': 'name' };
}
return params;
- }
- }
- } : undefined
+ },
+ },
+ } : undefined,
},
onboot: {
header: gettext('Start at boot'),
defaultValue: '',
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Start at boot'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'onboot',
uncheckedValue: 0,
defaultValue: 0,
deleteDefaultValue: true,
- fieldLabel: gettext('Start at boot')
- }
- } : undefined
+ fieldLabel: gettext('Start at boot'),
+ },
+ } : undefined,
},
startup: {
header: gettext('Start/Shutdown order'),
defaultValue: '',
renderer: PVE.Utils.render_kvm_startup,
- editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] ?
- {
+ editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify']
+ ? {
xtype: 'pveWindowStartupEdit',
- onlineHelp: 'qm_startup_and_shutdown'
- } : undefined
+ onlineHelp: 'qm_startup_and_shutdown',
+ } : undefined,
},
ostype: {
header: gettext('OS Type'),
editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined,
renderer: PVE.Utils.render_kvm_ostype,
- defaultValue: 'other'
+ defaultValue: 'other',
},
bootdisk: {
- visible: false
+ visible: false,
},
boot: {
header: gettext('Boot Order'),
editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
multiKey: ['boot', 'bootdisk'],
renderer: function(order, metaData, record, rowIndex, colIndex, store, pending) {
- var i;
+ if (/^\s*$/.test(order)) {
+ return gettext('(No boot device selected)');
+ }
+ let boot = PVE.Parser.parsePropertyString(order, "legacy");
+ if (boot.order) {
+ let list = boot.order.split(';');
+ let ret = '';
+ list.forEach(dev => {
+ if (ret) {
+ ret += ', ';
+ }
+ ret += dev;
+ });
+ return ret;
+ }
+
+ // legacy style and fallback
+ let i;
var text = '';
var bootdisk = me.getObjectValue('bootdisk', undefined, pending);
- order = order || 'cdn';
+ order = boot.legacy || 'cdn';
for (i = 0; i < order.length; i++) {
- var sel = order.substring(i, i + 1);
if (text) {
text += ', ';
}
+ var sel = order.substring(i, i + 1);
if (sel === 'c') {
if (bootdisk) {
- text += "Disk '" + bootdisk + "'";
+ text += bootdisk;
} else {
- text += "Disk";
+ text += gettext('first disk');
}
} else if (sel === 'n') {
- text += 'Network';
+ text += gettext('any net');
} else if (sel === 'a') {
- text += 'Floppy';
+ text += gettext('Floppy');
} else if (sel === 'd') {
- text += 'CD-ROM';
+ text += gettext('any CD-ROM');
} else {
text += sel;
}
}
return text;
- }
+ },
},
tablet: {
header: gettext('Use tablet for pointer'),
defaultValue: true,
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.Config.HWType'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Use tablet for pointer'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'tablet',
checked: true,
uncheckedValue: 0,
defaultValue: 1,
deleteDefaultValue: true,
- fieldLabel: gettext('Enabled')
- }
- } : undefined
+ fieldLabel: gettext('Enabled'),
+ },
+ } : undefined,
},
hotplug: {
header: gettext('Hotplug'),
defaultValue: 'disk,network,usb',
- renderer: PVE.Utils.render_hotplug_features,
+ renderer: PVE.Utils.render_hotplug_features,
editor: caps.vms['VM.Config.HWType'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Hotplug'),
items: {
xtype: 'pveHotplugFeatureSelector',
value: '',
multiSelect: true,
fieldLabel: gettext('Hotplug'),
- allowBlank: true
- }
- } : undefined
+ allowBlank: true,
+ },
+ } : undefined,
},
acpi: {
header: gettext('ACPI support'),
defaultValue: true,
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.Config.HWType'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('ACPI support'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'acpi',
checked: true,
uncheckedValue: 0,
defaultValue: 1,
deleteDefaultValue: true,
- fieldLabel: gettext('Enabled')
- }
- } : undefined
- },
- scsihw: {
- header: gettext('SCSI Controller'),
- editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.ScsiHwEdit' : undefined,
- renderer: PVE.Utils.render_scsihw,
- defaultValue: ''
- },
- bios: {
- header: 'BIOS',
- editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.BiosEdit' : undefined,
- renderer: PVE.Utils.render_qemu_bios,
- defaultValue: ''
+ fieldLabel: gettext('Enabled'),
+ },
+ } : undefined,
},
kvm: {
header: gettext('KVM hardware virtualization'),
defaultValue: true,
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.Config.HWType'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('KVM hardware virtualization'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'kvm',
checked: true,
uncheckedValue: 0,
defaultValue: 1,
deleteDefaultValue: true,
- fieldLabel: gettext('Enabled')
- }
- } : undefined
+ fieldLabel: gettext('Enabled'),
+ },
+ } : undefined,
},
freeze: {
header: gettext('Freeze CPU at startup'),
defaultValue: false,
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.PowerMgmt'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Freeze CPU at startup'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'freeze',
uncheckedValue: 0,
defaultValue: 0,
deleteDefaultValue: true,
labelWidth: 140,
- fieldLabel: gettext('Freeze CPU at startup')
- }
- } : undefined
+ fieldLabel: gettext('Freeze CPU at startup'),
+ },
+ } : undefined,
},
localtime: {
header: gettext('Use local time for RTC'),
- defaultValue: false,
- renderer: PVE.Utils.format_boolean,
+ defaultValue: '__default__',
+ renderer: PVE.Utils.render_localtime,
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Use local time for RTC'),
+ width: 400,
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxKVComboBox',
name: 'localtime',
- uncheckedValue: 0,
- defaultValue: 0,
- deleteDefaultValue: true,
+ value: '__default__',
+ comboItems: [
+ ['__default__', PVE.Utils.render_localtime('__default__')],
+ [1, PVE.Utils.render_localtime(1)],
+ [0, PVE.Utils.render_localtime(0)],
+ ],
labelWidth: 140,
- fieldLabel: gettext('Use local time for RTC')
- }
- } : undefined
+ fieldLabel: gettext('Use local time for RTC'),
+ },
+ } : undefined,
},
startdate: {
header: gettext('RTC start date'),
defaultValue: 'now',
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('RTC start date'),
items: {
- xtype: 'pvetextfield',
+ xtype: 'proxmoxtextfield',
name: 'startdate',
deleteEmpty: true,
value: 'now',
fieldLabel: gettext('RTC start date'),
vtype: 'QemuStartDate',
- allowBlank: true
- }
- } : undefined
+ allowBlank: true,
+ },
+ } : undefined,
},
smbios1: {
header: gettext('SMBIOS settings (type1)'),
defaultValue: '',
renderer: Ext.String.htmlEncode,
- editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined
+ editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined,
},
agent: {
- header: gettext('Qemu Agent'),
+ header: 'QEMU Guest Agent',
defaultValue: false,
- renderer: PVE.Utils.format_boolean,
+ renderer: PVE.Utils.render_qga_features,
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Qemu Agent'),
+ width: 350,
+ onlineHelp: 'qm_qemu_agent',
items: {
- xtype: 'pvecheckbox',
+ xtype: 'pveAgentFeatureSelector',
name: 'agent',
- uncheckedValue: 0,
- defaultValue: 0,
- deleteDefaultValue: true,
- fieldLabel: gettext('Enabled')
- }
- } : undefined
+ },
+ } : undefined,
},
protection: {
header: gettext('Protection'),
defaultValue: false,
- renderer: PVE.Utils.format_boolean,
+ renderer: Proxmox.Utils.format_boolean,
editor: caps.vms['VM.Config.Options'] ? {
- xtype: 'pveWindowEdit',
+ xtype: 'proxmoxWindowEdit',
subject: gettext('Protection'),
items: {
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'protection',
uncheckedValue: 0,
defaultValue: 0,
deleteDefaultValue: true,
- fieldLabel: gettext('Enabled')
- }
- } : undefined
- }
+ fieldLabel: gettext('Enabled'),
+ },
+ } : undefined,
+ },
+ spice_enhancements: {
+ header: gettext('Spice Enhancements'),
+ defaultValue: false,
+ renderer: PVE.Utils.render_spice_enhancements,
+ editor: caps.vms['VM.Config.Options'] ? {
+ xtype: 'proxmoxWindowEdit',
+ subject: gettext('Spice Enhancements'),
+ onlineHelp: 'qm_spice_enhancements',
+ items: {
+ xtype: 'pveSpiceEnhancementSelector',
+ name: 'spice_enhancements',
+ },
+ } : undefined,
+ },
+ vmstatestorage: {
+ header: gettext('VM State storage'),
+ defaultValue: '',
+ renderer: val => val || gettext('Automatic'),
+ editor: caps.vms['VM.Config.Options'] ? {
+ xtype: 'proxmoxWindowEdit',
+ subject: gettext('VM State storage'),
+ onlineHelp: 'chapter_virtual_machines', // FIXME: use 'qm_vmstatestorage' once available
+ width: 350,
+ items: {
+ xtype: 'pveStorageSelector',
+ storageContent: 'images',
+ allowBlank: true,
+ emptyText: gettext("Automatic (Storage used by the VM, or 'local')"),
+ autoSelect: false,
+ deleteEmpty: true,
+ skipEmptyText: true,
+ nodename: nodename,
+ name: 'vmstatestorage',
+ },
+ } : undefined,
+ },
+ hookscript: {
+ header: gettext('Hookscript'),
+ },
};
var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config';
- var reload = function() {
- me.rstore.load();
- };
-
- var run_editor = function() {
- var sm = me.getSelectionModel();
- var rec = sm.getSelection()[0];
- if (!rec) {
- return;
- }
-
- var rowdef = rows[rec.data.key];
- if (!rowdef.editor) {
- return;
- }
-
- var win;
- if (Ext.isString(rowdef.editor)) {
- win = Ext.create(rowdef.editor, {
- pveSelNode: me.pveSelNode,
- confid: rec.data.key,
- url: '/api2/extjs/' + baseurl
- });
- } else {
- var config = Ext.apply({
- pveSelNode: me.pveSelNode,
- confid: rec.data.key,
- url: '/api2/extjs/' + baseurl
- }, rowdef.editor);
- win = Ext.createWidget(rowdef.editor.xtype, config);
- win.load();
- }
-
- win.show();
- win.on('destroy', reload);
- };
-
var edit_btn = new Ext.Button({
text: gettext('Edit'),
disabled: true,
- handler: run_editor
+ handler: function() { me.run_editor(); },
});
- var revert_btn = new PVE.button.Button({
- text: gettext('Revert'),
- disabled: true,
- handler: function() {
- var sm = me.getSelectionModel();
- var rec = sm.getSelection()[0];
- if (!rec) {
- return;
- }
-
- var rowdef = me.rows[rec.data.key] || {};
- var keys = rowdef.multiKey || [ rec.data.key ];
- var revert = keys.join(',');
-
- PVE.Utils.API2Request({
- url: '/api2/extjs/' + baseurl,
- waitMsgTarget: me,
- method: 'PUT',
- params: {
- 'revert': revert
- },
- callback: function() {
- reload();
- },
- failure: function (response, opts) {
- Ext.Msg.alert('Error',response.htmlStatus);
- }
- });
- }
- });
+ var revert_btn = new PVE.button.PendingRevert();
var set_button_status = function() {
var sm = me.getSelectionModel();
}
var key = rec.data.key;
- var pending = rec.data['delete'] || me.hasPendingChanges(key);
+ var pending = rec.data.delete || me.hasPendingChanges(key);
var rowdef = rows[key];
edit_btn.setDisabled(!rowdef.editor);
url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending",
interval: 5000,
cwidth1: 250,
- tbar: [ edit_btn, revert_btn ],
+ tbar: [edit_btn, revert_btn],
rows: rows,
+ editorConfig: {
+ url: "/api2/extjs/" + baseurl,
+ },
listeners: {
- itemdblclick: run_editor,
- selectionchange: set_button_status
- }
+ itemdblclick: me.run_editor,
+ selectionchange: set_button_status,
+ },
});
me.callParent();
- me.on('activate', me.rstore.startUpdate);
- me.on('destroy', me.rstore.stopUpdate);
+ me.on('activate', () => me.rstore.startUpdate());
+ me.on('destroy', () => me.rstore.stopUpdate());
+ me.on('deactivate', () => me.rstore.stopUpdate());
- me.rstore.on('datachanged', function() {
+ me.mon(me.getStore(), 'datachanged', function() {
set_button_status();
});
- }
+ },
});