]>
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.'), | |
205 | viewConfig: { | |
206 | deferEmptyText: false | |
207 | }, | |
208 | ||
209 | store: { | |
210 | autoDestroy: true, | |
211 | model: 'pmg-mail-tracker' | |
212 | }, | |
213 | ||
214 | controller: { | |
215 | ||
216 | xclass: 'Ext.app.ViewController', | |
217 | ||
218 | onSearch: function() { | |
219 | var view = this.getView(); | |
220 | var filter = this.lookupReference('filter'); | |
221 | var status = this.lookupReference('status'); | |
222 | var params = filter.getFilterParams(); | |
223 | status.update(''); // clear status before load | |
224 | view.store.proxy.setExtraParams(params); | |
225 | view.store.proxy.setUrl('/api2/json/nodes/' + Proxmox.NodeName + '/tracker'); | |
226 | view.store.load(function(records, operation, success) { | |
227 | var response = operation.getResponse(); | |
228 | if (success) { | |
229 | // fixme: howto avoid duplicate Ext.decode ? | |
230 | var result = Ext.decode(response.responseText); | |
231 | if (result.changes) { | |
232 | status.update(result.changes); | |
233 | } | |
234 | } | |
235 | }); | |
236 | }, | |
237 | ||
238 | showDetails: function() { | |
239 | var view = this.getView(); | |
240 | var sm = view.getSelectionModel(); | |
241 | var rec = sm.getSelection()[0]; | |
242 | if (!rec) { | |
243 | return; | |
244 | } | |
245 | ||
246 | var params = view.store.proxy.getExtraParams(); | |
247 | ||
248 | var win = Ext.create('PMG.MaiLogWindow', { | |
249 | starttime: params.starttime, | |
250 | endtime: params.endtime, | |
251 | logid: rec.data.id | |
252 | }); | |
253 | win.show(); | |
254 | } | |
255 | }, | |
256 | ||
257 | dockedItems: [ | |
258 | { | |
259 | xtype: 'pmgMailTrackerFilter', | |
260 | reference: 'filter', | |
261 | listeners: { filterChanged: 'onSearch' }, | |
262 | border: false, | |
263 | dock: 'top' | |
264 | }, | |
265 | { | |
266 | xtype: 'toolbar', | |
267 | items: [ | |
268 | { text: 'Search', handler: 'onSearch' }, | |
269 | { xtype: 'component', html: '', reference: 'status' } | |
270 | ] | |
271 | } | |
272 | ], | |
273 | ||
274 | columns: [ | |
275 | { | |
276 | xtype: 'datecolumn', | |
277 | header: gettext('Time'), | |
278 | width: 120, | |
279 | dataIndex: 'time', | |
280 | format: 'M d H:i:s' | |
281 | }, | |
282 | { | |
283 | header: gettext('From'), | |
284 | flex: 1, | |
285 | dataIndex: 'from' | |
286 | }, | |
287 | { | |
288 | header: gettext('To'), | |
289 | flex: 1, | |
290 | dataIndex: 'to' | |
291 | }, | |
292 | { | |
293 | header: gettext('Status'), | |
294 | width: 150, | |
295 | renderer: function(v, metaData, rec) { | |
296 | var rstatus = rec.data.rstatus; | |
297 | if (v !== undefined && v !== '') { | |
298 | vtext = PMG.Utils.mail_status_map[v] || v; | |
299 | if (rstatus !== undefined && rstatus !== '') { | |
300 | rtext = PMG.Utils.mail_status_map[rstatus] || rstatus; | |
301 | return vtext + '/' + rtext; | |
302 | } | |
303 | if (rec.data.qid !== undefined) { | |
304 | return 'queued/' + vtext; | |
305 | } | |
306 | return vtext; | |
307 | } | |
308 | return 'unknown'; | |
309 | }, | |
310 | dataIndex: 'dstatus' | |
311 | }, | |
312 | { | |
313 | header: gettext('Size'), | |
314 | hidden: true, | |
315 | dataIndex: 'size' | |
316 | }, | |
317 | { | |
318 | header: 'MSGID', | |
319 | width: 300, | |
320 | hidden: true, | |
321 | dataIndex: 'msgid' | |
322 | }, | |
323 | { | |
324 | header: gettext('Client'), | |
325 | width: 200, | |
326 | hidden: true, | |
327 | dataIndex: 'client' | |
328 | } | |
329 | ], | |
330 | ||
331 | listeners: { | |
332 | itemdblclick: 'showDetails', | |
333 | }, | |
334 | ||
335 | initComponent: function() { | |
336 | var me = this; | |
337 | ||
338 | me.callParent(); | |
339 | ||
340 | Proxmox.Utils.monStoreErrors(me.getView(), me.store); | |
341 | } | |
342 | }); |