X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=js%2FMailTracker.js;h=52641a4ebd91888d1da2975ca85fc19525bb5e9f;hb=4e356bcded857b85f562622d3fcfa7769a75e4aa;hp=61b0b5e51aab9dc0cd664765b0fccaf97734eb87;hpb=e8e332fe013ee6e1f974fe25b4f81c2d5f075302;p=pmg-gui.git diff --git a/js/MailTracker.js b/js/MailTracker.js index 61b0b5e..52641a4 100644 --- a/js/MailTracker.js +++ b/js/MailTracker.js @@ -1,17 +1,16 @@ -/*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', }); @@ -20,7 +19,7 @@ Ext.define('PMG.MailTrackerFilter', { xtype: 'pmgMailTrackerFilter', layout: { - type: 'hbox' + type: 'hbox', }, controller: { @@ -28,24 +27,24 @@ Ext.define('PMG.MailTrackerFilter', { 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; } }); @@ -63,35 +62,35 @@ Ext.define('PMG.MailTrackerFilter', { 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: [ { @@ -104,10 +103,10 @@ Ext.define('PMG.MailTrackerFilter', { }, }, value: (function() { - var now = new Date(); + let now = new Date(); return new Date(now.getTime() - 3600000); }()), - xtype: 'promxoxDateTimeField' + xtype: 'promxoxDateTimeField', }, { fieldLabel: gettext('End'), @@ -119,19 +118,19 @@ Ext.define('PMG.MailTrackerFilter', { }, }, 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: [ @@ -140,7 +139,7 @@ Ext.define('PMG.MailTrackerFilter', { xtype: 'proxmoxcheckbox', listeners: { change: 'onFilterChange' }, reference: 'ndr', - name: 'ndrs' + name: 'ndrs', }, { boxLabel: gettext('Include Greylist'), @@ -148,13 +147,13 @@ Ext.define('PMG.MailTrackerFilter', { listeners: { change: 'onFilterChange' }, margin: { left: 20 }, reference: 'greylist', - name: 'greylist' - } - ] - } - ] - } - ] + name: 'greylist', + }, + ], + }, + ], + }, + ], }); Ext.define('PMG.MaiLogWindow', { @@ -172,13 +171,13 @@ 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', @@ -189,20 +188,20 @@ Ext.define('PMG.MaiLogWindow', { me.update(gettext('Error') + " " + response.htmlStatus); }, success: function(response, opts) { - var data = response.result.data; + let data = response.result.data; - var logs = "
";
+		let logs = "
";
 		Ext.Array.each(data.logs, function(line) {
 		    logs += Ext.htmlEncode(line) + "\n";
 		});
 		logs += "
"; me.update(logs); - } + }, }); }, - initComponent : function() { - var me = this; + initComponent: function() { + let me = this; if (!me.logid) { throw "no logid specified"; @@ -219,7 +218,7 @@ Ext.define('PMG.MaiLogWindow', { me.setHtml('Loading...'); me.load(); - } + }, }); Ext.define('PMG.MailTracker', { @@ -230,23 +229,24 @@ 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: '

{logs}

' - } + expandOnDblClick: false, + rowBodyTpl: '

{logs}

', + }, ], store: { @@ -260,10 +260,11 @@ Ext.define('PMG.MailTracker', { 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 } @@ -271,10 +272,10 @@ Ext.define('PMG.MailTracker', { 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); } @@ -283,9 +284,9 @@ Ext.define('PMG.MailTracker', { }, 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', @@ -293,43 +294,65 @@ Ext.define('PMG.MailTracker', { 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) + "
"; }); 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 = `
${emptyText || ""}
`; }, 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: [ @@ -338,34 +361,34 @@ Ext.define('PMG.MailTracker', { 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) { @@ -377,34 +400,34 @@ Ext.define('PMG.MailTracker', { 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); - } + }, });