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