]> git.proxmox.com Git - pmg-gui.git/blame - js/SpamQuarantine.js
quarantine: refactor spamquarantine controller
[pmg-gui.git] / js / SpamQuarantine.js
CommitLineData
d9c3552a
DM
1Ext.define('pmg-spam-archive', {
2 extend: 'Ext.data.Model',
3 fields: [
4 { type: 'number', name: 'spamavg' },
5 { type: 'integer', name: 'count' },
c87d46fb 6 { type: 'date', dateFormat: 'timestamp', name: 'day' },
d9c3552a
DM
7 ],
8 proxy: {
9 type: 'proxmox',
c87d46fb 10 url: "/api2/json/quarantine/spam",
d9c3552a 11 },
c87d46fb 12 idProperty: 'day',
d9c3552a
DM
13});
14
d9c3552a
DM
15Ext.define('pmg-spam-list', {
16 extend: 'Ext.data.Model',
c87d46fb 17 fields: ['id', 'envelope_sender', 'from', 'sender', 'receiver', 'subject',
af5aba0c 18 { type: 'number', name: 'spamlevel' },
d9c3552a 19 { type: 'integer', name: 'bytes' },
c96a22cb
DC
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');
c87d46fb
TL
26 }, depends: ['time'],
27 },
d9c3552a
DM
28 ],
29 proxy: {
30 type: 'proxmox',
c87d46fb 31 url: "/api2/json/quarantine/spam",
d9c3552a 32 },
c87d46fb 33 idProperty: 'id',
d9c3552a
DM
34});
35
e66c888b
SI
36Ext.define('PMG.SpamQuarantineController', {
37 extend: 'PMG.controller.QuarantineController',
38 xtype: 'pmgSpamQuarantineController',
39 alias: 'controller.spamquarantine',
0277bfeb 40
e66c888b
SI
41 updatePreview: function(raw, rec) {
42 let me = this;
43 me.lookupReference('spam').setDisabled(false);
d9c3552a 44
e66c888b
SI
45 me.callParent(arguments);
46 },
0277bfeb 47
e66c888b
SI
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 },
207471c0 56
e66c888b
SI
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();
41a290e3 66 },
d9c3552a 67
d9c3552a 68
e66c888b
SI
69 toggleSpamInfo: function(btn) {
70 var grid = this.lookupReference('spaminfo');
71 grid.setVisible(!grid.isVisible());
72 },
d9c3552a 73
e66c888b
SI
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 },
c96a22cb 82
e66c888b
SI
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 },
c96a22cb 111
e66c888b
SI
112 init: function(view) {
113 this.lookup('list').cselect = view.cselect;
114 },
d42f85b8 115
e66c888b
SI
116 control: {
117 'button[reference=raw]': {
118 click: 'toggleRaw',
d42f85b8 119 },
e66c888b
SI
120 'button[reference=spam]': {
121 click: 'toggleSpamInfo',
c96a22cb 122 },
e66c888b
SI
123 'pmgQuarantineList': {
124 selectionChange: 'onSelectMail',
125 itemkeypress: 'keyPress',
126 rowcontextmenu: 'openContextMenu',
d9c3552a 127 },
e66c888b
SI
128 },
129});
c96a22cb 130
e66c888b
SI
131Ext.define('PMG.SpamQuarantine', {
132 extend: 'Ext.container.Container',
133 xtype: 'pmgSpamQuarantine',
8e89b895 134
e66c888b
SI
135 border: false,
136 layout: { type: 'border' },
c627f092 137
e66c888b 138 defaults: { border: false },
0b9c0528 139
e66c888b
SI
140 // from mail link
141 cselect: undefined,
0b9c0528 142
e66c888b
SI
143 viewModel: {
144 parent: null,
145 data: {
146 mailid: '',
207471c0 147 },
e66c888b
SI
148 formulas: {
149 downloadMailURL: get => '/api2/json/quarantine/download?mailid=' + encodeURIComponent(get('mailid')),
c87d46fb 150 },
d9c3552a 151 },
e66c888b 152 controller: 'spamquarantine',
d9c3552a 153
0277bfeb
DM
154 items: [
155 {
56b4528f 156 title: gettext('Spam Quarantine'),
2d1f7824 157 xtype: 'pmgQuarantineList',
62651172 158 selModel: 'checkboxmodel',
2d1f7824
DC
159 emailSelection: true,
160 reference: 'list',
d9c3552a 161 region: 'west',
c96a22cb 162 width: 500,
d9c3552a 163 split: true,
c96a22cb 164 collapsible: false,
2d1f7824
DC
165 store: {
166 model: 'pmg-spam-list',
167 groupField: 'day',
168 groupDir: 'DESC',
169 sorters: [{
170 property: 'time',
c87d46fb
TL
171 direction: 'DESC',
172 }],
2d1f7824
DC
173 },
174
175 columns: [
176 {
177 header: gettext('Sender/Subject'),
178 dataIndex: 'subject',
cd150758 179 renderer: PMG.Utils.render_sender,
c87d46fb 180 flex: 1,
2d1f7824
DC
181 },
182 {
183 header: gettext('Score'),
184 dataIndex: 'spamlevel',
185 align: 'right',
c87d46fb 186 width: 70,
2d1f7824
DC
187 },
188 {
189 header: gettext('Size') + ' (KB)',
2cc13fbc 190 renderer: v => Ext.Number.toFixed(v/1024, 0),
2d1f7824
DC
191 dataIndex: 'bytes',
192 align: 'right',
c87d46fb 193 width: 90,
2d1f7824
DC
194 },
195 {
196 header: gettext('Date'),
197 dataIndex: 'day',
c87d46fb 198 hidden: true,
2d1f7824
DC
199 },
200 {
201 xtype: 'datecolumn',
202 header: gettext('Time'),
203 dataIndex: 'time',
c87d46fb
TL
204 format: 'H:i:s',
205 },
206 ],
0277bfeb
DM
207 },
208 {
c96a22cb 209 title: gettext('Selected Mail'),
ea07c9aa 210 border: false,
d9c3552a 211 region: 'center',
60a9d6fd 212 layout: 'fit',
c96a22cb
DC
213 split: true,
214 reference: 'preview',
215 disabled: true,
2d1f7824
DC
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,
c87d46fb 226 iconCls: 'fa fa-file-code-o',
2d1f7824
DC
227 },
228 {
229 xtype: 'button',
230 reference: 'spam',
231 text: gettext('Toggle Spam Info'),
232 enableToggle: true,
c87d46fb 233 iconCls: 'fa fa-bullhorn',
2d1f7824
DC
234 },
235 '->',
7ad0de10
DC
236 {
237 xtype: 'button',
238 reference: 'download',
239 text: gettext('Download'),
07a9b445
TL
240 setDownload: function(id) {
241 this.el.dom.download = id + ".eml";
242 },
243 bind: {
244 href: '{downloadMailURL}',
245 download: '{mailid}',
246 },
c87d46fb 247 iconCls: 'fa fa-download',
7ad0de10
DC
248 },
249 '-',
2d1f7824
DC
250 {
251 reference: 'whitelist',
252 text: gettext('Whitelist'),
253 iconCls: 'fa fa-check',
c87d46fb 254 handler: 'btnHandler',
2d1f7824
DC
255 },
256 {
257 reference: 'blacklist',
258 text: gettext('Blacklist'),
259 iconCls: 'fa fa-times',
c87d46fb 260 handler: 'btnHandler',
2d1f7824
DC
261 },
262 {
263 reference: 'deliver',
264 text: gettext('Deliver'),
365f84c1 265 iconCls: 'fa fa-paper-plane-o info-blue',
c87d46fb 266 handler: 'btnHandler',
2d1f7824
DC
267 },
268 {
269 reference: 'delete',
270 text: gettext('Delete'),
365f84c1 271 iconCls: 'fa fa-trash-o critical',
c87d46fb
TL
272 handler: 'btnHandler',
273 },
274 ],
2d1f7824
DC
275 },
276 {
277 xtype: 'pmgSpamInfoGrid',
f34abaca 278 border: false,
c87d46fb 279 reference: 'spaminfo',
ac6c1fb8
DC
280 },
281 {
282 xtype: 'pmgMailInfo',
283 hidden: true,
284 reference: 'mailinfo',
285 },
c87d46fb
TL
286 ],
287 },
288 ],
0277bfeb 289});