pmg-gui/js/PostfixMailQueue.js
Stoiko Ivanov 84d84db140 use format_size renderer for size in deferred queue listing
The listing of the contents of the deferred queue gets its data via
postqueue (1) json output, which lists the size in bytes.
Change the column renderer to use the Proxmox.Utils.format_size
renderer, which computes a sane human readable unit.

Tested by sending a mail, which gets deferred and comparing the
output with the size of the file on disk in
'/var/spool/postfix/deferred'

Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2020-01-21 11:06:43 +01:00

229 lines
4.4 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,
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'),
width: 150,
renderer: Ext.util.Format.dateRenderer("Y-m-d H:i:s"),
dataIndex: 'arrival_time'
},
{
header: 'Size',
renderer: Proxmox.Utils.format_size,
width: 80,
dataIndex: 'message_size'
},
{
header: gettext('Sender'),
width: 200,
dataIndex: 'sender'
},
{
header: gettext('Receiver'),
width: 200,
dataIndex: 'receiver'
},
{
header: gettext('Reason'),
flex: 1,
dataIndex: 'reason'
}
],
pendingLoad: false,
updateProxy: function() {
var me = this;
if (me.pendingLoad) {
return;
}
var proxy = {
type: 'proxmox',
startParam: 'start',
limitParam: 'limit',
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();
}
});