]>
Commit | Line | Data |
---|---|---|
cf248533 DM |
1 | Ext.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 | ||
15 | Ext.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 | ||
133 | Ext.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 | ||
196 | Ext.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 | }); |