]> git.proxmox.com Git - pmg-gui.git/blame - js/SpamDetectorCustom.js
spam detector: custom rules: consitent add/edit/remove button & modernization
[pmg-gui.git] / js / SpamDetectorCustom.js
CommitLineData
e2c7198f
DC
1Ext.define('pmg-sa-custom', {
2 extend: 'Ext.data.Model',
c87d46fb
TL
3 fields: ['name', 'score', 'comment', 'digest'],
4 idProperty: 'name',
e2c7198f
DC
5});
6
7Ext.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() {
28eb60c0
TL
25 let me = this;
26 let vm = me.getViewModel();
27 let grid = me.lookup('grid');
e2c7198f
DC
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>`);
c87d46fb 47 },
e2c7198f
DC
48 });
49 },
50
51 revert: function() {
28eb60c0
TL
52 let me = this;
53 let vm = me.getViewModel();
54 let grid = me.lookup('grid');
e2c7198f
DC
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
28eb60c0 77 Ext.createWidget('proxmoxWindowEdit', {
e2c7198f
DC
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"),
53d909f7 86 onlineHelp: 'pmgconfig_spamdetector_customscores',
e2c7198f
DC
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'),
c87d46fb
TL
100 },
101 ],
e2c7198f
DC
102 }).show();
103 },
104
105 create_custom: function() {
106 var me = this;
107 var vm = this.getViewModel();
108
11bd23b8
TL
109 Ext.createWidget('proxmoxWindowEdit', {
110 autoShow: true,
e2c7198f
DC
111 method: 'POST',
112 url: "/api2/extjs/config/customscores",
113 isCreate: true,
114 subject: gettext("Custom Rule Score"),
53d909f7 115 onlineHelp: 'pmgconfig_spamdetector_customscores',
e2c7198f
DC
116 items: [
117 {
118 xtype: 'proxmoxtextfield',
119 name: 'name',
120 allowBlank: false,
c87d46fb 121 fieldLabel: gettext('Name'),
e2c7198f
DC
122 },
123 {
124 xtype: 'numberfield',
125 name: 'score',
126 allowBlank: false,
c87d46fb 127 fieldLabel: gettext('Score'),
e2c7198f
DC
128 },
129
130 {
131 xtype: 'proxmoxtextfield',
132 name: 'comment',
c87d46fb 133 fieldLabel: gettext("Comment"),
e2c7198f
DC
134 },
135 {
136 xtype: 'hiddenfield',
137 name: 'digest',
138 value: vm.get('digest'),
c87d46fb
TL
139 },
140 ],
11bd23b8
TL
141 listeners: {
142 destroy: () => me.reload(),
143 },
e2c7198f 144 });
e2c7198f
DC
145 },
146
147 run_editor: function() {
11bd23b8
TL
148 let me = this;
149 let vm = me.getViewModel();
150 let grid = me.lookup('grid');
151 let rec = grid.getSelection()[0];
e2c7198f
DC
152 if (!rec) {
153 return;
154 }
155
11bd23b8
TL
156 Ext.createWidget('proxmoxWindowEdit', {
157 autoShow: true,
158 autoLoad: true,
e2c7198f
DC
159 url: "/api2/extjs/config/customscores/" + rec.data.name,
160 method: 'PUT',
161 subject: gettext("Custom Rule Score"),
53d909f7 162 onlineHelp: 'pmgconfig_spamdetector_customscores',
e2c7198f
DC
163 items: [
164 {
165 xtype: 'displayfield',
166 name: 'name',
c87d46fb 167 fieldLabel: gettext('Name'),
e2c7198f
DC
168 },
169 {
170 xtype: 'numberfield',
171 name: 'score',
172 allowBlank: false,
c87d46fb 173 fieldLabel: gettext('Score'),
e2c7198f
DC
174 },
175
176 {
177 xtype: 'proxmoxtextfield',
178 name: 'comment',
c87d46fb 179 fieldLabel: gettext("Comment"),
e2c7198f
DC
180 },
181 {
182 xtype: 'hiddenfield',
183 name: 'digest',
184 value: vm.get('digest'),
c87d46fb
TL
185 },
186 ],
11bd23b8
TL
187 listeners: {
188 destroy: () => me.reload(),
189 },
e2c7198f 190 });
e2c7198f
DC
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',
c87d46fb 212 url: "/api2/json/config/customscores",
e2c7198f
DC
213 },
214 sorters: {
215 property: 'name',
c87d46fb 216 },
e2c7198f
DC
217 },
218
219 tbar: [
11bd23b8
TL
220 {
221 text: gettext('Create'),
222 handler: 'create_custom',
223 },
224 '-',
e2c7198f
DC
225 {
226 xtype: 'proxmoxButton',
227 text: gettext('Edit'),
228 disabled: true,
c87d46fb 229 handler: 'run_editor',
e2c7198f 230 },
e2c7198f
DC
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) {
c87d46fb 237 url += `?digest=${digest}`;
e2c7198f
DC
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',
c87d46fb 262 },
e2c7198f
DC
263 ],
264
265 viewConfig: {
c87d46fb 266 trackOver: false,
e2c7198f
DC
267 },
268
269 columns: [
270 {
271 header: gettext('Name'),
272 width: 200,
273 sortable: true,
c87d46fb 274 dataIndex: 'name',
e2c7198f
DC
275 },
276 {
277 header: gettext('Score'),
278 width: 200,
279 sortable: true,
c87d46fb 280 dataIndex: 'score',
e2c7198f
DC
281 },
282 {
283 header: gettext('Comment'),
284 sortable: false,
285 renderer: Ext.String.htmlEncode,
286 dataIndex: 'comment',
c87d46fb
TL
287 flex: 1,
288 },
e2c7198f
DC
289 ],
290
291 listeners: {
292 itemdblclick: 'run_editor',
c87d46fb 293 },
e2c7198f
DC
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}',
c87d46fb 304 html: '{changetext}',
e2c7198f
DC
305 },
306 reference: 'changes',
307 tbar: [
308 gettext('Pending changes') + ' (' +
c87d46fb 309 gettext('Please restart pmg-smtp-filter to activate changes') + ')',
e2c7198f
DC
310 ],
311 split: true,
c87d46fb 312 },
e2c7198f
DC
313 ],
314
315});