2021-02-22 14:25:36 +01:00
Ext . define ( 'pbs-slot-model' , {
extend : 'Ext.data.Model' ,
2021-02-23 09:06:32 +01:00
fields : [ 'entry-id' , 'label-text' , 'is-labeled' , ' model' , 'name' , 'vendor' , 'serial' , 'state' , 'status' , 'pool' ,
2021-02-22 14:25:36 +01:00
{
name : 'is-blocked' ,
calculate : function ( data ) {
return data . state !== undefined ;
} ,
} ,
2021-04-30 10:13:13 +02:00
{
name : 'is-empty' ,
calculate : function ( data ) {
return data [ 'label-text' ] === undefined ;
} ,
} ,
2021-02-22 14:25:36 +01:00
] ,
idProperty : 'entry-id' ,
} ) ;
2021-03-12 16:06:27 +01:00
Ext . define ( 'PBS.TapeManagement.FreeSlotSelector' , {
extend : 'Proxmox.form.ComboGrid' ,
alias : 'widget.pbsFreeSlotSelector' ,
valueField : 'id' ,
displayField : 'id' ,
listConfig : {
columns : [
{
dataIndex : 'id' ,
text : gettext ( 'ID' ) ,
flex : 1 ,
} ,
{
dataIndex : 'type' ,
text : gettext ( 'Type' ) ,
flex : 1 ,
} ,
] ,
} ,
} ) ;
2021-01-28 12:59:48 +01:00
Ext . define ( 'PBS.TapeManagement.ChangerStatus' , {
extend : 'Ext.panel.Panel' ,
alias : 'widget.pbsChangerStatus' ,
2021-03-08 09:47:44 +01:00
tools : [ PBS . Utils . get _help _tool ( "tape_backup" ) ] ,
2021-01-28 12:59:48 +01:00
controller : {
xclass : 'Ext.app.ViewController' ,
2021-03-01 12:22:42 +01:00
importTape : function ( v , rI , cI , button , el , record ) {
2021-01-28 12:59:48 +01:00
let me = this ;
let view = me . getView ( ) ;
2021-01-29 14:57:50 +01:00
let from = record . data [ 'entry-id' ] ;
2021-03-01 12:22:42 +01:00
let changer = encodeURIComponent ( view . changer ) ;
2021-01-29 14:57:50 +01:00
Ext . create ( 'Proxmox.window.Edit' , {
title : gettext ( 'Import' ) ,
isCreate : true ,
submitText : gettext ( 'OK' ) ,
method : 'POST' ,
url : ` /api2/extjs/tape/changer/ ${ changer } /transfer ` ,
items : [
{
xtype : 'displayfield' ,
name : 'from' ,
value : from ,
submitValue : true ,
fieldLabel : gettext ( 'From Slot' ) ,
} ,
{
2021-03-12 16:06:27 +01:00
xtype : 'pbsFreeSlotSelector' ,
2021-01-29 14:57:50 +01:00
name : 'to' ,
fieldLabel : gettext ( 'To Slot' ) ,
2021-03-12 16:06:27 +01:00
store : {
data : me . free _slots ,
} ,
2021-01-29 14:57:50 +01:00
} ,
] ,
listeners : {
destroy : function ( ) {
me . reload ( ) ;
} ,
} ,
} ) . show ( ) ;
} ,
2021-03-01 12:22:42 +01:00
slotTransfer : function ( v , rI , cI , button , el , record ) {
2021-01-28 12:59:48 +01:00
let me = this ;
2021-03-01 12:22:42 +01:00
let view = me . getView ( ) ;
2021-01-28 12:59:48 +01:00
let from = record . data [ 'entry-id' ] ;
2021-03-01 12:22:42 +01:00
let changer = encodeURIComponent ( view . changer ) ;
2021-01-28 12:59:48 +01:00
Ext . create ( 'Proxmox.window.Edit' , {
title : gettext ( 'Transfer' ) ,
isCreate : true ,
submitText : gettext ( 'OK' ) ,
method : 'POST' ,
url : ` /api2/extjs/tape/changer/ ${ changer } /transfer ` ,
items : [
{
xtype : 'displayfield' ,
name : 'from' ,
value : from ,
submitValue : true ,
fieldLabel : gettext ( 'From Slot' ) ,
} ,
{
2021-03-12 16:06:27 +01:00
xtype : 'pbsFreeSlotSelector' ,
2021-01-28 12:59:48 +01:00
name : 'to' ,
fieldLabel : gettext ( 'To Slot' ) ,
2021-03-12 16:06:27 +01:00
store : {
data : me . free _slots . concat ( me . free _ie _slots ) ,
} ,
2021-01-28 12:59:48 +01:00
} ,
] ,
listeners : {
destroy : function ( ) {
me . reload ( ) ;
} ,
} ,
} ) . show ( ) ;
} ,
2021-03-02 08:44:29 +01:00
labelMedia : function ( button , event , record ) {
let me = this ;
Ext . create ( 'PBS.TapeManagement.LabelMediaWindow' , {
driveid : record . data . name ,
2021-03-02 09:54:33 +01:00
label : record . data [ "label-text" ] ,
2021-03-02 08:44:29 +01:00
} ) . show ( ) ;
} ,
2021-03-02 08:53:18 +01:00
catalog : function ( button , event , record ) {
let me = this ;
let view = me . getView ( ) ;
PBS . Utils . driveCommand ( record . data . name , 'catalog' , {
waitMsgTarget : view ,
method : 'POST' ,
success : function ( response ) {
Ext . create ( 'Proxmox.window.TaskViewer' , {
upid : response . result . data ,
} ) . show ( ) ;
} ,
} ) ;
} ,
2021-04-14 12:34:08 +02:00
'format-inserted' : function ( button , event , record ) {
let me = this ;
let view = me . getView ( ) ;
PBS . Utils . driveCommand ( record . data . name , 'format-media' , {
waitMsgTarget : view ,
method : 'POST' ,
success : function ( response ) {
Ext . create ( 'Proxmox.window.TaskProgress' , {
upid : response . result . data ,
taskDone : function ( ) {
me . reload ( ) ;
} ,
} ) . show ( ) ;
} ,
} ) ;
} ,
2021-04-14 12:21:37 +02:00
format : function ( v , rI , cI , button , el , record ) {
2021-02-16 12:48:10 +01:00
let me = this ;
2021-03-01 12:22:42 +01:00
let view = me . getView ( ) ;
2021-02-16 12:48:10 +01:00
let label = record . data [ 'label-text' ] ;
2021-03-01 12:22:42 +01:00
let changer = encodeURIComponent ( view . changer ) ;
2021-04-08 13:39:16 +02:00
let singleDrive = me . drives . length === 1 ? me . drives [ 0 ] : undefined ;
2021-02-16 12:48:10 +01:00
Ext . create ( 'PBS.TapeManagement.EraseWindow' , {
label ,
changer ,
2021-04-08 13:39:16 +02:00
singleDrive ,
2021-02-16 12:48:10 +01:00
listeners : {
destroy : function ( ) {
me . reload ( ) ;
} ,
} ,
} ) . show ( ) ;
} ,
2021-03-01 12:22:42 +01:00
load : function ( v , rI , cI , button , el , record ) {
2021-01-28 12:59:48 +01:00
let me = this ;
2021-03-01 12:22:42 +01:00
let view = me . getView ( ) ;
2021-01-28 12:59:48 +01:00
let label = record . data [ 'label-text' ] ;
2021-04-30 10:13:13 +02:00
let slot = record . data [ 'entry-id' ] ;
2021-01-28 12:59:48 +01:00
2021-03-01 12:22:42 +01:00
let changer = encodeURIComponent ( view . changer ) ;
2021-04-08 13:39:17 +02:00
let singleDrive = me . drives . length === 1 ? me . drives [ 0 ] : undefined ;
2021-01-28 12:59:48 +01:00
2021-04-30 10:13:13 +02:00
let apiCall = label !== "" ? 'load-media' : 'load-slot' ;
let params = label !== "" ? { 'label-text' : label } : { 'source-slot' : slot } ;
2021-04-08 13:39:17 +02:00
if ( singleDrive !== undefined ) {
Proxmox . Utils . API2Request ( {
method : 'POST' ,
2021-04-30 10:13:13 +02:00
params ,
url : ` /api2/extjs/tape/drive/ ${ singleDrive } / ${ apiCall } ` ,
2021-04-08 13:39:17 +02:00
success : function ( response , opt ) {
Ext . create ( 'Proxmox.window.TaskProgress' , {
upid : response . result . data ,
taskDone : function ( success ) {
me . reload ( ) ;
} ,
} ) . show ( ) ;
2021-01-28 12:59:48 +01:00
} ,
2021-04-08 13:39:17 +02:00
failure : function ( response , opt ) {
Ext . Msg . alert ( gettext ( 'Error' ) , response . htmlStatus ) ;
2021-01-28 12:59:48 +01:00
} ,
2021-04-08 13:39:17 +02:00
} ) ;
} else {
Ext . create ( 'Proxmox.window.Edit' , {
isCreate : true ,
autoShow : true ,
submitText : gettext ( 'OK' ) ,
title : gettext ( 'Load Media into Drive' ) ,
url : ` /api2/extjs/tape/drive ` ,
method : 'POST' ,
submitUrl : function ( url , values ) {
let drive = values . drive ;
delete values . drive ;
2021-04-30 10:13:13 +02:00
return ` ${ url } / ${ encodeURIComponent ( drive ) } / ${ apiCall } ` ;
2021-04-08 13:39:17 +02:00
} ,
items : [
2021-04-30 11:46:42 +02:00
label !== "" ? {
2021-04-08 13:39:17 +02:00
xtype : 'displayfield' ,
name : 'label-text' ,
value : label ,
submitValue : true ,
fieldLabel : gettext ( 'Media' ) ,
2021-04-30 10:13:13 +02:00
} : {
xtype : 'displayfield' ,
name : 'source-slot' ,
value : slot ,
submitValue : true ,
fieldLabel : gettext ( 'Source Slot' ) ,
2021-04-08 13:39:17 +02:00
} ,
{
xtype : 'pbsDriveSelector' ,
fieldLabel : gettext ( 'Drive' ) ,
changer : changer ,
name : 'drive' ,
} ,
] ,
listeners : {
destroy : function ( ) {
me . reload ( ) ;
} ,
} ,
} ) ;
}
2021-01-28 12:59:48 +01:00
} ,
2021-03-01 12:22:42 +01:00
unload : async function ( v , rI , cI , button , el , record ) {
2021-01-28 12:59:48 +01:00
let me = this ;
let drive = record . data . name ;
try {
2021-07-09 16:53:11 +02:00
await Proxmox . Async . api2 ( {
2021-02-18 09:18:09 +01:00
method : 'POST' ,
2021-02-15 12:18:19 +01:00
timeout : 5 * 60 * 1000 ,
2021-01-28 12:59:48 +01:00
url : ` /api2/extjs/tape/drive/ ${ encodeURIComponent ( drive ) } /unload ` ,
} ) ;
2021-07-09 16:53:11 +02:00
} catch ( response ) {
Ext . Msg . alert ( gettext ( 'Error' ) , response . result . message ) ;
2021-01-28 12:59:48 +01:00
}
2021-02-23 09:06:33 +01:00
me . reload ( ) ;
2021-01-28 12:59:48 +01:00
} ,
cartridgeMemory : function ( view , rI , cI , button , el , record ) {
let me = this ;
let drive = record . data . name ;
2021-02-25 11:52:42 +01:00
PBS . Utils . driveCommand ( drive , 'cartridge-memory' , {
waitMsgTarget : me . getView ( ) ,
success : PBS . Utils . showCartridgeMemoryWindow ,
2021-01-28 12:59:48 +01:00
} ) ;
} ,
2021-03-02 08:59:00 +01:00
cleanDrive : function ( button , event , record ) {
2021-01-28 12:59:48 +01:00
let me = this ;
2021-02-25 11:52:42 +01:00
PBS . Utils . driveCommand ( record . data . name , 'clean' , {
waitMsgTarget : me . getView ( ) ,
method : 'PUT' ,
2021-03-02 12:16:30 +01:00
success : function ( response ) {
Ext . create ( 'Proxmox.window.TaskProgress' , {
upid : response . result . data ,
taskDone : function ( ) {
me . reload ( ) ;
} ,
} ) . show ( ) ;
} ,
2021-02-25 11:52:42 +01:00
} ) ;
2021-01-28 12:59:48 +01:00
} ,
volumeStatistics : function ( view , rI , cI , button , el , record ) {
let me = this ;
let drive = record . data . name ;
2021-02-25 11:52:42 +01:00
PBS . Utils . driveCommand ( drive , 'volume-statistics' , {
waitMsgTarget : me . getView ( ) ,
success : PBS . Utils . showVolumeStatisticsWindow ,
2021-01-28 12:59:48 +01:00
} ) ;
} ,
readLabel : function ( view , rI , cI , button , el , record ) {
let me = this ;
let drive = record . data . name ;
2021-02-25 11:52:42 +01:00
PBS . Utils . driveCommand ( drive , 'read-label' , {
waitMsgTarget : me . getView ( ) ,
success : PBS . Utils . showMediaLabelWindow ,
2021-01-28 12:59:48 +01:00
} ) ;
} ,
status : function ( view , rI , cI , button , el , record ) {
let me = this ;
let drive = record . data . name ;
2021-02-25 11:52:42 +01:00
PBS . Utils . driveCommand ( drive , 'status' , {
waitMsgTarget : me . getView ( ) ,
success : PBS . Utils . showDriveStatusWindow ,
2021-01-28 12:59:48 +01:00
} ) ;
} ,
reloadList : function ( ) {
let me = this ;
me . lookup ( 'changerselector' ) . getStore ( ) . load ( ) ;
} ,
barcodeLabel : function ( ) {
let me = this ;
2021-03-01 12:22:42 +01:00
let view = me . getView ( ) ;
let changer = view . changer ;
2021-01-28 12:59:48 +01:00
if ( changer === '' ) {
return ;
}
2021-04-08 13:39:19 +02:00
let singleDrive = me . drives . length === 1 ? me . drives [ 0 ] : undefined ;
2021-01-28 12:59:48 +01:00
Ext . create ( 'Proxmox.window.Edit' , {
title : gettext ( 'Barcode Label' ) ,
showTaskViewer : true ,
2021-01-29 17:06:53 +01:00
method : 'POST' ,
2021-01-28 12:59:48 +01:00
url : '/api2/extjs/tape/drive' ,
submitUrl : function ( url , values ) {
let drive = values . drive ;
delete values . drive ;
return ` ${ url } / ${ encodeURIComponent ( drive ) } /barcode-label-media ` ;
} ,
items : [
{
2021-04-08 13:39:19 +02:00
xtype : singleDrive === undefined ? 'pbsDriveSelector' : 'displayfield' ,
2021-01-28 12:59:48 +01:00
fieldLabel : gettext ( 'Drive' ) ,
2021-04-08 13:39:19 +02:00
submitValue : true ,
2021-01-28 12:59:48 +01:00
name : 'drive' ,
2021-04-08 13:39:19 +02:00
value : singleDrive ,
2021-01-28 12:59:48 +01:00
changer : changer ,
} ,
{
xtype : 'pbsMediaPoolSelector' ,
fieldLabel : gettext ( 'Pool' ) ,
name : 'pool' ,
skipEmptyText : true ,
allowBlank : true ,
} ,
] ,
} ) . show ( ) ;
} ,
2021-02-05 15:26:18 +01:00
inventory : function ( ) {
let me = this ;
2021-03-01 12:22:42 +01:00
let view = me . getView ( ) ;
let changer = view . changer ;
2021-02-05 15:26:18 +01:00
if ( changer === '' ) {
return ;
}
2022-10-19 13:13:34 +02:00
Ext . create ( 'Proxmox.window.Edit' , {
title : gettext ( 'Inventory' ) ,
showTaskViewer : true ,
method : 'PUT' ,
url : '/api2/extjs/tape/drive' ,
submitUrl : function ( url , values ) {
let drive = values . drive ;
delete values . drive ;
return ` ${ url } / ${ encodeURIComponent ( drive ) } /inventory ` ;
} ,
2021-02-05 15:26:18 +01:00
2022-10-19 13:13:34 +02:00
items : [
{
xtype : 'pbsDriveSelector' ,
labelWidth : 120 ,
fieldLabel : gettext ( 'Drive' ) ,
name : 'drive' ,
changer : changer ,
autoSelect : true ,
2021-02-05 15:26:18 +01:00
} ,
2022-10-19 13:13:34 +02:00
{
xtype : 'proxmoxcheckbox' ,
labelWidth : 120 ,
fieldLabel : gettext ( 'Restore Catalogs' ) ,
name : 'catalog' ,
2021-04-08 13:39:18 +02:00
} ,
2022-10-19 13:13:34 +02:00
{
xtype : 'proxmoxcheckbox' ,
labelWidth : 120 ,
fieldLabel : gettext ( 'Force all Tapes' ) ,
name : 'read-all-labels' ,
2021-04-08 13:39:18 +02:00
} ,
2022-10-19 13:13:34 +02:00
] ,
} ) . show ( ) ;
2021-02-05 15:26:18 +01:00
} ,
2021-02-22 14:25:35 +01:00
scheduleReload : function ( time ) {
let me = this ;
if ( me . reloadTimeout === undefined ) {
me . reloadTimeout = setTimeout ( function ( ) {
me . reload ( ) ;
} , time ) ;
}
} ,
2021-03-01 12:22:43 +01:00
cancelReload : function ( ) {
2021-02-22 14:25:35 +01:00
let me = this ;
if ( me . reloadTimeout !== undefined ) {
clearTimeout ( me . reloadTimeout ) ;
me . reloadTimeout = undefined ;
}
2021-03-01 12:22:43 +01:00
} ,
reload : function ( ) {
let me = this ;
me . cancelReload ( ) ;
2021-02-22 14:25:35 +01:00
me . reload _full ( true ) ;
2021-02-20 09:06:17 +01:00
} ,
reload _no _cache : function ( ) {
2021-02-22 14:25:35 +01:00
let me = this ;
if ( me . reloadTimeout !== undefined ) {
clearTimeout ( me . reloadTimeout ) ;
me . reloadTimeout = undefined ;
}
me . reload _full ( false ) ;
2021-02-20 09:06:17 +01:00
} ,
2021-04-08 13:39:15 +02:00
drives : [ ] ,
updateDrives : function ( drives ) {
let me = this ;
me . drives = drives ;
} ,
2021-03-12 16:06:27 +01:00
free _slots : [ ] ,
2021-04-08 13:39:14 +02:00
free _ie _slots : [ ] ,
2021-03-12 16:06:27 +01:00
updateFreeSlots : function ( free _slots , free _ie _slots ) {
let me = this ;
me . free _slots = free _slots ;
me . free _ie _slots = free _ie _slots ;
} ,
2021-02-20 09:06:17 +01:00
reload _full : async function ( use _cache ) {
2021-01-28 12:59:48 +01:00
let me = this ;
let view = me . getView ( ) ;
2021-03-01 12:22:42 +01:00
let changer = view . changer ;
2021-01-28 12:59:48 +01:00
if ( changer === '' ) {
return ;
}
try {
2021-02-22 14:25:34 +01:00
if ( ! use _cache ) {
Proxmox . Utils . setErrorMask ( view , true ) ;
Proxmox . Utils . setErrorMask ( me . lookup ( 'content' ) ) ;
}
2021-07-09 16:53:11 +02:00
let status _fut = Proxmox . Async . api2 ( {
2021-02-15 12:18:19 +01:00
timeout : 5 * 60 * 1000 ,
2021-02-20 09:06:17 +01:00
method : 'GET' ,
2021-01-28 12:59:48 +01:00
url : ` /api2/extjs/tape/changer/ ${ encodeURIComponent ( changer ) } /status ` ,
2021-02-20 09:06:17 +01:00
params : {
cache : use _cache ,
} ,
2021-01-28 12:59:48 +01:00
} ) ;
2021-07-09 16:53:11 +02:00
let drives _fut = Proxmox . Async . api2 ( {
2021-02-15 12:18:19 +01:00
timeout : 5 * 60 * 1000 ,
2021-01-28 12:59:48 +01:00
url : ` /api2/extjs/tape/drive?changer= ${ encodeURIComponent ( changer ) } ` ,
} ) ;
2021-07-09 16:53:11 +02:00
let tapes _fut = Proxmox . Async . api2 ( {
2021-02-15 12:18:19 +01:00
timeout : 5 * 60 * 1000 ,
2021-02-04 13:56:32 +01:00
url : '/api2/extjs/tape/media/list' ,
2021-02-18 11:08:13 +01:00
method : 'GET' ,
params : {
2021-02-18 12:06:49 +01:00
"update-status" : false ,
2021-02-19 15:40:23 +01:00
} ,
2021-02-04 13:56:32 +01:00
} ) ;
let [ status , drives , tapes _list ] = await Promise . all ( [ status _fut , drives _fut , tapes _fut ] ) ;
2021-01-28 12:59:48 +01:00
let data = {
slot : [ ] ,
'import-export' : [ ] ,
drive : [ ] ,
} ;
2021-02-04 13:56:32 +01:00
let tapes = { } ;
for ( const tape of tapes _list . result . data ) {
2021-02-09 15:40:44 +01:00
tapes [ tape [ 'label-text' ] ] = {
labeled : true ,
pool : tape . pool ,
status : tape . expired ? 'expired' : tape . status ,
} ;
2021-02-04 13:56:32 +01:00
}
2021-01-28 12:59:48 +01:00
let drive _entries = { } ;
for ( const entry of drives . result . data ) {
drive _entries [ entry [ 'changer-drivenum' ] || 0 ] = entry ;
}
2021-03-12 16:06:27 +01:00
let free _slots = [ ] ;
let free _ie _slots = [ ] ;
2021-04-08 13:39:15 +02:00
let valid _drives = [ ] ;
2021-01-28 12:59:48 +01:00
for ( let entry of status . result . data ) {
let type = entry [ 'entry-kind' ] ;
2021-04-08 13:39:15 +02:00
let id = entry [ 'entry-id' ] ;
2021-01-28 12:59:48 +01:00
2021-04-14 14:11:22 +02:00
if ( type === 'drive' ) {
if ( drive _entries [ id ] === undefined ) {
continue ;
}
2021-04-08 13:39:15 +02:00
entry = Ext . applyIf ( entry , drive _entries [ id ] ) ;
valid _drives . push ( drive _entries [ id ] . name ) ;
2021-01-28 12:59:48 +01:00
}
2021-02-09 15:40:44 +01:00
if ( tapes [ entry [ 'label-text' ] ] !== undefined ) {
entry [ 'is-labeled' ] = true ;
entry . pool = tapes [ entry [ 'label-text' ] ] . pool ;
entry . status = tapes [ entry [ 'label-text' ] ] . status ;
} else {
entry [ 'is-labeled' ] = false ;
}
2021-02-04 13:56:32 +01:00
2021-03-12 16:06:27 +01:00
if ( ! entry [ 'label-text' ] && type !== 'drive' ) {
if ( type === 'slot' ) {
free _slots . push ( {
2021-04-08 13:39:15 +02:00
id ,
2021-03-12 16:06:27 +01:00
type ,
} ) ;
} else {
free _ie _slots . push ( {
2021-04-08 13:39:15 +02:00
id ,
2021-03-12 16:06:27 +01:00
type ,
} ) ;
}
}
2021-01-28 12:59:48 +01:00
data [ type ] . push ( entry ) ;
}
2021-02-22 14:25:36 +01:00
// the stores are diffstores and are only refreshed
// on a 'load' event, which does not trigger on 'setData'
// so we have to fire them ourselves
2021-01-28 12:59:48 +01:00
2021-02-22 14:25:36 +01:00
me . lookup ( 'slots' ) . getStore ( ) . rstore . setData ( data . slot ) ;
me . lookup ( 'slots' ) . getStore ( ) . rstore . fireEvent ( 'load' , me , [ ] , true ) ;
me . lookup ( 'import_export' ) . getStore ( ) . rstore . setData ( data [ 'import-export' ] ) ;
me . lookup ( 'import_export' ) . getStore ( ) . rstore . fireEvent ( 'load' , me , [ ] , true ) ;
me . lookup ( 'drives' ) . getStore ( ) . rstore . setData ( data . drive ) ;
me . lookup ( 'drives' ) . getStore ( ) . rstore . fireEvent ( 'load' , me , [ ] , true ) ;
2021-01-28 12:59:48 +01:00
2021-03-02 09:54:33 +01:00
// manually fire selectionchange to update button status
me . lookup ( 'drives' ) . getSelectionModel ( ) . fireEvent ( 'selectionchange' , me ) ;
2021-03-12 16:06:27 +01:00
me . updateFreeSlots ( free _slots , free _ie _slots ) ;
2021-04-08 13:39:15 +02:00
me . updateDrives ( valid _drives ) ;
2021-03-12 16:06:27 +01:00
2021-02-22 14:25:34 +01:00
if ( ! use _cache ) {
Proxmox . Utils . setErrorMask ( view ) ;
}
Proxmox . Utils . setErrorMask ( me . lookup ( 'content' ) ) ;
2021-07-09 16:53:11 +02:00
} catch ( response ) {
2021-03-01 12:22:43 +01:00
if ( ! view || view . isDestroyed ) {
return ;
}
2021-02-22 14:25:34 +01:00
if ( ! use _cache ) {
Proxmox . Utils . setErrorMask ( view ) ;
}
2021-07-09 16:53:11 +02:00
Proxmox . Utils . setErrorMask ( me . lookup ( 'content' ) , response . result . message . toString ( ) ) ;
2021-01-28 12:59:48 +01:00
}
2021-02-22 14:25:35 +01:00
me . scheduleReload ( 5000 ) ;
2021-01-28 12:59:48 +01:00
} ,
2021-02-18 09:18:07 +01:00
2021-04-30 10:13:13 +02:00
renderLabel : function ( value ) {
if ( value === undefined ) {
return '' ;
}
if ( value === "" ) {
return Ext . htmlEncode ( "<no-barcode>" ) ;
}
return value ;
} ,
2021-02-18 09:18:07 +01:00
renderIsLabeled : function ( value , mD , record ) {
if ( ! record . data [ 'label-text' ] ) {
return "" ;
}
if ( record . data [ 'label-text' ] . startsWith ( "CLN" ) ) {
return "" ;
}
if ( ! value ) {
return gettext ( 'Not Labeled' ) ;
}
let status = record . data . status ;
if ( record . data . pool ) {
return ` ${ status } ( ${ record . data . pool } ) ` ;
}
return status ;
} ,
2021-02-18 15:40:30 +01:00
control : {
'grid[reference=drives]' : {
cellclick : function ( table , td , ci , rec , tr , ri , e ) {
2021-02-19 15:40:24 +01:00
if ( e . position . column . dataIndex !== 'state' ) {
2021-02-18 15:40:30 +01:00
return ;
}
let upid = rec . data . state ;
if ( ! upid || ! upid . startsWith ( "UPID" ) ) {
return ;
}
Ext . create ( 'Proxmox.window.TaskViewer' , {
autoShow : true ,
upid ,
} ) ;
} ,
} ,
} ,
2021-03-01 12:22:42 +01:00
init : function ( view ) {
let me = this ;
if ( ! view . changer ) {
throw "no changer given" ;
}
view . title = ` ${ gettext ( "Changer" ) } : ${ view . changer } ` ;
2021-03-01 12:22:43 +01:00
me . reload ( ) ;
2021-03-01 12:22:42 +01:00
} ,
2021-01-28 12:59:48 +01:00
} ,
listeners : {
2021-03-01 12:22:43 +01:00
deactivate : 'cancelReload' ,
2021-05-26 11:12:01 +02:00
beforedestroy : 'cancelReload' ,
2021-01-28 12:59:48 +01:00
} ,
tbar : [
{
text : gettext ( 'Reload' ) ,
xtype : 'proxmoxButton' ,
2021-02-20 09:06:17 +01:00
handler : 'reload_no_cache' ,
2021-01-28 12:59:48 +01:00
selModel : false ,
} ,
'-' ,
{
text : gettext ( 'Barcode Label' ) ,
xtype : 'proxmoxButton' ,
handler : 'barcodeLabel' ,
iconCls : 'fa fa-barcode' ,
} ,
2021-02-05 15:26:18 +01:00
{
text : gettext ( 'Inventory' ) ,
xtype : 'proxmoxButton' ,
handler : 'inventory' ,
iconCls : 'fa fa-book' ,
} ,
2021-01-28 12:59:48 +01:00
] ,
2021-07-23 08:31:51 +02:00
layout : 'fit' ,
2021-01-28 12:59:48 +01:00
bodyPadding : 5 ,
items : [
{
xtype : 'container' ,
reference : 'content' ,
layout : {
type : 'hbox' ,
2021-07-23 08:31:51 +02:00
align : 'stretch' ,
2021-01-28 12:59:48 +01:00
} ,
items : [
{
xtype : 'grid' ,
reference : 'slots' ,
title : gettext ( 'Slots' ) ,
padding : 5 ,
2021-07-23 08:31:51 +02:00
srollable : true ,
2021-01-28 12:59:48 +01:00
flex : 1 ,
store : {
2021-02-22 14:25:36 +01:00
type : 'diff' ,
rstore : {
type : 'store' ,
model : 'pbs-slot-model' ,
} ,
2021-01-28 12:59:48 +01:00
data : [ ] ,
} ,
columns : [
{
2021-02-18 09:18:08 +01:00
text : gettext ( 'ID' ) ,
2021-01-28 12:59:48 +01:00
dataIndex : 'entry-id' ,
width : 50 ,
} ,
{
text : gettext ( "Content" ) ,
dataIndex : 'label-text' ,
flex : 1 ,
2021-04-30 10:13:13 +02:00
renderer : 'renderLabel' ,
2021-01-28 12:59:48 +01:00
} ,
2021-02-04 13:56:32 +01:00
{
2021-02-09 15:40:44 +01:00
text : gettext ( 'Inventory' ) ,
2021-02-04 13:56:32 +01:00
dataIndex : 'is-labeled' ,
2021-02-18 09:18:07 +01:00
renderer : 'renderIsLabeled' ,
2021-02-09 15:40:44 +01:00
flex : 1 ,
2021-02-04 13:56:32 +01:00
} ,
2021-01-28 12:59:48 +01:00
{
text : gettext ( 'Actions' ) ,
xtype : 'actioncolumn' ,
width : 100 ,
items : [
{
iconCls : 'fa fa-rotate-90 fa-exchange' ,
handler : 'slotTransfer' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Transfer' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] ,
2021-01-28 12:59:48 +01:00
} ,
2021-02-16 12:48:10 +01:00
{
iconCls : 'fa fa-trash-o' ,
2021-04-14 12:21:37 +02:00
handler : 'format' ,
tooltip : gettext ( 'Format' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] ,
2021-02-16 12:48:10 +01:00
} ,
2021-01-28 12:59:48 +01:00
{
iconCls : 'fa fa-rotate-90 fa-upload' ,
handler : 'load' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Load' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] ,
2021-01-28 12:59:48 +01:00
} ,
] ,
} ,
] ,
} ,
{
xtype : 'container' ,
flex : 2 ,
defaults : {
padding : 5 ,
} ,
2021-07-23 08:31:51 +02:00
layout : {
type : 'vbox' ,
align : 'stretch' ,
} ,
2021-01-28 12:59:48 +01:00
items : [
{
xtype : 'grid' ,
reference : 'drives' ,
2021-07-23 08:31:51 +02:00
scrollable : true ,
maxHeight : 350 , // ~10 drives
2021-01-28 12:59:48 +01:00
title : gettext ( 'Drives' ) ,
store : {
2021-02-22 14:25:36 +01:00
type : 'diff' ,
rstore : {
type : 'store' ,
model : 'pbs-slot-model' ,
} ,
2021-01-28 12:59:48 +01:00
data : [ ] ,
} ,
2021-03-02 08:44:29 +01:00
tbar : [
{
text : gettext ( 'Label Media' ) ,
xtype : 'proxmoxButton' ,
handler : 'labelMedia' ,
iconCls : 'fa fa-barcode' ,
disabled : true ,
2021-04-30 10:13:13 +02:00
enableFn : ( rec ) => ! rec . data [ "is-empty" ] ,
2021-03-02 08:44:29 +01:00
} ,
2021-03-02 08:53:18 +01:00
{
text : gettext ( 'Catalog' ) ,
xtype : 'proxmoxButton' ,
handler : 'catalog' ,
iconCls : 'fa fa-book' ,
disabled : true ,
2021-04-30 10:13:13 +02:00
enableFn : ( rec ) => ! rec . data [ "is-empty" ] ,
2021-03-02 08:53:18 +01:00
} ,
2021-04-14 12:34:08 +02:00
{
text : gettext ( 'Format' ) ,
xtype : 'proxmoxButton' ,
handler : 'format-inserted' ,
iconCls : 'fa fa-trash-o' ,
disabled : true ,
2021-04-30 10:13:13 +02:00
enableFn : ( rec ) => ! rec . data [ "is-empty" ] ,
2021-04-14 12:34:08 +02:00
dangerous : true ,
confirmMsg : gettext ( 'Are you sure you want to format the inserted tape?' ) ,
} ,
'-' ,
2021-03-02 08:59:00 +01:00
{
text : gettext ( 'Clean Drive' ) ,
xtype : 'proxmoxButton' ,
handler : 'cleanDrive' ,
iconCls : 'fa fa-shower' ,
disabled : true ,
} ,
2021-03-02 08:44:29 +01:00
] ,
2021-01-28 12:59:48 +01:00
columns : [
{
2021-02-18 09:18:08 +01:00
text : gettext ( 'ID' ) ,
2021-01-28 12:59:48 +01:00
dataIndex : 'entry-id' ,
2021-02-18 09:18:08 +01:00
hidden : true ,
2021-01-28 12:59:48 +01:00
width : 50 ,
} ,
{
text : gettext ( "Content" ) ,
dataIndex : 'label-text' ,
flex : 1 ,
2021-04-30 10:13:13 +02:00
renderer : 'renderLabel' ,
2021-01-28 12:59:48 +01:00
} ,
2021-02-18 09:18:07 +01:00
{
text : gettext ( 'Inventory' ) ,
dataIndex : 'is-labeled' ,
renderer : 'renderIsLabeled' ,
2021-02-18 15:40:30 +01:00
flex : 1.5 ,
2021-02-18 09:18:07 +01:00
} ,
2021-01-28 12:59:48 +01:00
{
text : gettext ( "Name" ) ,
sortable : true ,
dataIndex : 'name' ,
flex : 1 ,
renderer : Ext . htmlEncode ,
} ,
2021-02-18 15:40:30 +01:00
{
text : gettext ( 'State' ) ,
dataIndex : 'state' ,
flex : 3 ,
2021-03-02 12:19:37 +01:00
renderer : PBS . Utils . renderDriveState ,
2021-02-18 15:40:30 +01:00
} ,
2021-01-28 12:59:48 +01:00
{
text : gettext ( "Vendor" ) ,
sortable : true ,
dataIndex : 'vendor' ,
2021-02-18 15:40:30 +01:00
hidden : true ,
2021-01-28 12:59:48 +01:00
flex : 1 ,
renderer : Ext . htmlEncode ,
} ,
{
text : gettext ( "Model" ) ,
sortable : true ,
dataIndex : 'model' ,
2021-02-18 15:40:30 +01:00
hidden : true ,
2021-01-28 12:59:48 +01:00
flex : 1 ,
renderer : Ext . htmlEncode ,
} ,
{
text : gettext ( "Serial" ) ,
sortable : true ,
dataIndex : 'serial' ,
2021-02-18 15:40:30 +01:00
hidden : true ,
2021-01-28 12:59:48 +01:00
flex : 1 ,
renderer : Ext . htmlEncode ,
} ,
{
xtype : 'actioncolumn' ,
text : gettext ( 'Actions' ) ,
width : 140 ,
items : [
{
iconCls : 'fa fa-rotate-270 fa-upload' ,
handler : 'unload' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Unload' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] || rec . data [ 'is-blocked' ] ,
2021-01-28 12:59:48 +01:00
} ,
{
iconCls : 'fa fa-hdd-o' ,
handler : 'cartridgeMemory' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Cartridge Memory' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] || rec . data [ 'is-blocked' ] ,
2021-01-28 12:59:48 +01:00
} ,
{
iconCls : 'fa fa-line-chart' ,
handler : 'volumeStatistics' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Volume Statistics' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] || rec . data [ 'is-blocked' ] ,
2021-01-28 12:59:48 +01:00
} ,
{
iconCls : 'fa fa-tag' ,
handler : 'readLabel' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Read Label' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] || rec . data [ 'is-blocked' ] ,
2021-01-28 12:59:48 +01:00
} ,
{
iconCls : 'fa fa-info-circle' ,
2021-01-29 14:57:52 +01:00
tooltip : gettext ( 'Status' ) ,
2021-01-28 12:59:48 +01:00
handler : 'status' ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-blocked' ] ,
2021-01-28 12:59:48 +01:00
} ,
] ,
} ,
] ,
} ,
{
xtype : 'grid' ,
reference : 'import_export' ,
2021-07-23 08:31:51 +02:00
flex : 1 ,
srollable : true ,
2021-01-28 12:59:48 +01:00
store : {
2021-02-22 14:25:36 +01:00
type : 'diff' ,
rstore : {
type : 'store' ,
model : 'pbs-slot-model' ,
} ,
2021-01-28 12:59:48 +01:00
data : [ ] ,
} ,
2021-02-18 09:18:08 +01:00
title : gettext ( 'Import-Export Slots' ) ,
2021-01-28 12:59:48 +01:00
columns : [
{
2021-02-18 09:18:08 +01:00
text : gettext ( 'ID' ) ,
2021-01-28 12:59:48 +01:00
dataIndex : 'entry-id' ,
width : 50 ,
} ,
{
text : gettext ( "Content" ) ,
dataIndex : 'label-text' ,
2021-04-30 10:13:13 +02:00
renderer : 'renderLabel' ,
2021-01-28 12:59:48 +01:00
flex : 1 ,
} ,
2021-02-18 09:18:07 +01:00
{
text : gettext ( 'Inventory' ) ,
dataIndex : 'is-labeled' ,
renderer : 'renderIsLabeled' ,
flex : 1 ,
} ,
2021-01-28 12:59:48 +01:00
{
text : gettext ( 'Actions' ) ,
2021-01-29 14:57:50 +01:00
xtype : 'actioncolumn' ,
items : [
{
iconCls : 'fa fa-rotate-270 fa-upload' ,
handler : 'importTape' ,
tooltip : gettext ( 'Import' ) ,
2021-05-26 11:12:05 +02:00
isActionDisabled : ( v , r , c , i , rec ) => rec . data [ 'is-empty' ] ,
2021-01-29 14:57:50 +01:00
} ,
] ,
2021-01-28 12:59:48 +01:00
width : 80 ,
} ,
] ,
} ,
] ,
} ,
] ,
} ,
] ,
} ) ;