mirror of
https://git.proxmox.com/git/pmg-gui
synced 2025-05-31 19:38:44 +00:00

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>
229 lines
4.4 KiB
JavaScript
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();
|
|
}
|
|
|
|
});
|