]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/Resources.js
1 Ext
.define('PVE.lxc.RessourceView', {
2 extend
: 'Proxmox.grid.PendingObjectGrid',
3 alias
: ['widget.pveLxcRessourceView'],
5 onlineHelp
: 'pct_configuration',
7 renderKey: function(key
, metaData
, rec
, rowIndex
, colIndex
, store
) {
9 var rowdef
= me
.rows
[key
] || {};
11 metaData
.tdAttr
= "valign=middle";
13 metaData
.tdCls
= rowdef
.tdCls
;
15 return rowdef
.header
|| key
;
18 initComponent: function() {
22 var nodename
= me
.pveSelNode
.data
.node
;
24 throw "no node name specified";
27 var vmid
= me
.pveSelNode
.data
.vmid
;
29 throw "no VM ID specified";
32 var caps
= Ext
.state
.Manager
.get('GuiCap');
33 var diskCap
= caps
.vms
['VM.Config.Disk'];
35 var mpeditor
= caps
.vms
['VM.Config.Disk'] ? 'PVE.lxc.MountPointEdit' : undefined;
39 header
: gettext('Memory'),
40 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
42 tdCls
: 'pmx-itype-icon-memory',
44 renderer: function(value
) {
45 return Proxmox
.Utils
.format_size(value
*1024*1024);
49 header
: gettext('Swap'),
50 editor
: caps
.vms
['VM.Config.Memory'] ? 'PVE.lxc.MemoryEdit' : undefined,
52 tdCls
: 'pve-itype-icon-swap',
54 renderer: function(value
) {
55 return Proxmox
.Utils
.format_size(value
*1024*1024);
59 header
: gettext('Cores'),
60 editor
: caps
.vms
['VM.Config.CPU'] ? 'PVE.lxc.CPUEdit' : undefined,
62 tdCls
: 'pmx-itype-icon-processor',
64 renderer: function(value
) {
65 var cpulimit
= me
.getObjectValue('cpulimit');
66 var cpuunits
= me
.getObjectValue('cpuunits');
71 res
= gettext('unlimited');
75 res
+= ' [cpulimit=' + cpulimit
+ ']';
79 res
+= ' [cpuunits=' + cpuunits
+ ']';
85 header
: gettext('Root Disk'),
86 defaultValue
: Proxmox
.Utils
.noneText
,
88 tdCls
: 'pve-itype-icon-storage',
102 PVE
.Utils
.forEachMP(function(bus
, i
) {
107 header
= gettext('Mount Point') + ' (' + confid
+ ')';
109 header
= gettext('Unused Disk') + ' ' + i
;
115 tdCls
: 'pve-itype-icon-storage',
121 var baseurl
= 'nodes/' + nodename
+ '/lxc/' + vmid
+ '/config';
123 me
.selModel
= Ext
.create('Ext.selection.RowModel', {});
125 var run_resize = function() {
126 var rec
= me
.selModel
.getSelection()[0];
131 var win
= Ext
.create('PVE.window.MPResize', {
140 var run_remove = function(b
, e
, rec
) {
141 Proxmox
.Utils
.API2Request({
142 url
: '/api2/extjs/' + baseurl
,
146 'delete': rec
.data
.key
,
148 failure: function(response
, opts
) {
149 Ext
.Msg
.alert('Error', response
.htmlStatus
);
154 var run_move = function(b
, e
, rec
) {
159 var win
= Ext
.create('PVE.window.HDMove', {
168 win
.on('destroy', me
.reload
, me
);
171 var edit_btn
= new Proxmox
.button
.Button({
172 text
: gettext('Edit'),
173 selModel
: me
.selModel
,
175 enableFn: function(rec
) {
179 var rowdef
= rows
[rec
.data
.key
];
180 return !!rowdef
.editor
;
182 handler: function() { me
.run_editor(); },
185 var resize_btn
= new Proxmox
.button
.Button({
186 text
: gettext('Resize disk'),
187 selModel
: me
.selModel
,
192 var remove_btn
= new Proxmox
.button
.Button({
193 text
: gettext('Remove'),
194 defaultText
: gettext('Remove'),
195 altText
: gettext('Detach'),
196 selModel
: me
.selModel
,
199 confirmMsg: function(rec
) {
200 let warn
= Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'));
201 if (this.text
=== this.altText
) {
202 warn
= gettext('Are you sure you want to detach entry {0}');
204 let rendered
= me
.renderKey(rec
.data
.key
, {}, rec
);
205 let msg
= Ext
.String
.format(warn
, `'${rendered}'`);
207 if (rec
.data
.key
.match(/^unused\d+$/)) {
208 msg
+= " " + gettext('This will permanently erase all data.');
214 render: function(btn
) {
215 // hack: calculate the max button width on first display to prevent the whole
216 // toolbar to move when we switch between the "Remove" and "Detach" labels
217 let def
= btn
.getSize().width
;
219 btn
.setText(btn
.altText
);
220 let alt
= btn
.getSize().width
;
222 btn
.setText(btn
.defaultText
);
224 let optimal
= alt
> def
? alt
: def
;
225 btn
.setSize({ width
: optimal
});
230 var move_btn
= new Proxmox
.button
.Button({
231 text
: gettext('Move Volume'),
232 selModel
: me
.selModel
,
238 var revert_btn
= new PVE
.button
.PendingRevert();
240 var set_button_status = function() {
241 var rec
= me
.selModel
.getSelection()[0];
245 remove_btn
.disable();
246 resize_btn
.disable();
247 revert_btn
.disable();
250 var key
= rec
.data
.key
;
251 var value
= rec
.data
.value
;
252 var rowdef
= rows
[key
];
254 var pending
= rec
.data
.delete || me
.hasPendingChanges(key
);
255 var isDisk
= rowdef
.tdCls
=== 'pve-itype-icon-storage';
256 var isUnusedDisk
= key
.match(/^unused\d+/);
257 var isUsedDisk
= isDisk
&& !isUnusedDisk
;
259 var noedit
= rec
.data
.delete || !rowdef
.editor
;
260 if (!noedit
&& Proxmox
.UserName
!== 'root@pam' && key
.match(/^mp\d+$/)) {
261 var mp
= PVE
.Parser
.parseLxcMountPoint(value
);
262 if (mp
.type
!== 'volume') {
266 edit_btn
.setDisabled(noedit
);
268 remove_btn
.setDisabled(!isDisk
|| rec
.data
.key
=== 'rootfs' || !diskCap
|| pending
);
269 resize_btn
.setDisabled(!isDisk
|| !diskCap
|| isUnusedDisk
);
270 move_btn
.setDisabled(!isDisk
|| !diskCap
);
271 revert_btn
.setDisabled(!pending
);
273 remove_btn
.setText(isUsedDisk
? remove_btn
.altText
: remove_btn
.defaultText
);
276 var sorterFn = function(rec1
, rec2
) {
277 var v1
= rec1
.data
.key
;
278 var v2
= rec2
.data
.key
;
279 var g1
= rows
[v1
].group
|| 0;
280 var g2
= rows
[v2
].group
|| 0;
281 var order1
= rows
[v1
].order
|| 0;
282 var order2
= rows
[v2
].order
|| 0;
288 if (order1
- order2
!== 0) {
289 return order1
- order2
;
294 } else if (v1
< v2
) {
302 url
: "/api2/json/nodes/" + nodename
+ "/lxc/" + vmid
+ "/pending",
303 selModel
: me
.selModel
,
308 text
: gettext('Add'),
309 menu
: new Ext
.menu
.Menu({
312 text
: gettext('Mount Point'),
313 iconCls
: 'pve-itype-icon-storage',
314 disabled
: !caps
.vms
['VM.Config.Disk'],
315 handler: function() {
316 var win
= Ext
.create('PVE.lxc.MountPointEdit', {
317 url
: '/api2/extjs/' + baseurl
,
318 unprivileged
: me
.getObjectValue('unprivileged'),
319 pveSelNode
: me
.pveSelNode
,
321 win
.on('destroy', me
.reload
, me
);
337 pveSelNode
: me
.pveSelNode
,
338 url
: '/api2/extjs/' + baseurl
,
341 itemdblclick
: me
.run_editor
,
342 selectionchange
: set_button_status
,
348 me
.on('activate', me
.rstore
.startUpdate
);
349 me
.on('destroy', me
.rstore
.stopUpdate
);
350 me
.on('deactivate', me
.rstore
.stopUpdate
);
352 me
.mon(me
.getStore(), 'datachanged', function() {
356 Ext
.apply(me
.editorConfig
, { unprivileged
: me
.getObjectValue('unprivileged') });