]> git.proxmox.com Git - pmg-gui.git/blame - js/MailTracker.js
jslint: fix trailing comma
[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' },
108 xtype: 'promxoxDateTimeField'
109 },
110 {
de0ebd99
DC
111 layout: {
112 type: 'hbox'
113 },
cf248533
DM
114 border: false,
115 items: [
116 {
117 boxLabel: gettext('Include NDRs'),
118 xtype: 'proxmoxcheckbox',
119 listeners: { change: 'onFilterChange' },
120 reference: 'ndr',
121 name: 'ndrs'
122 },
123 {
124 boxLabel: gettext('Include Greylist'),
125 xtype: 'proxmoxcheckbox',
126 listeners: { change: 'onFilterChange' },
127 margin: { left: 20 },
128 reference: 'greylist',
129 name: 'greylist'
130 }
131 ]
132 }
133 ]
134 }
135 ]
136});
137
138Ext.define('PMG.MaiLogWindow', {
139 extend: 'Ext.window.Window',
140 xtype: 'pmgMaiLogWindow',
141
142 title: gettext('Syslog'),
143
144 logid: undefined,
145 starttime: undefined,
146 endtime: undefined,
147
148 width: 1024,
149 height: 400,
150 scrollable: true,
151
de0ebd99
DC
152 layout: {
153 type: 'auto'
154 },
cf248533
DM
155 modal: true,
156 bodyPadding: 5,
157
158 load: function() {
159 var me = this;
160
161 Proxmox.Utils.API2Request({
162 method: 'GET',
163 params: { starttime: me.starttime, endtime: me.endtime },
164 url: '/nodes/' + Proxmox.NodeName + '/tracker/' + me.logid,
165 waitMsgTarget: me,
166 failure: function(response, opts) {
167 me.update(gettext('Error') + " " + response.htmlStatus);
168 },
169 success: function(response, opts) {
170 var data = response.result.data;
171
172 var logs = "<pre style='margin: 0;'>";
173 Ext.Array.each(data.logs, function(line) {
174 logs += Ext.htmlEncode(line) + "\n";
175 });
176 logs += "</pre>";
177 me.update(logs);
178 }
179 });
180 },
181
182 initComponent : function() {
183 var me = this;
184
185 if (!me.logid) {
186 throw "no logid specified";
187 }
188
189 if (!me.starttime) {
190 throw "no starttime specified";
191 }
192 if (!me.endtime) {
193 throw "no endtime specified";
194 }
195
196 me.callParent();
197
198 me.setHtml('Loading...');
199 me.load();
200 }
201});
202
203Ext.define('PMG.MailTracker', {
204 extend: 'Ext.grid.GridPanel',
205 xtype: 'pmgMailTracker',
206
207 title: gettext('Tracking Center'),
208
209 border: false,
210
211 emptyText: gettext('No data in database.'),
0960034c
DC
212 disableSelection: true,
213
cf248533 214 viewConfig: {
0960034c
DC
215 deferEmptyText: false,
216 enableTextSelection: true,
dd502c64
DC
217 getRowClass: function(record, index) {
218 var status = record.data.rstatus || record.data.dstatus;
219 return PMG.Utils.mail_status_map[status];
220 }
cf248533
DM
221 },
222
0960034c
DC
223 plugins: [
224 {
225 ptype: 'rowexpander',
771bd0b9 226 rowBodyTpl: '<p class="logs">{logs}</p>'
0960034c
DC
227 }
228 ],
229
cf248533
DM
230 store: {
231 autoDestroy: true,
232 model: 'pmg-mail-tracker'
233 },
234
235 controller: {
236
237 xclass: 'Ext.app.ViewController',
238
239 onSearch: function() {
240 var view = this.getView();
241 var filter = this.lookupReference('filter');
242 var status = this.lookupReference('status');
243 var params = filter.getFilterParams();
244 status.update(''); // clear status before load
245 view.store.proxy.setExtraParams(params);
246 view.store.proxy.setUrl('/api2/json/nodes/' + Proxmox.NodeName + '/tracker');
247 view.store.load(function(records, operation, success) {
248 var response = operation.getResponse();
249 if (success) {
250 // fixme: howto avoid duplicate Ext.decode ?
251 var result = Ext.decode(response.responseText);
252 if (result.changes) {
253 status.update(result.changes);
254 }
255 }
256 });
257 },
258
0960034c 259 showDetails: function(rowNode, record) {
cf248533 260 var view = this.getView();
cf248533
DM
261
262 var params = view.store.proxy.getExtraParams();
263
0960034c
DC
264 Proxmox.Utils.API2Request({
265 method: 'GET',
266 params: { starttime: params.starttime, endtime: params.endtime },
267 url: '/nodes/' + Proxmox.NodeName + '/tracker/' + record.data.id,
268 waitMsgTarget: view,
269 failure: function(response, opts) {
270 record.set('logs',gettext('Error') + " " + response.htmlStatus);
271 },
272 success: function(response, opts) {
273 var data = response.result.data;
274 var logs = "";
275
276 Ext.Array.each(data.logs, function(line) {
277 logs += Ext.htmlEncode(line) + "<br>";
278 });
279
280 record.set('logs', logs);
281 }
cf248533 282 });
0960034c
DC
283 },
284
285 control: {
286 'gridview': {
287 expandbody: 'showDetails'
288 }
cf248533
DM
289 }
290 },
291
292 dockedItems: [
293 {
294 xtype: 'pmgMailTrackerFilter',
295 reference: 'filter',
296 listeners: { filterChanged: 'onSearch' },
297 border: false,
298 dock: 'top'
299 },
300 {
301 xtype: 'toolbar',
302 items: [
303 { text: 'Search', handler: 'onSearch' },
304 { xtype: 'component', html: '', reference: 'status' }
305 ]
306 }
307 ],
308
309 columns: [
310 {
311 xtype: 'datecolumn',
312 header: gettext('Time'),
313 width: 120,
314 dataIndex: 'time',
315 format: 'M d H:i:s'
316 },
317 {
318 header: gettext('From'),
319 flex: 1,
07d37f59
DM
320 dataIndex: 'from',
321 renderer: Ext.htmlEncode
cf248533
DM
322 },
323 {
324 header: gettext('To'),
325 flex: 1,
07d37f59
DM
326 dataIndex: 'to',
327 renderer: Ext.htmlEncode
cf248533
DM
328 },
329 {
330 header: gettext('Status'),
331 width: 150,
332 renderer: function(v, metaData, rec) {
dd502c64
DC
333 var returntext = 'unknown';
334 var icon = 'question-circle';
cf248533
DM
335 var rstatus = rec.data.rstatus;
336 if (v !== undefined && v !== '') {
cac4542e 337 var vtext = PMG.Utils.mail_status_map[v] || v;
dd502c64 338 icon = v;
cf248533 339 if (rstatus !== undefined && rstatus !== '') {
cac4542e 340 var rtext = PMG.Utils.mail_status_map[rstatus] || rstatus;
dd502c64
DC
341 returntext = vtext + '/' + rtext;
342 icon = rstatus;
343 } else if (rec.data.qid !== undefined) {
344 returntext = 'queued/' + vtext;
345 } else {
346 returntext = vtext;
cf248533 347 }
cf248533 348 }
dd502c64
DC
349
350 return PMG.Utils.format_status_icon(icon) + returntext;
cf248533
DM
351 },
352 dataIndex: 'dstatus'
353 },
354 {
355 header: gettext('Size'),
356 hidden: true,
357 dataIndex: 'size'
358 },
359 {
360 header: 'MSGID',
361 width: 300,
362 hidden: true,
07d37f59
DM
363 dataIndex: 'msgid',
364 renderer: Ext.htmlEncode
cf248533
DM
365 },
366 {
367 header: gettext('Client'),
368 width: 200,
369 hidden: true,
07d37f59
DM
370 dataIndex: 'client',
371 renderer: Ext.htmlEncode
cf248533
DM
372 }
373 ],
374
cf248533
DM
375 initComponent: function() {
376 var me = this;
377
378 me.callParent();
379
380 Proxmox.Utils.monStoreErrors(me.getView(), me.store);
381 }
382});