]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamQuarantine.js
add download button to spam quarantine preview
[pmg-gui.git] / js / SpamQuarantine.js
1 /*global Proxmox*/
2 /*jslint confusion: true*/
3 /*format is a string and a function*/
4 Ext.define('pmg-spam-archive', {
5 extend: 'Ext.data.Model',
6 fields: [
7 { type: 'number', name: 'spamavg' },
8 { type: 'integer', name: 'count' },
9 { type: 'date', dateFormat: 'timestamp', name: 'day' }
10 ],
11 proxy: {
12 type: 'proxmox',
13 url: "/api2/json/quarantine/spam"
14 },
15 idProperty: 'day'
16 });
17
18 Ext.define('pmg-spam-list', {
19 extend: 'Ext.data.Model',
20 fields: [ 'id', 'envelope_sender', 'from', 'sender', 'receiver', 'subject',
21 { type: 'number', name: 'spamlevel' },
22 { type: 'integer', name: 'bytes' },
23 { type: 'date', dateFormat: 'timestamp', name: 'time' },
24 {
25 type: 'string',
26 name: 'day',
27 convert: function(v, rec) {
28 return Ext.Date.format(rec.get('time'), 'Y-m-d');
29 }, depends: ['time']
30 }
31 ],
32 proxy: {
33 type: 'proxmox',
34 url: "/api2/json/quarantine/spam"
35 },
36 idProperty: 'id'
37 });
38
39 Ext.define('PMG.SpamQuarantine', {
40 extend: 'Ext.container.Container',
41 xtype: 'pmgSpamQuarantine',
42
43 border: false,
44 layout: { type: 'border' },
45
46 defaults: { border: false },
47
48 // from mail link
49 cselect: undefined,
50
51 controller: {
52
53 xclass: 'Ext.app.ViewController',
54
55 updatePreview: function(raw, rec) {
56 var preview = this.lookupReference('preview');
57
58 if (!rec || !rec.data || !rec.data.id) {
59 preview.update('');
60 preview.setDisabled(true);
61 return;
62 }
63
64 var url = '/api2/htmlmail/quarantine/content?id=' + rec.data.id + ((raw)?'&raw=1':'');
65 preview.setDisabled(false);
66 this.lookupReference('raw').setDisabled(false);
67 this.lookupReference('spam').setDisabled(false);
68 this.lookupReference('download').setDisabled(false);
69 preview.update("<iframe frameborder=0 width=100% height=100% sandbox='allow-same-origin' src='" + url +"'></iframe>");
70 },
71
72 multiSelect: function() {
73 var preview = this.lookupReference('preview');
74 var raw = this.lookupReference('raw');
75 var spam = this.lookupReference('spam');
76 var spaminfo = this.lookupReference('spaminfo');
77 var download = this.lookupReference('download');
78
79 preview.setDisabled(false);
80 preview.update('<h3>' + gettext('Multiple E-Mails selected') + '</h3>');
81 raw.setDisabled(true);
82 spam.setDisabled(true);
83 spam.setPressed(false);
84 spaminfo.setVisible(false);
85 download.setDisabled(true);
86 },
87
88 toggleRaw: function(button) {
89 var me = this;
90 var list = this.lookupReference('list');
91 var rec = list.selModel.getSelection()[0];
92 me.raw = !me.raw;
93 me.updatePreview(me.raw, rec);
94 },
95
96 btnHandler: function(button, e) {
97 var me = this;
98 var action = button.reference;
99 var list = this.lookupReference('list');
100 var selected = list.getSelection();
101 me.doAction(action, selected);
102 },
103
104 doAction: function(action, selected) {
105 if (!selected.length) {
106 return;
107 }
108
109 var list = this.lookupReference('list');
110
111 if (selected.length > 1) {
112 var idlist = [];
113 selected.forEach(function(item) {
114 idlist.push(item.data.id);
115 });
116 Ext.Msg.confirm(
117 gettext('Confirm'),
118 Ext.String.format(
119 gettext("Action '{0}' for '{1}' items"),
120 action, selected.length
121 ),
122 function(button) {
123 if (button !== 'yes') {
124 return;
125 }
126
127 PMG.Utils.doQuarantineAction(action, idlist.join(';'), function() {
128 list.getController().load();
129 });
130 }
131 );
132 return;
133 }
134
135 PMG.Utils.doQuarantineAction(action, selected[0].data.id, function() {
136 list.getController().load();
137 });
138 },
139
140 onSelectMail: function() {
141 var me = this;
142 var list = this.lookupReference('list');
143 var selection = list.selModel.getSelection();
144 if (selection.length > 1) {
145 me.multiSelect();
146 return;
147 }
148 var rec = list.selModel.getSelection()[0];
149
150 me.updatePreview(me.raw || false, rec);
151 me.lookupReference('spaminfo').setID(rec);
152 },
153
154 toggleSpamInfo: function(btn) {
155 var grid = this.lookupReference('spaminfo');
156 grid.setVisible(!grid.isVisible());
157 },
158
159 downloadEmail: function(btn) {
160 var me = this;
161 var list = this.lookupReference('list');
162 var selection = list.selModel.getSelection();
163 if (selection.length != 1) {
164 return; // multi download is not implemented
165 }
166 var rec = selection[0];
167 var url = '/api2/extjs/quarantine/content';
168 Proxmox.Utils.API2Request({
169 url: url,
170 params: {
171 id: rec.data.id,
172 raw: 1
173 },
174 method: 'GET',
175 failure: function(response, opts) {
176 Ext.Msg.alert('Error', response.htmlStatus);
177 },
178 success: function(response, opts) {
179 var data = response.result.data;
180 var raw = data.header;
181 raw += '\n';
182 raw += data.content;
183
184 var link = Ext.DomHelper.append(document.body, {
185 tag: 'a',
186 href: 'data:message/rfc822,' + encodeURIComponent(raw),
187 css: 'display:none;visibility:hidden;height: 0px;',
188 download: rec.data.id + '.eml'
189 });
190
191 if (link.fireEvent) {
192 link.fireEvent('onclick');
193 } else {
194 var evt = document.createEvent("MouseEvents");
195 evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
196 link.dispatchEvent(evt);
197 }
198 }
199 });
200 },
201
202 openContextMenu: function(table, record, tr, index, event) {
203 event.stopEvent();
204 var me = this;
205 var list = me.lookup('list');
206 var menu = Ext.create('PMG.menu.SpamContextMenu', {
207 callback: function(action) {
208 me.doAction(action, list.getSelection());
209 }
210 });
211
212 menu.showAt(event.getXY());
213 },
214
215 keyPress: function (table, record, item, index, event) {
216 var me = this;
217 var list = me.lookup('list');
218 var key = event.getKey();
219 var action = '';
220 switch(key) {
221 case event.DELETE:
222 case 127:
223 action = 'delete';
224 break;
225 case Ext.event.Event.D:
226 case Ext.event.Event.D + 32:
227 action = 'deliver';
228 break;
229 case Ext.event.Event.W:
230 case Ext.event.Event.W + 32:
231 action = 'whitelist';
232 break;
233 case Ext.event.Event.B:
234 case Ext.event.Event.B + 32:
235 action = 'blacklist';
236 break;
237 }
238
239 if (action !== '') {
240 me.doAction(action, list.getSelection());
241 }
242 },
243
244 init: function(view) {
245 this.lookup('list').cselect = view.cselect;
246 },
247
248 control: {
249 'button[reference=raw]': {
250 click: 'toggleRaw'
251 },
252 'button[reference=spam]': {
253 click: 'toggleSpamInfo'
254 },
255 'button[reference=download]': {
256 click: 'downloadEmail'
257 },
258 'pmgQuarantineList': {
259 selectionChange: 'onSelectMail',
260 itemkeypress: 'keyPress',
261 rowcontextmenu: 'openContextMenu'
262 }
263 }
264 },
265
266 items: [
267 {
268 title: gettext('Spam Quarantine'),
269 xtype: 'pmgQuarantineList',
270 selModel: 'checkboxmodel',
271 emailSelection: true,
272 reference: 'list',
273 region: 'west',
274 width: 500,
275 split: true,
276 collapsible: false,
277 store: {
278 model: 'pmg-spam-list',
279 groupField: 'day',
280 groupDir: 'DESC',
281 sorters: [{
282 property: 'time',
283 direction: 'DESC'
284 }]
285 },
286
287 columns: [
288 {
289 header: gettext('Sender/Subject'),
290 dataIndex: 'subject',
291 renderer: PMG.Utils.sender_renderer,
292 flex: 1
293 },
294 {
295 header: gettext('Score'),
296 dataIndex: 'spamlevel',
297 align: 'right',
298 width: 70
299 },
300 {
301 header: gettext('Size') + ' (KB)',
302 renderer: function(v) { return Ext.Number.toFixed(v/1024, 0); },
303 dataIndex: 'bytes',
304 align: 'right',
305 width: 90
306 },
307 {
308 header: gettext('Date'),
309 dataIndex: 'day',
310 hidden: true
311 },
312 {
313 xtype: 'datecolumn',
314 header: gettext('Time'),
315 dataIndex: 'time',
316 format: 'H:i:s'
317 }
318 ]
319 },
320 {
321 title: gettext('Selected Mail'),
322 border: false,
323 region: 'center',
324 split: true,
325 reference: 'preview',
326 disabled: true,
327 dockedItems: [
328 {
329 xtype: 'toolbar',
330 dock: 'top',
331 items: [
332 {
333 xtype: 'button',
334 reference: 'raw',
335 text: gettext('Toggle Raw'),
336 enableToggle: true,
337 iconCls: 'fa fa-file-code-o'
338 },
339 {
340 xtype: 'button',
341 reference: 'spam',
342 text: gettext('Toggle Spam Info'),
343 enableToggle: true,
344 iconCls: 'fa fa-bullhorn'
345 },
346 '->',
347 {
348 xtype: 'button',
349 reference: 'download',
350 text: gettext('Download'),
351 iconCls: 'fa fa-download'
352 },
353 '-',
354 {
355 reference: 'whitelist',
356 text: gettext('Whitelist'),
357 iconCls: 'fa fa-check',
358 handler: 'btnHandler'
359 },
360 {
361 reference: 'blacklist',
362 text: gettext('Blacklist'),
363 iconCls: 'fa fa-times',
364 handler: 'btnHandler'
365 },
366 {
367 reference: 'deliver',
368 text: gettext('Deliver'),
369 iconCls: 'fa fa-paper-plane-o',
370 handler: 'btnHandler'
371 },
372 {
373 reference: 'delete',
374 text: gettext('Delete'),
375 iconCls: 'fa fa-trash-o',
376 handler: 'btnHandler'
377 }
378 ]
379 },
380 {
381 xtype: 'pmgSpamInfoGrid',
382 border: false,
383 reference: 'spaminfo'
384 }
385 ]
386 }
387 ]
388 });