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