]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamQuarantine.js
spam quarantine: shorter mapping from selected to id list
[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 let idlist = selected.map(item => item.data.id);
122 Ext.Msg.confirm(
123 gettext('Confirm'),
124 Ext.String.format(
125 gettext("Action '{0}' for '{1}' items"),
126 action, selected.length,
127 ),
128 function(button) {
129 if (button !== 'yes') {
130 return;
131 }
132
133 PMG.Utils.doQuarantineAction(action, idlist.join(';'), function() {
134 list.getController().load();
135 });
136 },
137 );
138 return;
139 }
140
141 PMG.Utils.doQuarantineAction(action, selected[0].data.id, function() {
142 list.getController().load();
143 });
144 },
145
146 onSelectMail: function() {
147 var me = this;
148 var list = this.lookupReference('list');
149 var selection = list.selModel.getSelection();
150 if (selection.length > 1) {
151 me.multiSelect(selection);
152 return;
153 }
154
155 var rec = selection[0] || {};
156
157 me.getViewModel().set('mailid', rec.data ? rec.data.id : '');
158 me.updatePreview(me.raw || false, rec);
159 me.lookupReference('spaminfo').setID(rec);
160 me.lookupReference('mailinfo').setVisible(!!rec.data && !me.raw);
161 me.lookupReference('mailinfo').update(rec.data);
162 },
163
164 toggleSpamInfo: function(btn) {
165 var grid = this.lookupReference('spaminfo');
166 grid.setVisible(!grid.isVisible());
167 },
168
169 openContextMenu: function(table, record, tr, index, event) {
170 event.stopEvent();
171 var me = this;
172 var list = me.lookup('list');
173 var menu = Ext.create('PMG.menu.SpamContextMenu', {
174 callback: function(action) {
175 me.doAction(action, list.getSelection());
176 },
177 });
178
179 menu.showAt(event.getXY());
180 },
181
182 keyPress: function(table, record, item, index, event) {
183 var me = this;
184 var list = me.lookup('list');
185 var key = event.getKey();
186 var action = '';
187 switch (key) {
188 case event.DELETE:
189 case 127:
190 action = 'delete';
191 break;
192 case Ext.event.Event.D:
193 case Ext.event.Event.D + 32:
194 action = 'deliver';
195 break;
196 case Ext.event.Event.W:
197 case Ext.event.Event.W + 32:
198 action = 'whitelist';
199 break;
200 case Ext.event.Event.B:
201 case Ext.event.Event.B + 32:
202 action = 'blacklist';
203 break;
204 }
205
206 if (action !== '') {
207 me.doAction(action, list.getSelection());
208 }
209 },
210
211 init: function(view) {
212 this.lookup('list').cselect = view.cselect;
213 },
214
215 control: {
216 'button[reference=raw]': {
217 click: 'toggleRaw',
218 },
219 'button[reference=spam]': {
220 click: 'toggleSpamInfo',
221 },
222 'pmgQuarantineList': {
223 selectionChange: 'onSelectMail',
224 itemkeypress: 'keyPress',
225 rowcontextmenu: 'openContextMenu',
226 },
227 },
228 },
229
230 items: [
231 {
232 title: gettext('Spam Quarantine'),
233 xtype: 'pmgQuarantineList',
234 selModel: 'checkboxmodel',
235 emailSelection: true,
236 reference: 'list',
237 region: 'west',
238 width: 500,
239 split: true,
240 collapsible: false,
241 store: {
242 model: 'pmg-spam-list',
243 groupField: 'day',
244 groupDir: 'DESC',
245 sorters: [{
246 property: 'time',
247 direction: 'DESC',
248 }],
249 },
250
251 columns: [
252 {
253 header: gettext('Sender/Subject'),
254 dataIndex: 'subject',
255 renderer: PMG.Utils.sender_renderer,
256 flex: 1,
257 },
258 {
259 header: gettext('Score'),
260 dataIndex: 'spamlevel',
261 align: 'right',
262 width: 70,
263 },
264 {
265 header: gettext('Size') + ' (KB)',
266 renderer: function(v) { return Ext.Number.toFixed(v/1024, 0); },
267 dataIndex: 'bytes',
268 align: 'right',
269 width: 90,
270 },
271 {
272 header: gettext('Date'),
273 dataIndex: 'day',
274 hidden: true,
275 },
276 {
277 xtype: 'datecolumn',
278 header: gettext('Time'),
279 dataIndex: 'time',
280 format: 'H:i:s',
281 },
282 ],
283 },
284 {
285 title: gettext('Selected Mail'),
286 border: false,
287 region: 'center',
288 split: true,
289 reference: 'preview',
290 disabled: true,
291 dockedItems: [
292 {
293 xtype: 'toolbar',
294 dock: 'top',
295 items: [
296 {
297 xtype: 'button',
298 reference: 'raw',
299 text: gettext('Toggle Raw'),
300 enableToggle: true,
301 iconCls: 'fa fa-file-code-o',
302 },
303 {
304 xtype: 'button',
305 reference: 'spam',
306 text: gettext('Toggle Spam Info'),
307 enableToggle: true,
308 iconCls: 'fa fa-bullhorn',
309 },
310 '->',
311 {
312 xtype: 'button',
313 reference: 'download',
314 text: gettext('Download'),
315 setDownload: function(id) {
316 this.el.dom.download = id + ".eml";
317 },
318 bind: {
319 href: '{downloadMailURL}',
320 download: '{mailid}',
321 },
322 iconCls: 'fa fa-download',
323 },
324 '-',
325 {
326 reference: 'whitelist',
327 text: gettext('Whitelist'),
328 iconCls: 'fa fa-check',
329 handler: 'btnHandler',
330 },
331 {
332 reference: 'blacklist',
333 text: gettext('Blacklist'),
334 iconCls: 'fa fa-times',
335 handler: 'btnHandler',
336 },
337 {
338 reference: 'deliver',
339 text: gettext('Deliver'),
340 iconCls: 'fa fa-paper-plane-o',
341 handler: 'btnHandler',
342 },
343 {
344 reference: 'delete',
345 text: gettext('Delete'),
346 iconCls: 'fa fa-trash-o',
347 handler: 'btnHandler',
348 },
349 ],
350 },
351 {
352 xtype: 'pmgSpamInfoGrid',
353 border: false,
354 reference: 'spaminfo',
355 },
356 {
357 xtype: 'pmgMailInfo',
358 hidden: true,
359 reference: 'mailinfo',
360 },
361 ],
362 },
363 ],
364 });