]> git.proxmox.com Git - pmg-gui.git/blob - js/MailTracker.js
add MailTracker
[pmg-gui.git] / js / MailTracker.js
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 });