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