1 Ext
.define('PVE.qemu.Options', {
2 extend
: 'Proxmox.grid.PendingObjectGrid',
3 alias
: ['widget.PVE.qemu.Options'],
5 onlineHelp
: 'qm_options',
7 initComponent : function() {
11 var nodename
= me
.pveSelNode
.data
.node
;
13 throw "no node name specified";
16 var vmid
= me
.pveSelNode
.data
.vmid
;
18 throw "no VM ID specified";
21 var caps
= Ext
.state
.Manager
.get('GuiCap');
26 defaultValue
: me
.pveSelNode
.data
.name
,
27 header
: gettext('Name'),
28 editor
: caps
.vms
['VM.Config.Options'] ? {
29 xtype
: 'proxmoxWindowEdit',
30 subject
: gettext('Name'),
38 fieldLabel
: gettext('Name'),
41 onGetValues: function(values
) {
43 if (values
.name
=== undefined ||
44 values
.name
=== null ||
46 params
= { 'delete':'name'};
54 header
: gettext('Start at boot'),
56 renderer
: Proxmox
.Utils
.format_boolean
,
57 editor
: caps
.vms
['VM.Config.Options'] ? {
58 xtype
: 'proxmoxWindowEdit',
59 subject
: gettext('Start at boot'),
61 xtype
: 'proxmoxcheckbox',
65 deleteDefaultValue
: true,
66 fieldLabel
: gettext('Start at boot'),
71 header
: gettext('Start/Shutdown order'),
73 renderer
: PVE
.Utils
.render_kvm_startup
,
74 editor
: caps
.vms
['VM.Config.Options'] && caps
.nodes
['Sys.Modify'] ?
76 xtype
: 'pveWindowStartupEdit',
77 onlineHelp
: 'qm_startup_and_shutdown',
81 header
: gettext('OS Type'),
82 editor
: caps
.vms
['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined,
83 renderer
: PVE
.Utils
.render_kvm_ostype
,
84 defaultValue
: 'other',
90 header
: gettext('Boot Order'),
92 editor
: caps
.vms
['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
93 multiKey
: ['boot', 'bootdisk'],
94 renderer: function(order
, metaData
, record
, rowIndex
, colIndex
, store
, pending
) {
95 if (/^\s*$/.test(order
)) {
96 return gettext('(No boot device selected)');
98 let boot
= PVE
.Parser
.parsePropertyString(order
, "legacy");
100 let list
= boot
.order
.split(';');
103 list
.forEach(dev
=> {
112 // legacy style and fallback
115 var bootdisk
= me
.getObjectValue('bootdisk', undefined, pending
);
116 order
= boot
.legacy
|| 'cdn';
117 for (i
= 0; i
< order
.length
; i
++) {
121 var sel
= order
.substring(i
, i
+ 1);
126 text
+= gettext('(no bootdisk)');
128 } else if (sel
=== 'n') {
129 text
+= gettext('any net');
130 } else if (sel
=== 'a') {
131 text
+= gettext('Floppy');
132 } else if (sel
=== 'd') {
133 text
+= gettext('any CD-ROM');
142 header
: gettext('Use tablet for pointer'),
144 renderer
: Proxmox
.Utils
.format_boolean
,
145 editor
: caps
.vms
['VM.Config.HWType'] ? {
146 xtype
: 'proxmoxWindowEdit',
147 subject
: gettext('Use tablet for pointer'),
149 xtype
: 'proxmoxcheckbox',
154 deleteDefaultValue
: true,
155 fieldLabel
: gettext('Enabled'),
160 header
: gettext('Hotplug'),
161 defaultValue
: 'disk,network,usb',
162 renderer
: PVE
.Utils
.render_hotplug_features
,
163 editor
: caps
.vms
['VM.Config.HWType'] ? {
164 xtype
: 'proxmoxWindowEdit',
165 subject
: gettext('Hotplug'),
167 xtype
: 'pveHotplugFeatureSelector',
171 fieldLabel
: gettext('Hotplug'),
177 header
: gettext('ACPI support'),
179 renderer
: Proxmox
.Utils
.format_boolean
,
180 editor
: caps
.vms
['VM.Config.HWType'] ? {
181 xtype
: 'proxmoxWindowEdit',
182 subject
: gettext('ACPI support'),
184 xtype
: 'proxmoxcheckbox',
189 deleteDefaultValue
: true,
190 fieldLabel
: gettext('Enabled'),
195 header
: gettext('KVM hardware virtualization'),
197 renderer
: Proxmox
.Utils
.format_boolean
,
198 editor
: caps
.vms
['VM.Config.HWType'] ? {
199 xtype
: 'proxmoxWindowEdit',
200 subject
: gettext('KVM hardware virtualization'),
202 xtype
: 'proxmoxcheckbox',
207 deleteDefaultValue
: true,
208 fieldLabel
: gettext('Enabled'),
213 header
: gettext('Freeze CPU at startup'),
215 renderer
: Proxmox
.Utils
.format_boolean
,
216 editor
: caps
.vms
['VM.PowerMgmt'] ? {
217 xtype
: 'proxmoxWindowEdit',
218 subject
: gettext('Freeze CPU at startup'),
220 xtype
: 'proxmoxcheckbox',
224 deleteDefaultValue
: true,
226 fieldLabel
: gettext('Freeze CPU at startup'),
231 header
: gettext('Use local time for RTC'),
232 defaultValue
: '__default__',
233 renderer
: PVE
.Utils
.render_localtime
,
234 editor
: caps
.vms
['VM.Config.Options'] ? {
235 xtype
: 'proxmoxWindowEdit',
236 subject
: gettext('Use local time for RTC'),
239 xtype
: 'proxmoxKVComboBox',
241 value
: '__default__',
243 ['__default__', PVE
.Utils
.render_localtime('__default__')],
244 [1, PVE
.Utils
.render_localtime(1)],
245 [0, PVE
.Utils
.render_localtime(0)],
248 fieldLabel
: gettext('Use local time for RTC'),
253 header
: gettext('RTC start date'),
255 editor
: caps
.vms
['VM.Config.Options'] ? {
256 xtype
: 'proxmoxWindowEdit',
257 subject
: gettext('RTC start date'),
259 xtype
: 'proxmoxtextfield',
263 fieldLabel
: gettext('RTC start date'),
264 vtype
: 'QemuStartDate',
270 header
: gettext('SMBIOS settings (type1)'),
272 renderer
: Ext
.String
.htmlEncode
,
273 editor
: caps
.vms
['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined,
276 header
: 'QEMU Guest Agent',
278 renderer
: PVE
.Utils
.render_qga_features
,
279 editor
: caps
.vms
['VM.Config.Options'] ? {
280 xtype
: 'proxmoxWindowEdit',
281 subject
: gettext('Qemu Agent'),
284 xtype
: 'pveAgentFeatureSelector',
290 header
: gettext('Protection'),
292 renderer
: Proxmox
.Utils
.format_boolean
,
293 editor
: caps
.vms
['VM.Config.Options'] ? {
294 xtype
: 'proxmoxWindowEdit',
295 subject
: gettext('Protection'),
297 xtype
: 'proxmoxcheckbox',
301 deleteDefaultValue
: true,
302 fieldLabel
: gettext('Enabled'),
306 spice_enhancements
: {
307 header
: gettext('Spice Enhancements'),
309 renderer
: PVE
.Utils
.render_spice_enhancements
,
310 editor
: caps
.vms
['VM.Config.Options'] ? {
311 xtype
: 'proxmoxWindowEdit',
312 subject
: gettext('Spice Enhancements'),
313 onlineHelp
: 'qm_spice_enhancements',
315 xtype
: 'pveSpiceEnhancementSelector',
316 name
: 'spice_enhancements',
321 header
: gettext('VM State storage'),
323 renderer
: val
=> val
|| gettext('Automatic'),
324 editor
: caps
.vms
['VM.Config.Options'] ? {
325 xtype
: 'proxmoxWindowEdit',
326 subject
: gettext('VM State storage'),
327 onlineHelp
: 'chapter_virtual_machines', // FIXME: use 'qm_vmstatestorage' once available
330 xtype
: 'pveStorageSelector',
331 storageContent
: 'images',
333 emptyText
: gettext("Automatic (Storage used by the VM, or 'local')"),
338 name
: 'vmstatestorage',
343 header
: gettext('Hookscript'),
347 var baseurl
= 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/config';
349 var edit_btn
= new Ext
.Button({
350 text
: gettext('Edit'),
352 handler: function() { me
.run_editor(); },
355 var revert_btn
= new PVE
.button
.PendingRevert();
357 var set_button_status = function() {
358 var sm
= me
.getSelectionModel();
359 var rec
= sm
.getSelection()[0];
366 var key
= rec
.data
.key
;
367 var pending
= rec
.data
['delete'] || me
.hasPendingChanges(key
);
368 var rowdef
= rows
[key
];
370 edit_btn
.setDisabled(!rowdef
.editor
);
371 revert_btn
.setDisabled(!pending
);
375 url
: "/api2/json/nodes/" + nodename
+ "/qemu/" + vmid
+ "/pending",
378 tbar
: [ edit_btn
, revert_btn
],
381 url
: "/api2/extjs/" + baseurl
,
384 itemdblclick
: me
.run_editor
,
385 selectionchange
: set_button_status
,
391 me
.on('activate', () => me
.rstore
.startUpdate());
392 me
.on('destroy', () => me
.rstore
.stopUpdate());
393 me
.on('deactivate', () => me
.rstore
.stopUpdate());
395 me
.mon(me
.getStore(), 'datachanged', function() {