]> git.proxmox.com Git - pmg-gui.git/blame - js/SpamDetectorCustom.js
spam detector: custom rules: move apply/revert buttons to pending section
[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() {
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});