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