]> git.proxmox.com Git - pmg-gui.git/blame - js/MailTracker.js
MailTracker.js: set start of next day for end-time
[pmg-gui.git] / js / MailTracker.js
CommitLineData
ff735274 1/*global Proxmox*/
cf248533
DM
2Ext.define('pmg-mail-tracker', {
3 extend: 'Ext.data.Model',
4 fields: [
5 'id' , 'from', 'to', 'dstatus', 'rstatus', 'qid', 'msgid', 'client',
6 { type: 'number', name: 'size' },
b1255401 7 { type: 'date', dateFormat: 'timestamp', name: 'time' }
cf248533
DM
8 ],
9 proxy: {
10 type: 'proxmox'
11 },
9bde3d85
DM
12 // do not use field 'id', because "id/to" is the unique Id
13 // this way we display an entry for each receiver
14 idProperty: 'none'
cf248533
DM
15});
16
17
18Ext.define('PMG.MailTrackerFilter', {
19 extend: 'Ext.container.Container',
20 xtype: 'pmgMailTrackerFilter',
21
22 layout: {
23 type: 'hbox'
24 },
25
26 controller: {
27
28 xclass: 'Ext.app.ViewController',
29
30 onFilterChange: function() {
31 var view = this.getView();
32 view.fireEvent('filterChanged');
33 },
34
35 onSpecialKey: function(field, e) {
36 if (e.getKey() == e.ENTER) {
37 this.onFilterChange();
38 }
39 }
40 },
41
42 getFilterParams: function() {
43 var me = this;
44 var param = {};
45
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; }
50 });
51
52 return param;
53 },
54
55 items: [
56 {
57 width: 400,
58 border: false,
59 padding: 10,
60 layout: {
61 type: 'vbox',
62 align: 'stretch'
63 },
64 items: [
65 {
66 fieldLabel: gettext('Sender'),
67 xtype: 'textfield',
68 listeners: { specialkey: 'onSpecialKey' },
69 reference: 'from'
70 },
71 {
72 fieldLabel: gettext('Receiver'),
73 xtype: 'textfield',
74 listeners: { specialkey: 'onSpecialKey' },
75 reference: 'target'
76 },
77 {
78 fieldLabel: gettext('Filter'),
79 xtype: 'textfield',
80 listeners: { specialkey: 'onSpecialKey' },
81 reference: 'xfilter'
82 }
83 ]
84 },
85 {
86 width: 330,
87 border: false,
88 padding: 10,
89 layout: {
90 type: 'vbox',
91 align: 'stretch'
92 },
93 items: [
94 {
95 fieldLabel: gettext('Start'),
96 reference: 'starttime',
97 listeners: { change: 'onFilterChange' },
98 value: (function() {
99 var now = new Date();
100 return new Date(now.getTime() - 3600000);
be95ef5d 101 }()),
cf248533
DM
102 xtype: 'promxoxDateTimeField'
103 },
104 {
105 fieldLabel: gettext('End'),
106 reference: 'endtime',
107 listeners: { change: 'onFilterChange' },
00ac25c1
DM
108 value: (function() {
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);
115 return tomorrow;
116 }()),
cf248533
DM
117 xtype: 'promxoxDateTimeField'
118 },
119 {
de0ebd99
DC
120 layout: {
121 type: 'hbox'
122 },
cf248533
DM
123 border: false,
124 items: [
125 {
126 boxLabel: gettext('Include NDRs'),
127 xtype: 'proxmoxcheckbox',
128 listeners: { change: 'onFilterChange' },
129 reference: 'ndr',
130 name: 'ndrs'
131 },
132 {
133 boxLabel: gettext('Include Greylist'),
134 xtype: 'proxmoxcheckbox',
135 listeners: { change: 'onFilterChange' },
136 margin: { left: 20 },
137 reference: 'greylist',
138 name: 'greylist'
139 }
140 ]
141 }
142 ]
143 }
144 ]
145});
146
147Ext.define('PMG.MaiLogWindow', {
148 extend: 'Ext.window.Window',
149 xtype: 'pmgMaiLogWindow',
150
151 title: gettext('Syslog'),
152
153 logid: undefined,
154 starttime: undefined,
155 endtime: undefined,
156
157 width: 1024,
158 height: 400,
159 scrollable: true,
160
de0ebd99
DC
161 layout: {
162 type: 'auto'
163 },
cf248533
DM
164 modal: true,
165 bodyPadding: 5,
166
167 load: function() {
168 var me = this;
169
170 Proxmox.Utils.API2Request({
171 method: 'GET',
172 params: { starttime: me.starttime, endtime: me.endtime },
173 url: '/nodes/' + Proxmox.NodeName + '/tracker/' + me.logid,
174 waitMsgTarget: me,
175 failure: function(response, opts) {
176 me.update(gettext('Error') + " " + response.htmlStatus);
177 },
178 success: function(response, opts) {
179 var data = response.result.data;
180
181 var logs = "<pre style='margin: 0;'>";
182 Ext.Array.each(data.logs, function(line) {
183 logs += Ext.htmlEncode(line) + "\n";
184 });
185 logs += "</pre>";
186 me.update(logs);
187 }
188 });
189 },
190
191 initComponent : function() {
192 var me = this;
193
194 if (!me.logid) {
195 throw "no logid specified";
196 }
197
198 if (!me.starttime) {
199 throw "no starttime specified";
200 }
201 if (!me.endtime) {
202 throw "no endtime specified";
203 }
204
205 me.callParent();
206
207 me.setHtml('Loading...');
208 me.load();
209 }
210});
211
212Ext.define('PMG.MailTracker', {
213 extend: 'Ext.grid.GridPanel',
214 xtype: 'pmgMailTracker',
215
216 title: gettext('Tracking Center'),
217
218 border: false,
219
220 emptyText: gettext('No data in database.'),
0960034c
DC
221 disableSelection: true,
222
cf248533 223 viewConfig: {
0960034c
DC
224 deferEmptyText: false,
225 enableTextSelection: true,
dd502c64
DC
226 getRowClass: function(record, index) {
227 var status = record.data.rstatus || record.data.dstatus;
228 return PMG.Utils.mail_status_map[status];
229 }
cf248533
DM
230 },
231
0960034c
DC
232 plugins: [
233 {
234 ptype: 'rowexpander',
771bd0b9 235 rowBodyTpl: '<p class="logs">{logs}</p>'
0960034c
DC
236 }
237 ],
238
cf248533
DM
239 store: {
240 autoDestroy: true,
241 model: 'pmg-mail-tracker'
242 },
243
244 controller: {
245
246 xclass: 'Ext.app.ViewController',
247
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();
258 if (success) {
259 // fixme: howto avoid duplicate Ext.decode ?
260 var result = Ext.decode(response.responseText);
261 if (result.changes) {
262 status.update(result.changes);
263 }
264 }
265 });
266 },
267
0960034c 268 showDetails: function(rowNode, record) {
cf248533 269 var view = this.getView();
cf248533
DM
270
271 var params = view.store.proxy.getExtraParams();
272
0960034c
DC
273 Proxmox.Utils.API2Request({
274 method: 'GET',
275 params: { starttime: params.starttime, endtime: params.endtime },
276 url: '/nodes/' + Proxmox.NodeName + '/tracker/' + record.data.id,
277 waitMsgTarget: view,
278 failure: function(response, opts) {
279 record.set('logs',gettext('Error') + " " + response.htmlStatus);
280 },
281 success: function(response, opts) {
282 var data = response.result.data;
283 var logs = "";
284
285 Ext.Array.each(data.logs, function(line) {
286 logs += Ext.htmlEncode(line) + "<br>";
287 });
288
289 record.set('logs', logs);
290 }
cf248533 291 });
0960034c
DC
292 },
293
294 control: {
295 'gridview': {
296 expandbody: 'showDetails'
297 }
cf248533
DM
298 }
299 },
300
301 dockedItems: [
302 {
303 xtype: 'pmgMailTrackerFilter',
304 reference: 'filter',
305 listeners: { filterChanged: 'onSearch' },
306 border: false,
307 dock: 'top'
308 },
309 {
310 xtype: 'toolbar',
311 items: [
312 { text: 'Search', handler: 'onSearch' },
313 { xtype: 'component', html: '', reference: 'status' }
314 ]
315 }
316 ],
317
318 columns: [
319 {
320 xtype: 'datecolumn',
321 header: gettext('Time'),
322 width: 120,
323 dataIndex: 'time',
324 format: 'M d H:i:s'
325 },
326 {
327 header: gettext('From'),
328 flex: 1,
07d37f59
DM
329 dataIndex: 'from',
330 renderer: Ext.htmlEncode
cf248533
DM
331 },
332 {
333 header: gettext('To'),
334 flex: 1,
07d37f59
DM
335 dataIndex: 'to',
336 renderer: Ext.htmlEncode
cf248533
DM
337 },
338 {
339 header: gettext('Status'),
340 width: 150,
341 renderer: function(v, metaData, rec) {
dd502c64
DC
342 var returntext = 'unknown';
343 var icon = 'question-circle';
cf248533
DM
344 var rstatus = rec.data.rstatus;
345 if (v !== undefined && v !== '') {
cac4542e 346 var vtext = PMG.Utils.mail_status_map[v] || v;
dd502c64 347 icon = v;
cf248533 348 if (rstatus !== undefined && rstatus !== '') {
cac4542e 349 var rtext = PMG.Utils.mail_status_map[rstatus] || rstatus;
dd502c64
DC
350 returntext = vtext + '/' + rtext;
351 icon = rstatus;
352 } else if (rec.data.qid !== undefined) {
353 returntext = 'queued/' + vtext;
354 } else {
355 returntext = vtext;
cf248533 356 }
cf248533 357 }
dd502c64
DC
358
359 return PMG.Utils.format_status_icon(icon) + returntext;
cf248533
DM
360 },
361 dataIndex: 'dstatus'
362 },
363 {
364 header: gettext('Size'),
365 hidden: true,
366 dataIndex: 'size'
367 },
368 {
369 header: 'MSGID',
370 width: 300,
371 hidden: true,
07d37f59
DM
372 dataIndex: 'msgid',
373 renderer: Ext.htmlEncode
cf248533
DM
374 },
375 {
376 header: gettext('Client'),
377 width: 200,
378 hidden: true,
07d37f59
DM
379 dataIndex: 'client',
380 renderer: Ext.htmlEncode
cf248533
DM
381 }
382 ],
383
cf248533
DM
384 initComponent: function() {
385 var me = this;
386
387 me.callParent();
388
389 Proxmox.Utils.monStoreErrors(me.getView(), me.store);
390 }
391});