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