2018-12-04 17:53:10 +01:00
Ext . define ( 'PBS.MainView' , {
extend : 'Ext.container.Container' ,
xtype : 'mainview' ,
title : 'Proxmox Backup Server' ,
controller : {
xclass : 'Ext.app.ViewController' ,
routes : {
':path:subpath' : {
action : 'changePath' ,
before : 'beforeChangePath' ,
2020-09-25 18:34:54 +02:00
conditions : {
':path' : '(?:([%a-zA-Z0-9\\-\\_\\s,.]+))' ,
':subpath' : '(?:(?::)([%a-zA-Z0-9\\-\\_\\s,]+))?' ,
} ,
} ,
2018-12-04 17:53:10 +01:00
} ,
2019-12-18 19:21:59 +01:00
2018-12-04 17:53:10 +01:00
beforeChangePath : function ( path , subpath , action ) {
var me = this ;
2020-05-20 12:15:38 +02:00
let xtype = path ;
let datastore ;
let isDataStore = PBS . Utils . isDataStorePath ( path ) ;
if ( isDataStore ) {
xtype = 'pbsDataStorePanel' ;
datastore = PBS . Utils . getDataStoreFromPath ( path ) ;
}
if ( ! Ext . ClassManager . getByAlias ( ` widget. ${ xtype } ` ) ) {
console . warn ( ` xtype ${ xtype } not found ` ) ;
2019-01-22 11:48:00 +01:00
action . stop ( ) ;
return ;
}
var lastpanel = me . lookupReference ( 'contentpanel' ) . getLayout ( ) . getActiveItem ( ) ;
2020-05-20 12:15:38 +02:00
if ( lastpanel && lastpanel . xtype === xtype ) {
if ( isDataStore ) {
if ( datastore === lastpanel . datastore ) {
2019-12-20 12:46:09 +01:00
action . stop ( ) ;
return ;
}
} else {
// we have the right component already,
// we just need to select the correct tab
// default to the first
subpath = subpath || 0 ;
if ( lastpanel . getActiveTab ) {
// we assume lastpanel is a tabpanel
if ( lastpanel . getActiveTab ( ) . getItemId ( ) !== subpath ) {
// set the active tab
lastpanel . setActiveTab ( subpath ) ;
}
// else we are already there
2019-01-22 11:48:00 +01:00
}
2019-12-20 12:46:09 +01:00
action . stop ( ) ;
return ;
2019-01-22 11:48:00 +01:00
}
}
2018-12-04 17:53:10 +01:00
action . resume ( ) ;
} ,
2019-12-18 19:21:59 +01:00
2019-12-20 12:46:09 +01:00
changePath : function ( path , subpath ) {
2018-12-04 17:53:10 +01:00
var me = this ;
var contentpanel = me . lookupReference ( 'contentpanel' ) ;
var lastpanel = contentpanel . getLayout ( ) . getActiveItem ( ) ;
2020-10-27 16:20:10 +01:00
let tabChangeListener = function ( tp , newc , oldc ) {
let newpath = path ;
2019-01-22 11:48:00 +01:00
2020-10-27 16:20:10 +01:00
// only add the subpath part for the
// non-default tabs
if ( tp . items . findIndex ( 'id' , newc . id ) !== 0 ) {
newpath += ` : ${ newc . getItemId ( ) } ` ;
}
2019-01-22 11:48:00 +01:00
2020-10-27 16:20:10 +01:00
me . redirectTo ( newpath ) ;
} ;
2019-01-22 11:48:00 +01:00
2020-10-27 16:20:10 +01:00
let xtype = path ;
var obj ;
let datastore ;
if ( PBS . Utils . isDataStorePath ( path ) ) {
datastore = PBS . Utils . getDataStoreFromPath ( path ) ;
if ( lastpanel && lastpanel . xtype === 'pbsDataStorePanel' && ! subpath ) {
let activeTab = lastpanel . getActiveTab ( ) ;
let newpath = path ;
if ( lastpanel . items . indexOf ( activeTab ) !== 0 ) {
subpath = activeTab . getItemId ( ) ;
newpath += ` : ${ subpath } ` ;
2019-01-22 11:48:00 +01:00
}
me . redirectTo ( newpath ) ;
2020-10-27 16:20:10 +01:00
}
xtype = 'pbsDataStorePanel' ;
2019-01-22 11:48:00 +01:00
}
2020-10-27 16:20:10 +01:00
obj = contentpanel . add ( {
xtype ,
datastore ,
nodename : 'localhost' ,
border : false ,
activeTab : subpath || 0 ,
listeners : {
tabchange : tabChangeListener ,
} ,
} ) ;
var treelist = me . lookupReference ( 'navtree' ) ;
treelist . select ( path , true ) ;
2019-01-22 11:48:00 +01:00
contentpanel . setActiveItem ( obj ) ;
if ( lastpanel ) {
contentpanel . remove ( lastpanel , { destroy : true } ) ;
}
} ,
2019-01-30 15:14:20 +01:00
logout : function ( ) {
PBS . app . logout ( ) ;
} ,
2019-01-22 11:48:00 +01:00
navigate : function ( treelist , item ) {
this . redirectTo ( item . get ( 'path' ) ) ;
2018-12-04 17:53:10 +01:00
} ,
2019-01-30 15:14:20 +01:00
control : {
2020-07-09 14:24:33 +02:00
'[reference=logoutButton]' : {
2020-09-25 18:34:54 +02:00
click : 'logout' ,
} ,
2019-01-30 15:14:20 +01:00
} ,
2018-12-04 17:53:10 +01:00
init : function ( view ) {
var me = this ;
2020-07-09 13:38:20 +02:00
PBS . data . RunningTasksStore . startUpdate ( ) ;
2020-07-09 14:24:33 +02:00
me . lookupReference ( 'usernameinfo' ) . setText ( Proxmox . UserName ) ;
2019-12-17 14:44:25 +01:00
2019-12-17 14:45:13 +01:00
// show login on requestexception
// fixme: what about other errors
Ext . Ajax . on ( 'requestexception' , function ( conn , response , options ) {
2020-09-25 18:34:54 +02:00
if ( response . status === 401 || response . status === '401' ) { // auth failure
2019-12-17 14:45:13 +01:00
me . logout ( ) ;
}
} ) ;
2019-12-17 14:44:25 +01:00
// get ticket periodically
Ext . TaskManager . start ( {
run : function ( ) {
var ticket = Proxmox . Utils . authOK ( ) ;
if ( ! ticket || ! Proxmox . UserName ) {
return ;
}
Ext . Ajax . request ( {
params : {
username : Proxmox . UserName ,
2020-09-25 18:34:54 +02:00
password : ticket ,
2019-12-17 14:44:25 +01:00
} ,
url : '/api2/json/access/ticket' ,
method : 'POST' ,
failure : function ( ) {
me . logout ( ) ;
} ,
success : function ( response , opts ) {
var obj = Ext . decode ( response . responseText ) ;
2019-12-17 15:42:59 +01:00
PBS . Utils . updateLoginData ( obj . data ) ;
2020-09-25 18:34:54 +02:00
} ,
2019-12-17 14:44:25 +01:00
} ) ;
} ,
2020-09-25 18:34:54 +02:00
interval : 15 * 60 * 1000 ,
2019-12-17 14:44:25 +01:00
} ) ;
2019-12-18 19:19:30 +01:00
// select treeitem and load page from url fragment, if set
let token = Ext . util . History . getToken ( ) || 'pbsDashboard' ;
this . redirectTo ( token , true ) ;
2020-09-25 18:34:54 +02:00
} ,
2018-12-04 17:53:10 +01:00
} ,
plugins : 'viewport' ,
layout : { type : 'border' } ,
items : [
{
region : 'north' ,
xtype : 'container' ,
layout : {
type : 'hbox' ,
2020-09-25 18:34:54 +02:00
align : 'middle' ,
2018-12-04 17:53:10 +01:00
} ,
2020-07-09 14:25:14 +02:00
margin : '2 0 2 5' ,
2018-12-04 17:53:10 +01:00
height : 38 ,
items : [
{
2020-05-18 14:18:37 +02:00
xtype : 'proxmoxlogo' ,
prefix : '' ,
2018-12-04 17:53:10 +01:00
} ,
{
2020-07-09 14:25:14 +02:00
padding : '0 0 0 5' ,
xtype : 'versioninfo' ,
2018-12-04 17:53:10 +01:00
} ,
{
2020-07-03 12:48:50 +02:00
flex : 1 ,
baseCls : 'x-plain' ,
2018-12-04 17:53:10 +01:00
} ,
2019-12-16 18:16:06 +01:00
{
xtype : 'button' ,
baseCls : 'x-btn' ,
cls : 'x-btn-default-toolbar-small proxmox-inline-button' ,
iconCls : 'fa fa-book x-btn-icon-el-default-toolbar-small ' ,
text : gettext ( 'Documentation' ) ,
href : '/docs/index.html' ,
margin : '0 5 0 0' ,
} ,
2020-07-09 13:38:21 +02:00
{
xtype : 'pbsTaskButton' ,
margin : '0 5 0 0' ,
} ,
2018-12-04 17:53:10 +01:00
{
xtype : 'button' ,
2020-07-09 14:24:33 +02:00
reference : 'usernameinfo' ,
style : {
// proxmox dark grey p light grey as border
backgroundColor : '#464d4d' ,
2020-09-25 18:34:54 +02:00
borderColor : '#ABBABA' ,
2020-07-09 14:24:33 +02:00
} ,
margin : '0 5 0 0' ,
iconCls : 'fa fa-user' ,
menu : [
{
2020-10-30 09:46:04 +01:00
iconCls : 'fa fa-language' ,
text : gettext ( 'Language' ) ,
reference : 'languageButton' ,
handler : ( ) => Ext . create ( 'Proxmox.window.LanguageEditWindow' , {
cookieName : 'PBSLangCookie' ,
autoShow : true ,
} ) ,
} ,
'-' ,
{
2020-07-09 14:24:33 +02:00
iconCls : 'fa fa-sign-out' ,
text : gettext ( 'Logout' ) ,
2020-10-30 09:46:04 +01:00
reference : 'logoutButton' ,
2020-07-09 14:24:33 +02:00
} ,
] ,
} ,
2020-09-25 18:34:54 +02:00
] ,
2018-12-04 17:53:10 +01:00
} ,
{
xtype : 'panel' ,
scrollable : 'y' ,
border : false ,
region : 'west' ,
layout : {
type : 'vbox' ,
2020-09-25 18:34:54 +02:00
align : 'stretch' ,
2018-12-04 17:53:10 +01:00
} ,
2019-01-22 11:48:00 +01:00
items : [ {
xtype : 'navigationtree' ,
minWidth : 180 ,
reference : 'navtree' ,
// we have to define it here until extjs 6.2
// because of a bug where a viewcontroller does not detect
// the selectionchange event of a treelist
listeners : {
2020-09-25 18:34:54 +02:00
selectionchange : 'navigate' ,
} ,
2019-01-22 11:48:00 +01:00
} , {
xtype : 'box' ,
cls : 'x-treelist-nav' ,
2020-09-25 18:34:54 +02:00
flex : 1 ,
} ] ,
2018-12-04 17:53:10 +01:00
} ,
{
xtype : 'panel' ,
layout : { type : 'card' } ,
region : 'center' ,
border : false ,
2020-09-25 18:34:54 +02:00
reference : 'contentpanel' ,
} ,
] ,
2018-12-04 17:53:10 +01:00
} ) ;