diff --git a/www/Makefile b/www/Makefile index 9f9b46aa..11858f98 100644 --- a/www/Makefile +++ b/www/Makefile @@ -23,6 +23,7 @@ TAPE_UI_FILES= \ tape/window/LabelMedia.js \ tape/window/PoolEdit.js \ tape/window/TapeBackup.js \ + tape/window/TapeBackupJob.js \ tape/window/TapeRestore.js \ tape/BackupOverview.js \ tape/ChangerConfig.js \ diff --git a/www/tape/BackupJobs.js b/www/tape/BackupJobs.js index 7c23864f..2532fb38 100644 --- a/www/tape/BackupJobs.js +++ b/www/tape/BackupJobs.js @@ -34,6 +34,75 @@ Ext.define('PBS.config.TapeBackupJobView', { controller: { xclass: 'Ext.app.ViewController', + addJob: function() { + let me = this; + Ext.create('PBS.TapeManagement.BackupJobEdit', { + autoShow: true, + listeners: { + destroy: function() { + me.reload(); + }, + }, + }).show(); + }, + + editJob: function() { + let me = this; + let view = me.getView(); + let selection = view.getSelection(); + if (!selection || selection.length < 1) { + return; + } + + Ext.create('PBS.TapeManagement.BackupJobEdit', { + id: selection[0].data.id, + autoShow: true, + listeners: { + destroy: function() { + me.reload(); + }, + }, + }).show(); + }, + + openTaskLog: function() { + let me = this; + let view = me.getView(); + let selection = view.getSelection(); + if (selection.length < 1) return; + + let upid = selection[0].data['last-run-upid']; + if (!upid) return; + + Ext.create('Proxmox.window.TaskViewer', { + upid, + }).show(); + }, + + runJob: function() { + let me = this; + let view = me.getView(); + let selection = view.getSelection(); + if (selection.length < 1) return; + + let id = selection[0].data.id; + Proxmox.Utils.API2Request({ + method: 'POST', + url: `/tape/backup/${id}`, + success: function(response, opt) { + Ext.create('Proxmox.window.TaskViewer', { + upid: response.result.data, + taskDone: function(success) { + me.reload(); + }, + }).show(); + }, + failure: function(response, opt) { + Ext.Msg.alert(gettext('Error'), response.htmlStatus); + }, + }); + }, + startStore: function() { this.getView().getStore().rstore.startUpdate(); }, stopStore: function() { this.getView().getStore().rstore.stopUpdate(); }, @@ -48,7 +117,7 @@ Ext.define('PBS.config.TapeBackupJobView', { listeners: { activate: 'startStore', deactivate: 'stopStore', - //itemdblclick: 'editSyncJob', + itemdblclick: 'editJob', }, store: { @@ -68,6 +137,41 @@ Ext.define('PBS.config.TapeBackupJobView', { trackOver: false, }, + tbar: [ + { + xtype: 'proxmoxButton', + text: gettext('Add'), + selModel: false, + handler: 'addJob', + }, + { + xtype: 'proxmoxButton', + text: gettext('Edit'), + handler: 'editJob', + disabled: true, + }, + { + xtype: 'proxmoxStdRemoveButton', + baseurl: '/config/tape-backup-job/', + confirmMsg: gettext('Remove entry?'), + callback: 'reload', + }, + '-', + { + xtype: 'proxmoxButton', + text: gettext('Show Log'), + handler: 'openTaskLog', + enableFn: (rec) => !!rec.data['last-run-upid'], + disabled: true, + }, + { + xtype: 'proxmoxButton', + text: gettext('Run now'), + handler: 'runJob', + disabled: true, + }, + ], + columns: [ { header: gettext('Job ID'), diff --git a/www/tape/window/TapeBackupJob.js b/www/tape/window/TapeBackupJob.js new file mode 100644 index 00000000..9902a454 --- /dev/null +++ b/www/tape/window/TapeBackupJob.js @@ -0,0 +1,82 @@ +Ext.define('PBS.TapeManagement.BackupJobEdit', { + extend: 'Proxmox.window.Edit', + alias: 'widget.pbsTapeBackupJobEdit', + mixins: ['Proxmox.Mixin.CBind'], + + userid: undefined, + + isAdd: true, + + subject: gettext('Tape Backup Job'), + + fieldDefaults: { labelWidth: 120 }, + + cbindData: function(initialConfig) { + let me = this; + + let baseurl = '/api2/extjs/config/tape-backup-job'; + let id = initialConfig.id; + + me.isCreate = !id; + me.url = id ? `${baseurl}/${id}` : baseurl; + me.method = id ? 'PUT' : 'POST'; + me.autoLoad = !!id; + me.scheduleValue = id ? null : 'daily'; + me.authid = id ? null : Proxmox.UserName; + me.editDatastore = me.datastore === undefined && me.isCreate; + return { }; + }, + + items: { + xtype: 'inputpanel', + onGetValues: function(values) { + let me = this; + + if (!values.id && me.up('pbsTapeBackupJobEdit').isCreate) { + values.id = 's-' + Ext.data.identifier.Uuid.Global.generate().slice(0, 13); + } + return values; + }, + column1: [ + { + xtype: 'pbsDataStoreSelector', + fieldLabel: gettext('Local Datastore'), + name: 'store', + }, + { + xtype: 'pbsMediaPoolSelector', + fieldLabel: gettext('Media Pool'), + name: 'pool', + }, + { + xtype: 'pbsDriveSelector', + fieldLabel: gettext('Drive'), + name: 'drive', + }, + ], + + column2: [ + { + fieldLabel: gettext('Schedule'), + xtype: 'pbsCalendarEvent', + name: 'schedule', + emptyText: gettext('none (disabled)'), + cbind: { + deleteEmpty: '{!isCreate}', + value: '{scheduleValue}', + }, + }, + ], + + columnB: [ + { + fieldLabel: gettext('Comment'), + xtype: 'proxmoxtextfield', + name: 'comment', + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, + ], + }, +});