]>
git.proxmox.com Git - pmg-gui.git/blob - js/QuarantineList.js
1 Ext
.define('PMG.QuarantineList', {
2 extend
: 'Ext.grid.GridPanel',
3 xtype
: 'pmgQuarantineList',
5 emptyText
: gettext('No E-Mail address selected'),
11 emailSelection
: false,
12 notFoundText
: gettext('No data in database'),
20 allowPositionSave
: false,
23 xclass
: 'Ext.app.ViewController',
25 init: function(view
) {
27 if (PMG
.view
=== 'quarantineview') {
28 view
.emailSelection
= false;
31 let emailCombobox
= me
.lookupReference('email');
32 emailCombobox
.setVisible(view
.emailSelection
);
33 emailCombobox
.setDisabled(!view
.emailSelection
);
36 if (PMG
.QuarantineList
.from !== 0) {
37 from = new Date(PMG
.QuarantineList
.from * 1000);
39 from = new Date(Date
.now() - 7 * 24 * 60 * 60 * 1000);
43 if (PMG
.QuarantineList
.to
!== 0) {
44 to
= new Date(PMG
.QuarantineList
.to
* 1000);
49 // we to this to trigger the change event of those fields
50 me
.lookupReference('from').setValue(from);
51 me
.lookupReference('to').setValue(to
);
53 Proxmox
.Utils
.monStoreErrors(view
.getView(), view
.getStore());
56 view
.setSelection(view
.getStore().getById(view
.cselect
));
60 // ExtJS cannot dynamically change the emptyText on grids, so implement ourself
61 setEmptyText: function(emptyText
) {
63 let view
= me
.getView();
64 let tableview
= view
.getView();
65 tableview
.emptyText
= `<div class="x-grid-empty">${emptyText || view.notFoundText}</div>`;
68 load: function(callback
) {
70 me
.allowPositionSave
= false;
71 let view
= me
.getView();
72 let store
= view
.getStore();
73 if (view
.emailSelection
) {
74 if (!me
.lookupReference('email').getSelection()) {
75 return; // if the combobox has no selection we do not reload
79 // deselect all first, else ExtJS does some funky O(n^3) comparissions as it tries
80 // to keep the selection, but we do not care for that on a new load anyway
81 view
.getSelectionModel().deselectAll();
84 me
.restoreSavedSelection();
85 if (Ext
.isFunction(callback
)) {
88 me
.allowPositionSave
= true;
92 restoreSavedSelection: function() {
94 let view
= me
.getView();
95 if (me
.savedPosition
!== undefined) {
96 let store
= view
.getStore();
97 if (store
.getCount() - 1 < me
.savedPosition
) {
98 me
.savedPosition
= store
.getCount() - 1;
100 view
.setSelection(store
.getAt(me
.savedPosition
));
106 setFrom: function(from) {
107 let view
= this.getView();
108 let params
= view
.getStore().getProxy().getExtraParams();
109 params
.starttime
= from;
110 PMG
.QuarantineList
.from = from;
111 view
.getStore().getProxy().setExtraParams(params
);
114 setTo: function(to
) {
115 let end_of_to
= to
+ 24*60*60; // we want the end of the day
116 let view
= this.getView();
117 let params
= view
.getStore().getProxy().getExtraParams();
118 params
.endtime
= end_of_to
;
119 PMG
.QuarantineList
.to
= to
; // we save the start of the day here
120 view
.getStore().getProxy().setExtraParams(params
);
123 setUser: function(user
) {
124 let view
= this.getView();
125 let params
= view
.getStore().getProxy().getExtraParams();
131 view
.getStore().getProxy().setExtraParams(params
);
135 changeTime: function(field
, value
) {
138 me
.allowPositionSave
= false;
139 me
.savedPosition
= undefined;
145 let val
= value
.getTime() / 1000;
146 let combobox
= me
.lookupReference('email');
147 let params
= combobox
.getStore().getProxy().getExtraParams();
149 let to
= me
.lookupReference('to');
150 let from = me
.lookupReference('from');
152 if (field
.name
=== 'from') {
154 params
.starttime
= val
;
155 to
.setMinValue(value
);
156 } else if (field
.name
=== 'to') {
158 params
.endtime
= val
+ 24*60*60;
159 from.setMaxValue(value
);
164 combobox
.getStore().getProxy().setExtraParams(params
);
165 combobox
.getStore().load();
170 resetEmail: function() {
172 let view
= me
.getView();
173 if (view
.emailSelection
) {
174 me
.setUser(undefined);
178 changeEmail: function(tb
, value
) {
180 me
.savedPosition
= undefined;
181 me
.allowPositionSave
= false;
182 if (value
=== 'all') {
190 savePosition: function(grid
, selected
, eopts
) {
192 if (!me
.allowPositionSave
) {
195 if (selected
.length
<= 0) {
196 me
.savedPosition
= undefined;
200 let view
= me
.getView();
201 let id
= view
.getStore().indexOf(selected
[0]);
203 me
.savedPosition
= id
;
206 doFilter: function(searchValue
, store
, sm
) {
207 const selected
= sm
.getSelection();
208 const selectedRecordId
= selected
.length
=== 1 ? selected
[0].id
: null;
209 let clearSelectedMail
= true;
211 store
.filterBy(function(record
) {
214 Ext
.each(['subject', 'from'], property
=> {
215 if (record
.data
[property
] === null) {
219 let v
= record
.data
[property
].toString();
220 if (v
!== undefined) {
222 if (v
.includes(searchValue
)) {
224 if (record
.id
=== selectedRecordId
) {
225 clearSelectedMail
= false;
230 if (!match
&& sm
.isSelected(record
)) {
231 toDeselect
.push(record
);
235 if (toDeselect
.length
> 0) {
236 sm
.deselect(toDeselect
, true);
237 sm
.maybeFireSelectionChange(true);
239 return selectedRecordId
!== null && clearSelectedMail
;
242 updateFilter
: async
function(field
) {
244 let view
= me
.getView();
245 let store
= view
.getStore();
246 let sm
= view
.getSelectionModel();
248 let searchValue
= field
.getValue().toLowerCase();
250 // supress store event if not empty, let filterBy below trigger it to avoid glitches
251 store
.clearFilter(searchValue
.length
> 0);
252 field
.triggers
.clear
.setVisible(searchValue
.length
> 0);
254 if (searchValue
.length
=== 0) {
258 me
.setEmptyText(gettext('No match found'));
260 let clearSelection
= me
.doFilter(searchValue
, store
, sm
);
262 if (clearSelection
) {
269 beforedestroy
: 'resetEmail',
270 selectionchange
: 'savePosition',
272 'combobox[reference=email]': {
273 change
: 'changeEmail',
287 groupHeaderTpl
: '{columnName}: {name} ({children.length})',
303 fieldLabel
: gettext('Since'),
310 fieldLabel
: gettext('Until'),
317 displayField
: 'mail',
321 '<div class="x-grid-empty">' +
322 gettext('No data in database') +
328 url
: '/api2/json/quarantine/spamusers',
333 renderer
: Ext
.htmlEncode
,
337 load: function(store
, records
, successfull
) {
338 if (successfull
&& records
.length
> 1) {
339 store
.insert(0, { mail
: 'all' });
347 forceSelection
: true,
352 fieldLabel
: 'E-Mail',
357 fieldLabel
: gettext('Search'),
358 emptyText
: gettext('Subject, Sender'),
359 enableKeyEvents
: true,
362 cls
: 'pmx-clear-trigger',
365 handler: function() {
368 // setValue does not results in a keyup event, so trigger manually
369 me
.up('grid').getController().updateFilter(me
);
375 keyup
: 'updateFilter',