]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamQuarantine.js
quarantine: refactor spamquarantine controller
[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.SpamQuarantineController', {
37 extend: 'PMG.controller.QuarantineController',
38 xtype: 'pmgSpamQuarantineController',
39 alias: 'controller.spamquarantine',
40
41 updatePreview: function(raw, rec) {
42 let me = this;
43 me.lookupReference('spam').setDisabled(false);
44
45 me.callParent(arguments);
46 },
47
48 multiSelect: function(selection) {
49 let me = this;
50 let spam = me.lookupReference('spam');
51 spam.setDisabled(true);
52 spam.setPressed(false);
53 me.lookupReference('spaminfo').setVisible(false);
54 me.callParent(selection);
55 },
56
57 onSelectMail: function() {
58 let me = this;
59 let list = me.lookupReference('list');
60 let selection = list.selModel.getSelection();
61 if (selection.length <= 1) {
62 let rec = selection[0] || {};
63 me.lookupReference('spaminfo').setID(rec);
64 }
65 me.callParent();
66 },
67
68
69 toggleSpamInfo: function(btn) {
70 var grid = this.lookupReference('spaminfo');
71 grid.setVisible(!grid.isVisible());
72 },
73
74 openContextMenu: function(table, record, tr, index, event) {
75 event.stopEvent();
76 let me = this;
77 let list = me.lookup('list');
78 Ext.create('PMG.menu.SpamContextMenu', {
79 callback: action => me.doAction(action, list.getSelection()),
80 }).showAt(event.getXY());
81 },
82
83 keyPress: function(table, record, item, index, event) {
84 var me = this;
85 var list = me.lookup('list');
86 var key = event.getKey();
87 var action = '';
88 switch (key) {
89 case event.DELETE:
90 case 127:
91 action = 'delete';
92 break;
93 case Ext.event.Event.D:
94 case Ext.event.Event.D + 32:
95 action = 'deliver';
96 break;
97 case Ext.event.Event.W:
98 case Ext.event.Event.W + 32:
99 action = 'whitelist';
100 break;
101 case Ext.event.Event.B:
102 case Ext.event.Event.B + 32:
103 action = 'blacklist';
104 break;
105 }
106
107 if (action !== '') {
108 me.doAction(action, list.getSelection());
109 }
110 },
111
112 init: function(view) {
113 this.lookup('list').cselect = view.cselect;
114 },
115
116 control: {
117 'button[reference=raw]': {
118 click: 'toggleRaw',
119 },
120 'button[reference=spam]': {
121 click: 'toggleSpamInfo',
122 },
123 'pmgQuarantineList': {
124 selectionChange: 'onSelectMail',
125 itemkeypress: 'keyPress',
126 rowcontextmenu: 'openContextMenu',
127 },
128 },
129 });
130
131 Ext.define('PMG.SpamQuarantine', {
132 extend: 'Ext.container.Container',
133 xtype: 'pmgSpamQuarantine',
134
135 border: false,
136 layout: { type: 'border' },
137
138 defaults: { border: false },
139
140 // from mail link
141 cselect: undefined,
142
143 viewModel: {
144 parent: null,
145 data: {
146 mailid: '',
147 },
148 formulas: {
149 downloadMailURL: get => '/api2/json/quarantine/download?mailid=' + encodeURIComponent(get('mailid')),
150 },
151 },
152 controller: 'spamquarantine',
153
154 items: [
155 {
156 title: gettext('Spam Quarantine'),
157 xtype: 'pmgQuarantineList',
158 selModel: 'checkboxmodel',
159 emailSelection: true,
160 reference: 'list',
161 region: 'west',
162 width: 500,
163 split: true,
164 collapsible: false,
165 store: {
166 model: 'pmg-spam-list',
167 groupField: 'day',
168 groupDir: 'DESC',
169 sorters: [{
170 property: 'time',
171 direction: 'DESC',
172 }],
173 },
174
175 columns: [
176 {
177 header: gettext('Sender/Subject'),
178 dataIndex: 'subject',
179 renderer: PMG.Utils.render_sender,
180 flex: 1,
181 },
182 {
183 header: gettext('Score'),
184 dataIndex: 'spamlevel',
185 align: 'right',
186 width: 70,
187 },
188 {
189 header: gettext('Size') + ' (KB)',
190 renderer: v => Ext.Number.toFixed(v/1024, 0),
191 dataIndex: 'bytes',
192 align: 'right',
193 width: 90,
194 },
195 {
196 header: gettext('Date'),
197 dataIndex: 'day',
198 hidden: true,
199 },
200 {
201 xtype: 'datecolumn',
202 header: gettext('Time'),
203 dataIndex: 'time',
204 format: 'H:i:s',
205 },
206 ],
207 },
208 {
209 title: gettext('Selected Mail'),
210 border: false,
211 region: 'center',
212 layout: 'fit',
213 split: true,
214 reference: 'preview',
215 disabled: true,
216 dockedItems: [
217 {
218 xtype: 'toolbar',
219 dock: 'top',
220 items: [
221 {
222 xtype: 'button',
223 reference: 'raw',
224 text: gettext('Toggle Raw'),
225 enableToggle: true,
226 iconCls: 'fa fa-file-code-o',
227 },
228 {
229 xtype: 'button',
230 reference: 'spam',
231 text: gettext('Toggle Spam Info'),
232 enableToggle: true,
233 iconCls: 'fa fa-bullhorn',
234 },
235 '->',
236 {
237 xtype: 'button',
238 reference: 'download',
239 text: gettext('Download'),
240 setDownload: function(id) {
241 this.el.dom.download = id + ".eml";
242 },
243 bind: {
244 href: '{downloadMailURL}',
245 download: '{mailid}',
246 },
247 iconCls: 'fa fa-download',
248 },
249 '-',
250 {
251 reference: 'whitelist',
252 text: gettext('Whitelist'),
253 iconCls: 'fa fa-check',
254 handler: 'btnHandler',
255 },
256 {
257 reference: 'blacklist',
258 text: gettext('Blacklist'),
259 iconCls: 'fa fa-times',
260 handler: 'btnHandler',
261 },
262 {
263 reference: 'deliver',
264 text: gettext('Deliver'),
265 iconCls: 'fa fa-paper-plane-o info-blue',
266 handler: 'btnHandler',
267 },
268 {
269 reference: 'delete',
270 text: gettext('Delete'),
271 iconCls: 'fa fa-trash-o critical',
272 handler: 'btnHandler',
273 },
274 ],
275 },
276 {
277 xtype: 'pmgSpamInfoGrid',
278 border: false,
279 reference: 'spaminfo',
280 },
281 {
282 xtype: 'pmgMailInfo',
283 hidden: true,
284 reference: 'mailinfo',
285 },
286 ],
287 },
288 ],
289 });