]>
git.proxmox.com Git - pve-manager.git/blob - www/manager/qemu/HardwareView.js
4de9cc63aedb2d3048cfadcf1f7a861cd5a4a07c
1 // fixme: howto avoid jslint type confusion?
2 /*jslint confusion: true */
3 Ext
.define('PVE.qemu.HardwareView', {
4 extend
: 'PVE.grid.ObjectGrid',
5 alias
: ['widget.PVE.qemu.HardwareView'],
7 renderKey: function(key
, metaData
, record
, rowIndex
, colIndex
, store
) {
10 var rowdef
= rows
[key
] || {};
13 metaData
.tdCls
= rowdef
.tdCls
;
14 if (rowdef
.tdCls
== 'pve-itype-icon-storage') {
15 if (record
.data
.value
.match(/media=cdrom/)) {
16 metaData
.tdCls
= 'pve-itype-icon-cdrom';
17 return rowdef
.cdheader
;
21 return rowdef
.header
|| key
;
24 initComponent : function() {
28 var nodename
= me
.pveSelNode
.data
.node
;
30 throw "no node name specified";
33 var vmid
= me
.pveSelNode
.data
.vmid
;
35 throw "no VM ID specified";
38 var caps
= Ext
.state
.Manager
.get('GuiCap');
42 header
: gettext('Memory'),
43 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.qemu.MemoryEdit' : undefined,
46 tdCls
: 'pve-itype-icon-memory',
47 renderer: function(value
, metaData
, record
) {
48 var balloon
= me
.getObjectValue('balloon');
50 return PVE
.Utils
.format_size(balloon
*1024*1024) + "/" +
51 PVE
.Utils
.format_size(value
*1024*1024);
54 return PVE
.Utils
.format_size(value
*1024*1024);
58 header
: gettext('Processors'),
60 editor
: (caps
.vms
['VM.Config.CPU'] || caps
.vms
['VM.Config.HWType']) ?
61 'PVE.qemu.ProcessorEdit' : undefined,
62 tdCls
: 'pve-itype-icon-processor',
64 renderer: function(value
, metaData
, record
, rowIndex
, colIndex
, store
) {
65 var model
= me
.getObjectValue('cpu');
66 var cores
= me
.getObjectValue('cores');
68 if (!cores
|| (cores
<= 1)) {
71 res
= (value
*cores
) + ' (' + value
+ ' sockets, ' + cores
+ ' cores)';
74 res
+= ' [' + model
+ ']';
80 header
: gettext('Keyboard Layout'),
82 editor
: caps
.vms
['VM.Config.Options'] ? 'PVE.qemu.KeyboardEdit' : undefined,
83 tdCls
: 'pve-itype-icon-keyboard',
85 renderer
: PVE
.Utils
.render_kvm_language
88 header
: gettext('Display'),
89 editor
: caps
.vms
['VM.Config.HWType'] ? 'PVE.qemu.DisplayEdit' : undefined,
91 tdCls
: 'pve-itype-icon-display',
93 renderer
: PVE
.Utils
.render_kvm_vga_driver
106 for (i
= 0; i
< 4; i
++) {
110 tdCls
: 'pve-itype-icon-storage',
111 editor
: 'PVE.qemu.HDEdit',
112 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
113 header
: gettext('Hard Disk') + ' (' + confid
+')',
114 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
117 for (i
= 0; i
< 6; i
++) {
121 tdCls
: 'pve-itype-icon-storage',
122 editor
: 'PVE.qemu.HDEdit',
123 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
124 header
: gettext('Hard Disk') + ' (' + confid
+')',
125 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
128 for (i
= 0; i
< 16; i
++) {
132 tdCls
: 'pve-itype-icon-storage',
133 editor
: 'PVE.qemu.HDEdit',
134 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
135 header
: gettext('Hard Disk') + ' (' + confid
+')',
136 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
139 for (i
= 0; i
< 16; i
++) {
140 confid
= "virtio" + i
;
143 tdCls
: 'pve-itype-icon-storage',
144 editor
: 'PVE.qemu.HDEdit',
145 never_delete
: caps
.vms
['VM.Config.Disk'] ? false : true,
146 header
: gettext('Hard Disk') + ' (' + confid
+')',
147 cdheader
: gettext('CD/DVD Drive') + ' (' + confid
+')'
150 for (i
= 0; i
< 32; i
++) {
154 tdCls
: 'pve-itype-icon-network',
155 editor
: caps
.vms
['VM.Config.Network'] ? 'PVE.qemu.NetworkEdit' : undefined,
156 never_delete
: caps
.vms
['VM.Config.Network'] ? false : true,
157 header
: gettext('Network Device') + ' (' + confid
+')'
160 for (i
= 0; i
< 8; i
++) {
161 rows
["unused" + i
] = {
163 tdCls
: 'pve-itype-icon-storage',
164 editor
: caps
.vms
['VM.Config.Disk'] ? 'PVE.qemu.HDEdit' : undefined,
165 header
: gettext('Unused Disk') + ' ' + i
169 var sorterFn = function(rec1
, rec2
) {
170 var v1
= rec1
.data
.key
;
171 var v2
= rec2
.data
.key
;
172 var g1
= rows
[v1
].group
|| 0;
173 var g2
= rows
[v2
].group
|| 0;
176 (g1
> g2
? 1 : -1) : (v1
> v2
? 1 : (v1
< v2
? -1 : 0));
179 var reload = function() {
183 var baseurl
= 'nodes/' + nodename
+ '/qemu/' + vmid
+ '/config';
185 var sm
= Ext
.create('Ext.selection.RowModel', {});
187 var run_editor = function() {
188 var rec
= sm
.getSelection()[0];
193 var rowdef
= rows
[rec
.data
.key
];
194 if (!rowdef
.editor
) {
198 var editor
= rowdef
.editor
;
199 if (rowdef
.tdCls
== 'pve-itype-icon-storage') {
200 if (rec
.data
.value
.match(/media=cdrom/)) {
201 editor
= 'PVE.qemu.CDEdit';
205 var win
= Ext
.create(editor
, {
206 pveSelNode
: me
.pveSelNode
,
207 confid
: rec
.data
.key
,
208 url
: '/api2/extjs/' + baseurl
212 win
.on('destroy', reload
);
215 var run_resize = function() {
216 var rec
= sm
.getSelection()[0];
221 var rowdef
= rows
[rec
.data
.key
];
222 if (!rowdef
.editor
) {
226 var win
= Ext
.create('PVE.window.HDResize', {
234 win
.on('destroy', reload
);
237 var run_move = function() {
238 var rec
= sm
.getSelection()[0];
243 var rowdef
= rows
[rec
.data
.key
];
244 if (!rowdef
.editor
) {
248 var win
= Ext
.create('PVE.window.HDMove', {
256 win
.on('destroy', reload
);
259 var edit_btn
= new PVE
.button
.Button({
260 text
: gettext('Edit'),
263 enableFn: function(rec
) {
267 var rowdef
= rows
[rec
.data
.key
];
268 return !!rowdef
.editor
;
273 var resize_btn
= new PVE
.button
.Button({
274 text
: gettext('Resize disk'),
277 enableFn: function(rec
) {
281 var rowdef
= rows
[rec
.data
.key
];
282 return rowdef
.tdCls
== 'pve-itype-icon-storage' && !rec
.data
.value
.match(/media=cdrom/);
288 var move_btn
= new PVE
.button
.Button({
289 text
: gettext('Move disk'),
292 enableFn: function(rec
) {
293 if (!rec
|| rec
.data
.key
.match(/^unused\d+/)) {
296 var rowdef
= rows
[rec
.data
.key
];
297 return rowdef
.tdCls
== 'pve-itype-icon-storage' && !rec
.data
.value
.match(/media=cdrom/)
302 var remove_btn
= new PVE
.button
.Button({
303 text
: gettext('Remove'),
307 confirmMsg: function(rec
) {
308 var msg
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
309 "'" + me
.renderKey(rec
.data
.key
, {}, rec
) + "'");
310 if (rec
.data
.key
.match(/^unused\d+$/)) {
311 msg
+= " " + gettext('This will permanently erase all image data.');
316 enableFn: function(rec
) {
320 var rowdef
= rows
[rec
.data
.key
];
322 return rowdef
.never_delete
!== true;
324 handler: function(b
, e
, rec
) {
325 PVE
.Utils
.API2Request({
326 url
: '/api2/extjs/' + baseurl
,
330 'delete': rec
.data
.key
332 callback: function() {
335 failure: function (response
, opts
) {
336 Ext
.Msg
.alert('Error',response
.htmlStatus
);
343 url
: '/api2/json/' + baseurl
,
348 text
: gettext('Add'),
349 menu
: new Ext
.menu
.Menu({
352 text
: gettext('Hard Disk'),
353 iconCls
: 'pve-itype-icon-storage',
354 disabled
: !caps
.vms
['VM.Config.Disk'],
355 handler: function() {
356 var win
= Ext
.create('PVE.qemu.HDEdit', {
357 url
: '/api2/extjs/' + baseurl
,
358 pveSelNode
: me
.pveSelNode
360 win
.on('destroy', reload
);
365 text
: gettext('CD/DVD Drive'),
366 iconCls
: 'pve-itype-icon-cdrom',
367 disabled
: !caps
.vms
['VM.Config.Disk'],
368 handler: function() {
369 var win
= Ext
.create('PVE.qemu.CDEdit', {
370 url
: '/api2/extjs/' + baseurl
,
371 pveSelNode
: me
.pveSelNode
373 win
.on('destroy', reload
);
378 text
: gettext('Network Device'),
379 iconCls
: 'pve-itype-icon-network',
380 disabled
: !caps
.vms
['VM.Config.Network'],
381 handler: function() {
382 var win
= Ext
.create('PVE.qemu.NetworkEdit', {
383 url
: '/api2/extjs/' + baseurl
,
384 pveSelNode
: me
.pveSelNode
386 win
.on('destroy', reload
);
402 itemdblclick
: run_editor