]> git.proxmox.com Git - pmg-gui.git/blob - js/controller/QuarantineController.js
5058300f120638e8e929dbb30309dd7ebf4cbb7b
[pmg-gui.git] / js / controller / QuarantineController.js
1 Ext.define('PMG.controller.QuarantineController', {
2 extend: 'Ext.app.ViewController',
3 alias: 'controller.quarantine',
4
5 updatePreview: function(raw, rec) {
6 let preview = this.lookupReference('preview');
7
8 if (!rec || !rec.data || !rec.data.id) {
9 preview.update('');
10 preview.setDisabled(true);
11 return;
12 }
13
14 let url = `/api2/htmlmail/quarantine/content?id=${rec.data.id}`;
15 if (raw) {
16 url += '&raw=1';
17 }
18 preview.setDisabled(false);
19 this.lookupReference('raw').setDisabled(false);
20 this.lookupReference('download').setDisabled(false);
21 preview.update("<iframe frameborder=0 width=100% height=100% sandbox='allow-same-origin' src='" + url +"'></iframe>");
22 },
23
24 multiSelect: function(selection) {
25 let me = this;
26 me.lookupReference('raw').setDisabled(true);
27 me.lookupReference('download').setDisabled(true);
28 me.lookupReference('mailinfo').setVisible(false);
29 me.lookup('attachmentlist')?.setVisible(false);
30
31 let preview = me.lookupReference('preview');
32 preview.setDisabled(false);
33 preview.update(`<h3 style="padding-left:5px;">${gettext('Multiple E-Mails selected')} (${selection.length})</h3>`);
34 },
35
36 toggleRaw: function(button) {
37 let me = this;
38 let list = me.lookupReference('list');
39 let rec = list.selModel.getSelection()[0];
40 me.lookupReference('mailinfo').setVisible(me.raw);
41 me.raw = !me.raw;
42 me.updatePreview(me.raw, rec);
43 },
44
45 btnHandler: function(button, e) {
46 let me = this;
47 let action = button.reference;
48 let list = me.lookupReference('list');
49 let selected = list.getSelection();
50 me.doAction(action, selected);
51 },
52
53 doAction: function(action, selected) {
54 if (!selected.length) {
55 return;
56 }
57
58 let list = this.lookupReference('list');
59
60 if (selected.length > 1) {
61 let idlist = selected.map(item => item.data.id);
62 Ext.Msg.confirm(
63 gettext('Confirm'),
64 Ext.String.format(
65 gettext("Action '{0}' for '{1}' items"),
66 action, selected.length,
67 ),
68 async function(button) {
69 if (button !== 'yes') {
70 return;
71 }
72
73 list.mask(gettext('Processing...'), 'x-mask-loading');
74
75 const sliceSize = 2500, maxInFlight = 2;
76 let batches = [], batchCount = Math.ceil(selected.length / sliceSize);
77 for (let i = 0; i * sliceSize < selected.length; i++) {
78 let sliceStart = i * sliceSize;
79 let sliceEnd = Math.min(sliceStart + sliceSize, selected.length);
80 batches.push(
81 PMG.Async.doQAction(
82 action,
83 idlist.slice(sliceStart, sliceEnd),
84 i + 1,
85 batchCount,
86 ),
87 );
88 if (batches.length >= maxInFlight) {
89 await Promise.allSettled(batches); // eslint-disable-line no-await-in-loop
90 batches = [];
91 }
92 }
93 await Promise.allSettled(batches); // await possible remaining ones
94 list.unmask();
95 // below can be slow, we could remove directly from the in-memory store, but
96 // with lots of elements and some failures we could be quite out of sync?
97 list.getController().load();
98 },
99 );
100 return;
101 }
102
103 PMG.Utils.doQuarantineAction(action, selected[0].data.id, function() {
104 let listController = list.getController();
105 listController.allowPositionSave = false;
106 // success -> remove directly to avoid slow store reload for a single-element action
107 list.getStore().remove(selected[0]);
108 listController.restoreSavedSelection();
109 listController.allowPositionSave = true;
110 });
111 },
112
113 onSelectMail: function() {
114 let me = this;
115 let list = this.lookupReference('list');
116 let selection = list.selModel.getSelection();
117 if (selection.length > 1) {
118 me.multiSelect(selection);
119 return;
120 }
121
122 let rec = selection[0] || {};
123 me.lookup('spaminfo')?.setID(rec);
124 me.lookup('attachmentlist')?.setID(rec);
125 me.lookup('attachmentlist')?.setVisible(!!rec.data);
126
127 me.getViewModel().set('mailid', rec.data ? rec.data.id : '');
128 me.updatePreview(me.raw || false, rec);
129 me.lookupReference('mailinfo').setVisible(!!rec.data && !me.raw);
130 me.lookupReference('mailinfo').update(rec.data);
131 },
132
133 openContextMenu: function(table, record, tr, index, event) {
134 event.stopEvent();
135 let me = this;
136 let list = me.lookup('list');
137 Ext.create('PMG.menu.QuarantineContextMenu', {
138 callback: action => me.doAction(action, list.getSelection()),
139 }).showAt(event.getXY());
140 },
141
142 keyPress: function(table, record, item, index, event) {
143 let me = this;
144 let list = me.lookup('list');
145 let key = event.getKey();
146 let action = '';
147 switch (key) {
148 case event.DELETE:
149 case 127:
150 action = 'delete';
151 break;
152 case Ext.event.Event.D:
153 case Ext.event.Event.D + 32:
154 action = 'deliver';
155 break;
156 }
157
158 if (action !== '') {
159 me.doAction(action, list.getSelection());
160 }
161 },
162
163 control: {
164 'button[reference=raw]': {
165 click: 'toggleRaw',
166 },
167 'pmgQuarantineList': {
168 selectionChange: 'onSelectMail',
169 itemkeypress: 'keyPress',
170 rowcontextmenu: 'openContextMenu',
171 },
172 },
173 });