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