]> git.proxmox.com Git - pmg-gui.git/blob - js/SpamDetectorCustom.js
tree wide: eslint --fix
[pmg-gui.git] / js / SpamDetectorCustom.js
1 Ext.define('pmg-sa-custom', {
2 extend: 'Ext.data.Model',
3 fields: ['name', 'score', 'comment', 'digest'],
4 idProperty: 'name',
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>`);
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 onlineHelp: 'pmgconfig_spamdetector_customscores',
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'),
99 },
100 ],
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"),
113 onlineHelp: 'pmgconfig_spamdetector_customscores',
114 items: [
115 {
116 xtype: 'proxmoxtextfield',
117 name: 'name',
118 allowBlank: false,
119 fieldLabel: gettext('Name'),
120 },
121 {
122 xtype: 'numberfield',
123 name: 'score',
124 allowBlank: false,
125 fieldLabel: gettext('Score'),
126 },
127
128 {
129 xtype: 'proxmoxtextfield',
130 name: 'comment',
131 fieldLabel: gettext("Comment"),
132 },
133 {
134 xtype: 'hiddenfield',
135 name: 'digest',
136 value: vm.get('digest'),
137 },
138 ],
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"),
158 onlineHelp: 'pmgconfig_spamdetector_customscores',
159 items: [
160 {
161 xtype: 'displayfield',
162 name: 'name',
163 fieldLabel: gettext('Name'),
164 },
165 {
166 xtype: 'numberfield',
167 name: 'score',
168 allowBlank: false,
169 fieldLabel: gettext('Score'),
170 },
171
172 {
173 xtype: 'proxmoxtextfield',
174 name: 'comment',
175 fieldLabel: gettext("Comment"),
176 },
177 {
178 xtype: 'hiddenfield',
179 name: 'digest',
180 value: vm.get('digest'),
181 },
182 ],
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',
209 url: "/api2/json/config/customscores",
210 },
211 sorters: {
212 property: 'name',
213 },
214 },
215
216 tbar: [
217 {
218 xtype: 'proxmoxButton',
219 text: gettext('Edit'),
220 disabled: true,
221 handler: 'run_editor',
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) {
233 url += `?digest=${digest}`;
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',
258 },
259 ],
260
261 viewConfig: {
262 trackOver: false,
263 },
264
265 columns: [
266 {
267 header: gettext('Name'),
268 width: 200,
269 sortable: true,
270 dataIndex: 'name',
271 },
272 {
273 header: gettext('Score'),
274 width: 200,
275 sortable: true,
276 dataIndex: 'score',
277 },
278 {
279 header: gettext('Comment'),
280 sortable: false,
281 renderer: Ext.String.htmlEncode,
282 dataIndex: 'comment',
283 flex: 1,
284 },
285 ],
286
287 listeners: {
288 itemdblclick: 'run_editor',
289 },
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}',
300 html: '{changetext}',
301 },
302 reference: 'changes',
303 tbar: [
304 gettext('Pending changes') + ' (' +
305 gettext('Please restart pmg-smtp-filter to activate changes') + ')',
306 ],
307 split: true,
308 },
309 ],
310
311 });