]>
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') {
193 tb
.triggers
.clear
.setVisible(value
?.length
> 0 && value
!== 'all');
197 savePosition: function(grid
, selected
, eopts
) {
199 if (!me
.allowPositionSave
) {
202 if (selected
.length
<= 0) {
203 me
.savedPosition
= undefined;
207 let view
= me
.getView();
208 let id
= view
.getStore().indexOf(selected
[0]);
210 me
.savedPosition
= id
;
213 doFilter: function(searchValue
, store
, sm
) {
214 const selected
= sm
.getSelection();
215 const selectedRecordId
= selected
.length
=== 1 ? selected
[0].id
: null;
216 let clearSelectedMail
= true;
218 store
.filterBy(function(record
) {
221 Ext
.each(['subject', 'from'], property
=> {
222 if (record
.data
[property
] === null) {
226 let v
= record
.data
[property
].toString();
227 if (v
!== undefined) {
229 if (v
.includes(searchValue
)) {
231 if (record
.id
=== selectedRecordId
) {
232 clearSelectedMail
= false;
237 if (!match
&& sm
.isSelected(record
)) {
238 toDeselect
.push(record
);
242 if (toDeselect
.length
> 0) {
243 sm
.deselect(toDeselect
, true);
244 sm
.maybeFireSelectionChange(true);
246 return selectedRecordId
!== null && clearSelectedMail
;
249 updateFilter
: async
function(field
) {
251 let view
= me
.getView();
252 let store
= view
.getStore();
253 let sm
= view
.getSelectionModel();
255 let searchValue
= field
.getValue().toLowerCase();
257 // supress store event if not empty, let filterBy below trigger it to avoid glitches
258 store
.clearFilter(searchValue
.length
> 0);
259 field
.triggers
.clear
.setVisible(searchValue
.length
> 0);
261 if (searchValue
.length
=== 0) {
265 me
.setEmptyText(gettext('No match found'));
267 let clearSelection
= me
.doFilter(searchValue
, store
, sm
);
269 if (clearSelection
) {
274 injectAllOption: function(store
, records
, successfull
) {
276 let view
= me
.getView();
277 if (successfull
&& records
.length
> 1) {
278 store
.insert(0, { mail
: 'all' });
280 let emailCombobox
= me
.lookup('email');
281 if (!emailCombobox
.getSelection() && view
.quarantineType
!== 'spam') {
282 emailCombobox
.setSelection(store
.getAt(0));
288 beforedestroy
: 'resetEmail',
289 selectionchange
: 'savePosition',
291 'combobox[reference=email]': {
292 change
: 'changeEmail',
306 groupHeaderTpl
: '{columnName}: {name} ({children.length})',
322 fieldLabel
: gettext('Since'),
329 fieldLabel
: gettext('Until'),
337 displayField
: 'mail',
340 emptyText
: `<div class="x-grid-empty">${gettext('No data in database')}</div>`,
345 url
: '/api2/json/quarantine/spamusers',
350 renderer
: Ext
.htmlEncode
,
357 forceSelection
: true,
362 fieldLabel
: 'E-Mail',
365 cls
: 'pmx-clear-trigger',
368 handler: function() {
369 this.triggers
.clear
.setVisible(false);
370 // 'all' is unfiltered here, so empty/originalValue makes no sense
371 this.setValue('all');
379 fieldLabel
: gettext('Search'),
380 emptyText
: gettext('Subject, Sender'),
381 enableKeyEvents
: true,
384 cls
: 'pmx-clear-trigger',
387 handler: function() {
390 // setValue does not results in a keyup event, so trigger manually
391 me
.up('grid').getController().updateFilter(me
);
397 keyup
: 'updateFilter',