From 09d64465787cde2d9a1c5ed81ea9358e10a907ef Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 31 Jan 2017 09:25:24 +0100 Subject: [PATCH] add task list class --- Makefile | 1 + data/ProxmoxProxy.js | 42 +++++++++- node/Tasks.js | 178 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 node/Tasks.js diff --git a/Makefile b/Makefile index 7793761..20f89ee 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ JSSRC= \ grid/ObjectGrid.js \ window/Edit.js \ window/TaskViewer.js \ + node/Tasks.js \ node/TimeEdit.js \ node/TimeView.js diff --git a/data/ProxmoxProxy.js b/data/ProxmoxProxy.js index ff6fbee..d0e5a2a 100644 --- a/data/ProxmoxProxy.js +++ b/data/ProxmoxProxy.js @@ -1,7 +1,7 @@ Ext.define('Proxmox.RestProxy', { extend: 'Ext.data.RestProxy', alias : 'proxy.proxmox', - + pageParam : null, startParam: null, limitParam: null, @@ -17,14 +17,14 @@ Ext.define('Proxmox.RestProxy', { constructor: function(config) { - Ext.applyIf(config, { + Ext.applyIf(config, { reader: { type: 'json', rootProperty: config.root || 'data' } }); - this.callParent([config]); + this.callParent([config]); } }, function() { @@ -34,4 +34,40 @@ Ext.define('Proxmox.RestProxy', { idProperty: 'key' }); + Ext.define('proxmox-tasks', { + extend: 'Ext.data.Model', + fields: [ + { name: 'starttime', type : 'date', dateFormat: 'timestamp' }, + { name: 'endtime', type : 'date', dateFormat: 'timestamp' }, + { name: 'pid', type: 'int' }, + 'node', 'upid', 'user', 'status', 'type', 'id' + ], + idProperty: 'upid' + }); + + Ext.define('proxmox-cluster-log', { + extend: 'Ext.data.Model', + fields: [ + { name: 'uid' , type: 'int' }, + { name: 'time', type : 'date', dateFormat: 'timestamp' }, + { name: 'pri', type: 'int' }, + { name: 'pid', type: 'int' }, + 'node', 'user', 'tag', 'msg', + { + name: 'id', + convert: function(value, record) { + var info = record.data; + var text; + + if (value) { + return value; + } + // compute unique ID + return info.uid + ':' + info.node; + } + } + ], + idProperty: 'id' + }); + }); diff --git a/node/Tasks.js b/node/Tasks.js new file mode 100644 index 0000000..55d9939 --- /dev/null +++ b/node/Tasks.js @@ -0,0 +1,178 @@ +Ext.define('Proxmox.node.Tasks', { + extend: 'Ext.grid.GridPanel', + + alias: ['widget.proxmoxNodeTasks'], + stateful: true, + stateId: 'grid-node-tasks', + loadMask: true, + sortableColumns: false, + vmidFilter: 0, + + render_upid: function(upid) { + var task = Proxmox.Utils.parse_task_upid(upid); + return task.type + ' ' + task.id; + }, + + initComponent : function() { + var me = this; + + if (!me.nodename) { + throw "no node name specified"; + } + + var store = Ext.create('Ext.data.BufferedStore', { + pageSize: 500, + autoLoad: true, + remoteFilter: true, + model: 'proxmox-tasks', + proxy: { + type: 'proxmox', + startParam: 'start', + limitParam: 'limit', + url: "/api2/json/nodes/" + me.nodename + "/tasks" + } + }); + + var userfilter = ''; + var filter_errors = 0; + + var updateProxyParams = function() { + var params = { + errors: filter_errors + }; + if (userfilter) { + params.userfilter = userfilter; + } + if (me.vmidFilter) { + params.vmid = me.vmidFilter; + } + store.proxy.extraParams = params; + }; + + updateProxyParams(); + + var reload_task = Ext.create('Ext.util.DelayedTask',function() { + updateProxyParams(); + store.reload(); + }); + + var run_task_viewer = function() { + var sm = me.getSelectionModel(); + var rec = sm.getSelection()[0]; + if (!rec) { + return; + } + + var win = Ext.create('Proxmox.window.TaskViewer', { + upid: rec.data.upid + }); + win.show(); + }; + + var view_btn = new Ext.Button({ + text: gettext('View'), + disabled: true, + handler: run_task_viewer + }); + + + Ext.apply(me, { + store: store, + viewConfig: { + trackOver: false, + stripeRows: false, // does not work with getRowClass() + + getRowClass: function(record, index) { + var status = record.get('status'); + + if (status && status != 'OK') { + return "x-form-invalid-field"; + } + } + }, + tbar: [ + view_btn, '->', gettext('User name') +':', ' ', + { + xtype: 'textfield', + width: 200, + value: userfilter, + enableKeyEvents: true, + listeners: { + keyup: function(field, e) { + userfilter = field.getValue(); + reload_task.delay(500); + } + } + }, ' ', gettext('Only Errors') + ':', ' ', + { + xtype: 'checkbox', + hideLabel: true, + checked: filter_errors, + listeners: { + change: function(field, checked) { + filter_errors = checked ? 1 : 0; + reload_task.delay(10); + } + } + }, ' ' + ], + columns: [ + { + header: gettext("Start Time"), + dataIndex: 'starttime', + width: 100, + renderer: function(value) { + return Ext.Date.format(value, "M d H:i:s"); + } + }, + { + header: gettext("End Time"), + dataIndex: 'endtime', + width: 100, + renderer: function(value, metaData, record) { + return Ext.Date.format(value,"M d H:i:s"); + } + }, + { + header: gettext("Node"), + dataIndex: 'node', + width: 100 + }, + { + header: gettext("User name"), + dataIndex: 'user', + width: 150 + }, + { + header: gettext("Description"), + dataIndex: 'upid', + flex: 1, + renderer: me.render_upid + }, + { + header: gettext("Status"), + dataIndex: 'status', + width: 200, + renderer: function(value, metaData, record) { + if (value == 'OK') { + return 'OK'; + } + // metaData.attr = 'style="color:red;"'; + return "ERROR: " + value; + } + } + ], + listeners: { + itemdblclick: run_task_viewer, + selectionchange: function(v, selections) { + view_btn.setDisabled(!(selections && selections[0])); + }, + show: function() { reload_task.delay(10); }, + destroy: function() { reload_task.cancel(); } + } + }); + + me.callParent(); + + } +});