]>
git.proxmox.com Git - pmg-gui.git/blob - js/MailTracker.js
2 Ext
.define('pmg-mail-tracker', {
3 extend
: 'Ext.data.Model',
5 'id' , 'from', 'to', 'dstatus', 'rstatus', 'qid', 'msgid', 'client',
6 { type
: 'number', name
: 'size' },
7 { type
: 'date', dateFormat
: 'timestamp', name
: 'time' }
12 // do not use field 'id', because "id/to" is the unique Id
13 // this way we display an entry for each receiver
18 Ext
.define('PMG.MailTrackerFilter', {
19 extend
: 'Ext.container.Container',
20 xtype
: 'pmgMailTrackerFilter',
28 xclass
: 'Ext.app.ViewController',
30 onFilterChange: function() {
31 var view
= this.getView();
32 view
.fireEvent('filterChanged');
35 onSpecialKey: function(field
, e
) {
36 if (e
.getKey() == e
.ENTER
) {
37 this.onFilterChange();
42 getFilterParams: function() {
46 var names
= ['from', 'target', 'xfilter', 'starttime', 'endtime', 'ndr', 'greylist'];
47 Ext
.Array
.each(names
, function(name
) {
48 var value
= me
.lookupReference(name
).getSubmitValue();
49 if (value
) { param
[name
] = value
; }
66 fieldLabel
: gettext('Sender'),
68 listeners
: { specialkey
: 'onSpecialKey' },
72 fieldLabel
: gettext('Receiver'),
74 listeners
: { specialkey
: 'onSpecialKey' },
78 fieldLabel
: gettext('Filter'),
80 listeners
: { specialkey
: 'onSpecialKey' },
95 fieldLabel
: gettext('Start'),
96 reference
: 'starttime',
97 listeners
: { change
: 'onFilterChange' },
100 return new Date(now
.getTime() - 3600000);
102 xtype
: 'promxoxDateTimeField'
105 fieldLabel
: gettext('End'),
106 reference
: 'endtime',
107 listeners
: { change
: 'onFilterChange' },
109 var now
= new Date();
110 var tomorrow
= new Date();
111 tomorrow
.setDate(now
.getDate()+1);
112 tomorrow
.setHours(0);
113 tomorrow
.setMinutes(0);
114 tomorrow
.setSeconds(0);
117 xtype
: 'promxoxDateTimeField'
126 boxLabel
: gettext('Include NDRs'),
127 xtype
: 'proxmoxcheckbox',
128 listeners
: { change
: 'onFilterChange' },
133 boxLabel
: gettext('Include Greylist'),
134 xtype
: 'proxmoxcheckbox',
135 listeners
: { change
: 'onFilterChange' },
136 margin
: { left
: 20 },
137 reference
: 'greylist',
147 Ext
.define('PMG.MaiLogWindow', {
148 extend
: 'Ext.window.Window',
149 xtype
: 'pmgMaiLogWindow',
151 title
: gettext('Syslog'),
154 starttime
: undefined,
170 Proxmox
.Utils
.API2Request({
172 params
: { starttime
: me
.starttime
, endtime
: me
.endtime
},
173 url
: '/nodes/' + Proxmox
.NodeName
+ '/tracker/' + me
.logid
,
175 failure: function(response
, opts
) {
176 me
.update(gettext('Error') + " " + response
.htmlStatus
);
178 success: function(response
, opts
) {
179 var data
= response
.result
.data
;
181 var logs
= "<pre style='margin: 0;'>";
182 Ext
.Array
.each(data
.logs
, function(line
) {
183 logs
+= Ext
.htmlEncode(line
) + "\n";
191 initComponent : function() {
195 throw "no logid specified";
199 throw "no starttime specified";
202 throw "no endtime specified";
207 me
.setHtml('Loading...');
212 Ext
.define('PMG.MailTracker', {
213 extend
: 'Ext.grid.GridPanel',
214 xtype
: 'pmgMailTracker',
216 title
: gettext('Tracking Center'),
220 emptyText
: gettext('No data in database.'),
221 disableSelection
: true,
224 deferEmptyText
: false,
225 enableTextSelection
: true,
226 getRowClass: function(record
, index
) {
227 var status
= record
.data
.rstatus
|| record
.data
.dstatus
;
228 return PMG
.Utils
.mail_status_map
[status
];
234 ptype
: 'rowexpander',
235 rowBodyTpl
: '<p class="logs">{logs}</p>'
241 model
: 'pmg-mail-tracker'
246 xclass
: 'Ext.app.ViewController',
248 onSearch: function() {
249 var view
= this.getView();
250 var filter
= this.lookupReference('filter');
251 var status
= this.lookupReference('status');
252 var params
= filter
.getFilterParams();
253 status
.update(''); // clear status before load
254 view
.store
.proxy
.setExtraParams(params
);
255 view
.store
.proxy
.setUrl('/api2/json/nodes/' + Proxmox
.NodeName
+ '/tracker');
256 view
.store
.load(function(records
, operation
, success
) {
257 var response
= operation
.getResponse();
259 // fixme: howto avoid duplicate Ext.decode ?
260 var result
= Ext
.decode(response
.responseText
);
261 if (result
.changes
) {
262 status
.update(result
.changes
);
268 showDetails: function(rowNode
, record
) {
269 var view
= this.getView();
271 var params
= view
.store
.proxy
.getExtraParams();
273 Proxmox
.Utils
.API2Request({
275 params
: { starttime
: params
.starttime
, endtime
: params
.endtime
},
276 url
: '/nodes/' + Proxmox
.NodeName
+ '/tracker/' + record
.data
.id
,
278 failure: function(response
, opts
) {
279 record
.set('logs',gettext('Error') + " " + response
.htmlStatus
);
281 success: function(response
, opts
) {
282 var data
= response
.result
.data
;
285 Ext
.Array
.each(data
.logs
, function(line
) {
286 logs
+= Ext
.htmlEncode(line
) + "<br>";
289 record
.set('logs', logs
);
296 expandbody
: 'showDetails'
303 xtype
: 'pmgMailTrackerFilter',
305 listeners
: { filterChanged
: 'onSearch' },
312 { text
: 'Search', handler
: 'onSearch' },
313 { xtype
: 'component', html
: '', reference
: 'status' }
321 header
: gettext('Time'),
327 header
: gettext('From'),
330 renderer
: Ext
.htmlEncode
333 header
: gettext('To'),
336 renderer
: Ext
.htmlEncode
339 header
: gettext('Status'),
341 renderer: function(v
, metaData
, rec
) {
342 var returntext
= 'unknown';
343 var icon
= 'question-circle';
344 var rstatus
= rec
.data
.rstatus
;
345 if (v
!== undefined && v
!== '') {
346 var vtext
= PMG
.Utils
.mail_status_map
[v
] || v
;
348 if (rstatus
!== undefined && rstatus
!== '') {
349 var rtext
= PMG
.Utils
.mail_status_map
[rstatus
] || rstatus
;
350 returntext
= vtext
+ '/' + rtext
;
352 } else if (rec
.data
.qid
!== undefined) {
353 returntext
= 'queued/' + vtext
;
359 return PMG
.Utils
.format_status_icon(icon
) + returntext
;
364 header
: gettext('Size'),
373 renderer
: Ext
.htmlEncode
376 header
: gettext('Client'),
380 renderer
: Ext
.htmlEncode
384 initComponent: function() {
389 Proxmox
.Utils
.monStoreErrors(me
.getView(), me
.store
);