-/*global Proxmox*/
Ext.define('pmg-mail-tracker', {
extend: 'Ext.data.Model',
fields: [
- 'id' , 'from', 'to', 'dstatus', 'rstatus', 'qid', 'msgid', 'client',
+ 'id', 'from', 'to', 'dstatus', 'rstatus', 'qid', 'msgid', 'client',
{ type: 'number', name: 'size' },
- { type: 'date', dateFormat: 'timestamp', name: 'time' }
+ { type: 'date', dateFormat: 'timestamp', name: 'time' },
],
proxy: {
- type: 'proxmox'
+ type: 'proxmox',
},
// do not use field 'id', because "id/to" is the unique Id
// this way we display an entry for each receiver
- idProperty: 'none'
+ idProperty: 'none',
});
xtype: 'pmgMailTrackerFilter',
layout: {
- type: 'hbox'
+ type: 'hbox',
},
controller: {
xclass: 'Ext.app.ViewController',
onFilterChange: function() {
- var view = this.getView();
+ let view = this.getView();
view.fireEvent('filterChanged');
},
onSpecialKey: function(field, e) {
- if (e.getKey() == e.ENTER) {
+ if (e.getKey() === e.ENTER) {
this.onFilterChange();
}
- }
+ },
},
getFilterParams: function() {
- var me = this;
- var param = {};
+ let me = this;
+ let param = {};
- var names = ['from', 'target', 'xfilter', 'starttime', 'endtime', 'ndr', 'greylist'];
+ let names = ['from', 'target', 'xfilter', 'starttime', 'endtime', 'ndr', 'greylist'];
Ext.Array.each(names, function(name) {
- var value = me.lookupReference(name).getSubmitValue();
+ let value = me.lookupReference(name).getSubmitValue();
if (value) { param[name] = value; }
});
padding: 10,
layout: {
type: 'vbox',
- align: 'stretch'
+ align: 'stretch',
},
items: [
{
fieldLabel: gettext('Sender'),
xtype: 'textfield',
listeners: { specialkey: 'onSpecialKey' },
- reference: 'from'
+ reference: 'from',
},
{
fieldLabel: gettext('Receiver'),
xtype: 'textfield',
listeners: { specialkey: 'onSpecialKey' },
- reference: 'target'
+ reference: 'target',
},
{
fieldLabel: gettext('Filter'),
xtype: 'textfield',
listeners: { specialkey: 'onSpecialKey' },
- reference: 'xfilter'
- }
- ]
+ reference: 'xfilter',
+ },
+ ],
},
{
border: false,
padding: 10,
layout: {
type: 'vbox',
- align: 'stretch'
+ align: 'stretch',
},
items: [
{
},
},
value: (function() {
- var now = new Date();
+ let now = new Date();
return new Date(now.getTime() - 3600000);
}()),
- xtype: 'promxoxDateTimeField'
+ xtype: 'promxoxDateTimeField',
},
{
fieldLabel: gettext('End'),
},
},
value: (function() {
- var now = new Date();
- var tomorrow = new Date();
+ let now = new Date();
+ let tomorrow = new Date();
tomorrow.setDate(now.getDate()+1);
tomorrow.setHours(0);
tomorrow.setMinutes(0);
tomorrow.setSeconds(0);
return tomorrow;
}()),
- xtype: 'promxoxDateTimeField'
+ xtype: 'promxoxDateTimeField',
},
{
layout: {
- type: 'hbox'
+ type: 'hbox',
},
border: false,
items: [
xtype: 'proxmoxcheckbox',
listeners: { change: 'onFilterChange' },
reference: 'ndr',
- name: 'ndrs'
+ name: 'ndrs',
},
{
boxLabel: gettext('Include Greylist'),
listeners: { change: 'onFilterChange' },
margin: { left: 20 },
reference: 'greylist',
- name: 'greylist'
- }
- ]
- }
- ]
- }
- ]
+ name: 'greylist',
+ },
+ ],
+ },
+ ],
+ },
+ ],
});
Ext.define('PMG.MaiLogWindow', {
scrollable: true,
layout: {
- type: 'auto'
+ type: 'auto',
},
modal: true,
bodyPadding: 5,
load: function() {
- var me = this;
+ let me = this;
Proxmox.Utils.API2Request({
method: 'GET',
me.update(gettext('Error') + " " + response.htmlStatus);
},
success: function(response, opts) {
- var data = response.result.data;
+ let data = response.result.data;
- var logs = "<pre style='margin: 0;'>";
+ let logs = "<pre style='margin: 0;'>";
Ext.Array.each(data.logs, function(line) {
logs += Ext.htmlEncode(line) + "\n";
});
logs += "</pre>";
me.update(logs);
- }
+ },
});
},
- initComponent : function() {
- var me = this;
+ initComponent: function() {
+ let me = this;
if (!me.logid) {
throw "no logid specified";
me.setHtml('Loading...');
me.load();
- }
+ },
});
Ext.define('PMG.MailTracker', {
border: false,
- emptyText: gettext('No data in database'),
+ emptyText: gettext("Please enter your search parameters and press 'Search'."),
disableSelection: true,
viewConfig: {
deferEmptyText: false,
enableTextSelection: true,
getRowClass: function(record, index) {
- var status = record.data.rstatus || record.data.dstatus;
+ let status = record.data.rstatus || record.data.dstatus;
return PMG.Utils.mail_status_map[status];
- }
+ },
},
plugins: [
{
ptype: 'rowexpander',
- rowBodyTpl: '<p class="logs">{logs}</p>'
- }
+ expandOnDblClick: false,
+ rowBodyTpl: '<p class="logs">{logs}</p>',
+ },
],
store: {
xclass: 'Ext.app.ViewController',
onSearch: function() {
- var view = this.getView();
- var filter = this.lookupReference('filter');
- var status = this.lookupReference('status');
- var params = filter.getFilterParams();
+ let view = this.getView();
+ view.setEmptyText(gettext('No data in database'));
+ let filter = this.lookupReference('filter');
+ let status = this.lookupReference('status');
+ let params = filter.getFilterParams();
if (params === undefined) {
return; // something went wrong with the filters bail out
}
view.store.proxy.setExtraParams(params);
view.store.proxy.setUrl('/api2/json/nodes/' + Proxmox.NodeName + '/tracker');
view.store.load(function(records, operation, success) {
- var response = operation.getResponse();
+ let response = operation.getResponse();
if (success) {
// fixme: howto avoid duplicate Ext.decode ?
- var result = Ext.decode(response.responseText);
+ let result = Ext.decode(response.responseText);
if (result.changes) {
status.update(result.changes);
}
},
showDetails: function(rowNode, record) {
- var view = this.getView();
+ let view = this.getView();
- var params = view.store.proxy.getExtraParams();
+ let params = view.store.proxy.getExtraParams();
Proxmox.Utils.API2Request({
method: 'GET',
url: '/nodes/' + Proxmox.NodeName + '/tracker/' + record.data.id,
waitMsgTarget: view,
failure: function(response, opts) {
- record.set('logs',gettext('Error') + " " + response.htmlStatus);
+ record.set('logs', gettext('Error') + " " + response.htmlStatus);
},
success: function(response, opts) {
- var data = response.result.data;
- var logs = "";
+ let data = response.result.data;
+ let logs = "";
Ext.Array.each(data.logs, function(line) {
logs += Ext.htmlEncode(line) + "<br>";
});
record.set('logs', logs);
- }
+ },
});
},
+ // only expand row on dblclick, but do not collapse
+ expand: function(view, record, row, rowIdx, e) {
+ // inspired by RowExpander.js
+ let rowNode = view.getNode(rowIdx);
+ let normalRow = Ext.fly(rowNode);
+
+ let collapsedCls = view.rowBodyFeature.rowCollapsedCls;
+
+ if (normalRow.hasCls(collapsedCls)) {
+ view.rowBodyFeature.rowExpander.toggleRow(rowIdx, record);
+ }
+ },
+
control: {
'gridview': {
- expandbody: 'showDetails'
- }
- }
+ expandbody: 'showDetails',
+ itemdblclick: 'expand',
+ },
+ },
+ },
+
+ // extjs has no method to dynamically change the emptytext on
+ // grids, so we have to do it this way
+ setEmptyText: function(emptyText) {
+ let me = this;
+ let tableview = me.getView();
+ tableview.emptyText = `<div class="x-grid-empty">${emptyText || ""}</div>`;
},
dockedItems: [
{
xtype: 'pmgMailTrackerFilter',
reference: 'filter',
- listeners: { filterChanged: 'onSearch' },
+ listeners: { filterChanged: 'onSearch' },
border: false,
- dock: 'top'
+ dock: 'top',
},
{
xtype: 'toolbar',
items: [
{ text: 'Search', handler: 'onSearch' },
- { xtype: 'component', html: '', reference: 'status' }
- ]
- }
+ { xtype: 'component', html: '', reference: 'status' },
+ ],
+ },
],
columns: [
header: gettext('Time'),
width: 120,
dataIndex: 'time',
- format: 'M d H:i:s'
+ format: 'M d H:i:s',
},
{
header: gettext('From'),
flex: 1,
dataIndex: 'from',
- renderer: Ext.htmlEncode
+ renderer: Ext.htmlEncode,
},
{
header: gettext('To'),
flex: 1,
dataIndex: 'to',
- renderer: Ext.htmlEncode
+ renderer: Ext.htmlEncode,
},
{
header: gettext('Status'),
width: 150,
renderer: function(v, metaData, rec) {
- var returntext = 'unknown';
- var icon = 'question-circle';
- var rstatus = rec.data.rstatus;
+ let returntext = 'unknown';
+ let icon = 'question-circle';
+ let rstatus = rec.data.rstatus;
if (v !== undefined && v !== '') {
- var vtext = PMG.Utils.mail_status_map[v] || v;
+ let vtext = PMG.Utils.mail_status_map[v] || v;
icon = v;
if (v === 'Q' || v === 'B') {
returntext = vtext;
- } else if (rstatus !== undefined && rstatus !== '') {
- var rtext = PMG.Utils.mail_status_map[rstatus] || rstatus;
+ } else if (rstatus !== undefined && rstatus !== '') {
+ let rtext = PMG.Utils.mail_status_map[rstatus] || rstatus;
returntext = vtext + '/' + rtext;
icon = rstatus;
} else if (rec.data.qid !== undefined) {
return PMG.Utils.format_status_icon(icon) + returntext;
},
- dataIndex: 'dstatus'
+ dataIndex: 'dstatus',
},
{
header: gettext('Size'),
hidden: true,
- dataIndex: 'size'
+ dataIndex: 'size',
},
{
header: 'MSGID',
width: 300,
hidden: true,
dataIndex: 'msgid',
- renderer: Ext.htmlEncode
+ renderer: Ext.htmlEncode,
},
{
header: gettext('Client'),
width: 200,
hidden: true,
dataIndex: 'client',
- renderer: Ext.htmlEncode
- }
+ renderer: Ext.htmlEncode,
+ },
],
initComponent: function() {
- var me = this;
+ let me = this;
me.callParent();
Proxmox.Utils.monStoreErrors(me.getView(), me.store);
- }
+ },
});