]> git.proxmox.com Git - pmg-gui.git/blob - js/QuarantineList.js
quarantine list: code cleanup
[pmg-gui.git] / js / QuarantineList.js
1 Ext.define('PMG.QuarantineList', {
2 extend: 'Ext.grid.GridPanel',
3 xtype: 'pmgQuarantineList',
4
5 emptyText: gettext('No E-Mail address selected'),
6 viewConfig: {
7 deferEmptyText: false,
8 },
9
10 config: {
11 emailSelection: false,
12 notFoundText: gettext('No data in database'),
13 },
14
15 statics: {
16 from: 0,
17 to: 0,
18 },
19
20 allowPositionSave: false,
21
22 controller: {
23 xclass: 'Ext.app.ViewController',
24
25 init: function(view) {
26 let me = this;
27 if (PMG.view === 'quarantineview') {
28 view.emailSelection = false;
29 me.setEmptyText();
30 }
31 let emailCombobox = me.lookupReference('email');
32 emailCombobox.setVisible(view.emailSelection);
33 emailCombobox.setDisabled(!view.emailSelection);
34
35 let from;
36 if (PMG.QuarantineList.from !== 0) {
37 from = new Date(PMG.QuarantineList.from * 1000);
38 } else {
39 from = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
40 }
41
42 let to;
43 if (PMG.QuarantineList.to !== 0) {
44 to = new Date(PMG.QuarantineList.to * 1000);
45 } else {
46 to = new Date();
47 }
48
49 // we to this to trigger the change event of those fields
50 me.lookupReference('from').setValue(from);
51 me.lookupReference('to').setValue(to);
52
53 Proxmox.Utils.monStoreErrors(view.getView(), view.getStore());
54 me.load(function() {
55 if (view.cselect) {
56 view.setSelection(view.getStore().getById(view.cselect));
57 }
58 });
59 },
60 // extjs has no method to dynamically change the emptytext on
61 // grids, so we have to do it this way
62 setEmptyText: function(emptyText) {
63 let me = this;
64 let view = me.getView();
65 let tableview = view.getView();
66 tableview.emptyText = '<div class="x-grid-empty">'+ (emptyText || view.notFoundText) + '</div>';
67 },
68
69 load: function(callback) {
70 let me = this;
71 me.allowPositionSave = false;
72 let view = me.getView();
73 let store = view.getStore();
74 if (view.emailSelection) {
75 if (!me.lookupReference('email').getSelection()) {
76 // if the combobox has no selection we do not reload
77 return;
78 }
79 me.setEmptyText();
80 }
81 store.load(function() {
82 if (me.savedPosition !== undefined) {
83 if (store.getCount() - 1 < me.savedPosition) {
84 me.savedPosition = store.getCount() - 1;
85 }
86 view.setSelection(store.getAt(me.savedPosition));
87 } else {
88 view.setSelection();
89 }
90 if (Ext.isFunction(callback)) {
91 callback();
92 }
93 me.allowPositionSave = true;
94 });
95 },
96
97 setFrom: function(from) {
98 let view = this.getView();
99 let params = view.getStore().getProxy().getExtraParams();
100 params.starttime = from;
101 PMG.QuarantineList.from = from;
102 view.getStore().getProxy().setExtraParams(params);
103 },
104
105 setTo: function(to) {
106 let end_of_to = to + 24*60*60; // we want the end of the day
107 let view = this.getView();
108 let params = view.getStore().getProxy().getExtraParams();
109 params.endtime = end_of_to;
110 PMG.QuarantineList.to = to; // we save the start of the day here
111 view.getStore().getProxy().setExtraParams(params);
112 },
113
114 setUser: function(user) {
115 let view = this.getView();
116 let params = view.getStore().getProxy().getExtraParams();
117 params.pmail = user;
118 view.getStore().getProxy().setExtraParams(params);
119 view.user = user;
120 },
121
122 changeTime: function(field, value) {
123 let me = this;
124
125 me.allowPositionSave = false;
126 me.savedPosition = undefined;
127
128 if (!value) {
129 return;
130 }
131
132 let val = value.getTime() / 1000;
133 let combobox = me.lookupReference('email');
134 let params = combobox.getStore().getProxy().getExtraParams();
135
136 let to = me.lookupReference('to');
137 let from = me.lookupReference('from');
138
139 if (field.name === 'from') {
140 me.setFrom(val);
141 params.starttime = val;
142 to.setMinValue(value);
143 } else if (field.name === 'to') {
144 me.setTo(val);
145 params.endtime = val + 24*60*60;
146 from.setMaxValue(value);
147 } else {
148 return;
149 }
150
151 combobox.getStore().getProxy().setExtraParams(params);
152 combobox.getStore().load();
153
154 me.load();
155 },
156
157 resetEmail: function() {
158 let me = this;
159 let view = me.getView();
160 if (view.emailSelection) {
161 me.setUser(undefined);
162 }
163 },
164
165 changeEmail: function(tb, value) {
166 let me = this;
167 me.savedPosition = undefined;
168 me.allowPositionSave = false;
169 me.setUser(value);
170 me.load();
171 },
172
173 savePosition: function(grid, selected, eopts) {
174 let me = this;
175 if (!me.allowPositionSave) {
176 return;
177 }
178 if (!selected.length) {
179 me.savedPosition = undefined;
180 return;
181 }
182
183 let view = me.getView();
184 let id = view.getStore().indexOf(selected[0]);
185
186 me.savedPosition = id;
187 },
188
189
190 control: {
191 '#': {
192 beforedestroy: 'resetEmail',
193 selectionchange: 'savePosition',
194 },
195 'combobox[reference=email]': {
196 change: 'changeEmail',
197 },
198 datefield: {
199 change: {
200 fn: 'changeTime',
201 },
202 },
203
204 },
205 },
206
207 features: [
208 {
209 ftype: 'grouping',
210 groupHeaderTpl: '{columnName}: {name} ({children.length})',
211 },
212 ],
213
214 tbar: {
215 layout: {
216 type: 'vbox',
217 align: 'stretch',
218 },
219 defaults: {
220 margin: 2,
221 },
222 items: [
223 {
224 xtype: 'datefield',
225 name: 'from',
226 fieldLabel: gettext('Since'),
227 reference: 'from',
228 format: 'Y-m-d',
229 },
230 {
231 xtype: 'datefield',
232 name: 'to',
233 fieldLabel: gettext('Until'),
234 reference: 'to',
235 format: 'Y-m-d',
236 },
237 {
238 xtype: 'combobox',
239 hidden: true,
240 displayField: 'mail',
241 valueField: 'mail',
242 listConfig: {
243 emptyText:
244 '<div class="x-grid-empty">' +
245 gettext('No data in database') +
246 '</div>',
247 },
248 store: {
249 proxy: {
250 type: 'proxmox',
251 url: '/api2/json/quarantine/spamusers',
252 },
253 fields: [
254 {
255 name: 'mail',
256 renderer: Ext.htmlEncode,
257 },
258 ],
259 },
260 queryMode: 'local',
261 editable: true,
262 typeAhead: true,
263 forceSelection: true,
264 autoSelect: true,
265 anyMatch: true,
266 selectOnFocus: true,
267 reference: 'email',
268 fieldLabel: 'E-Mail',
269 },
270 ],
271 },
272 });