]>
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();
83 store
.load(function() {
84 if (me
.savedPosition
!== undefined) {
85 if (store
.getCount() - 1 < me
.savedPosition
) {
86 me
.savedPosition
= store
.getCount() - 1;
88 view
.setSelection(store
.getAt(me
.savedPosition
));
92 if (Ext
.isFunction(callback
)) {
95 me
.allowPositionSave
= true;
99 setFrom: function(from) {
100 let view
= this.getView();
101 let params
= view
.getStore().getProxy().getExtraParams();
102 params
.starttime
= from;
103 PMG
.QuarantineList
.from = from;
104 view
.getStore().getProxy().setExtraParams(params
);
107 setTo: function(to
) {
108 let end_of_to
= to
+ 24*60*60; // we want the end of the day
109 let view
= this.getView();
110 let params
= view
.getStore().getProxy().getExtraParams();
111 params
.endtime
= end_of_to
;
112 PMG
.QuarantineList
.to
= to
; // we save the start of the day here
113 view
.getStore().getProxy().setExtraParams(params
);
116 setUser: function(user
) {
117 let view
= this.getView();
118 let params
= view
.getStore().getProxy().getExtraParams();
124 view
.getStore().getProxy().setExtraParams(params
);
128 changeTime: function(field
, value
) {
131 me
.allowPositionSave
= false;
132 me
.savedPosition
= undefined;
138 let val
= value
.getTime() / 1000;
139 let combobox
= me
.lookupReference('email');
140 let params
= combobox
.getStore().getProxy().getExtraParams();
142 let to
= me
.lookupReference('to');
143 let from = me
.lookupReference('from');
145 if (field
.name
=== 'from') {
147 params
.starttime
= val
;
148 to
.setMinValue(value
);
149 } else if (field
.name
=== 'to') {
151 params
.endtime
= val
+ 24*60*60;
152 from.setMaxValue(value
);
157 combobox
.getStore().getProxy().setExtraParams(params
);
158 combobox
.getStore().load();
163 resetEmail: function() {
165 let view
= me
.getView();
166 if (view
.emailSelection
) {
167 me
.setUser(undefined);
171 changeEmail: function(tb
, value
) {
173 me
.savedPosition
= undefined;
174 me
.allowPositionSave
= false;
175 if (value
=== 'all') {
183 savePosition: function(grid
, selected
, eopts
) {
185 if (!me
.allowPositionSave
) {
188 if (selected
.length
<= 0) {
189 me
.savedPosition
= undefined;
193 let view
= me
.getView();
194 let id
= view
.getStore().indexOf(selected
[0]);
196 me
.savedPosition
= id
;
199 doFilter: function(searchValue
, store
, sm
) {
200 const selected
= sm
.getSelection();
201 const selectedRecordId
= selected
.length
=== 1 ? selected
[0].id
: null;
202 let clearSelectedMail
= true;
204 store
.filterBy(function(record
) {
207 Ext
.each(['subject', 'from'], property
=> {
208 if (record
.data
[property
] === null) {
212 let v
= record
.data
[property
].toString();
213 if (v
!== undefined) {
215 if (v
.includes(searchValue
)) {
217 if (record
.id
=== selectedRecordId
) {
218 clearSelectedMail
= false;
223 if (!match
&& sm
.isSelected(record
)) {
224 toDeselect
.push(record
);
228 if (toDeselect
.length
> 0) {
229 sm
.deselect(toDeselect
, true);
230 sm
.maybeFireSelectionChange(true);
232 return selectedRecordId
!== null && clearSelectedMail
;
235 updateFilter
: async
function(field
) {
237 let view
= me
.getView();
238 let store
= view
.getStore();
239 let sm
= view
.getSelectionModel();
241 let searchValue
= field
.getValue().toLowerCase();
243 // supress store event if not empty, let filterBy below trigger it to avoid glitches
244 store
.clearFilter(searchValue
.length
> 0);
245 field
.triggers
.clear
.setVisible(searchValue
.length
> 0);
247 if (searchValue
.length
=== 0) {
251 me
.setEmptyText(gettext('No match found'));
253 let clearSelection
= me
.doFilter(searchValue
, store
, sm
);
255 if (clearSelection
) {
262 beforedestroy
: 'resetEmail',
263 selectionchange
: 'savePosition',
265 'combobox[reference=email]': {
266 change
: 'changeEmail',
280 groupHeaderTpl
: '{columnName}: {name} ({children.length})',
296 fieldLabel
: gettext('Since'),
303 fieldLabel
: gettext('Until'),
310 displayField
: 'mail',
314 '<div class="x-grid-empty">' +
315 gettext('No data in database') +
321 url
: '/api2/json/quarantine/spamusers',
326 renderer
: Ext
.htmlEncode
,
330 load: function(store
, records
, successfull
) {
331 if (successfull
&& records
.length
> 1) {
332 store
.insert(0, { mail
: 'all' });
340 forceSelection
: true,
345 fieldLabel
: 'E-Mail',
350 fieldLabel
: gettext('Search'),
351 emptyText
: gettext('Subject, Sender'),
352 enableKeyEvents
: true,
355 cls
: 'pmx-clear-trigger',
358 handler: function() {
361 // setValue does not results in a keyup event, so trigger manually
362 me
.up('grid').getController().updateFilter(me
);
368 keyup
: 'updateFilter',