]>
git.proxmox.com Git - pve-manager.git/blob - www/manager/Utils.js
3 // avoid errors when running without development tools
4 if (! Ext
. isDefined ( Ext
. global
. console
)) {
10 console
. log ( "Starting PVE Manager" );
12 Ext
. Ajax
. defaultHeaders
= {
13 'Accept' : 'application/json'
16 // do not send '_dc' parameter
17 Ext
. Ajax
. disableCaching
= false ;
19 Ext
. Ajax
. on ( 'beforerequest' , function ( conn
, options
) {
20 if ( PVE
. CSRFPreventionToken
) {
21 if (! options
. headers
) {
24 options
. headers
. CSRFPreventionToken
= PVE
. CSRFPreventionToken
;
29 Ext
. apply ( Ext
. form
. field
. VTypes
, {
30 IPAddress : function ( v
) {
31 return ( /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ ). test ( v
);
33 IPAddressText
: gettext ( 'Example' ) + ': 192.168.1.1' ,
34 IPAddressMask
: /[\d\.]/i ,
36 MacAddress : function ( v
) {
37 return ( /^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/ ). test ( v
);
39 MacAddressMask
: /[a-fA-F0-9:]/ ,
40 MacAddressText
: gettext ( 'Example' ) + ': 01:23:45:67:89:ab' ,
42 BridgeName : function ( v
) {
43 return ( /^vmbr\d{1,4}$/ ). test ( v
);
45 BridgeNameText
: gettext ( 'Format' ) + ': vmbr<b>N</b>, where 0 <= <b>N</b> <= 9999' ,
47 BondName : function ( v
) {
48 return ( /^bond\d{1,4}$/ ). test ( v
);
50 BondNameText
: gettext ( 'Format' ) + ': bond<b>N</b>, where 0 <= <b>N</b> <= 9999' ,
52 QemuStartDate : function ( v
) {
53 return ( /^(now|\d{4}-\d{1,2}-\d{1,2}(T\d{1,2}:\d{1,2}:\d{1,2})?)$/ ). test ( v
);
55 QemuStartDateText
: gettext ( 'Format' ) + ': "now" or "2006-06-17T16:01:21" or "2006-06-17"' ,
57 StorageId : function ( v
) {
58 return ( /^[a-z][a-z0-9\-\_\.]*[a-z0-9]$/i ). test ( v
);
60 StorageIdText
: gettext ( "Allowed characters" ) + ": 'a-z', '0-9', '-', '_', '.'" ,
62 HttpProxy : function ( v
) {
63 return ( /^http:\/\/.*$/ ). test ( v
);
65 HttpProxyText
: gettext ( 'Example' ) + ": http://username:password@host:port/" ,
67 DnsName : function ( v
) {
68 return ( /^(([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?)\.)*([A-Za-z0-9]([A-Za-z0-9\-]*[A-Za-z0-9])?)$/ ). test ( v
);
70 DnsNameText
: gettext ( 'This is not a valid DNS name' )
73 // we dont want that a displayfield set the form dirty flag!
74 Ext
. override ( Ext
. form
. field
. Display
, {
75 isDirty : function () { return false ; }
78 // hack: ExtJS does not display the correct value if we
79 // call setValue while the store is loading, so we need
80 // to call it again after loading
81 Ext
. override ( Ext
. form
. field
. ComboBox
, {
83 this . setValue ( this . value
, false );
84 this . callOverridden ( arguments
);
88 Ext
. define ( 'PVE.Utils' , { statics
: {
90 // this class only contains static functions
103 support_level_hash
: {
104 'c' : gettext ( 'Community' ),
105 'b' : gettext ( 'Basic' ),
106 's' : gettext ( 'Standard' ),
107 'p' : gettext ( 'Premium' )
110 noSubKeyHtml
: 'You do not have a valid subscription for this server. Please visit <a target="_blank" href="http://www.proxmox.com/products/proxmox-ve/subscription-service-plans">www.proxmox.com</a> to get a list of available options.' ,
113 other
: gettext ( 'Other OS types' ),
114 wxp
: 'Microsoft Windows XP/2003' ,
115 w2k
: 'Microsoft Windows 2000' ,
116 w2k8
: 'Microsoft Windows Vista/2008' ,
117 win7
: 'Microsoft Windows 7/2008r2' ,
118 win8
: 'Microsoft Windows 8/2012' ,
119 l24
: 'Linux 2.4 Kernel' ,
120 l26
: 'Linux 3.X/2.6 Kernel' ,
121 solaris
: 'Solaris Kernel'
124 render_kvm_ostype : function ( value
) {
126 return gettext ( 'Other OS types' );
128 var text
= PVE
. Utils
. kvm_ostypes
[ value
];
130 return text
+ ' (' + value
+ ')' ;
135 render_scsihw : function ( value
) {
137 return PVE
. Utils
. defaultText
+ ' (lsi)' ;
138 } else if ( value
=== 'lsi' ) {
139 return 'LSI 53C895A' ;
140 } else if ( value
=== 'megasas' ) {
141 return 'MegaRAID SAS 8708EM2' ;
142 } else if ( value
=== 'virtio-scsi-pci' ) {
149 // fixme: auto-generate this
150 // for now, please keep in sync with PVE::Tools::kvmkeymaps
155 'de-ch' : 'German (Swiss)' ,
156 'en-gb' : 'English (UK)' ,
157 'en-us' : 'English (USA' ,
161 //fo: 'Faroe Islands',
163 'fr-be' : 'French (Belgium)' ,
164 'fr-ca' : 'French (Canada)' ,
165 'fr-ch' : 'French (Swiss)' ,
175 //'nl-be': 'Dutch (Belgium)',
179 'pt-br' : 'Portuguese (Brazil)' ,
188 std
: gettext ( 'Standard VGA' ),
189 vmware
: gettext ( 'VMWare compatible' ),
190 cirrus
: 'Cirrus Logic GD5446' ,
192 serial0
: gettext ( 'Serial terminal' ) + ' 0' ,
193 serial1
: gettext ( 'Serial terminal' ) + ' 1' ,
194 serial2
: gettext ( 'Serial terminal' ) + ' 2' ,
195 serial3
: gettext ( 'Serial terminal' ) + ' 3'
198 render_kvm_language : function ( value
) {
200 return PVE
. Utils
. defaultText
;
202 var text
= PVE
. Utils
. kvm_keymaps
[ value
];
204 return text
+ ' (' + value
+ ')' ;
209 kvm_keymap_array : function () {
210 var data
= [[ '' , PVE
. Utils
. render_kvm_language ( '' )]];
211 Ext
. Object
. each ( PVE
. Utils
. kvm_keymaps
, function ( key
, value
) {
212 data
. push ([ key
, PVE
. Utils
. render_kvm_language ( value
)]);
228 nb
: 'Norwegian (Bokmal)' ,
229 nn
: 'Norwegian (Nynorsk)' ,
234 pt_BR
: 'Portuguese (Brazil)' ,
238 render_language : function ( value
) {
240 return PVE
. Utils
. defaultText
+ ' (English)' ;
242 var text
= PVE
. Utils
. language_map
[ value
];
244 return text
+ ' (' + value
+ ')' ;
249 language_array : function () {
250 var data
= [[ '' , PVE
. Utils
. render_language ( '' )]];
251 Ext
. Object
. each ( PVE
. Utils
. language_map
, function ( key
, value
) {
252 data
. push ([ key
, PVE
. Utils
. render_language ( value
)]);
258 render_kvm_vga_driver : function ( value
) {
260 return PVE
. Utils
. defaultText
;
262 var text
= PVE
. Utils
. kvm_vga_drivers
[ value
];
264 return text
+ ' (' + value
+ ')' ;
269 kvm_vga_driver_array : function () {
270 var data
= [[ '' , PVE
. Utils
. render_kvm_vga_driver ( '' )]];
271 Ext
. Object
. each ( PVE
. Utils
. kvm_vga_drivers
, function ( key
, value
) {
272 data
. push ([ key
, PVE
. Utils
. render_kvm_vga_driver ( value
)]);
278 render_kvm_startup : function ( value
) {
279 var startup
= PVE
. Parser
. parseStartup ( value
);
282 if ( startup
. order
=== undefined ) {
285 res
+= startup
. order
;
287 if ( startup
. up
!== undefined ) {
288 res
+= ',up=' + startup
. up
;
290 if ( startup
. down
!== undefined ) {
291 res
+= ',down=' + startup
. down
;
298 return Ext
. util
. Cookies
. get ( 'PVEAuthCookie' );
301 authClear : function () {
302 Ext
. util
. Cookies
. clear ( "PVEAuthCookie" );
305 // fixme: remove - not needed?
306 gridLineHeigh : function () {
314 extractRequestError : function ( result
, verbose
) {
315 var msg
= gettext ( 'Successful' );
317 if (! result
. success
) {
318 msg
= gettext ( "Unknown error" );
319 if ( result
. message
) {
320 msg
= result
. message
;
322 msg
+= ' (' + result
. status
+ ')' ;
325 if ( verbose
&& Ext
. isObject ( result
. errors
)) {
327 Ext
. Object
. each ( result
. errors
, function ( prop
, desc
) {
328 msg
+= "<br><b>" + Ext
. htmlEncode ( prop
) + "</b>: " +
329 Ext
. htmlEncode ( desc
);
337 extractFormActionError : function ( action
) {
339 switch ( action
. failureType
) {
340 case Ext
. form
. action
. Action
. CLIENT_INVALID
:
341 msg
= gettext ( 'Form fields may not be submitted with invalid values' );
343 case Ext
. form
. action
. Action
. CONNECT_FAILURE
:
344 msg
= gettext ( 'Connection error' );
345 var resp
= action
. response
;
346 if ( resp
. status
&& resp
. statusText
) {
347 msg
+= " " + resp
. status
+ ": " + resp
. statusText
;
350 case Ext
. form
. action
. Action
. LOAD_FAILURE
:
351 case Ext
. form
. action
. Action
. SERVER_INVALID
:
352 msg
= PVE
. Utils
. extractRequestError ( action
. result
, true );
359 API2Request : function ( reqOpts
) {
361 var newopts
= Ext
. apply ({
362 waitMsg
: gettext ( 'Please wait...' )
365 if (! newopts
. url
. match ( /^\/api2/ )) {
366 newopts
. url
= '/api2/extjs' + newopts
. url
;
368 delete newopts
. callback
;
370 var createWrapper = function ( successFn
, callbackFn
, failureFn
) {
372 success : function ( response
, options
) {
373 if ( options
. waitMsgTarget
) {
374 options
. waitMsgTarget
. setLoading ( false );
376 var result
= Ext
. decode ( response
. responseText
);
377 response
. result
= result
;
378 if (! result
. success
) {
379 response
. htmlStatus
= PVE
. Utils
. extractRequestError ( result
, true );
380 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
381 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
384 Ext
. callback ( callbackFn
, options
. scope
, [ options
, true , response
]);
385 Ext
. callback ( successFn
, options
. scope
, [ response
, options
]);
387 failure : function ( response
, options
) {
388 if ( options
. waitMsgTarget
) {
389 options
. waitMsgTarget
. setLoading ( false );
391 response
. result
= {};
393 response
. result
= Ext
. decode ( response
. responseText
);
395 var msg
= gettext ( 'Connection error' ) + ' - server offline?' ;
396 if ( response
. aborted
) {
397 msg
= gettext ( 'Connection error' ) + ' - aborted.' ;
398 } else if ( response
. timedout
) {
399 msg
= gettext ( 'Connection error' ) + ' - Timeout.' ;
400 } else if ( response
. status
&& response
. statusText
) {
401 msg
= gettext ( 'Connection error' ) + ' ' + response
. status
+ ': ' + response
. statusText
;
403 response
. htmlStatus
= msg
;
404 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
405 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
410 createWrapper ( reqOpts
. success
, reqOpts
. callback
, reqOpts
. failure
);
412 var target
= newopts
. waitMsgTarget
;
414 // Note: ExtJS bug - this does not work when component is not rendered
415 target
. setLoading ( newopts
. waitMsg
);
417 Ext
. Ajax
. request ( newopts
);
420 assemble_field_data : function ( values
, data
) {
421 if ( Ext
. isObject ( data
)) {
422 Ext
. Object
. each ( data
, function ( name
, val
) {
423 if ( values
. hasOwnProperty ( name
)) {
424 var bucket
= values
[ name
];
425 if (! Ext
. isArray ( bucket
)) {
426 bucket
= values
[ name
] = [ bucket
];
428 if ( Ext
. isArray ( val
)) {
429 values
[ name
] = bucket
. concat ( val
);
440 checked_command : function ( orig_cmd
) {
441 PVE
. Utils
. API2Request ({
442 url
: '/nodes/localhost/subscription' ,
445 failure : function ( response
, opts
) {
446 Ext
. Msg
. alert ( gettext ( 'Error' ), response
. htmlStatus
);
448 success : function ( response
, opts
) {
449 var data
= response
. result
. data
;
451 if ( data
. status
!== 'Active' ) {
453 title
: gettext ( 'No valid subscription' ),
454 icon
: Ext
. Msg
. WARNING
,
455 msg
: PVE
. Utils
. noSubKeyHtml
,
457 callback : function ( btn
) {
472 vncproxy
: [ 'VM/CT' , gettext ( 'Console' ) ],
473 spiceproxy
: [ 'VM/CT' , gettext ( 'Console' ) + ' (Spice)' ],
474 vncshell
: [ '' , gettext ( 'Shell' ) ],
475 qmsnapshot
: [ 'VM' , gettext ( 'Snapshot' ) ],
476 qmrollback
: [ 'VM' , gettext ( 'Rollback' ) ],
477 qmdelsnapshot
: [ 'VM' , gettext ( 'Delete Snapshot' ) ],
478 qmcreate
: [ 'VM' , gettext ( 'Create' ) ],
479 qmrestore
: [ 'VM' , gettext ( 'Restore' ) ],
480 qmdestroy
: [ 'VM' , gettext ( 'Destroy' ) ],
481 qmigrate
: [ 'VM' , gettext ( 'Migrate' ) ],
482 qmclone
: [ 'VM' , gettext ( 'Clone' ) ],
483 qmmove
: [ 'VM' , gettext ( 'Move disk' ) ],
484 qmtemplate
: [ 'VM' , gettext ( 'Convert to template' ) ],
485 qmstart
: [ 'VM' , gettext ( 'Start' ) ],
486 qmstop
: [ 'VM' , gettext ( 'Stop' ) ],
487 qmreset
: [ 'VM' , gettext ( 'Reset' ) ],
488 qmshutdown
: [ 'VM' , gettext ( 'Shutdown' ) ],
489 qmsuspend
: [ 'VM' , gettext ( 'Suspend' ) ],
490 qmresume
: [ 'VM' , gettext ( 'Resume' ) ],
491 qmconfig
: [ 'VM' , gettext ( 'Configure' ) ],
492 vzcreate
: [ 'CT' , gettext ( 'Create' ) ],
493 vzrestore
: [ 'CT' , gettext ( 'Restore' ) ],
494 vzdestroy
: [ 'CT' , gettext ( 'Destroy' ) ],
495 vzmigrate
: [ 'CT' , gettext ( 'Migrate' ) ],
496 vzstart
: [ 'CT' , gettext ( 'Start' ) ],
497 vzstop
: [ 'CT' , gettext ( 'Stop' ) ],
498 vzmount
: [ 'CT' , gettext ( 'Mount' ) ],
499 vzumount
: [ 'CT' , gettext ( 'Unmount' ) ],
500 vzshutdown
: [ 'CT' , gettext ( 'Shutdown' ) ],
501 hamigrate
: [ 'HA' , gettext ( 'Migrate' ) ],
502 hastart
: [ 'HA' , gettext ( 'Start' ) ],
503 hastop
: [ 'HA' , gettext ( 'Stop' ) ],
504 srvstart
: [ 'SRV' , gettext ( 'Start' ) ],
505 srvstop
: [ 'SRV' , gettext ( 'Stop' ) ],
506 srvrestart
: [ 'SRV' , gettext ( 'Restart' ) ],
507 srvreload
: [ 'SRV' , gettext ( 'Reload' ) ],
508 imgcopy
: [ '' , gettext ( 'Copy data' ) ],
509 imgdel
: [ '' , gettext ( 'Erase data' ) ],
510 download
: [ '' , gettext ( 'Download' ) ],
511 vzdump
: [ '' , gettext ( 'Backup' ) ],
512 aptupdate
: [ '' , gettext ( 'Update package database' ) ],
513 startall
: [ '' , gettext ( 'Start all VMs and Containers' ) ],
514 stopall
: [ '' , gettext ( 'Stop all VMs and Containers' ) ]
517 format_task_description : function ( type
, id
) {
518 var farray
= PVE
. Utils
. task_desc_table
[ type
];
522 var prefix
= farray
[ 0 ];
523 var text
= farray
[ 1 ];
525 return prefix
+ ' ' + id
+ ' - ' + text
;
530 parse_task_upid : function ( upid
) {
533 var res
= upid
. match ( /^UPID:(\S+):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/ );
535 throw "unable to parse upid '" + upid
+ "'" ;
538 task
. pid
= parseInt ( res
[ 2 ], 16 );
539 task
. pstart
= parseInt ( res
[ 3 ], 16 );
540 task
. starttime
= parseInt ( res
[ 4 ], 16 );
545 task
. desc
= PVE
. Utils
. format_task_description ( task
. type
, task
. id
);
550 format_size : function ( size
) {
551 /*jslint confusion: true */
557 var kb
= size
/ 1024 ;
560 return kb
. toFixed ( 0 ) + "KB" ;
563 var mb
= size
/ ( 1024 * 1024 );
566 return mb
. toFixed ( 0 ) + "MB" ;
572 return gb
. toFixed ( 2 ) + "GB" ;
577 return tb
. toFixed ( 2 ) + "TB" ;
581 format_html_bar : function ( per
, text
) {
583 return "<div class='pve-bar-wrap'>" + text
+ "<div class='pve-bar-border'>" +
584 "<div class='pve-bar-inner' style='width:" + per
+ "%;'></div>" +
589 format_cpu_bar : function ( per1
, per2
, text
) {
591 return "<div class='pve-bar-border'>" +
592 "<div class='pve-bar-inner' style='width:" + per1
+ "%;'></div>" +
593 "<div class='pve-bar-inner2' style='width:" + per2
+ "%;'></div>" +
594 "<div class='pve-bar-text'>" + text
+ "</div>" +
598 format_large_bar : function ( per
, text
) {
601 text
= per
. toFixed ( 1 ) + "%" ;
604 return "<div class='pve-largebar-border'>" +
605 "<div class='pve-largebar-inner' style='width:" + per
+ "%;'></div>" +
606 "<div class='pve-largebar-text'>" + text
+ "</div>" +
610 format_duration_long : function ( ut
) {
612 var days
= Math
. floor ( ut
/ 86400 );
614 var hours
= Math
. floor ( ut
/ 3600 );
616 var mins
= Math
. floor ( ut
/ 60 );
619 var hours_str
= '00' + hours
. toString ();
620 hours_str
= hours_str
. substr ( hours_str
. length
- 2 );
621 var mins_str
= "00" + mins
. toString ();
622 mins_str
= mins_str
. substr ( mins_str
. length
- 2 );
623 var ut_str
= "00" + ut
. toString ();
624 ut_str
= ut_str
. substr ( ut_str
. length
- 2 );
627 var ds
= days
> 1 ? PVE
. Utils
. daysText
: PVE
. Utils
. dayText
;
628 return days
. toString () + ' ' + ds
+ ' ' +
629 hours_str
+ ':' + mins_str
+ ':' + ut_str
;
631 return hours_str
+ ':' + mins_str
+ ':' + ut_str
;
635 format_duration_short : function ( ut
) {
638 return ut
. toString () + 's' ;
643 return mins
. toFixed ( 0 ) + 'm' ;
647 var hours
= ut
/ 3600 ;
648 return hours
. toFixed ( 0 ) + 'h' ;
651 var days
= ut
/ 86400 ;
652 return days
. toFixed ( 0 ) + 'd' ;
655 yesText
: gettext ( 'Yes' ),
656 noText
: gettext ( 'No' ),
657 errorText
: gettext ( 'Error' ),
658 unknownText
: gettext ( 'Unknown' ),
659 defaultText
: gettext ( 'Default' ),
660 daysText
: gettext ( 'days' ),
661 dayText
: gettext ( 'day' ),
662 runningText
: gettext ( 'running' ),
663 stoppedText
: gettext ( 'stopped' ),
664 neverText
: gettext ( 'never' ),
665 totalText
: gettext ( 'Total' ),
666 usedText
: gettext ( 'Used' ),
668 format_expire : function ( date
) {
670 return PVE
. Utils
. neverText
;
672 return Ext
. Date
. format ( date
, "Y-m-d" );
675 format_storage_type : function ( value
) {
676 if ( value
=== 'dir' ) {
678 } else if ( value
=== 'nfs' ) {
680 } else if ( value
=== 'glusterfs' ) {
682 } else if ( value
=== 'lvm' ) {
684 } else if ( value
=== 'iscsi' ) {
686 } else if ( value
=== 'rbd' ) {
688 } else if ( value
=== 'sheepdog' ) {
690 } else if ( value
=== 'nexenta' ) {
692 } else if ( value
=== 'iscsidirect' ) {
693 return 'iSCSIDirect' ;
695 return PVE
. Utils
. unknownText
;
699 format_boolean_with_default : function ( value
) {
700 if ( Ext
. isDefined ( value
) && value
!== '' ) {
701 return value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
703 return PVE
. Utils
. defaultText
;
706 format_boolean : function ( value
) {
707 return value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
710 format_neg_boolean : function ( value
) {
711 return ! value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
714 format_content_types : function ( value
) {
717 Ext
. each ( value
. split ( ',' ). sort (), function ( ct
) {
718 if ( ct
=== 'images' ) {
720 } else if ( ct
=== 'backup' ) {
722 } else if ( ct
=== 'vztmpl' ) {
723 cta
. push ( 'Templates' );
724 } else if ( ct
=== 'iso' ) {
726 } else if ( ct
=== 'rootdir' ) {
727 cta
. push ( 'Containers' );
731 return cta
. join ( ', ' );
734 render_storage_content : function ( value
, metaData
, record
) {
735 var data
= record
. data
;
736 if ( Ext
. isNumber ( data
. channel
) &&
737 Ext
. isNumber ( data
. id
) &&
738 Ext
. isNumber ( data
. lun
)) {
740 Ext
. String
. leftPad ( data
. channel
, 2 , '0' ) +
741 " ID " + data
. id
+ " LUN " + data
. lun
;
743 return data
. volid
. replace ( /^.*:(.*\/)?/ , '' );
746 render_serverity : function ( value
) {
747 return PVE
. Utils
. log_severity_hash
[ value
] || value
;
750 render_cpu : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
752 if (!( record
. data
. uptime
&& Ext
. isNumeric ( value
))) {
756 var maxcpu
= record
. data
. maxcpu
|| 1 ;
758 if (! Ext
. isNumeric ( maxcpu
) && ( maxcpu
>= 1 )) {
762 var per
= value
* 100 ;
764 return per
. toFixed ( 1 ) + '% of ' + maxcpu
. toString () + ( maxcpu
> 1 ? 'CPUs' : 'CPU' );
767 render_size : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
768 /*jslint confusion: true */
770 if (! Ext
. isNumeric ( value
)) {
774 return PVE
. Utils
. format_size ( value
);
777 render_timestamp : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
778 var servertime
= new Date ( value
* 1000 );
779 return Ext
. Date
. format ( servertime
, 'Y-m-d H:i:s' );
782 render_mem_usage : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
785 var maxmem
= record
. data
. maxmem
;
787 if (! record
. data
. uptime
) {
791 if (!( Ext
. isNumeric ( mem
) && maxmem
)) {
795 var per
= ( mem
* 100 ) / maxmem
;
797 return per
. toFixed ( 1 ) + '%' ;
800 render_disk_usage : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
803 var maxdisk
= record
. data
. maxdisk
;
805 if (!( Ext
. isNumeric ( disk
) && maxdisk
)) {
809 var per
= ( disk
* 100 ) / maxdisk
;
811 return per
. toFixed ( 1 ) + '%' ;
814 render_resource_type : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
816 var cls
= 'pve-itype-icon-' + value
;
818 if ( record
. data
. running
) {
819 metaData
. tdCls
= cls
+ "-running" ;
820 } else if ( record
. data
. template
) {
821 metaData
. tdCls
= cls
+ "-template" ;
823 metaData
. tdCls
= cls
;
829 render_uptime : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
833 if ( uptime
=== undefined ) {
841 return PVE
. Utils
. format_duration_long ( uptime
);
844 render_support_level : function ( value
, metaData
, record
) {
845 return PVE
. Utils
. support_level_hash
[ value
] || '-' ;
848 render_upid : function ( value
, metaData
, record
) {
849 var type
= record
. data
. type
;
850 var id
= record
. data
. id
;
852 return PVE
. Utils
. format_task_description ( type
, id
);
855 dialog_title : function ( subject
, create
, isAdd
) {
858 return gettext ( 'Add' ) + ': ' + subject
;
860 return gettext ( 'Create' ) + ': ' + subject
;
863 return gettext ( 'Edit' ) + ': ' + subject
;
867 openConoleWindow : function ( vmtype
, vmid
, nodename
, vmname
) {
868 var url
= Ext
. urlEncode ({
869 console
: vmtype
, // kvm, openvz or shell
874 var nw
= window
. open ( "?" + url
, '_blank' ,
875 "innerWidth=745,innerheight=427" );
879 // comp.setLoading() is buggy in ExtJS 4.0.7, so we
880 // use el.mask() instead
881 setErrorMask : function ( comp
, msg
) {
890 el
. mask ( gettext ( "Loading..." ));
897 monStoreErrors : function ( me
, store
) {
898 me
. mon ( store
, 'beforeload' , function ( s
, operation
, eOpts
) {
900 me
. loadCount
= 0 ; // make sure it is numeric
901 PVE
. Utils
. setErrorMask ( me
, true );
905 // only works with 'pve' proxy
906 me
. mon ( store
. proxy
, 'afterload' , function ( proxy
, request
, success
) {
910 PVE
. Utils
. setErrorMask ( me
, false );
915 var operation
= request
. operation
;
916 var error
= operation
. getError ();
917 if ( error
. statusText
) {
918 msg
= error
. statusText
+ ' (' + error
. status
+ ')' ;
920 msg
= gettext ( 'Connection error' );
922 PVE
. Utils
. setErrorMask ( me
, msg
);