]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamQuarantine.js
add white/blacklist, deliver and delete button for the spam quarantine
[pmg-gui.git] / js / SpamQuarantine.js
1 Ext.define('pmg-spam-archive', {
2 extend: 'Ext.data.Model',
3 fields: [
4 { type: 'number', name: 'spamavg' },
5 { type: 'integer', name: 'count' },
6 { type: 'date', dateFormat: 'timestamp', name: 'day' }
7 ],
8 proxy: {
9 type: 'proxmox',
10 url: "/api2/json/quarantine/spam"
11 },
12 idProperty: 'day'
13 });
14
15 Ext.define('pmg-spam-list', {
16 extend: 'Ext.data.Model',
17 fields: [ 'id', 'envelope_sender', 'from', 'sender', 'receiver', 'subject',
18 { type: 'number', name: 'spamlevel' },
19 { type: 'integer', name: 'bytes' },
20 { type: 'date', dateFormat: 'timestamp', name: 'time' },
21 {
22 type: 'string',
23 name: 'day',
24 convert: function(v, rec) {
25 return Ext.Date.format(rec.get('time'), 'Y-m-d');
26 }, depends: ['time']
27 }
28 ],
29 proxy: {
30 type: 'proxmox',
31 url: "/api2/json/quarantine/spam",
32 },
33 idProperty: 'id'
34 });
35
36 Ext.define('PMG.SpamList', {
37 extend: 'Ext.grid.GridPanel',
38 xtype: 'pmgSpamList',
39
40 title: gettext('Spam List'),
41
42 emptyText: gettext('No E-Mail address selected'),
43 viewConfig: {
44 deferEmptyText: false
45 },
46
47 setUser: function(user) {
48 var me = this;
49 var params = me.getStore().getProxy().getExtraParams();
50 params.pmail = user;
51 me.getStore().getProxy().setExtraParams(params);
52 me.user = user;
53 },
54
55 setFrom: function(from) {
56 var me = this;
57 var params = me.getStore().getProxy().getExtraParams();
58 params.starttime = from;
59 me.getStore().getProxy().setExtraParams(params);
60 },
61
62 setTo: function(to) {
63 var me = this;
64 var params = me.getStore().getProxy().getExtraParams();
65 params.endtime = to;
66 me.getStore().getProxy().setExtraParams(params);
67 },
68
69 load: function() {
70 var me = this;
71 if (me.user || PMG.view === 'quarantine') {
72 // extjs has no method to dynamically change the emptytext on
73 // grids, so we have to do it this way
74 var view = me.getView();
75 view.emptyText = '<div class="x-grid-empty">'+ gettext('No Spam E-Mails found') + '</div>';
76 view.refresh();
77 }
78 me.getStore().load();
79 },
80
81 store: {
82 model: 'pmg-spam-list',
83 groupField: 'day',
84 groupDir: 'DESC',
85 sorters: [{
86 property: 'time',
87 direction: 'DESC'
88 }]
89 },
90
91 features: [
92 {
93 ftype: 'grouping',
94 groupHeaderTpl: '{columnName}: {name} ({children.length})'
95 }
96 ],
97
98 columns: [
99 {
100 header: gettext('Sender/Subject'),
101 dataIndex: 'subject',
102 renderer: function(value, metaData, rec) {
103 var subject = Ext.htmlEncode(value);
104 var from = Ext.htmlEncode(rec.data.from);
105 var sender = Ext.htmlEncode(rec.data.sender);
106 if (sender) {
107 from = Ext.String.format(gettext("{0} on behalf of {1}"),
108 sender, from);
109 }
110 return '<small>' + from + '</small><br>' + subject;
111 },
112 flex: 1
113 },
114 {
115 header: gettext('Score'),
116 dataIndex: 'spamlevel',
117 align: 'right',
118 width: 70,
119 },
120 {
121 header: gettext('Size') + ' (KB)',
122 renderer: function(v) { return Ext.Number.toFixed(v/1024, 0); },
123 dataIndex: 'bytes',
124 align: 'right',
125 width: 90,
126 },
127 {
128 header: gettext('Date'),
129 dataIndex: 'day',
130 hidden: true
131 },
132 {
133 xtype: 'datecolumn',
134 header: gettext('Time'),
135 dataIndex: 'time',
136 format: 'H:m:s'
137 },
138 ]
139 });
140
141 Ext.define('PMG.SpamQuarantine', {
142 extend: 'Ext.container.Container',
143 xtype: 'pmgSpamQuarantine',
144
145 border: false,
146 layout: 'border',
147
148 defaults: { border: false },
149
150 controller: {
151
152 xclass: 'Ext.app.ViewController',
153
154 init: function(view) {
155 var me = this;
156 var spamlist = me.lookupReference('spamlist');
157 if (PMG.view === 'quarantine') {
158 spamlist.down('combobox[name=email]').setVisible(false);
159 spamlist.load();
160 }
161
162 // we to this to trigger the change event of those fields
163 var today = new Date();
164 spamlist.down('datefield[name=from]').setValue(today);
165 spamlist.down('datefield[name=to]').setValue(today);
166 },
167
168 changeEmail: function(tb, value) {
169 var spamlist = this.lookupReference('spamlist');
170 spamlist.setUser(value);
171 spamlist.load();
172 },
173
174 resetEmail: function() {
175 if (PMG.view !== 'quarantine') {
176 var spamlist = this.lookupReference('spamlist');
177 spamlist.setUser(undefined);
178 }
179 },
180
181 onSelectMail: function() {
182 var me = this;
183 var spamlist = this.lookupReference('spamlist');
184 var rec = spamlist.selModel.getSelection()[0];
185
186 var preview = this.lookupReference('preview');
187
188 if (!rec || !rec.data || !rec.data.id) {
189 preview.update('');
190 me.lookupReference('preview').setDisabled(true);
191 return;
192 }
193
194 me.lookupReference('preview').setDisabled(false);
195
196 var raw = me.raw || false;
197
198 var url = '/api2/htmlmail/quarantine/content?id=' + rec.data.id + ((raw)?'&raw=1':'');
199 preview.update("<iframe frameborder=0 width=100% height=100% sandbox='allow-same-origin' src='" + url +"'></iframe>");
200 },
201
202 rawMail: function(button) {
203 var me = this;
204 me.lookupReference('html').setVisible(true);
205 button.setVisible(false);
206 me.raw = true;
207 me.onSelectMail();
208 },
209
210 htmlMail: function(button) {
211 var me = this;
212 me.lookupReference('raw').setVisible(true);
213 button.setVisible(false);
214 me.raw = false;
215 me.onSelectMail();
216 },
217
218 changeTime: function(field, value) {
219 var me = this;
220 if (!value) {
221 return;
222 }
223 var val = value.getTime()/1000;
224 var spamlist = me.lookupReference('spamlist');
225 var combobox = me.lookupReference('email');
226 var params = combobox.getStore().getProxy().getExtraParams();
227
228 var to = me.lookupReference('to');
229 var from = me.lookupReference('from');
230
231 if (field.name === 'from') {
232 spamlist.setFrom(val);
233 params.starttime = val;
234 to.setMinValue(value);
235
236 } else if (field.name === 'to') {
237 spamlist.setTo(val + 24*60*60);
238 params.endtime = val + 24*60*60;
239 from.setMaxValue(value);
240 } else {
241 return;
242 }
243
244 // the combobox does not know anything about the extraparams
245 // so we disable queryCaching until we expand (and query) again
246 combobox.queryCaching = false;
247 combobox.getStore().getProxy().setExtraParams(params);
248
249 // we are reloading when we already have an email selected,
250 // or are in the user quarantine view
251 if (combobox.getValue() || PMG.view === 'quarantine') {
252 spamlist.load();
253 }
254 },
255
256 setQueryCaching: function() {
257 this.lookupReference('email').queryCaching = true;
258 },
259
260 btnHandler: function(button, e) {
261 var spamlist = this.lookupReference('spamlist');
262 var selected = spamlist.getSelection();
263 if (!selected.length) {
264 return;
265 }
266 Proxmox.Utils.API2Request({
267 url: '/quarantine/content/',
268 params: {
269 action: button.reference,
270 id: selected[0].data.id
271 },
272 method: 'POST',
273 failure: function(response, opts) {
274 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
275 },
276 success: function(response, opts) {
277 spamlist.load();
278 Ext.Msg.show({
279 title: gettext('Info'),
280 message: "Action '" + button.reference + ' ' +
281 selected[0].data.id + "' successful",
282 buttons: Ext.Msg.OK,
283 icon: Ext.MessageBox.INFO
284 });
285 }
286 });
287 },
288
289 control: {
290 '#':{
291 beforedestroy: 'resetEmail'
292 },
293 'button[reference=raw]': {
294 click: 'rawMail'
295 },
296 'button[reference=html]': {
297 click: 'htmlMail'
298 },
299 'combobox[name=email]': {
300 change: {
301 fn: 'changeEmail',
302 buffer: 500
303 },
304 expand: 'setQueryCaching'
305 },
306 'datefield': {
307 change: 'changeTime'
308 },
309 'pmgSpamList':{
310 selectionChange: 'onSelectMail'
311 },
312 }
313 },
314
315 items: [
316 {
317 tbar: {
318 layout: {
319 type: 'vbox',
320 align: 'stretch'
321 },
322 defaults: {
323 margin: 2,
324 },
325 items: [
326 {
327 fieldLabel: gettext('From'),
328 reference: 'from',
329 xtype: 'datefield',
330 format: 'Y-m-d',
331 name: 'from'
332 },
333 {
334 fieldLabel: gettext('To'),
335 reference: 'to',
336 xtype: 'datefield',
337 format: 'Y-m-d',
338 name: 'to'
339 },
340 {
341 xtype: 'combobox',
342 displayField: 'mail',
343 valueField: 'mail',
344 store: {
345 proxy: {
346 type: 'proxmox',
347 url: '/api2/json/quarantine/spamusers'
348 }
349 },
350 queryParam: false,
351 queryCaching: false,
352 editable: false,
353 reference: 'email',
354 name: 'email',
355 fieldLabel: 'E-Mail',
356 }]
357 },
358 xtype: 'pmgSpamList',
359 reference: 'spamlist',
360 region: 'west',
361 width: 500,
362 split: true,
363 collapsible: false,
364 },
365 {
366 title: gettext('Selected Mail'),
367 border: 0,
368 region: 'center',
369 split: true,
370 reference: 'preview',
371 disabled: true,
372 tbar: [{
373 xtype: 'button',
374 reference: 'raw',
375 text: gettext('Show Raw'),
376 iconCls: 'fa fa-file-code-o'
377 },{
378 xtype: 'button',
379 reference: 'html',
380 hidden: true,
381 text: gettext('Show HTML'),
382 iconCls: 'fa fa-file-text-o'
383 },'->',{
384 reference: 'whitelist',
385 text: gettext('Whitelist'),
386 iconCls: 'fa fa-check',
387 handler: 'btnHandler'
388 },{
389 reference: 'blacklist',
390 text: gettext('Blacklist'),
391 iconCls: 'fa fa-times',
392 handler: 'btnHandler'
393 },{
394 reference: 'deliver',
395 text: gettext('Deliver'),
396 iconCls: 'fa fa-paper-plane-o',
397 handler: 'btnHandler'
398 },{
399 reference: 'delete',
400 text: gettext('Delete'),
401 iconCls: 'fa fa-trash-o',
402 handler: 'btnHandler'
403 },]
404 }
405 ]
406 });