]> git.proxmox.com Git - pmg-gui.git/blame - js/MailTracker.js
use rowexpander for trackingcenter logs
[pmg-gui.git] / js / MailTracker.js
CommitLineData
cf248533
DM
1Ext.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
15Ext.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
133Ext.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
196Ext.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,
cf248533
DM
210 },
211
0960034c
DC
212 plugins: [
213 {
214 ptype: 'rowexpander',
215 rowBodyTpl: '<p class="logs">{logs}</p>',
216 }
217 ],
218
cf248533
DM
219 store: {
220 autoDestroy: true,
221 model: 'pmg-mail-tracker'
222 },
223
224 controller: {
225
226 xclass: 'Ext.app.ViewController',
227
228 onSearch: function() {
229 var view = this.getView();
230 var filter = this.lookupReference('filter');
231 var status = this.lookupReference('status');
232 var params = filter.getFilterParams();
233 status.update(''); // clear status before load
234 view.store.proxy.setExtraParams(params);
235 view.store.proxy.setUrl('/api2/json/nodes/' + Proxmox.NodeName + '/tracker');
236 view.store.load(function(records, operation, success) {
237 var response = operation.getResponse();
238 if (success) {
239 // fixme: howto avoid duplicate Ext.decode ?
240 var result = Ext.decode(response.responseText);
241 if (result.changes) {
242 status.update(result.changes);
243 }
244 }
245 });
246 },
247
0960034c 248 showDetails: function(rowNode, record) {
cf248533 249 var view = this.getView();
cf248533
DM
250
251 var params = view.store.proxy.getExtraParams();
252
0960034c
DC
253 Proxmox.Utils.API2Request({
254 method: 'GET',
255 params: { starttime: params.starttime, endtime: params.endtime },
256 url: '/nodes/' + Proxmox.NodeName + '/tracker/' + record.data.id,
257 waitMsgTarget: view,
258 failure: function(response, opts) {
259 record.set('logs',gettext('Error') + " " + response.htmlStatus);
260 },
261 success: function(response, opts) {
262 var data = response.result.data;
263 var logs = "";
264
265 Ext.Array.each(data.logs, function(line) {
266 logs += Ext.htmlEncode(line) + "<br>";
267 });
268
269 record.set('logs', logs);
270 }
cf248533 271 });
0960034c
DC
272 },
273
274 control: {
275 'gridview': {
276 expandbody: 'showDetails'
277 }
cf248533
DM
278 }
279 },
280
281 dockedItems: [
282 {
283 xtype: 'pmgMailTrackerFilter',
284 reference: 'filter',
285 listeners: { filterChanged: 'onSearch' },
286 border: false,
287 dock: 'top'
288 },
289 {
290 xtype: 'toolbar',
291 items: [
292 { text: 'Search', handler: 'onSearch' },
293 { xtype: 'component', html: '', reference: 'status' }
294 ]
295 }
296 ],
297
298 columns: [
299 {
300 xtype: 'datecolumn',
301 header: gettext('Time'),
302 width: 120,
303 dataIndex: 'time',
304 format: 'M d H:i:s'
305 },
306 {
307 header: gettext('From'),
308 flex: 1,
309 dataIndex: 'from'
310 },
311 {
312 header: gettext('To'),
313 flex: 1,
314 dataIndex: 'to'
315 },
316 {
317 header: gettext('Status'),
318 width: 150,
319 renderer: function(v, metaData, rec) {
320 var rstatus = rec.data.rstatus;
321 if (v !== undefined && v !== '') {
322 vtext = PMG.Utils.mail_status_map[v] || v;
323 if (rstatus !== undefined && rstatus !== '') {
324 rtext = PMG.Utils.mail_status_map[rstatus] || rstatus;
325 return vtext + '/' + rtext;
326 }
327 if (rec.data.qid !== undefined) {
328 return 'queued/' + vtext;
329 }
330 return vtext;
331 }
332 return 'unknown';
333 },
334 dataIndex: 'dstatus'
335 },
336 {
337 header: gettext('Size'),
338 hidden: true,
339 dataIndex: 'size'
340 },
341 {
342 header: 'MSGID',
343 width: 300,
344 hidden: true,
345 dataIndex: 'msgid'
346 },
347 {
348 header: gettext('Client'),
349 width: 200,
350 hidden: true,
351 dataIndex: 'client'
352 }
353 ],
354
cf248533
DM
355 initComponent: function() {
356 var me = this;
357
358 me.callParent();
359
360 Proxmox.Utils.monStoreErrors(me.getView(), me.store);
361 }
362});