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