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