]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamDetectorCustom.js
quarantines: use a check mark for the dark mode filter
[pmg-gui.git] / js / SpamDetectorCustom.js
1 Ext.define('pmg-sa-custom', {
2 extend: 'Ext.data.Model',
3 fields: ['name', 'score', 'comment', 'digest'],
4 idProperty: 'name',
5 });
6
7 Ext.define('PMG.SpamDetectorCustomScores', {
8 extend: 'Ext.panel.Panel',
9 xtype: 'pmgSpamDetectorCustomScores',
10
11 layout: 'border',
12
13 viewModel: {
14 data: {
15 applied: true,
16 changetext: '',
17 digest: null,
18 },
19 },
20
21 controller: {
22 xclass: 'Ext.app.ViewController',
23
24 reload: function() {
25 let me = this;
26 let vm = me.getViewModel();
27 let grid = me.lookup('grid');
28
29 Proxmox.Utils.API2Request({
30 url: '/config/customscores',
31 failure: function(response, opts) {
32 grid.getStore().loadData({});
33 Proxmox.Utils.setErrorMask(grid, response.htmlStatus);
34 vm.set('digest', null);
35 vm.set('applied', true);
36 vm.set('changetext', '');
37 },
38 success: function(response, opts) {
39 let data = response.result.data;
40 let digestel = data.pop(); // last element is digest
41 let changes = response.result.changes;
42 grid.getStore().loadData(data);
43
44 vm.set('digest', digestel.digest);
45 vm.set('applied', !changes);
46 vm.set('changetext', `<pre>${changes || ''}</pre>`);
47 },
48 });
49 },
50
51 revert: function() {
52 let me = this;
53 let vm = me.getViewModel();
54 let grid = me.lookup('grid');
55
56 Proxmox.Utils.API2Request({
57 url: '/config/customscores',
58 method: 'DELETE',
59 param: {
60 digest: vm.get('digest'),
61 },
62 failure: function(response, opts) {
63 grid.getStore().loadData({});
64 Proxmox.Utils.setErrorMask(grid, response.htmlStatus);
65 vm.set('digest', null);
66 vm.set('applied', true);
67 vm.set('changetext', '');
68 },
69 success: () => { me.reload(); },
70 });
71 },
72
73 restart: function() {
74 var me = this;
75 var vm = this.getViewModel();
76
77 Ext.createWidget('proxmoxWindowEdit', {
78 method: 'PUT',
79 url: "/api2/extjs/config/customscores",
80 isCreate: true,
81 submitText: gettext('Apply'),
82 showProgress: true,
83 taskDone: () => { me.reload(); },
84
85 title: gettext("Apply Custom Scores"),
86 onlineHelp: 'pmgconfig_spamdetector_customscores',
87
88 items: [
89 {
90 xtype: 'proxmoxcheckbox',
91 name: 'restart-daemon',
92 fieldLabel: gettext('Restart pmg-smtp-filter'),
93 labelWidth: 150,
94 checked: true,
95 },
96 {
97 xtype: 'hiddenfield',
98 name: 'digest',
99 value: vm.get('digest'),
100 },
101 ],
102 }).show();
103 },
104
105 create_custom: function() {
106 var me = this;
107 var vm = this.getViewModel();
108
109 var win = Ext.createWidget('proxmoxWindowEdit', {
110 method: 'POST',
111 url: "/api2/extjs/config/customscores",
112 isCreate: true,
113 subject: gettext("Custom Rule Score"),
114 onlineHelp: 'pmgconfig_spamdetector_customscores',
115 items: [
116 {
117 xtype: 'proxmoxtextfield',
118 name: 'name',
119 allowBlank: false,
120 fieldLabel: gettext('Name'),
121 },
122 {
123 xtype: 'numberfield',
124 name: 'score',
125 allowBlank: false,
126 fieldLabel: gettext('Score'),
127 },
128
129 {
130 xtype: 'proxmoxtextfield',
131 name: 'comment',
132 fieldLabel: gettext("Comment"),
133 },
134 {
135 xtype: 'hiddenfield',
136 name: 'digest',
137 value: vm.get('digest'),
138 },
139 ],
140 });
141
142 win.on('destroy', me.reload, me);
143 win.show();
144 },
145
146 run_editor: function() {
147 var me = this;
148 var vm = this.getViewModel();
149 var grid = me.lookup('grid');
150 var rec = grid.getSelection()[0];
151 if (!rec) {
152 return;
153 }
154
155 var win = Ext.createWidget('proxmoxWindowEdit', {
156 url: "/api2/extjs/config/customscores/" + rec.data.name,
157 method: 'PUT',
158 subject: gettext("Custom Rule Score"),
159 onlineHelp: 'pmgconfig_spamdetector_customscores',
160 items: [
161 {
162 xtype: 'displayfield',
163 name: 'name',
164 fieldLabel: gettext('Name'),
165 },
166 {
167 xtype: 'numberfield',
168 name: 'score',
169 allowBlank: false,
170 fieldLabel: gettext('Score'),
171 },
172
173 {
174 xtype: 'proxmoxtextfield',
175 name: 'comment',
176 fieldLabel: gettext("Comment"),
177 },
178 {
179 xtype: 'hiddenfield',
180 name: 'digest',
181 value: vm.get('digest'),
182 },
183 ],
184 });
185
186 win.load();
187 win.on('destroy', me.reload, me);
188 win.show();
189 },
190 },
191
192 listeners: {
193 activate: 'reload',
194 },
195
196 defaults: {
197 border: 0,
198 },
199
200 items: [
201 {
202 xtype: 'gridpanel',
203 region: 'center',
204 reference: 'grid',
205
206 store: {
207 model: 'pmg-sa-custom',
208 proxy: {
209 type: 'proxmox',
210 url: "/api2/json/config/customscores",
211 },
212 sorters: {
213 property: 'name',
214 },
215 },
216
217 tbar: [
218 {
219 xtype: 'proxmoxButton',
220 text: gettext('Edit'),
221 disabled: true,
222 handler: 'run_editor',
223 },
224 {
225 text: gettext('Create'),
226 handler: 'create_custom',
227 },
228 {
229 xtype: 'proxmoxStdRemoveButton',
230 getUrl: function(rec) {
231 let digest = this.up('grid').digest;
232 let url = `/config/customscores/${rec.getId()}`;
233 if (digest) {
234 url += `?digest=${digest}`;
235 }
236 return url;
237 },
238 callback: 'reload',
239 },
240 ' ',
241 {
242 text: gettext('Revert'),
243 reference: 'revert_btn',
244 handler: 'revert',
245 disabled: true,
246 bind: {
247 disabled: '{applied}',
248 },
249 },
250 '-',
251 {
252 text: gettext('Apply Custom Scores'),
253 reference: 'restart_btn',
254 disabled: true,
255 bind: {
256 disabled: '{applied}',
257 },
258 handler: 'restart',
259 },
260 ],
261
262 viewConfig: {
263 trackOver: false,
264 },
265
266 columns: [
267 {
268 header: gettext('Name'),
269 width: 200,
270 sortable: true,
271 dataIndex: 'name',
272 },
273 {
274 header: gettext('Score'),
275 width: 200,
276 sortable: true,
277 dataIndex: 'score',
278 },
279 {
280 header: gettext('Comment'),
281 sortable: false,
282 renderer: Ext.String.htmlEncode,
283 dataIndex: 'comment',
284 flex: 1,
285 },
286 ],
287
288 listeners: {
289 itemdblclick: 'run_editor',
290 },
291 },
292 {
293 xtype: 'panel',
294 bodyPadding: 5,
295 region: 'south',
296 autoScroll: true,
297 flex: 0.5,
298 hidden: true,
299 bind: {
300 hidden: '{applied}',
301 html: '{changetext}',
302 },
303 reference: 'changes',
304 tbar: [
305 gettext('Pending changes') + ' (' +
306 gettext('Please restart pmg-smtp-filter to activate changes') + ')',
307 ],
308 split: true,
309 },
310 ],
311
312 });