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