/*jslint confusion: true */ Ext.define('PVE.qemu.Options', { extend: 'PVE.grid.PendingObjectGrid', alias: ['widget.PVE.qemu.Options'], initComponent : function() { var me = this; var i; var nodename = me.pveSelNode.data.node; if (!nodename) { throw "no node name specified"; } var vmid = me.pveSelNode.data.vmid; if (!vmid) { throw "no VM ID specified"; } var caps = Ext.state.Manager.get('GuiCap'); var rows = { name: { required: true, defaultValue: me.pveSelNode.data.name, header: gettext('Name'), editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('Name'), items: { xtype: 'textfield', name: 'name', vtype: 'DnsName', value: '', fieldLabel: gettext('Name'), allowBlank: true } } : undefined }, onboot: { header: gettext('Start at boot'), defaultValue: '', renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('Start at boot'), items: { xtype: 'pvecheckbox', name: 'onboot', uncheckedValue: 0, defaultValue: 0, deleteDefaultValue: true, 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'] ? 'PVE.qemu.StartupEdit' : undefined }, ostype: { header: gettext('OS Type'), editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined, renderer: PVE.Utils.render_kvm_ostype, defaultValue: 'other' }, bootdisk: { visible: false }, boot: { header: gettext('Boot order'), defaultValue: 'cdn', editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined, renderer: function(order, metaData, record, rowIndex, colIndex, store, pending) { var i; var text = ''; var bootdisk = me.getObjectValue('bootdisk', undefined, pending); order = order || 'cdn'; for (i = 0; i < order.length; i++) { var sel = order.substring(i, i + 1); if (text) { text += ', '; } if (sel === 'c') { if (bootdisk) { text += "Disk '" + bootdisk + "'"; } else { text += "Disk"; } } else if (sel === 'n') { text += 'Network'; } else if (sel === 'a') { text += 'Floppy'; } else if (sel === 'd') { text += 'CD-ROM'; } else { text += sel; } } return text; } }, tablet: { header: gettext('Use tablet for pointer'), defaultValue: true, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.HWType'] ? { xtype: 'pveWindowEdit', subject: gettext('Use tablet for pointer'), items: { xtype: 'pvecheckbox', name: 'tablet', checked: true, uncheckedValue: 0, defaultValue: 1, deleteDefaultValue: true, fieldLabel: gettext('Enabled') } } : undefined }, hotplug: { header: gettext('Hotplug'), defaultValue: 'disk,network,usb', renderer: PVE.Utils.render_hotplug_features, editor: caps.vms['VM.Config.HWType'] ? { xtype: 'pveWindowEdit', subject: gettext('Hotplug'), items: { xtype: 'pveHotplugFeatureSelector', name: 'hotplug', value: '', multiSelect: true, fieldLabel: gettext('Hotplug'), allowBlank: true } } : undefined }, acpi: { header: gettext('ACPI support'), defaultValue: true, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.HWType'] ? { xtype: 'pveWindowEdit', subject: gettext('ACPI support'), items: { xtype: 'pvecheckbox', name: 'acpi', checked: true, uncheckedValue: 0, defaultValue: 1, deleteDefaultValue: true, fieldLabel: gettext('Enabled') } } : undefined }, scsihw: { header: gettext('SCSI Controller Type'), 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: '' }, kvm: { header: gettext('KVM hardware virtualization'), defaultValue: true, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.HWType'] ? { xtype: 'pveWindowEdit', subject: gettext('KVM hardware virtualization'), items: { xtype: 'pvecheckbox', name: 'kvm', checked: true, uncheckedValue: 0, defaultValue: 1, deleteDefaultValue: true, fieldLabel: gettext('Enabled') } } : undefined }, freeze: { header: gettext('Freeze CPU at startup'), defaultValue: false, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.PowerMgmt'] ? { xtype: 'pveWindowEdit', subject: gettext('Freeze CPU at startup'), items: { xtype: 'pvecheckbox', name: 'freeze', uncheckedValue: 0, defaultValue: 0, deleteDefaultValue: true, labelWidth: 140, fieldLabel: gettext('Freeze CPU at startup') } } : undefined }, localtime: { header: gettext('Use local time for RTC'), defaultValue: false, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('Use local time for RTC'), items: { xtype: 'pvecheckbox', name: 'localtime', uncheckedValue: 0, defaultValue: 0, deleteDefaultValue: true, labelWidth: 140, fieldLabel: gettext('Use local time for RTC') } } : undefined }, startdate: { header: gettext('RTC start date'), defaultValue: 'now', editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('RTC start date'), items: { xtype: 'pvetextfield', name: 'startdate', deleteEmpty: true, value: 'now', fieldLabel: gettext('RTC start date'), vtype: 'QemuStartDate', allowBlank: true } } : undefined }, smbios1: { header: gettext('SMBIOS settings (type1)'), defaultValue: '', editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined }, agent: { header: gettext('Qemu Agent'), defaultValue: false, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('Qemu Agent'), items: { xtype: 'pvecheckbox', name: 'agent', uncheckedValue: 0, defaultValue: 0, deleteDefaultValue: true, fieldLabel: gettext('Enabled') } } : undefined }, protection: { header: gettext('VM protection'), defaultValue: false, renderer: PVE.Utils.format_boolean, editor: caps.vms['VM.Config.Options'] ? { xtype: 'pveWindowEdit', subject: gettext('VM protection'), items: { xtype: 'pvecheckbox', name: 'protection', uncheckedValue: 0, defaultValue: 0, deleteDefaultValue: true, fieldLabel: gettext('Enabled') } } : undefined } }; 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 }); 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; } PVE.Utils.API2Request({ url: '/api2/extjs/' + baseurl, waitMsgTarget: me, method: 'PUT', params: { 'revert': rec.data.key }, callback: function() { reload(); }, failure: function (response, opts) { Ext.Msg.alert('Error',response.htmlStatus); } }); } }); var set_button_status = function() { var sm = me.getSelectionModel(); var rec = sm.getSelection()[0]; if (!rec) { edit_btn.disable(); return; } var key = rec.data.key; var pending = rec.data['delete'] || me.hasPendingChanges(key); var rowdef = rows[key]; edit_btn.setDisabled(!rowdef.editor); revert_btn.setDisabled(!pending); }; Ext.applyIf(me, { url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending", interval: 5000, cwidth1: 170, tbar: [ edit_btn, revert_btn ], rows: rows, listeners: { itemdblclick: run_editor, selectionchange: set_button_status } }); me.callParent(); me.on('show', me.rstore.startUpdate); me.on('hide', me.rstore.stopUpdate); me.on('destroy', me.rstore.stopUpdate); me.rstore.on('datachanged', function() { set_button_status(); }); } });