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