2020-03-26 11:17:15 +01:00
Ext . define ( 'pbs-data-store-snapshots' , {
2019-12-20 12:46:09 +01:00
extend : 'Ext.data.Model' ,
2019-12-20 17:04:45 +01:00
fields : [
'backup-type' ,
2019-12-22 10:43:57 +01:00
'backup-id' ,
{
2020-03-25 15:17:28 +01:00
name : 'backup-time' ,
2019-12-22 10:43:57 +01:00
type : 'date' ,
dateFormat : 'timestamp'
} ,
2019-12-20 17:04:45 +01:00
'files' ,
2020-05-29 15:09:01 +02:00
'owner' ,
2020-03-25 15:17:28 +01:00
{ name : 'size' , type : 'int' } ,
2020-03-26 11:17:15 +01:00
]
2019-12-20 12:46:09 +01:00
} ) ;
Ext . define ( 'PBS.DataStoreContent' , {
2020-03-25 15:17:28 +01:00
extend : 'Ext.tree.Panel' ,
2019-12-20 12:46:09 +01:00
alias : 'widget.pbsDataStoreContent' ,
2020-03-25 15:17:28 +01:00
rootVisible : false ,
2019-12-22 10:43:57 +01:00
2020-05-20 12:15:38 +02:00
title : gettext ( 'Content' ) ,
2019-12-20 17:17:44 +01:00
controller : {
xclass : 'Ext.app.ViewController' ,
init : function ( view ) {
if ( ! view . datastore ) {
throw "no datastore specified" ;
}
2020-05-26 12:46:45 +02:00
this . store = Ext . create ( 'Ext.data.Store' , {
2020-03-26 11:17:15 +01:00
model : 'pbs-data-store-snapshots' ,
2020-03-25 15:17:28 +01:00
sorters : 'backup-group' ,
groupField : 'backup-group' ,
} ) ;
2020-05-26 12:46:45 +02:00
this . store . on ( 'load' , this . onLoad , this ) ;
2020-03-25 15:17:28 +01:00
2019-12-20 17:17:44 +01:00
Proxmox . Utils . monStoreErrors ( view , view . store , true ) ;
this . reload ( ) ; // initial load
} ,
reload : function ( ) {
2020-05-26 12:46:45 +02:00
let view = this . getView ( ) ;
if ( ! view . store || ! this . store ) {
console . warn ( 'cannot reload, no store(s)' ) ;
return ;
}
2019-12-20 17:17:44 +01:00
2020-03-25 15:17:28 +01:00
let url = ` /api2/json/admin/datastore/ ${ view . datastore } /snapshots ` ;
2020-05-26 12:46:45 +02:00
this . store . setProxy ( {
2019-12-20 17:17:44 +01:00
type : 'proxmox' ,
url : url
} ) ;
2020-03-25 15:17:28 +01:00
2020-05-26 12:46:45 +02:00
this . store . load ( ) ;
} ,
2020-03-25 15:17:28 +01:00
2020-05-26 12:46:45 +02:00
getRecordGroups : function ( records ) {
let groups = { } ;
for ( const item of records ) {
var btype = item . data [ "backup-type" ] ;
let group = btype + "/" + item . data [ "backup-id" ] ;
if ( groups [ group ] !== undefined ) {
continue ;
}
var cls = '' ;
if ( btype === 'vm' ) {
cls = 'fa-desktop' ;
} else if ( btype === 'ct' ) {
cls = 'fa-cube' ;
} else if ( btype === 'host' ) {
cls = 'fa-building' ;
} else {
2020-05-30 16:37:33 +02:00
console . warn ( ` got unknown backup-type ' ${ btype } ' ` ) ;
2020-05-26 12:46:45 +02:00
continue ; // FIXME: auto render? what do?
}
groups [ group ] = {
text : group ,
leaf : false ,
iconCls : "fa " + cls ,
expanded : false ,
backup _type : item . data [ "backup-type" ] ,
backup _id : item . data [ "backup-id" ] ,
children : [ ]
2020-03-26 18:01:04 +01:00
} ;
2020-05-26 12:46:45 +02:00
}
2020-03-26 18:01:04 +01:00
2020-05-26 12:46:45 +02:00
return groups ;
} ,
2020-03-25 15:17:28 +01:00
2020-05-26 12:46:45 +02:00
onLoad : function ( store , records , success ) {
let view = this . getView ( ) ;
if ( ! success ) {
return ;
}
let groups = this . getRecordGroups ( records ) ;
2020-03-25 15:17:28 +01:00
2020-05-26 12:46:45 +02:00
for ( const item of records ) {
let group = item . data [ "backup-type" ] + "/" + item . data [ "backup-id" ] ;
let children = groups [ group ] . children ;
let data = item . data ;
2020-05-26 18:16:38 +02:00
data . text = group + '/' + PBS . Utils . render _datetime _utc ( data [ "backup-time" ] ) ;
2020-05-26 12:46:45 +02:00
data . leaf = true ;
data . cls = 'no-leaf-icons' ;
children . push ( data ) ;
}
let children = [ ] ;
for ( const [ _key , group ] of Object . entries ( groups ) ) {
let last _backup = 0 ;
for ( const item of group . children ) {
if ( item [ "backup-time" ] > last _backup ) {
last _backup = item [ "backup-time" ] ;
group [ "backup-time" ] = last _backup ;
group . files = item . files ;
group . size = item . size ;
2020-05-29 15:09:01 +02:00
group . owner = item . owner ;
2020-05-26 12:46:45 +02:00
}
}
group . count = group . children . length ;
children . push ( group ) ;
}
view . setRootNode ( {
expanded : true ,
children : children
} ) ;
2019-12-20 17:17:44 +01:00
} ,
2020-03-26 17:23:51 +01:00
onPrune : function ( ) {
var view = this . getView ( ) ;
let rec = view . selModel . getSelection ( ) [ 0 ] ;
if ( ! ( rec && rec . data ) ) return ;
let data = rec . data ;
if ( data . leaf ) return ;
if ( ! view . datastore ) return ;
let win = Ext . create ( 'PBS.DataStorePrune' , {
datastore : view . datastore ,
backup _type : data . backup _type ,
backup _id : data . backup _id ,
} ) ;
win . on ( 'destroy' , this . reload , this ) ;
win . show ( ) ;
}
2019-12-20 17:17:44 +01:00
} ,
2020-05-29 15:09:01 +02:00
columns : [
{
xtype : 'treecolumn' ,
header : gettext ( "Backup Group" ) ,
dataIndex : 'text' ,
flex : 1
} ,
{
xtype : 'datecolumn' ,
header : gettext ( 'Backup Time' ) ,
sortable : true ,
dataIndex : 'backup-time' ,
format : 'Y-m-d H:i:s' ,
width : 150
} ,
{
header : gettext ( "Size" ) ,
sortable : true ,
dataIndex : 'size' ,
renderer : Proxmox . Utils . format _size ,
} ,
{
xtype : 'numbercolumn' ,
format : '0' ,
header : gettext ( "Count" ) ,
sortable : true ,
dataIndex : 'count' ,
} ,
{
header : gettext ( "Owner" ) ,
sortable : true ,
dataIndex : 'owner' ,
} ,
{
header : gettext ( "Files" ) ,
sortable : false ,
dataIndex : 'files' ,
flex : 2
} ,
] ,
2020-03-26 13:23:28 +01:00
2020-05-29 15:09:01 +02:00
tbar : [
{
text : gettext ( 'Reload' ) ,
iconCls : 'fa fa-refresh' ,
handler : 'reload' ,
} ,
{
xtype : 'proxmoxButton' ,
2020-03-26 13:23:28 +01:00
text : gettext ( 'Prune' ) ,
disabled : true ,
2020-03-26 17:23:51 +01:00
enableFn : function ( record ) { return ! record . data . leaf ; } ,
handler : 'onPrune' ,
2020-05-29 15:09:01 +02:00
}
] ,
2019-12-20 12:46:09 +01:00
} ) ;