pmg-gui/js/PostfixMailQueue.js
Stoiko Ivanov 6cde982f6a fix #1976: enable remoteSort for PostfixMailQueue
The mailq results are potentially very large, why a BufferedStore is used.

BufferedStores only support [0] remote filtering (which is already done) and
remote sorting (which this patch enables).

simpleSortMode (getting sortfield and sortdirection as two parameters instead
of an array with multiple objects containing those fields), is enabled to
work with our API.

[0] quite naturally, since you'd need to have the complete result to sort it,
 however only documented in the source code (and not the reference docs)

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
2020-06-04 08:34:55 +02:00

233 lines
4.5 KiB
JavaScript

/*global Proxmox*/
Ext.define('pmg-mailq', {
extend: 'Ext.data.Model',
fields: [
'queue_id', 'queue_name',
{ type: 'date', dateFormat: 'timestamp', name: 'arrival_time'},
{ type: 'integer', name: 'message_size'},
'sender', 'receiver', 'reason'
],
idProperty: 'queue_id'
});
Ext.define('PMG.Postfix.MailQueue', {
extend: 'Ext.grid.GridPanel',
alias: 'widget.pmgPostfixMailQueue',
nodename: undefined,
filter: undefined,
queuename: 'deferred',
store: {
xclass: 'Ext.data.BufferedStore',
model: 'pmg-mailq',
remoteFilter: true,
remoteSort: true,
pageSize: 2000
},
controller: {
xclass: 'Ext.app.ViewController',
init: function(view) {
if (view.nodename) {
view.setNodename(view.nodename);
}
view.delayFilterTask = new Ext.util.DelayedTask(function() {
var filter = view.lookupReference('filter').getValue();
view.filter = filter;
view.updateProxy();
});
},
onChangeFilter: function(f, v) {
var view = this.getView();
view.delayFilterTask.delay(500);
},
onFlush: function(button, event, rec) {
var view = this.getView();
Proxmox.Utils.API2Request({
url: '/api2/extjs/nodes/' + view.nodename + '/postfix/queue/' +
view.queuename + '/' + rec.data.queue_id,
method: 'POST',
waitMsgTarget: view,
failure: function (response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
}
});
},
onRemove: function(button, event, rec) {
var view = this.getView();
Proxmox.Utils.API2Request({
url: '/api2/extjs/nodes/' + view.nodename + '/postfix/queue/' +
view.queuename + '/' + rec.data.queue_id,
method: 'DELETE',
waitMsgTarget: view,
success: function(response, opts) {
view.selModel.deselectAll();
view.store.load();
},
failure: function (response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
}
});
},
onHeaders: function(button, event, rec) {
var view = this.getView();
var url = '/api2/extjs/nodes/' + view.nodename + '/postfix/queue/' +
view.queuename + '/' + rec.data.queue_id;
var win = Ext.create('PMG.ViewMailHeaders', {
title: view.title + ' : ' + rec.data.queue_id,
url: url
});
win.show();
},
control: {
'#': {
activate: function() {
this.view.updateProxy(); // reload
},
itemdblclick: function(grid, rec, item, index, event) {
this.onHeaders(grid, event, rec);
}
},
'field[reference=filter]': {
change: 'onChangeFilter'
}
}
},
tbar: [
{
xtype: 'proxmoxButton',
disabled: true,
text: gettext('Headers'),
handler: 'onHeaders'
},
{
xtype: 'proxmoxButton',
disabled: true,
text: gettext('Flush'),
handler: 'onFlush'
},
{
xtype: 'proxmoxStdRemoveButton',
handler: 'onRemove'
},
{
xtype: 'label',
html: gettext('Filter') + ':'
},
{
xtype: 'textfield',
width: 300,
reference: 'filter'
}
],
columns: [
{
header: gettext('Time'),
flex: 2,
renderer: Ext.util.Format.dateRenderer("Y-m-d H:i:s"),
dataIndex: 'arrival_time'
},
{
header: 'Size',
renderer: Proxmox.Utils.format_size,
flex: 1,
dataIndex: 'message_size'
},
{
header: gettext('Sender'),
flex: 2,
dataIndex: 'sender'
},
{
header: gettext('Receiver'),
flex: 2,
dataIndex: 'receiver'
},
{
header: gettext('Reason'),
flex: 8,
dataIndex: 'reason'
}
],
pendingLoad: false,
updateProxy: function() {
var me = this;
if (me.pendingLoad) {
return;
}
var proxy = {
type: 'proxmox',
startParam: 'start',
limitParam: 'limit',
sortParam: 'sortfield',
directionParam: 'sortdir',
simpleSortMode: true,
url: "/api2/json/nodes/" + me.nodename + "/postfix/queue/" + me.queuename
};
var filter = me.filter;
var nodename = me.nodename;
var queuename = me.queuename;
if (filter) { proxy.extraParams = { filter: filter }; }
me.store.setProxy(proxy);
me.pendingLoad = true;
me.store.load(function() {
me.pendingLoad = false;
if (me.nodename !== nodename || me.filter !== filter || me.queuename !== queuename) {
setTimeout(function() {
me.updateProxy();
}, 100);
}
});
},
setFilter: function(filter) {
this.lookupReference('filter').setValue(filter);
},
setNodename: function(nodename) {
var me = this;
me.nodename = nodename;
me.updateProxy();
},
setQueueName: function(queuename) {
var me = this;
me.queuename = queuename;
me.updateProxy();
}
});