[pbs-devel] [PATCH v1 proxmox-backup 08/14] ui: add verify job view
Dominik Csapak
d.csapak at proxmox.com
Thu Oct 1 12:40:15 CEST 2020
i'd
make the 'days-valid' columns bigger, by default only 'D...' is visible
add the 'ignore verified' as column also
rest looks good (altough we should refactor some of the
renderer/calculations if we add another schedule panel)
On 9/25/20 10:43 AM, Hannes Laimer wrote:
> Signed-off-by: Hannes Laimer <h.laimer at proxmox.com>
> ---
> www/Makefile | 1 +
> www/NavigationTree.js | 6 +
> www/config/VerifyView.js | 273 +++++++++++++++++++++++++++++++++++++++
> 3 files changed, 280 insertions(+)
> create mode 100644 www/config/VerifyView.js
>
> diff --git a/www/Makefile b/www/Makefile
> index 90a98b74..48d06266 100644
> --- a/www/Makefile
> +++ b/www/Makefile
> @@ -16,6 +16,7 @@ JSSRC= \
> config/RemoteView.js \
> config/ACLView.js \
> config/SyncView.js \
> + config/VerifyView.js \
> config/DataStoreConfig.js \
> window/UserEdit.js \
> window/UserPassword.js \
> diff --git a/www/NavigationTree.js b/www/NavigationTree.js
> index 0fd9458d..21b9b2a6 100644
> --- a/www/NavigationTree.js
> +++ b/www/NavigationTree.js
> @@ -42,6 +42,12 @@ Ext.define('PBS.store.NavigationStore', {
> path: 'pbsSyncJobView',
> leaf: true,
> },
> + {
> + text: gettext('Verify Jobs'),
> + iconCls: 'fa fa-check-circle',
> + path: 'pbsVerifyJobView',
> + leaf: true,
> + },
> {
> text: gettext('Subscription'),
> iconCls: 'fa fa-support',
> diff --git a/www/config/VerifyView.js b/www/config/VerifyView.js
> new file mode 100644
> index 00000000..e8722eb9
> --- /dev/null
> +++ b/www/config/VerifyView.js
> @@ -0,0 +1,273 @@
> +Ext.define('pbs-verify-jobs-status', {
> + extend: 'Ext.data.Model',
> + fields: [
> + 'id', 'store', 'outdated-after', 'schedule',
> + '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/admin/verify',
> + },
> +});
> +
> +Ext.define('PBS.config.VerifyJobView', {
> + extend: 'Ext.grid.GridPanel',
> + alias: 'widget.pbsVerifyJobView',
> +
> + stateful: true,
> + stateId: 'grid-verify-jobs',
> +
> + title: gettext('Verify Jobs'),
> +
> + controller: {
> + xclass: 'Ext.app.ViewController',
> +
> + addVerifyJob: function() {
> + let me = this;
> + Ext.create('PBS.window.VerifyJobEdit', {
> + listeners: {
> + destroy: function() {
> + me.reload();
> + },
> + },
> + }).show();
> + },
> +
> + editVerifyJob: function() {
> + let me = this;
> + let view = me.getView();
> + let selection = view.getSelection();
> + if (selection.length < 1) return;
> +
> + Ext.create('PBS.window.VerifyJobEdit', {
> + id: selection[0].data.id,
> + 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();
> + },
> +
> + runVerifyJob: 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: `/admin/verify/${id}/run`,
> + 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);
> + },
> + });
> + },
> +
> + render_verify_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 `<i class="fa fa-${icon}"></i> ${text}`;
> + },
> +
> + render_next_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);
> + },
> +
> + reload: function() { this.getView().getStore().rstore.load(); },
> +
> + init: function(view) {
> + Proxmox.Utils.monStoreErrors(view, view.getStore().rstore);
> + },
> + },
> +
> + listeners: {
> + activate: 'reload',
> + itemdblclick: 'editVerifyJob',
> + },
> +
> + store: {
> + type: 'diff',
> + autoDestroy: true,
> + autoDestroyRstore: true,
> + sorters: 'id',
> + rstore: {
> + type: 'update',
> + storeid: 'pbs-verify-jobs-status',
> + model: 'pbs-verify-jobs-status',
> + autoStart: true,
> + interval: 5000,
> + },
> + },
> +
> + tbar: [
> + {
> + xtype: 'proxmoxButton',
> + text: gettext('Add'),
> + handler: 'addVerifyJob',
> + selModel: false,
> + },
> + {
> + xtype: 'proxmoxButton',
> + text: gettext('Edit'),
> + handler: 'editVerifyJob',
> + disabled: true,
> + },
> + {
> + xtype: 'proxmoxStdRemoveButton',
> + baseurl: '/config/verify/',
> + callback: 'reload',
> + },
> + '-',
> + {
> + xtype: 'proxmoxButton',
> + text: gettext('Log'),
> + handler: 'openTaskLog',
> + enableFn: (rec) => !!rec.data['last-run-upid'],
> + disabled: true,
> + },
> + {
> + xtype: 'proxmoxButton',
> + text: gettext('Run now'),
> + handler: 'runVerifyJob',
> + disabled: true,
> + },
> + ],
> +
> + viewConfig: {
> + trackOver: false,
> + },
> +
> + columns: [
> + {
> + header: gettext('Verify Job'),
> + width: 100,
> + sortable: true,
> + renderer: Ext.String.htmlEncode,
> + dataIndex: 'id',
> + },
> + {
> + header: gettext('Datastore'),
> + width: 100,
> + sortable: true,
> + dataIndex: 'store',
> + },
> + {
> + header: gettext('Days valid'),
> + width: 50,
> + sortable: true,
> + dataIndex: 'outdated-after',
> + },
> + {
> + header: gettext('Schedule'),
> + sortable: true,
> + dataIndex: 'schedule',
> + },
> + {
> + header: gettext('Status'),
> + dataIndex: 'last-run-state',
> + flex: 1,
> + renderer: 'render_verify_status',
> + },
> + {
> + header: gettext('Last Verification'),
> + sortable: true,
> + minWidth: 200,
> + renderer: 'render_optional_timestamp',
> + dataIndex: 'last-run-endtime',
> + },
> + {
> + text: gettext('Duration'),
> + dataIndex: 'duration',
> + width: 60,
> + renderer: Proxmox.Utils.render_duration,
> + },
> + {
> + header: gettext('Next Run'),
> + sortable: true,
> + minWidth: 200,
> + renderer: 'render_next_run',
> + dataIndex: 'next-run',
> + },
> + {
> + header: gettext('Comment'),
> + hidden: true,
> + sortable: true,
> + renderer: Ext.String.htmlEncode,
> + dataIndex: 'comment',
> + },
> + ],
> +});
>
More information about the pbs-devel
mailing list