normally this is used as strict task history, meaning no running tasks included. But we can have running tasks in PBS here, so at least avoid that they're shown as error. Also add a refresh button as a simple workaround to the auto-refresh problem, which isn't straightforward to solve with the buffered reader we have here. Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
189 lines
3.9 KiB
JavaScript
189 lines
3.9 KiB
JavaScript
Ext.define('Proxmox.node.Tasks', {
|
|
extend: 'Ext.grid.GridPanel',
|
|
|
|
alias: ['widget.proxmoxNodeTasks'],
|
|
stateful: true,
|
|
stateId: 'grid-node-tasks',
|
|
loadMask: true,
|
|
sortableColumns: false,
|
|
vmidFilter: 0,
|
|
|
|
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
|
|
});
|
|
|
|
Proxmox.Utils.monStoreErrors(me, store, true);
|
|
|
|
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 "proxmox-invalid-row";
|
|
}
|
|
}
|
|
},
|
|
tbar: [
|
|
view_btn,
|
|
{
|
|
text: gettext('Refresh'), // FIXME: smart-auto-refresh store
|
|
handler: () => store.reload(),
|
|
},
|
|
'->',
|
|
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) {
|
|
if (!value) {
|
|
metaData.tdCls = "x-grid-row-loading";
|
|
return '';
|
|
}
|
|
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: Proxmox.Utils.render_upid
|
|
},
|
|
{
|
|
header: gettext("Status"),
|
|
dataIndex: 'status',
|
|
width: 200,
|
|
renderer: function(value, metaData, record) {
|
|
if (value == 'OK') {
|
|
return 'OK';
|
|
}
|
|
if (value === undefined && !record.data.endtime) {
|
|
metaData.tdCls = "x-grid-row-loading";
|
|
return '';
|
|
}
|
|
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();
|
|
|
|
}
|
|
});
|