]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/qemu/Options.js
use windowEdit from widget toolkit
[pve-manager.git] / www / manager6 / qemu / Options.js
CommitLineData
7d44036a
DM
1/*jslint confusion: true */
2Ext.define('PVE.qemu.Options', {
bc0eaf58 3 extend: 'Proxmox.grid.PendingObjectGrid',
7d44036a
DM
4 alias: ['widget.PVE.qemu.Options'],
5
ba93a9c6
DC
6 onlineHelp: 'qm_options',
7
7d44036a
DM
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'] ? {
9fccc702 30 xtype: 'proxmoxWindowEdit',
7d44036a
DM
31 subject: gettext('Name'),
32 items: {
3335a948
DC
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 }
7d44036a
DM
51 }
52 } : undefined
53 },
54 onboot: {
55 header: gettext('Start at boot'),
56 defaultValue: '',
e7ade592 57 renderer: Proxmox.Utils.format_boolean,
7d44036a 58 editor: caps.vms['VM.Config.Options'] ? {
9fccc702 59 xtype: 'proxmoxWindowEdit',
7d44036a
DM
60 subject: gettext('Start at boot'),
61 items: {
896c0d50 62 xtype: 'proxmoxcheckbox',
7d44036a
DM
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,
998922c3 75 editor: caps.vms['VM.Config.Options'] && caps.nodes['Sys.Modify'] ?
a255dd7e
EK
76 {
77 xtype: 'pveWindowStartupEdit',
78 onlineHelp: 'qm_startup_and_shutdown'
79 } : undefined
7d44036a
DM
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: {
ec99b1c3 91 header: gettext('Boot Order'),
7d44036a
DM
92 defaultValue: 'cdn',
93 editor: caps.vms['VM.Config.Disk'] ? 'PVE.qemu.BootOrderEdit' : undefined,
16c162ec 94 multiKey: ['boot', 'bootdisk'],
7d44036a
DM
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,
e7ade592 127 renderer: Proxmox.Utils.format_boolean,
7d44036a 128 editor: caps.vms['VM.Config.HWType'] ? {
9fccc702 129 xtype: 'proxmoxWindowEdit',
7d44036a
DM
130 subject: gettext('Use tablet for pointer'),
131 items: {
896c0d50 132 xtype: 'proxmoxcheckbox',
7d44036a
DM
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'] ? {
9fccc702 147 xtype: 'proxmoxWindowEdit',
7d44036a
DM
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,
e7ade592 162 renderer: Proxmox.Utils.format_boolean,
7d44036a 163 editor: caps.vms['VM.Config.HWType'] ? {
9fccc702 164 xtype: 'proxmoxWindowEdit',
7d44036a
DM
165 subject: gettext('ACPI support'),
166 items: {
896c0d50 167 xtype: 'proxmoxcheckbox',
7d44036a
DM
168 name: 'acpi',
169 checked: true,
170 uncheckedValue: 0,
171 defaultValue: 1,
172 deleteDefaultValue: true,
173 fieldLabel: gettext('Enabled')
174 }
175 } : undefined
176 },
177 scsihw: {
42bd6556 178 header: gettext('SCSI Controller'),
7d44036a
DM
179 editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.ScsiHwEdit' : undefined,
180 renderer: PVE.Utils.render_scsihw,
181 defaultValue: ''
182 },
183 bios: {
184 header: 'BIOS',
185 editor: caps.vms['VM.Config.Options'] ? 'PVE.qemu.BiosEdit' : undefined,
186 renderer: PVE.Utils.render_qemu_bios,
187 defaultValue: ''
188 },
189 kvm: {
190 header: gettext('KVM hardware virtualization'),
191 defaultValue: true,
e7ade592 192 renderer: Proxmox.Utils.format_boolean,
7d44036a 193 editor: caps.vms['VM.Config.HWType'] ? {
9fccc702 194 xtype: 'proxmoxWindowEdit',
7d44036a
DM
195 subject: gettext('KVM hardware virtualization'),
196 items: {
896c0d50 197 xtype: 'proxmoxcheckbox',
7d44036a
DM
198 name: 'kvm',
199 checked: true,
200 uncheckedValue: 0,
201 defaultValue: 1,
202 deleteDefaultValue: true,
203 fieldLabel: gettext('Enabled')
204 }
205 } : undefined
206 },
207 freeze: {
208 header: gettext('Freeze CPU at startup'),
209 defaultValue: false,
e7ade592 210 renderer: Proxmox.Utils.format_boolean,
7d44036a 211 editor: caps.vms['VM.PowerMgmt'] ? {
9fccc702 212 xtype: 'proxmoxWindowEdit',
7d44036a
DM
213 subject: gettext('Freeze CPU at startup'),
214 items: {
896c0d50 215 xtype: 'proxmoxcheckbox',
7d44036a
DM
216 name: 'freeze',
217 uncheckedValue: 0,
218 defaultValue: 0,
219 deleteDefaultValue: true,
220 labelWidth: 140,
221 fieldLabel: gettext('Freeze CPU at startup')
222 }
223 } : undefined
224 },
225 localtime: {
226 header: gettext('Use local time for RTC'),
227 defaultValue: false,
e7ade592 228 renderer: Proxmox.Utils.format_boolean,
7d44036a 229 editor: caps.vms['VM.Config.Options'] ? {
9fccc702 230 xtype: 'proxmoxWindowEdit',
7d44036a
DM
231 subject: gettext('Use local time for RTC'),
232 items: {
896c0d50 233 xtype: 'proxmoxcheckbox',
7d44036a
DM
234 name: 'localtime',
235 uncheckedValue: 0,
236 defaultValue: 0,
237 deleteDefaultValue: true,
238 labelWidth: 140,
239 fieldLabel: gettext('Use local time for RTC')
240 }
241 } : undefined
242 },
243 startdate: {
244 header: gettext('RTC start date'),
245 defaultValue: 'now',
246 editor: caps.vms['VM.Config.Options'] ? {
9fccc702 247 xtype: 'proxmoxWindowEdit',
7d44036a
DM
248 subject: gettext('RTC start date'),
249 items: {
dbed4c1c 250 xtype: 'proxmoxtextfield',
7d44036a
DM
251 name: 'startdate',
252 deleteEmpty: true,
253 value: 'now',
254 fieldLabel: gettext('RTC start date'),
255 vtype: 'QemuStartDate',
256 allowBlank: true
257 }
258 } : undefined
259 },
260 smbios1: {
261 header: gettext('SMBIOS settings (type1)'),
262 defaultValue: '',
263 renderer: Ext.String.htmlEncode,
264 editor: caps.vms['VM.Config.HWType'] ? 'PVE.qemu.Smbios1Edit' : undefined
265 },
266 agent: {
267 header: gettext('Qemu Agent'),
268 defaultValue: false,
e7ade592 269 renderer: Proxmox.Utils.format_boolean,
7d44036a 270 editor: caps.vms['VM.Config.Options'] ? {
9fccc702 271 xtype: 'proxmoxWindowEdit',
7d44036a
DM
272 subject: gettext('Qemu Agent'),
273 items: {
896c0d50 274 xtype: 'proxmoxcheckbox',
7d44036a
DM
275 name: 'agent',
276 uncheckedValue: 0,
277 defaultValue: 0,
278 deleteDefaultValue: true,
279 fieldLabel: gettext('Enabled')
280 }
281 } : undefined
282 },
283 protection: {
16152937 284 header: gettext('Protection'),
7d44036a 285 defaultValue: false,
e7ade592 286 renderer: Proxmox.Utils.format_boolean,
7d44036a 287 editor: caps.vms['VM.Config.Options'] ? {
9fccc702 288 xtype: 'proxmoxWindowEdit',
16152937 289 subject: gettext('Protection'),
7d44036a 290 items: {
896c0d50 291 xtype: 'proxmoxcheckbox',
7d44036a
DM
292 name: 'protection',
293 uncheckedValue: 0,
294 defaultValue: 0,
295 deleteDefaultValue: true,
296 fieldLabel: gettext('Enabled')
297 }
298 } : undefined
299 }
300 };
301
302 var baseurl = 'nodes/' + nodename + '/qemu/' + vmid + '/config';
303
7d44036a
DM
304 var edit_btn = new Ext.Button({
305 text: gettext('Edit'),
306 disabled: true,
998922c3 307 handler: me.run_editor
7d44036a
DM
308 });
309
5720fafa 310 var revert_btn = new Proxmox.button.Button({
7d44036a
DM
311 text: gettext('Revert'),
312 disabled: true,
313 handler: function() {
314 var sm = me.getSelectionModel();
315 var rec = sm.getSelection()[0];
316 if (!rec) {
317 return;
318 }
319
16c162ec
DC
320 var rowdef = me.rows[rec.data.key] || {};
321 var keys = rowdef.multiKey || [ rec.data.key ];
322 var revert = keys.join(',');
323
e7ade592 324 Proxmox.Utils.API2Request({
7d44036a
DM
325 url: '/api2/extjs/' + baseurl,
326 waitMsgTarget: me,
327 method: 'PUT',
328 params: {
16c162ec 329 'revert': revert
7d44036a
DM
330 },
331 callback: function() {
998922c3 332 me.reload();
7d44036a
DM
333 },
334 failure: function (response, opts) {
335 Ext.Msg.alert('Error',response.htmlStatus);
336 }
337 });
338 }
339 });
340
341 var set_button_status = function() {
342 var sm = me.getSelectionModel();
343 var rec = sm.getSelection()[0];
344
345 if (!rec) {
346 edit_btn.disable();
347 return;
348 }
349
350 var key = rec.data.key;
351 var pending = rec.data['delete'] || me.hasPendingChanges(key);
352 var rowdef = rows[key];
353
354 edit_btn.setDisabled(!rowdef.editor);
355 revert_btn.setDisabled(!pending);
356 };
357
a26cb711 358 Ext.apply(me, {
7d44036a
DM
359 url: "/api2/json/nodes/" + nodename + "/qemu/" + vmid + "/pending",
360 interval: 5000,
3c813f74 361 cwidth1: 250,
7d44036a
DM
362 tbar: [ edit_btn, revert_btn ],
363 rows: rows,
998922c3
TL
364 editorConfig: {
365 url: "/api2/extjs/" + baseurl
366 },
7d44036a 367 listeners: {
998922c3 368 itemdblclick: me.run_editor,
7d44036a
DM
369 selectionchange: set_button_status
370 }
371 });
372
373 me.callParent();
374
a26cb711 375 me.on('activate', me.rstore.startUpdate);
998922c3
TL
376 me.on('destroy', me.rstore.stopUpdate);
377 me.on('deactivate', me.rstore.stopUpdate);
7d44036a
DM
378
379 me.rstore.on('datachanged', function() {
380 set_button_status();
381 });
382 }
383});
384