]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamQuarantine.js
restructure 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('Level'),
116 dataIndex: 'spamlevel'
117 },
118 {
119 header: gettext('Size (KB)'),
120 renderer: function(v) { return Ext.Number.toFixed(v/1024, 0); },
121 dataIndex: 'bytes'
122 },
123 {
124 header: gettext('Arrival Day'),
125 dataIndex: 'day',
126 hidden: true
127 },
128 {
129 xtype: 'datecolumn',
130 header: gettext('Arrival Time'),
131 dataIndex: 'time',
132 format: 'H:m:s'
133 },
134 ]
135 });
136
137 Ext.define('PMG.SpamQuarantine', {
138 extend: 'Ext.container.Container',
139 xtype: 'pmgSpamQuarantine',
140
141 border: false,
142 layout: 'border',
143
144 defaults: { border: false },
145
146 controller: {
147
148 xclass: 'Ext.app.ViewController',
149
150 init: function(view) {
151 var me = this;
152 var spamlist = me.lookupReference('spamlist');
153 if (PMG.view === 'quarantine') {
154 spamlist.down('combobox[name=email]').setVisible(false);
155 spamlist.load();
156 }
157
158 // we to this to trigger the change event of those fields
159 var today = new Date();
160 spamlist.down('datefield[name=from]').setValue(today);
161 spamlist.down('datefield[name=to]').setValue(today);
162 },
163
164 changeEmail: function(tb, value) {
165 var spamlist = this.lookupReference('spamlist');
166 spamlist.setUser(value);
167 spamlist.load();
168 },
169
170 resetEmail: function() {
171 var spamlist = this.lookupReference('spamlist');
172 spamlist.setUser(undefined);
173 },
174
175 onSelectMail: function() {
176 var me = this;
177 var spamlist = this.lookupReference('spamlist');
178 var rec = spamlist.selModel.getSelection()[0];
179
180 var preview = this.lookupReference('preview');
181
182 if (!rec || !rec.data || !rec.data.id) {
183 preview.update('');
184 me.lookupReference('preview').setDisabled(true);
185 return;
186 }
187
188 me.lookupReference('preview').setDisabled(false);
189
190 var raw = me.raw || false;
191
192 var url = '/api2/htmlmail/quarantine/content?id=' + rec.data.id + ((raw)?'&raw=1':'');
193 preview.update("<iframe frameborder=0 width=100% height=100% sandbox='allow-same-origin' src='" + url +"'></iframe>");
194 },
195
196 rawMail: function(button) {
197 var me = this;
198 me.lookupReference('html').setVisible(true);
199 button.setVisible(false);
200 me.raw = true;
201 me.onSelectMail();
202 },
203
204 htmlMail: function(button) {
205 var me = this;
206 me.lookupReference('raw').setVisible(true);
207 button.setVisible(false);
208 me.raw = false;
209 me.onSelectMail();
210 },
211
212 changeTime: function(field, value) {
213 var me = this;
214 if (!value) {
215 return;
216 }
217 var val = value.getTime()/1000;
218 var spamlist = me.lookupReference('spamlist');
219 var combobox = me.lookupReference('email');
220 var params = combobox.getStore().getProxy().getExtraParams();
221
222 var to = me.lookupReference('to');
223 var from = me.lookupReference('from');
224
225 if (field.name === 'from') {
226 spamlist.setFrom(val);
227 params.starttime = val;
228 to.setMinValue(value);
229
230 } else if (field.name === 'to') {
231 spamlist.setTo(val + 24*60*60);
232 params.endtime = val + 24*60*60;
233 from.setMaxValue(value);
234 } else {
235 return;
236 }
237
238 // the combobox does not know anything about the extraparams
239 // so we disable queryCaching until we expand (and query) again
240 combobox.queryCaching = false;
241 combobox.getStore().getProxy().setExtraParams(params);
242
243 // we are reloading when we already have an email selected,
244 // or are in the user quarantine view
245 if (combobox.getValue() || PMG.view === 'quarantine') {
246 spamlist.load();
247 }
248 },
249
250 setQueryCaching: function() {
251 this.lookupReference('email').queryCaching = true;
252 },
253
254 control: {
255 '#':{
256 beforedestroy: 'resetEmail'
257 },
258 'button[reference=raw]': {
259 click: 'rawMail'
260 },
261 'button[reference=html]': {
262 click: 'htmlMail'
263 },
264 'combobox[name=email]': {
265 change: {
266 fn: 'changeEmail',
267 buffer: 500
268 },
269 expand: 'setQueryCaching'
270 },
271 'datefield': {
272 change: 'changeTime'
273 },
274 'pmgSpamList':{
275 selectionChange: 'onSelectMail'
276 },
277 }
278 },
279
280 items: [
281 {
282 tbar: {
283 layout: {
284 type: 'vbox',
285 align: 'stretch'
286 },
287 defaults: {
288 margin: 2,
289 },
290 items: [
291 {
292 fieldLabel: gettext('From'),
293 reference: 'from',
294 xtype: 'datefield',
295 format: 'Y-m-d',
296 name: 'from'
297 },
298 {
299 fieldLabel: gettext('To'),
300 reference: 'to',
301 xtype: 'datefield',
302 format: 'Y-m-d',
303 name: 'to'
304 },
305 {
306 xtype: 'combobox',
307 displayField: 'mail',
308 valueField: 'mail',
309 store: {
310 proxy: {
311 type: 'proxmox',
312 url: '/api2/json/quarantine/spamusers'
313 }
314 },
315 queryParam: false,
316 queryCaching: false,
317 editable: false,
318 reference: 'email',
319 name: 'email',
320 fieldLabel: 'E-Mail',
321 }]
322 },
323 xtype: 'pmgSpamList',
324 reference: 'spamlist',
325 region: 'west',
326 width: 500,
327 split: true,
328 collapsible: false,
329 },
330 {
331 title: gettext('Selected Mail'),
332 border: 0,
333 region: 'center',
334 split: true,
335 reference: 'preview',
336 disabled: true,
337 tbar: [{
338 xtype: 'button',
339 reference: 'raw',
340 text: gettext('Show Raw'),
341 iconCls: 'fa fa-file-code-o'
342 },{
343 xtype: 'button',
344 reference: 'html',
345 hidden: true,
346 text: gettext('Show HTML'),
347 iconCls: 'fa fa-file-text-o'
348 }]
349 }
350 ]
351 });