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