]>
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() { | |
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', | |
536eb6e5 | 92 | boxLabel: gettext('Restart pmg-smtp-filter to activate changes.'), |
e2c7198f DC |
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 | }, | |
e2c7198f DC |
243 | ], |
244 | ||
245 | viewConfig: { | |
c87d46fb | 246 | trackOver: false, |
e2c7198f DC |
247 | }, |
248 | ||
249 | columns: [ | |
250 | { | |
251 | header: gettext('Name'), | |
252 | width: 200, | |
253 | sortable: true, | |
c87d46fb | 254 | dataIndex: 'name', |
e2c7198f DC |
255 | }, |
256 | { | |
257 | header: gettext('Score'), | |
258 | width: 200, | |
259 | sortable: true, | |
c87d46fb | 260 | dataIndex: 'score', |
e2c7198f DC |
261 | }, |
262 | { | |
263 | header: gettext('Comment'), | |
264 | sortable: false, | |
265 | renderer: Ext.String.htmlEncode, | |
266 | dataIndex: 'comment', | |
c87d46fb TL |
267 | flex: 1, |
268 | }, | |
e2c7198f DC |
269 | ], |
270 | ||
271 | listeners: { | |
272 | itemdblclick: 'run_editor', | |
c87d46fb | 273 | }, |
e2c7198f DC |
274 | }, |
275 | { | |
276 | xtype: 'panel', | |
277 | bodyPadding: 5, | |
278 | region: 'south', | |
279 | autoScroll: true, | |
280 | flex: 0.5, | |
281 | hidden: true, | |
282 | bind: { | |
283 | hidden: '{applied}', | |
c87d46fb | 284 | html: '{changetext}', |
e2c7198f DC |
285 | }, |
286 | reference: 'changes', | |
287 | tbar: [ | |
536eb6e5 TL |
288 | { |
289 | text: gettext('Revert'), | |
290 | handler: 'revert', | |
291 | disabled: true, | |
292 | bind: { | |
293 | disabled: '{applied}', | |
294 | }, | |
295 | }, | |
296 | '-', | |
297 | { | |
298 | text: gettext('Apply Custom Scores'), | |
299 | handler: 'restart', | |
300 | disabled: true, | |
301 | bind: { | |
302 | disabled: '{applied}', | |
303 | }, | |
304 | }, | |
305 | '->', | |
306 | `<b style="font-weight: 600">${gettext('Pending changes')}</b>`, | |
307 | '->', | |
e2c7198f DC |
308 | ], |
309 | split: true, | |
c87d46fb | 310 | }, |
e2c7198f DC |
311 | ], |
312 | ||
313 | }); |