]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/qemu/Options.js
followup: avoid a doc-gen bump, use general QM chapter as onlineHelp
[pve-manager.git] / www / manager6 / qemu / Options.js
1 /*jslint confusion: true */
2 Ext.define('PVE.qemu.Options', {
3 extend: 'Proxmox.grid.PendingObjectGrid',
4 alias: ['widget.PVE.qemu.Options'],
5
6 onlineHelp: 'qm_options',
7
8 initComponent : function() {
9 var me = this;
10 var i;
11
12 var nodename = me.pveSelNode.data.node;
13 if (!nodename) {
14 throw "no node name specified";
15 }
16
17 var vmid = me.pveSelNode.data.vmid;
18 if (!vmid) {
19 throw "no VM ID specified";
20 }
21
22 var caps = Ext.state.Manager.get('GuiCap');
23
24 var rows = {
25 name: {
26 required: true,
27 defaultValue: me.pveSelNode.data.name,
28 header: gettext('Name'),
29 editor: caps.vms['VM.Config.Options'] ? {
30 xtype: 'proxmoxWindowEdit',
31 subject: gettext('Name'),
32 items: {
33 xtype: 'inputpanel',
34 items:{
35 xtype: 'textfield',
36 name: 'name',
37 vtype: 'DnsName',
38 value: '',
39 fieldLabel: gettext('Name'),
40 allowBlank: true
41 },
42 onGetValues: function(values) {
43 var params = values;
44 if (values.name === undefined ||
45 values.name === null ||
46 values.name === '') {
47 params = { 'delete':'name'};
48 }
49 return params;
50 }
51 }
52 } : undefined
53 },
54 onboot: {
55 header: gettext('Start at boot'),
56 defaultValue: '',
57 renderer: Proxmox.Utils.format_boolean,
58 editor: caps.vms['VM.Config.Options'] ? {
59 xtype: 'proxmoxWindowEdit',
60 subject: gettext('Start at boot'),
61 items: {
62 xtype: 'proxmoxcheckbox',
63 name: 'onboot',
64 uncheckedValue: 0,
65 defaultValue: 0,
66 deleteDefaultValue: true,
67 fieldLabel: gettext('Start at boot')
68 }
69 } : undefined
70 },
71 startup: {
72 header: gettext('Start/Shutdown order'),
73 defaultValue: '',
74 renderer: PVE.Utils.render_kvm_startup,
75 editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] ?
76 {
77 xtype: 'pveWindowStartupEdit',
78 onlineHelp: 'qm_startup_and_shutdown'
79 } : undefined
80 },
81 ostype: {
82 header: gettext('OS Type'),
83 editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.OSTypeEdit' : undefined,
84 renderer: PVE.Utils.render_kvm_ostype,
85 defaultValue: 'other'
86 },
87 bootdisk: {
88 visible: false
89 },
90 boot: {
91 header: gettext('Boot Order'),
92 defaultValue: 'cdn',
93 editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
94 multiKey: ['boot', 'bootdisk'],
95 renderer: function(order, metaData, record, rowIndex, colIndex, store, pending) {
96 var i;
97 var text = '';
98 var bootdisk = me.getObjectValue('bootdisk', undefined, pending);
99 order = order || 'cdn';
100 for (i = 0; i < order.length; i++) {
101 var sel = order.substring(i, i + 1);
102 if (text) {
103 text += ', ';
104 }
105 if (sel === 'c') {
106 if (bootdisk) {
107 text += "Disk '" + bootdisk + "'";
108 } else {
109 text += "Disk";
110 }
111 } else if (sel === 'n') {
112 text += 'Network';
113 } else if (sel === 'a') {
114 text += 'Floppy';
115 } else if (sel === 'd') {
116 text += 'CD-ROM';
117 } else {
118 text += sel;
119 }
120 }
121 return text;
122 }
123 },
124 tablet: {
125 header: gettext('Use tablet for pointer'),
126 defaultValue: true,
127 renderer: Proxmox.Utils.format_boolean,
128 editor: caps.vms['VM.Config.HWType'] ? {
129 xtype: 'proxmoxWindowEdit',
130 subject: gettext('Use tablet for pointer'),
131 items: {
132 xtype: 'proxmoxcheckbox',
133 name: 'tablet',
134 checked: true,
135 uncheckedValue: 0,
136 defaultValue: 1,
137 deleteDefaultValue: true,
138 fieldLabel: gettext('Enabled')
139 }
140 } : undefined
141 },
142 hotplug: {
143 header: gettext('Hotplug'),
144 defaultValue: 'disk,network,usb',
145 renderer: PVE.Utils.render_hotplug_features,
146 editor: caps.vms['VM.Config.HWType'] ? {
147 xtype: 'proxmoxWindowEdit',
148 subject: gettext('Hotplug'),
149 items: {
150 xtype: 'pveHotplugFeatureSelector',
151 name: 'hotplug',
152 value: '',
153 multiSelect: true,
154 fieldLabel: gettext('Hotplug'),
155 allowBlank: true
156 }
157 } : undefined
158 },
159 acpi: {
160 header: gettext('ACPI support'),
161 defaultValue: true,
162 renderer: Proxmox.Utils.format_boolean,
163 editor: caps.vms['VM.Config.HWType'] ? {
164 xtype: 'proxmoxWindowEdit',
165 subject: gettext('ACPI support'),
166 items: {
167 xtype: 'proxmoxcheckbox',
168 name: 'acpi',
169 checked: true,
170 uncheckedValue: 0,
171 defaultValue: 1,
172 deleteDefaultValue: true,
173 fieldLabel: gettext('Enabled')
174 }
175 } : undefined
176 },
177 kvm: {
178 header: gettext('KVM hardware virtualization'),
179 defaultValue: true,
180 renderer: Proxmox.Utils.format_boolean,
181 editor: caps.vms['VM.Config.HWType'] ? {
182 xtype: 'proxmoxWindowEdit',
183 subject: gettext('KVM hardware virtualization'),
184 items: {
185 xtype: 'proxmoxcheckbox',
186 name: 'kvm',
187 checked: true,
188 uncheckedValue: 0,
189 defaultValue: 1,
190 deleteDefaultValue: true,
191 fieldLabel: gettext('Enabled')
192 }
193 } : undefined
194 },
195 freeze: {
196 header: gettext('Freeze CPU at startup'),
197 defaultValue: false,
198 renderer: Proxmox.Utils.format_boolean,
199 editor: caps.vms['VM.PowerMgmt'] ? {
200 xtype: 'proxmoxWindowEdit',
201 subject: gettext('Freeze CPU at startup'),
202 items: {
203 xtype: 'proxmoxcheckbox',
204 name: 'freeze',
205 uncheckedValue: 0,
206 defaultValue: 0,
207 deleteDefaultValue: true,
208 labelWidth: 140,
209 fieldLabel: gettext('Freeze CPU at startup')
210 }
211 } : undefined
212 },
213 localtime: {
214 header: gettext('Use local time for RTC'),
215 defaultValue: false,
216 renderer: Proxmox.Utils.format_boolean,
217 editor: caps.vms['VM.Config.Options'] ? {
218 xtype: 'proxmoxWindowEdit',
219 subject: gettext('Use local time for RTC'),
220 items: {
221 xtype: 'proxmoxcheckbox',
222 name: 'localtime',
223 uncheckedValue: 0,
224 defaultValue: 0,
225 deleteDefaultValue: true,
226 labelWidth: 140,
227 fieldLabel: gettext('Use local time for RTC')
228 }
229 } : undefined
230 },
231 startdate: {
232 header: gettext('RTC start date'),
233 defaultValue: 'now',
234 editor: caps.vms['VM.Config.Options'] ? {
235 xtype: 'proxmoxWindowEdit',
236 subject: gettext('RTC start date'),
237 items: {
238 xtype: 'proxmoxtextfield',
239 name: 'startdate',
240 deleteEmpty: true,
241 value: 'now',
242 fieldLabel: gettext('RTC start date'),
243 vtype: 'QemuStartDate',
244 allowBlank: true
245 }
246 } : undefined
247 },
248 smbios1: {
249 header: gettext('SMBIOS settings (type1)'),
250 defaultValue: '',
251 renderer: Ext.String.htmlEncode,
252 editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined
253 },
254 agent: {
255 header: 'QEMU Guest Agent',
256 defaultValue: false,
257 renderer: PVE.Utils.render_qga_features,
258 editor: caps.vms['VM.Config.Options'] ? {
259 xtype: 'proxmoxWindowEdit',
260 subject: gettext('Qemu Agent'),
261 width: 350,
262 items: {
263 xtype: 'pveAgentFeatureSelector',
264 name: 'agent'
265 }
266 } : undefined
267 },
268 protection: {
269 header: gettext('Protection'),
270 defaultValue: false,
271 renderer: Proxmox.Utils.format_boolean,
272 editor: caps.vms['VM.Config.Options'] ? {
273 xtype: 'proxmoxWindowEdit',
274 subject: gettext('Protection'),
275 items: {
276 xtype: 'proxmoxcheckbox',
277 name: 'protection',
278 uncheckedValue: 0,
279 defaultValue: 0,
280 deleteDefaultValue: true,
281 fieldLabel: gettext('Enabled')
282 }
283 } : undefined
284 },
285 spice_enhancements: {
286 header: gettext('Spice Enhancements'),
287 defaultValue: false,
288 renderer: PVE.Utils.render_spice_enhancements,
289 editor: caps.vms['VM.Config.Options'] ? {
290 xtype: 'proxmoxWindowEdit',
291 subject: gettext('Spice Enhancements'),
292 onlineHelp: 'qm_spice_enhancements',
293 items: {
294 xtype: 'pveSpiceEnhancementSelector',
295 name: 'spice_enhancements',
296 }
297 } : undefined
298 },
299 vmstatestorage: {
300 header: gettext('VM State storage'),
301 defaultValue: '',
302 renderer: val => val || gettext('Automatic'),
303 editor: caps.vms['VM.Config.Options'] ? {
304 xtype: 'proxmoxWindowEdit',
305 subject: gettext('VM State storage'),
306 onlineHelp: 'chapter_virtual_machines', // FIXME: use 'qm_vmstatestorage' once available
307 items: {
308 xtype: 'pveStorageSelector',
309 storageContent: 'images',
310 allowBlank: true,
311 emptyText: gettext('Automatic'),
312 autoSelect: false,
313 deleteEmpty: true,
314 skipEmptyText: true,
315 nodename: nodename,
316 name: 'vmstatestorage',
317 }
318 } : undefined
319 },
320 hookscript: {
321 header: gettext('Hookscript')
322 }
323 };
324
325 var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config';
326
327 var edit_btn = new Ext.Button({
328 text: gettext('Edit'),
329 disabled: true,
330 handler: function() { me.run_editor(); }
331 });
332
333 var revert_btn = new PVE.button.PendingRevert();
334
335 var set_button_status = function() {
336 var sm = me.getSelectionModel();
337 var rec = sm.getSelection()[0];
338
339 if (!rec) {
340 edit_btn.disable();
341 return;
342 }
343
344 var key = rec.data.key;
345 var pending = rec.data['delete'] || me.hasPendingChanges(key);
346 var rowdef = rows[key];
347
348 edit_btn.setDisabled(!rowdef.editor);
349 revert_btn.setDisabled(!pending);
350 };
351
352 Ext.apply(me, {
353 url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending",
354 interval: 5000,
355 cwidth1: 250,
356 tbar: [ edit_btn, revert_btn ],
357 rows: rows,
358 editorConfig: {
359 url: "/api2/extjs/" + baseurl
360 },
361 listeners: {
362 itemdblclick: me.run_editor,
363 selectionchange: set_button_status
364 }
365 });
366
367 me.callParent();
368
369 me.on('activate', me.rstore.startUpdate);
370 me.on('destroy', me.rstore.stopUpdate);
371 me.on('deactivate', me.rstore.stopUpdate);
372
373 me.mon(me.getStore(), 'datachanged', function() {
374 set_button_status();
375 });
376 }
377 });
378