]>
git.proxmox.com Git - pve-manager.git/blob - www/manager/Utils.js
6fd70361decdb4e9314cb6b5004d5fe450ad0b75
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'
123 render_kvm_ostype : function ( value
) {
125 return gettext ( 'Other OS types' );
127 var text
= PVE
. Utils
. kvm_ostypes
[ value
];
129 return text
+ ' (' + value
+ ')' ;
134 render_scsihw : function ( value
) {
136 return PVE
. Utils
. defaultText
+ ' (lsi)' ;
137 } else if ( value
=== 'lsi' ) {
138 return 'LSI 53C895A' ;
139 } else if ( value
=== 'megasas' ) {
140 return 'MegaRAID SAS 8708EM2' ;
141 } else if ( value
=== 'virtio-scsi-pci' ) {
148 // fixme: auto-generate this
149 // for now, please keep in sync with PVE::Tools::kvmkeymaps
154 'de-ch' : 'German (Swiss)' ,
155 'en-gb' : 'English (UK)' ,
156 'en-us' : 'English (USA' ,
160 //fo: 'Faroe Islands',
162 'fr-be' : 'French (Belgium)' ,
163 'fr-ca' : 'French (Canada)' ,
164 'fr-ch' : 'French (Swiss)' ,
174 //'nl-be': 'Dutch (Belgium)',
178 'pt-br' : 'Portuguese (Brazil)' ,
188 vmware
: 'VMWare compatible' ,
189 cirrus
: 'Cirrus Logic GD5446' ,
191 serial0
: 'Serial terminal 0' ,
192 serial1
: 'Serial terminal 1' ,
193 serial2
: 'Serial terminal 2' ,
194 serial3
: 'Serial terminal 3'
197 render_kvm_language : function ( value
) {
199 return PVE
. Utils
. defaultText
;
201 var text
= PVE
. Utils
. kvm_keymaps
[ value
];
203 return text
+ ' (' + value
+ ')' ;
208 kvm_keymap_array : function () {
209 var data
= [[ '' , PVE
. Utils
. render_kvm_language ( '' )]];
210 Ext
. Object
. each ( PVE
. Utils
. kvm_keymaps
, function ( key
, value
) {
211 data
. push ([ key
, PVE
. Utils
. render_kvm_language ( value
)]);
227 nb
: 'Norwegian (Bokmal)' ,
228 nn
: 'Norwegian (Nynorsk)' ,
233 pt_BR
: 'Portuguese (Brazil)' ,
237 render_language : function ( value
) {
239 return PVE
. Utils
. defaultText
+ ' (English)' ;
241 var text
= PVE
. Utils
. language_map
[ value
];
243 return text
+ ' (' + value
+ ')' ;
248 language_array : function () {
249 var data
= [[ '' , PVE
. Utils
. render_language ( '' )]];
250 Ext
. Object
. each ( PVE
. Utils
. language_map
, function ( key
, value
) {
251 data
. push ([ key
, PVE
. Utils
. render_language ( value
)]);
257 render_kvm_vga_driver : function ( value
) {
259 return PVE
. Utils
. defaultText
;
261 var text
= PVE
. Utils
. kvm_vga_drivers
[ value
];
263 return text
+ ' (' + value
+ ')' ;
268 kvm_vga_driver_array : function () {
269 var data
= [[ '' , PVE
. Utils
. render_kvm_vga_driver ( '' )]];
270 Ext
. Object
. each ( PVE
. Utils
. kvm_vga_drivers
, function ( key
, value
) {
271 data
. push ([ key
, PVE
. Utils
. render_kvm_vga_driver ( value
)]);
277 render_kvm_startup : function ( value
) {
278 var startup
= PVE
. Parser
. parseStartup ( value
);
281 if ( startup
. order
=== undefined ) {
284 res
+= startup
. order
;
286 if ( startup
. up
!== undefined ) {
287 res
+= ',up=' + startup
. up
;
289 if ( startup
. down
!== undefined ) {
290 res
+= ',down=' + startup
. down
;
297 return Ext
. util
. Cookies
. get ( 'PVEAuthCookie' );
300 authClear : function () {
301 Ext
. util
. Cookies
. clear ( "PVEAuthCookie" );
304 // fixme: remove - not needed?
305 gridLineHeigh : function () {
313 extractRequestError : function ( result
, verbose
) {
314 var msg
= gettext ( 'Successful' );
316 if (! result
. success
) {
317 msg
= gettext ( "Unknown error" );
318 if ( result
. message
) {
319 msg
= result
. message
;
321 msg
+= ' (' + result
. status
+ ')' ;
324 if ( verbose
&& Ext
. isObject ( result
. errors
)) {
326 Ext
. Object
. each ( result
. errors
, function ( prop
, desc
) {
327 msg
+= "<br><b>" + Ext
. htmlEncode ( prop
) + "</b>: " +
328 Ext
. htmlEncode ( desc
);
336 extractFormActionError : function ( action
) {
338 switch ( action
. failureType
) {
339 case Ext
. form
. action
. Action
. CLIENT_INVALID
:
340 msg
= gettext ( 'Form fields may not be submitted with invalid values' );
342 case Ext
. form
. action
. Action
. CONNECT_FAILURE
:
343 msg
= gettext ( 'Connection error' );
344 var resp
= action
. response
;
345 if ( resp
. status
&& resp
. statusText
) {
346 msg
+= " " + resp
. status
+ ": " + resp
. statusText
;
349 case Ext
. form
. action
. Action
. LOAD_FAILURE
:
350 case Ext
. form
. action
. Action
. SERVER_INVALID
:
351 msg
= PVE
. Utils
. extractRequestError ( action
. result
, true );
358 API2Request : function ( reqOpts
) {
360 var newopts
= Ext
. apply ({
361 waitMsg
: gettext ( 'Please wait...' )
364 if (! newopts
. url
. match ( /^\/api2/ )) {
365 newopts
. url
= '/api2/extjs' + newopts
. url
;
367 delete newopts
. callback
;
369 var createWrapper = function ( successFn
, callbackFn
, failureFn
) {
371 success : function ( response
, options
) {
372 if ( options
. waitMsgTarget
) {
373 options
. waitMsgTarget
. setLoading ( false );
375 var result
= Ext
. decode ( response
. responseText
);
376 response
. result
= result
;
377 if (! result
. success
) {
378 response
. htmlStatus
= PVE
. Utils
. extractRequestError ( result
, true );
379 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
380 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
383 Ext
. callback ( callbackFn
, options
. scope
, [ options
, true , response
]);
384 Ext
. callback ( successFn
, options
. scope
, [ response
, options
]);
386 failure : function ( response
, options
) {
387 if ( options
. waitMsgTarget
) {
388 options
. waitMsgTarget
. setLoading ( false );
390 response
. result
= {};
392 response
. result
= Ext
. decode ( response
. responseText
);
394 var msg
= gettext ( 'Connection error' ) + ' - server offline?' ;
395 if ( response
. aborted
) {
396 msg
= gettext ( 'Connection error' ) + ' - aborted.' ;
397 } else if ( response
. timedout
) {
398 msg
= gettext ( 'Connection error' ) + ' - Timeout.' ;
399 } else if ( response
. status
&& response
. statusText
) {
400 msg
= gettext ( 'Connection error' ) + ' ' + response
. status
+ ': ' + response
. statusText
;
402 response
. htmlStatus
= msg
;
403 Ext
. callback ( callbackFn
, options
. scope
, [ options
, false , response
]);
404 Ext
. callback ( failureFn
, options
. scope
, [ response
, options
]);
409 createWrapper ( reqOpts
. success
, reqOpts
. callback
, reqOpts
. failure
);
411 var target
= newopts
. waitMsgTarget
;
413 // Note: ExtJS bug - this does not work when component is not rendered
414 target
. setLoading ( newopts
. waitMsg
);
416 Ext
. Ajax
. request ( newopts
);
419 assemble_field_data : function ( values
, data
) {
420 if ( Ext
. isObject ( data
)) {
421 Ext
. Object
. each ( data
, function ( name
, val
) {
422 if ( values
. hasOwnProperty ( name
)) {
423 var bucket
= values
[ name
];
424 if (! Ext
. isArray ( bucket
)) {
425 bucket
= values
[ name
] = [ bucket
];
427 if ( Ext
. isArray ( val
)) {
428 values
[ name
] = bucket
. concat ( val
);
439 checked_command : function ( orig_cmd
) {
440 PVE
. Utils
. API2Request ({
441 url
: '/nodes/localhost/subscription' ,
444 failure : function ( response
, opts
) {
445 Ext
. Msg
. alert ( 'Error' , response
. htmlStatus
);
447 success : function ( response
, opts
) {
448 var data
= response
. result
. data
;
450 if ( data
. status
!== 'Active' ) {
452 title
: 'No valid subscription' ,
453 icon
: Ext
. Msg
. WARNING
,
454 msg
: PVE
. Utils
. noSubKeyHtml
,
456 callback : function ( btn
) {
471 vncproxy
: [ 'VM/CT' , gettext ( 'Console' ) ],
472 spiceproxy
: [ 'VM/CT' , gettext ( 'Spice Console' ) ],
473 vncshell
: [ '' , gettext ( 'Shell' ) ],
474 qmsnapshot
: [ 'VM' , gettext ( 'Snapshot' ) ],
475 qmrollback
: [ 'VM' , gettext ( 'Rollback' ) ],
476 qmdelsnapshot
: [ 'VM' , gettext ( 'Delete Snapshot' ) ],
477 qmcreate
: [ 'VM' , gettext ( 'Create' ) ],
478 qmrestore
: [ 'VM' , gettext ( 'Restore' ) ],
479 qmdestroy
: [ 'VM' , gettext ( 'Destroy' ) ],
480 qmigrate
: [ 'VM' , gettext ( 'Migrate' ) ],
481 qmclone
: [ 'VM' , gettext ( 'Clone' ) ],
482 qmmove
: [ 'VM' , gettext ( 'Move disk' ) ],
483 qmtemplate
: [ 'VM' , gettext ( 'Convert to template' ) ],
484 qmstart
: [ 'VM' , gettext ( 'Start' ) ],
485 qmstop
: [ 'VM' , gettext ( 'Stop' ) ],
486 qmreset
: [ 'VM' , gettext ( 'Reset' ) ],
487 qmshutdown
: [ 'VM' , gettext ( 'Shutdown' ) ],
488 qmsuspend
: [ 'VM' , gettext ( 'Suspend' ) ],
489 qmresume
: [ 'VM' , gettext ( 'Resume' ) ],
490 qmconfig
: [ 'VM' , gettext ( 'Configure' ) ],
491 vzcreate
: [ 'CT' , gettext ( 'Create' ) ],
492 vzrestore
: [ 'CT' , gettext ( 'Restore' ) ],
493 vzdestroy
: [ 'CT' , gettext ( 'Destroy' ) ],
494 vzmigrate
: [ 'CT' , gettext ( 'Migrate' ) ],
495 vzstart
: [ 'CT' , gettext ( 'Start' ) ],
496 vzstop
: [ 'CT' , gettext ( 'Stop' ) ],
497 vzmount
: [ 'CT' , gettext ( 'Mount' ) ],
498 vzumount
: [ 'CT' , gettext ( 'Unmount' ) ],
499 vzshutdown
: [ 'CT' , gettext ( 'Shutdown' ) ],
500 hamigrate
: [ 'HA' , gettext ( 'Migrate' ) ],
501 hastart
: [ 'HA' , gettext ( 'Start' ) ],
502 hastop
: [ 'HA' , gettext ( 'Stop' ) ],
503 srvstart
: [ 'SRV' , gettext ( 'Start' ) ],
504 srvstop
: [ 'SRV' , gettext ( 'Stop' ) ],
505 srvrestart
: [ 'SRV' , gettext ( 'Restart' ) ],
506 srvreload
: [ 'SRV' , gettext ( 'Reload' ) ],
507 imgcopy
: [ '' , gettext ( 'Copy data' ) ],
508 imgdel
: [ '' , gettext ( 'Erase data' ) ],
509 download
: [ '' , gettext ( 'Download' ) ],
510 vzdump
: [ '' , gettext ( 'Backup' ) ],
511 aptupdate
: [ '' , gettext ( 'Update package database' ) ],
512 startall
: [ '' , gettext ( 'Start all VMs and Containers' ) ],
513 stopall
: [ '' , gettext ( 'Stop all VMs and Containers' ) ]
516 format_task_description : function ( type
, id
) {
517 var farray
= PVE
. Utils
. task_desc_table
[ type
];
521 var prefix
= farray
[ 0 ];
522 var text
= farray
[ 1 ];
524 return prefix
+ ' ' + id
+ ' - ' + text
;
529 parse_task_upid : function ( upid
) {
532 var res
= upid
. match ( /^UPID:(\S+):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([0-9A-Fa-f]{8}):([^:\s]+):([^:\s]*):([^:\s]+):$/ );
534 throw "unable to parse upid '" + upid
+ "'" ;
537 task
. pid
= parseInt ( res
[ 2 ], 16 );
538 task
. pstart
= parseInt ( res
[ 3 ], 16 );
539 task
. starttime
= parseInt ( res
[ 4 ], 16 );
544 task
. desc
= PVE
. Utils
. format_task_description ( task
. type
, task
. id
);
549 format_size : function ( size
) {
550 /*jslint confusion: true */
556 var kb
= size
/ 1024 ;
559 return kb
. toFixed ( 0 ) + "KB" ;
562 var mb
= size
/ ( 1024 * 1024 );
565 return mb
. toFixed ( 0 ) + "MB" ;
571 return gb
. toFixed ( 2 ) + "GB" ;
576 return tb
. toFixed ( 2 ) + "TB" ;
580 format_html_bar : function ( per
, text
) {
582 return "<div class='pve-bar-wrap'>" + text
+ "<div class='pve-bar-border'>" +
583 "<div class='pve-bar-inner' style='width:" + per
+ "%;'></div>" +
588 format_cpu_bar : function ( per1
, per2
, text
) {
590 return "<div class='pve-bar-border'>" +
591 "<div class='pve-bar-inner' style='width:" + per1
+ "%;'></div>" +
592 "<div class='pve-bar-inner2' style='width:" + per2
+ "%;'></div>" +
593 "<div class='pve-bar-text'>" + text
+ "</div>" +
597 format_large_bar : function ( per
, text
) {
600 text
= per
. toFixed ( 1 ) + "%" ;
603 return "<div class='pve-largebar-border'>" +
604 "<div class='pve-largebar-inner' style='width:" + per
+ "%;'></div>" +
605 "<div class='pve-largebar-text'>" + text
+ "</div>" +
609 format_duration_long : function ( ut
) {
611 var days
= Math
. floor ( ut
/ 86400 );
613 var hours
= Math
. floor ( ut
/ 3600 );
615 var mins
= Math
. floor ( ut
/ 60 );
618 var hours_str
= '00' + hours
. toString ();
619 hours_str
= hours_str
. substr ( hours_str
. length
- 2 );
620 var mins_str
= "00" + mins
. toString ();
621 mins_str
= mins_str
. substr ( mins_str
. length
- 2 );
622 var ut_str
= "00" + ut
. toString ();
623 ut_str
= ut_str
. substr ( ut_str
. length
- 2 );
626 var ds
= days
> 1 ? PVE
. Utils
. daysText
: PVE
. Utils
. dayText
;
627 return days
. toString () + ' ' + ds
+ ' ' +
628 hours_str
+ ':' + mins_str
+ ':' + ut_str
;
630 return hours_str
+ ':' + mins_str
+ ':' + ut_str
;
634 format_duration_short : function ( ut
) {
637 return ut
. toString () + 's' ;
642 return mins
. toFixed ( 0 ) + 'm' ;
646 var hours
= ut
/ 3600 ;
647 return hours
. toFixed ( 0 ) + 'h' ;
650 var days
= ut
/ 86400 ;
651 return days
. toFixed ( 0 ) + 'd' ;
654 yesText
: gettext ( 'Yes' ),
655 noText
: gettext ( 'No' ),
656 errorText
: gettext ( 'Error' ),
657 unknownText
: gettext ( 'Unknown' ),
658 defaultText
: gettext ( 'Default' ),
659 daysText
: gettext ( 'days' ),
660 dayText
: gettext ( 'day' ),
661 runningText
: gettext ( 'running' ),
662 stoppedText
: gettext ( 'stopped' ),
663 neverText
: gettext ( 'never' ),
665 format_expire : function ( date
) {
667 return PVE
. Utils
. neverText
;
669 return Ext
. Date
. format ( date
, "Y-m-d" );
672 format_storage_type : function ( value
) {
673 if ( value
=== 'dir' ) {
675 } else if ( value
=== 'nfs' ) {
677 } else if ( value
=== 'glusterfs' ) {
679 } else if ( value
=== 'lvm' ) {
681 } else if ( value
=== 'iscsi' ) {
683 } else if ( value
=== 'rbd' ) {
685 } else if ( value
=== 'sheepdog' ) {
687 } else if ( value
=== 'nexenta' ) {
689 } else if ( value
=== 'iscsidirect' ) {
690 return 'iSCSIDirect' ;
692 return PVE
. Utils
. unknownText
;
696 format_boolean_with_default : function ( value
) {
697 if ( Ext
. isDefined ( value
) && value
!== '' ) {
698 return value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
700 return PVE
. Utils
. defaultText
;
703 format_boolean : function ( value
) {
704 return value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
707 format_neg_boolean : function ( value
) {
708 return ! value
? PVE
. Utils
. yesText
: PVE
. Utils
. noText
;
711 format_content_types : function ( value
) {
714 Ext
. each ( value
. split ( ',' ). sort (), function ( ct
) {
715 if ( ct
=== 'images' ) {
717 } else if ( ct
=== 'backup' ) {
719 } else if ( ct
=== 'vztmpl' ) {
720 cta
. push ( 'Templates' );
721 } else if ( ct
=== 'iso' ) {
723 } else if ( ct
=== 'rootdir' ) {
724 cta
. push ( 'Containers' );
728 return cta
. join ( ', ' );
731 render_storage_content : function ( value
, metaData
, record
) {
732 var data
= record
. data
;
733 if ( Ext
. isNumber ( data
. channel
) &&
734 Ext
. isNumber ( data
. id
) &&
735 Ext
. isNumber ( data
. lun
)) {
737 Ext
. String
. leftPad ( data
. channel
, 2 , '0' ) +
738 " ID " + data
. id
+ " LUN " + data
. lun
;
740 return data
. volid
. replace ( /^.*:(.*\/)?/ , '' );
743 render_serverity : function ( value
) {
744 return PVE
. Utils
. log_severity_hash
[ value
] || value
;
747 render_cpu : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
749 if (!( record
. data
. uptime
&& Ext
. isNumeric ( value
))) {
753 var maxcpu
= record
. data
. maxcpu
|| 1 ;
755 if (! Ext
. isNumeric ( maxcpu
) && ( maxcpu
>= 1 )) {
759 var per
= value
* 100 ;
761 return per
. toFixed ( 1 ) + '% of ' + maxcpu
. toString () + ( maxcpu
> 1 ? 'CPUs' : 'CPU' );
764 render_size : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
765 /*jslint confusion: true */
767 if (! Ext
. isNumeric ( value
)) {
771 return PVE
. Utils
. format_size ( value
);
774 render_timestamp : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
775 var servertime
= new Date ( value
* 1000 );
776 return Ext
. Date
. format ( servertime
, 'Y-m-d H:i:s' );
779 render_mem_usage : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
782 var maxmem
= record
. data
. maxmem
;
784 if (! record
. data
. uptime
) {
788 if (!( Ext
. isNumeric ( mem
) && maxmem
)) {
792 var per
= ( mem
* 100 ) / maxmem
;
794 return per
. toFixed ( 1 ) + '%' ;
797 render_disk_usage : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
800 var maxdisk
= record
. data
. maxdisk
;
802 if (!( Ext
. isNumeric ( disk
) && maxdisk
)) {
806 var per
= ( disk
* 100 ) / maxdisk
;
808 return per
. toFixed ( 1 ) + '%' ;
811 render_resource_type : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
813 var cls
= 'pve-itype-icon-' + value
;
815 if ( record
. data
. running
) {
816 metaData
. tdCls
= cls
+ "-running" ;
817 } else if ( record
. data
. template
) {
818 metaData
. tdCls
= cls
+ "-template" ;
820 metaData
. tdCls
= cls
;
826 render_uptime : function ( value
, metaData
, record
, rowIndex
, colIndex
, store
) {
830 if ( uptime
=== undefined ) {
838 return PVE
. Utils
. format_duration_long ( uptime
);
841 render_support_level : function ( value
, metaData
, record
) {
842 return PVE
. Utils
. support_level_hash
[ value
] || '-' ;
845 render_upid : function ( value
, metaData
, record
) {
846 var type
= record
. data
. type
;
847 var id
= record
. data
. id
;
849 return PVE
. Utils
. format_task_description ( type
, id
);
852 dialog_title : function ( subject
, create
, isAdd
) {
855 return gettext ( 'Add' ) + ': ' + subject
;
857 return gettext ( 'Create' ) + ': ' + subject
;
860 return gettext ( 'Edit' ) + ': ' + subject
;
864 openConoleWindow : function ( vmtype
, vmid
, nodename
, vmname
) {
865 var url
= Ext
. urlEncode ({
866 console
: vmtype
, // kvm, openvz or shell
871 var nw
= window
. open ( "?" + url
, '_blank' ,
872 "innerWidth=745,innerheight=427" );
876 // comp.setLoading() is buggy in ExtJS 4.0.7, so we
877 // use el.mask() instead
878 setErrorMask : function ( comp
, msg
) {
887 el
. mask ( gettext ( "Loading..." ));
894 monStoreErrors : function ( me
, store
) {
895 me
. mon ( store
, 'beforeload' , function ( s
, operation
, eOpts
) {
897 me
. loadCount
= 0 ; // make sure it is numeric
898 PVE
. Utils
. setErrorMask ( me
, true );
902 // only works with 'pve' proxy
903 me
. mon ( store
. proxy
, 'afterload' , function ( proxy
, request
, success
) {
907 PVE
. Utils
. setErrorMask ( me
, false );
912 var operation
= request
. operation
;
913 var error
= operation
. getError ();
914 if ( error
. statusText
) {
915 msg
= error
. statusText
+ ' (' + error
. status
+ ')' ;
917 msg
= gettext ( 'Connection error' );
919 PVE
. Utils
. setErrorMask ( me
, msg
);