]>
Commit | Line | Data |
---|---|---|
e2c7198f DC |
1 | Ext.define('pmg-sa-custom', { |
2 | extend: 'Ext.data.Model', | |
c87d46fb TL |
3 | fields: ['name', 'score', 'comment', 'digest'], |
4 | idProperty: 'name', | |
e2c7198f DC |
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 | 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 | }); |