2011-08-23 07:40:22 +02:00
/ *
* Workspace base class
*
* popup login window when auth fails ( call onLogin handler )
* update ( re - login ) ticket every 15 minutes
*
* /
Ext . define ( 'PVE.Workspace' , {
extend : 'Ext.container.Viewport' ,
title : 'Proxmox Virtual Environment' ,
loginData : null , // Data from last login call
onLogin : function ( loginData ) { } ,
// private
updateLoginData : function ( loginData ) {
var me = this ;
me . loginData = loginData ;
PVE . CSRFPreventionToken = loginData . CSRFPreventionToken ;
PVE . UserName = loginData . username ;
2012-04-17 10:37:30 +02:00
if ( loginData . cap ) {
Ext . state . Manager . set ( 'GuiCap' , loginData . cap ) ;
}
2012-02-10 10:17:35 +01:00
// creates a session cookie (expire = null)
// that way the cookie gets deleted after browser window close
Ext . util . Cookies . set ( 'PVEAuthCookie' , loginData . ticket , null , '/' , null , true ) ;
2011-08-23 07:40:22 +02:00
me . onLogin ( loginData ) ;
} ,
// private
showLogin : function ( ) {
var me = this ;
PVE . Utils . authClear ( ) ;
PVE . UserName = null ;
me . loginData = null ;
if ( ! me . login ) {
me . login = Ext . create ( 'PVE.window.LoginWindow' , {
handler : function ( data ) {
me . login = null ;
me . updateLoginData ( data ) ;
}
} ) ;
}
me . onLogin ( null ) ;
me . login . show ( ) ;
} ,
initComponent : function ( ) {
var me = this ;
Ext . tip . QuickTipManager . init ( ) ;
// fixme: what about other errors
Ext . Ajax . on ( 'requestexception' , function ( conn , response , options ) {
if ( response . status == 401 ) { // auth failure
me . showLogin ( ) ;
}
} ) ;
document . title = me . title ;
me . callParent ( ) ;
if ( ! PVE . Utils . authOK ( ) ) {
me . showLogin ( ) ;
} else {
if ( me . loginData ) {
me . onLogin ( me . loginData ) ;
}
}
Ext . TaskManager . start ( {
run : function ( ) {
var ticket = PVE . Utils . authOK ( ) ;
if ( ! ticket || ! PVE . UserName ) {
return ;
}
Ext . Ajax . request ( {
params : {
username : PVE . UserName ,
password : ticket
} ,
url : '/api2/json/access/ticket' ,
method : 'POST' ,
success : function ( response , opts ) {
var obj = Ext . decode ( response . responseText ) ;
me . updateLoginData ( obj . data ) ;
}
} ) ;
} ,
interval : 15 * 60 * 1000
} ) ;
}
} ) ;
Ext . define ( 'PVE.ConsoleWorkspace' , {
extend : 'PVE.Workspace' ,
alias : [ 'widget.pveConsoleWorkspace' ] ,
2011-12-08 09:20:50 +01:00
title : gettext ( 'Console' ) ,
2011-08-23 07:40:22 +02:00
initComponent : function ( ) {
var me = this ;
var param = Ext . Object . fromQueryString ( window . location . search ) ;
var consoleType = me . consoleType || param . console ;
var content ;
if ( consoleType === 'kvm' ) {
me . title = "VM " + param . vmid ;
2011-11-29 07:43:25 +01:00
if ( param . vmname ) {
me . title += " ('" + param . vmname + "')" ;
}
2011-08-23 07:40:22 +02:00
content = {
xtype : 'pveKVMConsole' ,
vmid : param . vmid ,
nodename : param . node ,
2011-11-29 07:43:25 +01:00
vmname : param . vmname ,
2011-10-05 07:37:01 +02:00
toplevel : true
} ;
} else if ( consoleType === 'openvz' ) {
me . title = "CT " + param . vmid ;
2011-11-29 07:43:25 +01:00
if ( param . vmname ) {
me . title += " ('" + param . vmname + "')" ;
}
2011-10-05 07:37:01 +02:00
content = {
xtype : 'pveOpenVZConsole' ,
vmid : param . vmid ,
nodename : param . node ,
2011-11-29 07:43:25 +01:00
vmname : param . vmname ,
2011-08-23 07:40:22 +02:00
toplevel : true
} ;
} else if ( consoleType === 'shell' ) {
2011-12-08 09:20:50 +01:00
me . title = "node '" + param . node ;
2011-08-23 07:40:22 +02:00
content = {
xtype : 'pveShell' ,
nodename : param . node ,
toplevel : true
} ;
} else {
content = {
border : false ,
bodyPadding : 10 ,
html : 'Error: No such console type'
} ;
}
Ext . apply ( me , {
layout : { type : 'fit' } ,
border : false ,
items : [ content ]
} ) ;
me . callParent ( ) ;
}
} ) ;
Ext . define ( 'PVE.StdWorkspace' , {
extend : 'PVE.Workspace' ,
alias : [ 'widget.pveStdWorkspace' ] ,
// private
setContent : function ( comp ) {
var me = this ;
var cont = me . child ( '#content' ) ;
cont . removeAll ( true ) ;
2011-11-11 13:26:05 +01:00
if ( comp ) {
2012-01-30 07:35:01 +01:00
PVE . Utils . setErrorMask ( cont , false ) ;
2011-11-11 13:26:05 +01:00
comp . border = false ;
cont . add ( comp ) ;
cont . doLayout ( ) ;
2012-03-26 14:08:38 +02:00
}
// else {
2012-03-26 13:26:53 +02:00
// TODO: display something useful
// Note:: error mask has wrong zindex, so we do not
// use that - see bug 114
// PVE.Utils.setErrorMask(cont, 'nothing selected');
2012-03-26 14:08:38 +02:00
//}
2011-08-23 07:40:22 +02:00
} ,
selectById : function ( nodeid ) {
var me = this ;
var tree = me . down ( 'pveResourceTree' ) ;
tree . selectById ( nodeid ) ;
} ,
2011-09-16 11:09:51 +02:00
checkVmMigration : function ( record ) {
2011-09-16 08:55:46 +02:00
var me = this ;
var tree = me . down ( 'pveResourceTree' ) ;
2011-09-16 11:09:51 +02:00
tree . checkVmMigration ( record ) ;
2011-09-16 08:55:46 +02:00
} ,
2011-08-23 07:40:22 +02:00
onLogin : function ( loginData ) {
var me = this ;
me . updateUserInfo ( ) ;
if ( loginData ) {
PVE . data . ResourceStore . startUpdate ( ) ;
2012-06-25 11:40:32 +02:00
PVE . Utils . API2Request ( {
url : '/version' ,
method : 'GET' ,
success : function ( response ) {
PVE . VersionInfo = response . result . data ;
me . updateVersionInfo ( ) ;
}
} ) ;
2011-08-23 07:40:22 +02:00
}
} ,
updateUserInfo : function ( ) {
var me = this ;
var ui = me . query ( '#userinfo' ) [ 0 ] ;
if ( PVE . UserName ) {
2011-11-22 09:18:56 +01:00
var msg = Ext . String . format ( gettext ( "You are logged in as {0}" ) , "'" + PVE . UserName + "'" ) ;
ui . update ( '<div class="x-unselectable" style="white-space:nowrap;">' + msg + '</div>' ) ;
2011-08-23 07:40:22 +02:00
} else {
ui . update ( '' ) ;
}
ui . doLayout ( ) ;
} ,
2012-06-25 11:40:32 +02:00
updateVersionInfo : function ( ) {
var me = this ;
var ui = me . query ( '#versioninfo' ) [ 0 ] ;
if ( PVE . VersionInfo ) {
var version = PVE . VersionInfo . version + '-' + PVE . VersionInfo . release + '/' +
PVE . VersionInfo . repoid ;
ui . update ( '<span class="x-panel-header-text">Proxmox Virtual Environment<br>' + gettext ( 'Version' ) + ': ' + version + "</span>" ) ;
} else {
ui . update ( '<span class="x-panel-header-text">Proxmox Virtual Environment</span>' ) ;
}
ui . doLayout ( ) ;
} ,
2011-08-23 07:40:22 +02:00
initComponent : function ( ) {
var me = this ;
Ext . History . init ( ) ;
2012-04-24 07:12:19 +02:00
var sprovider = Ext . create ( 'PVE.StateProvider' ) ;
Ext . state . Manager . setProvider ( sprovider ) ;
2011-11-11 13:26:05 +01:00
var selview = new PVE . form . ViewSelector ( { } ) ;
2011-08-23 07:40:22 +02:00
var rtree = Ext . createWidget ( 'pveResourceTree' , {
viewFilter : selview . getViewFilter ( ) ,
2011-11-11 13:26:05 +01:00
flex : 1 ,
2011-08-23 07:40:22 +02:00
selModel : new Ext . selection . TreeModel ( {
listeners : {
selectionchange : function ( sm , selected ) {
var comp ;
var tlckup = {
root : 'PVE.dc.Config' ,
node : 'PVE.node.Config' ,
qemu : 'PVE.qemu.Config' ,
2011-09-28 16:04:44 +02:00
openvz : 'PVE.openvz.Config' ,
2012-01-30 08:09:12 +01:00
storage : 'PVE.storage.Browser' ,
pool : 'pvePoolConfig'
2011-08-23 07:40:22 +02:00
} ;
if ( selected . length > 0 ) {
var n = selected [ 0 ] ;
comp = {
xtype : tlckup [ n . data . type || 'root' ] ||
2012-01-30 07:35:01 +01:00
'pvePanelConfig' ,
2011-08-23 07:40:22 +02:00
layout : { type : 'fit' } ,
showSearch : ( n . data . id === 'root' ) ||
Ext . isDefined ( n . data . groupbyid ) ,
pveSelNode : n ,
2011-09-16 08:55:46 +02:00
workspace : me ,
2011-08-23 07:40:22 +02:00
viewFilter : selview . getViewFilter ( )
} ;
}
me . setContent ( comp ) ;
}
}
} )
} ) ;
2011-11-11 13:26:05 +01:00
selview . on ( 'select' , function ( combo , records ) {
if ( records && records . length ) {
var view = combo . getViewFilter ( ) ;
rtree . setViewFilter ( view ) ;
}
} ) ;
2012-04-24 07:12:19 +02:00
var caps = sprovider . get ( 'GuiCap' ) ;
var createVM = Ext . createWidget ( 'button' , {
pack : 'end' ,
margins : '3 5 0 0' ,
baseCls : 'x-btn' ,
text : gettext ( "Create VM" ) ,
disabled : ! caps . vms [ 'VM.Allocate' ] ,
handler : function ( ) {
var wiz = Ext . create ( 'PVE.qemu.CreateWizard' , { } ) ;
wiz . show ( ) ;
}
} ) ;
var createCT = Ext . createWidget ( 'button' , {
pack : 'end' ,
margins : '3 5 0 0' ,
baseCls : 'x-btn' ,
text : gettext ( "Create CT" ) ,
disabled : ! caps . vms [ 'VM.Allocate' ] ,
handler : function ( ) {
var wiz = Ext . create ( 'PVE.openvz.CreateWizard' , { } ) ;
wiz . show ( ) ;
}
} ) ;
sprovider . on ( 'statechange' , function ( sp , key , value ) {
if ( key === 'GuiCap' && value ) {
caps = value ;
createVM . setDisabled ( ! caps . vms [ 'VM.Allocate' ] ) ;
createCT . setDisabled ( ! caps . vms [ 'VM.Allocate' ] ) ;
}
} ) ;
2011-08-23 07:40:22 +02:00
Ext . apply ( me , {
layout : { type : 'border' } ,
border : false ,
items : [
{
region : 'north' ,
height : 30 ,
layout : {
type : 'hbox' ,
align : 'middle'
} ,
baseCls : 'x-plain' ,
defaults : {
baseCls : 'x-plain'
} ,
border : false ,
margins : '2 0 5 0' ,
items : [
{
margins : '0 0 0 4' ,
html : '<a class="x-unselectable" target=_blank href="http://www.proxmox.com">' +
'<img height=30 width=209 src="/pve2/images/proxmox_logo.png"/></a>'
} ,
{
minWidth : 200 ,
flex : 1 ,
2012-06-25 11:40:32 +02:00
id : 'versioninfo' ,
html : '<span class="x-panel-header-text">Proxmox Virtual Environment</span>'
2011-08-23 07:40:22 +02:00
} ,
{
pack : 'end' ,
margins : '8 10 0 10' ,
id : 'userinfo' ,
stateful : false
} ,
{
pack : 'end' ,
margins : '3 5 0 0' ,
xtype : 'button' ,
baseCls : 'x-btn' ,
2011-11-22 09:18:56 +01:00
text : gettext ( "Logout" ) ,
2011-08-23 07:40:22 +02:00
handler : function ( ) {
PVE . data . ResourceStore . stopUpdate ( ) ;
me . showLogin ( ) ;
me . setContent ( ) ;
var rt = me . down ( 'pveResourceTree' ) ;
rt . clearTree ( ) ;
}
2012-04-24 07:12:19 +02:00
} ,
createVM ,
createCT
2011-08-23 07:40:22 +02:00
]
} ,
{
region : 'center' ,
id : 'content' ,
2011-11-11 13:26:05 +01:00
xtype : 'container' ,
2011-08-23 07:40:22 +02:00
layout : { type : 'fit' } ,
border : false ,
stateful : false ,
2011-11-11 13:26:05 +01:00
margins : '0 5 0 0' ,
items : [ ]
} ,
{
region : 'west' ,
xtype : 'container' ,
border : false ,
layout : { type : 'vbox' , align : 'stretch' } ,
margins : '0 0 0 5' ,
split : true ,
width : 200 ,
items : [ selview , rtree ]
2011-08-23 07:40:22 +02:00
} ,
{
xtype : 'pveStatusPanel' ,
region : 'south' ,
margins : '0 5 5 5' ,
height : 200 ,
split : true
}
]
} ) ;
me . callParent ( ) ;
me . updateUserInfo ( ) ;
}
} ) ;