]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamDetectorCustom.js
4ccf3ace695a1bcbd6d77d4ede09923261d7b0b7
[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 Ext.createWidget('proxmoxWindowEdit', {
110 autoShow: true,
111 method: 'POST',
112 url: "/api2/extjs/config/customscores",
113 isCreate: true,
114 subject: gettext("Custom Rule Score"),
115 onlineHelp: 'pmgconfig_spamdetector_customscores',
116 items: [
117 {
118 xtype: 'proxmoxtextfield',
119 name: 'name',
120 allowBlank: false,
121 fieldLabel: gettext('Name'),
122 },
123 {
124 xtype: 'numberfield',
125 name: 'score',
126 allowBlank: false,
127 fieldLabel: gettext('Score'),
128 },
129
130 {
131 xtype: 'proxmoxtextfield',
132 name: 'comment',
133 fieldLabel: gettext("Comment"),
134 },
135 {
136 xtype: 'hiddenfield',
137 name: 'digest',
138 value: vm.get('digest'),
139 },
140 ],
141 listeners: {
142 destroy: () => me.reload(),
143 },
144 });
145 },
146
147 run_editor: function() {
148 let me = this;
149 let vm = me.getViewModel();
150 let grid = me.lookup('grid');
151 let rec = grid.getSelection()[0];
152 if (!rec) {
153 return;
154 }
155
156 Ext.createWidget('proxmoxWindowEdit', {
157 autoShow: true,
158 autoLoad: true,
159 url: "/api2/extjs/config/customscores/" + rec.data.name,
160 method: 'PUT',
161 subject: gettext("Custom Rule Score"),
162 onlineHelp: 'pmgconfig_spamdetector_customscores',
163 items: [
164 {
165 xtype: 'displayfield',
166 name: 'name',
167 fieldLabel: gettext('Name'),
168 },
169 {
170 xtype: 'numberfield',
171 name: 'score',
172 allowBlank: false,
173 fieldLabel: gettext('Score'),
174 },
175
176 {
177 xtype: 'proxmoxtextfield',
178 name: 'comment',
179 fieldLabel: gettext("Comment"),
180 },
181 {
182 xtype: 'hiddenfield',
183 name: 'digest',
184 value: vm.get('digest'),
185 },
186 ],
187 listeners: {
188 destroy: () => me.reload(),
189 },
190 });
191 },
192 },
193
194 listeners: {
195 activate: 'reload',
196 },
197
198 defaults: {
199 border: 0,
200 },
201
202 items: [
203 {
204 xtype: 'gridpanel',
205 region: 'center',
206 reference: 'grid',
207
208 store: {
209 model: 'pmg-sa-custom',
210 proxy: {
211 type: 'proxmox',
212 url: "/api2/json/config/customscores",
213 },
214 sorters: {
215 property: 'name',
216 },
217 },
218
219 tbar: [
220 {
221 text: gettext('Create'),
222 handler: 'create_custom',
223 },
224 '-',
225 {
226 xtype: 'proxmoxButton',
227 text: gettext('Edit'),
228 disabled: true,
229 handler: 'run_editor',
230 },
231 {
232 xtype: 'proxmoxStdRemoveButton',
233 getUrl: function(rec) {
234 let digest = this.up('grid').digest;
235 let url = `/config/customscores/${rec.getId()}`;
236 if (digest) {
237 url += `?digest=${digest}`;
238 }
239 return url;
240 },
241 callback: 'reload',
242 },
243 ' ',
244 {
245 text: gettext('Revert'),
246 reference: 'revert_btn',
247 handler: 'revert',
248 disabled: true,
249 bind: {
250 disabled: '{applied}',
251 },
252 },
253 '-',
254 {
255 text: gettext('Apply Custom Scores'),
256 reference: 'restart_btn',
257 disabled: true,
258 bind: {
259 disabled: '{applied}',
260 },
261 handler: 'restart',
262 },
263 ],
264
265 viewConfig: {
266 trackOver: false,
267 },
268
269 columns: [
270 {
271 header: gettext('Name'),
272 width: 200,
273 sortable: true,
274 dataIndex: 'name',
275 },
276 {
277 header: gettext('Score'),
278 width: 200,
279 sortable: true,
280 dataIndex: 'score',
281 },
282 {
283 header: gettext('Comment'),
284 sortable: false,
285 renderer: Ext.String.htmlEncode,
286 dataIndex: 'comment',
287 flex: 1,
288 },
289 ],
290
291 listeners: {
292 itemdblclick: 'run_editor',
293 },
294 },
295 {
296 xtype: 'panel',
297 bodyPadding: 5,
298 region: 'south',
299 autoScroll: true,
300 flex: 0.5,
301 hidden: true,
302 bind: {
303 hidden: '{applied}',
304 html: '{changetext}',
305 },
306 reference: 'changes',
307 tbar: [
308 gettext('Pending changes') + ' (' +
309 gettext('Please restart pmg-smtp-filter to activate changes') + ')',
310 ],
311 split: true,
312 },
313 ],
314
315 });