From 9e860ac01afb565ea166bbaf98a9609ce48e98f4 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 19 Feb 2021 09:08:00 +0100 Subject: [PATCH] ui: tape/BackupJobs.js - render task scheduling status --- www/Utils.js | 50 ++++++++++++++++++++++++++++++++++++++++++ www/tape/BackupJobs.js | 40 +++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/www/Utils.js b/www/Utils.js index d3f1fc21..3ce119a7 100644 --- a/www/Utils.js +++ b/www/Utils.js @@ -188,6 +188,56 @@ Ext.define('PBS.Utils', { return fingerprint.substring(0, 23); }, + render_task_status: function(value, metadata, record) { + if (!record.data['last-run-upid']) { + return '-'; + } + + if (!record.data['last-run-endtime']) { + metadata.tdCls = 'x-grid-row-loading'; + return ''; + } + + let parsed = Proxmox.Utils.parse_task_status(value); + let text = value; + let icon = ''; + switch (parsed) { + case 'unknown': + icon = 'question faded'; + text = Proxmox.Utils.unknownText; + break; + case 'error': + icon = 'times critical'; + text = Proxmox.Utils.errorText + ': ' + value; + break; + case 'warning': + icon = 'exclamation warning'; + break; + case 'ok': + icon = 'check good'; + text = gettext("OK"); + } + + return ` ${text}`; + }, + + render_next_task_run: function(value, metadat, record) { + if (!value) return '-'; + + let now = new Date(); + let next = new Date(value*1000); + + if (next < now) { + return gettext('pending'); + } + return Proxmox.Utils.render_timestamp(value); + }, + + render_optional_timestamp: function(value, metadata, record) { + if (!value) return '-'; + return Proxmox.Utils.render_timestamp(value); + }, + parse_datastore_worker_id: function(type, id) { let result; let res; diff --git a/www/tape/BackupJobs.js b/www/tape/BackupJobs.js index e2c03365..f8a64694 100644 --- a/www/tape/BackupJobs.js +++ b/www/tape/BackupJobs.js @@ -3,12 +3,22 @@ Ext.define('pbs-tape-backup-job-status', { fields: [ 'id', 'store', 'pool', 'drive', 'store', 'schedule', 'comment', { name: 'eject-media', type: 'boolean' }, - { name: 'export-media-set', type: 'boolean' } + { name: 'export-media-set', type: 'boolean' }, + 'next-run', 'last-run-upid', 'last-run-state', 'last-run-endtime', + { + name: 'duration', + calculate: function(data) { + let endtime = data['last-run-endtime']; + if (!endtime) return undefined; + let task = Proxmox.Utils.parse_task_upid(data['last-run-upid']); + return endtime - task.starttime; + }, + } ], idProperty: 'id', proxy: { type: 'proxmox', - url: '/api2/json/config/tape-backup-job', + url: '/api2/json/tape/backup', }, }); @@ -94,6 +104,32 @@ Ext.define('PBS.config.TapeBackupJobView', { flex: 1, sortable: true, }, + { + header: gettext('Last Backup'), + dataIndex: 'last-run-endtime', + renderer: PBS.Utils.render_optional_timestamp, + width: 150, + sortable: true, + }, + { + text: gettext('Duration'), + dataIndex: 'duration', + renderer: Proxmox.Utils.render_duration, + width: 80, + }, + { + header: gettext('Status'), + dataIndex: 'last-run-state', + renderer: PBS.Utils.render_task_status, + flex: 3, + }, + { + header: gettext('Next Run'), + dataIndex: 'next-run', + renderer: PBS.Utils.render_next_task_run, + width: 150, + sortable: true, + }, { header: gettext('Comment'), dataIndex: 'comment',