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