]>
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 quarantineType
: 'spam',
12 notFoundText
: gettext('No data in database'),
20 allowPositionSave
: false,
23 xclass
: 'Ext.app.ViewController',
25 init: function(view
) {
27 let emailCombobox
= me
.lookupReference('email');
28 if (PMG
.view
=== 'quarantineview') {
29 view
.autoLoadAll
= false;
32 emailCombobox
.setVisible(true);
33 emailCombobox
.setDisabled(false);
34 emailCombobox
.getStore().on('load', me
.injectAllOption
, me
);
38 if (view
.quarantineType
) {
39 emailCombobox
.getStore().getProxy().setExtraParams({
40 'quarantine-type': view
.quarantineType
,
45 if (PMG
.QuarantineList
.from !== 0) {
46 from = new Date(PMG
.QuarantineList
.from * 1000);
48 from = new Date(Date
.now() - 7 * 24 * 60 * 60 * 1000);
52 if (PMG
.QuarantineList
.to
!== 0) {
53 to
= new Date(PMG
.QuarantineList
.to
* 1000);
58 // we to this to trigger the change event of those fields
59 me
.lookupReference('from').setValue(from);
60 me
.lookupReference('to').setValue(to
);
62 Proxmox
.Utils
.monStoreErrors(view
.getView(), view
.getStore());
65 view
.setSelection(view
.getStore().getById(view
.cselect
));
69 // ExtJS cannot dynamically change the emptyText on grids, so implement ourself
70 setEmptyText: function(emptyText
) {
72 let view
= me
.getView();
73 let tableview
= view
.getView();
74 tableview
.emptyText
= `<div class="x-grid-empty">${emptyText || view.notFoundText}</div>`;
77 load: function(callback
) {
79 me
.allowPositionSave
= false;
80 let view
= me
.getView();
81 let store
= view
.getStore();
82 if (view
.quarantineType
=== 'spam' && PMG
.view
!== 'quarantineview') {
83 if (!me
.lookupReference('email').getSelection()) {
84 return; // if the combobox has no selection we do not reload
88 // deselect all first, else ExtJS does some funky O(n^3) comparissions as it tries
89 // to keep the selection, but we do not care for that on a new load anyway
90 view
.getSelectionModel().deselectAll();
93 me
.restoreSavedSelection();
94 if (Ext
.isFunction(callback
)) {
97 me
.allowPositionSave
= true;
101 restoreSavedSelection: function() {
103 let view
= me
.getView();
104 if (me
.savedPosition
!== undefined) {
105 let store
= view
.getStore();
106 if (store
.getCount() - 1 < me
.savedPosition
) {
107 me
.savedPosition
= store
.getCount() - 1;
109 view
.setSelection(store
.getAt(me
.savedPosition
));
115 setFrom: function(from) {
116 let view
= this.getView();
117 let params
= view
.getStore().getProxy().getExtraParams();
118 params
.starttime
= from;
119 PMG
.QuarantineList
.from = from;
120 view
.getStore().getProxy().setExtraParams(params
);
123 setTo: function(to
) {
124 let end_of_to
= to
+ 24*60*60; // we want the end of the day
125 let view
= this.getView();
126 let params
= view
.getStore().getProxy().getExtraParams();
127 params
.endtime
= end_of_to
;
128 PMG
.QuarantineList
.to
= to
; // we save the start of the day here
129 view
.getStore().getProxy().setExtraParams(params
);
132 setUser: function(user
) {
133 let view
= this.getView();
134 let params
= view
.getStore().getProxy().getExtraParams();
140 view
.getStore().getProxy().setExtraParams(params
);
144 changeTime: function(field
, value
) {
147 me
.allowPositionSave
= false;
148 me
.savedPosition
= undefined;
154 let val
= value
.getTime() / 1000;
155 let combobox
= me
.lookupReference('email');
156 let params
= combobox
.getStore().getProxy().getExtraParams();
158 let to
= me
.lookupReference('to');
159 let from = me
.lookupReference('from');
161 if (field
.name
=== 'from') {
163 params
.starttime
= val
;
164 to
.setMinValue(value
);
165 } else if (field
.name
=== 'to') {
167 params
.endtime
= val
+ 24*60*60;
168 from.setMaxValue(value
);
173 combobox
.getStore().getProxy().setExtraParams(params
);
174 combobox
.getStore().load();
179 resetEmail: function() {
181 me
.setUser(undefined);
184 changeEmail: function(tb
, value
) {
186 me
.savedPosition
= undefined;
187 me
.allowPositionSave
= false;
188 if (value
=== 'all') {
196 savePosition: function(grid
, selected
, eopts
) {
198 if (!me
.allowPositionSave
) {
201 if (selected
.length
<= 0) {
202 me
.savedPosition
= undefined;
206 let view
= me
.getView();
207 let id
= view
.getStore().indexOf(selected
[0]);
209 me
.savedPosition
= id
;
212 doFilter: function(searchValue
, store
, sm
) {
213 const selected
= sm
.getSelection();
214 const selectedRecordId
= selected
.length
=== 1 ? selected
[0].id
: null;
215 let clearSelectedMail
= true;
217 store
.filterBy(function(record
) {
220 Ext
.each(['subject', 'from'], property
=> {
221 if (record
.data
[property
] === null) {
225 let v
= record
.data
[property
].toString();
226 if (v
!== undefined) {
228 if (v
.includes(searchValue
)) {
230 if (record
.id
=== selectedRecordId
) {
231 clearSelectedMail
= false;
236 if (!match
&& sm
.isSelected(record
)) {
237 toDeselect
.push(record
);
241 if (toDeselect
.length
> 0) {
242 sm
.deselect(toDeselect
, true);
243 sm
.maybeFireSelectionChange(true);
245 return selectedRecordId
!== null && clearSelectedMail
;
248 updateFilter
: async
function(field
) {
250 let view
= me
.getView();
251 let store
= view
.getStore();
252 let sm
= view
.getSelectionModel();
254 let searchValue
= field
.getValue().toLowerCase();
256 // supress store event if not empty, let filterBy below trigger it to avoid glitches
257 store
.clearFilter(searchValue
.length
> 0);
258 field
.triggers
.clear
.setVisible(searchValue
.length
> 0);
260 if (searchValue
.length
=== 0) {
264 me
.setEmptyText(gettext('No match found'));
266 let clearSelection
= me
.doFilter(searchValue
, store
, sm
);
268 if (clearSelection
) {
273 injectAllOption: function(store
, records
, successfull
) {
275 let view
= me
.getView();
276 if (successfull
&& records
.length
> 1) {
277 store
.insert(0, { mail
: 'all' });
279 let emailCombobox
= me
.lookup('email');
280 if (!emailCombobox
.getSelection() && view
.quarantineType
!== 'spam') {
281 emailCombobox
.setSelection(store
.getAt(0));
287 beforedestroy
: 'resetEmail',
288 selectionchange
: 'savePosition',
290 'combobox[reference=email]': {
291 change
: 'changeEmail',
305 groupHeaderTpl
: '{columnName}: {name} ({children.length})',
321 fieldLabel
: gettext('Since'),
328 fieldLabel
: gettext('Until'),
336 displayField
: 'mail',
340 '<div class="x-grid-empty">' +
341 gettext('No data in database') +
347 url
: '/api2/json/quarantine/spamusers',
352 renderer
: Ext
.htmlEncode
,
359 forceSelection
: true,
364 fieldLabel
: 'E-Mail',
369 fieldLabel
: gettext('Search'),
370 emptyText
: gettext('Subject, Sender'),
371 enableKeyEvents
: true,
374 cls
: 'pmx-clear-trigger',
377 handler: function() {
380 // setValue does not results in a keyup event, so trigger manually
381 me
.up('grid').getController().updateFilter(me
);
387 keyup
: 'updateFilter',