mirror of
https://git.proxmox.com/git/pmg-gui
synced 2025-06-03 01:09:12 +00:00

using an explicit load on time change and queryMode 'local', we can enable typeAhead (and related settings) to let the user type in an email which will be autocompleted by the loaded list. Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
262 lines
5.6 KiB
JavaScript
262 lines
5.6 KiB
JavaScript
/*global Proxmox*/
|
|
Ext.define('PMG.QuarantineList', {
|
|
extend: 'Ext.grid.GridPanel',
|
|
xtype: 'pmgQuarantineList',
|
|
|
|
emptyText: gettext('No E-Mail address selected'),
|
|
viewConfig: {
|
|
deferEmptyText: false
|
|
},
|
|
|
|
config: {
|
|
emailSelection: false,
|
|
notFoundText: gettext('No data in database')
|
|
},
|
|
|
|
statics: {
|
|
from: 0,
|
|
to: 0
|
|
},
|
|
|
|
controller: {
|
|
xclass: 'Ext.app.ViewController',
|
|
|
|
init: function(view) {
|
|
var me = this;
|
|
if (PMG.view === 'quarantineview') {
|
|
view.emailSelection = false;
|
|
me.setEmptyText();
|
|
}
|
|
var emailCombobox = me.lookupReference('email');
|
|
emailCombobox.setVisible(view.emailSelection);
|
|
emailCombobox.setDisabled(!view.emailSelection);
|
|
|
|
var from;
|
|
if (PMG.QuarantineList.from != 0) {
|
|
from = new Date(PMG.QuarantineList.from * 1000);
|
|
} else {
|
|
from = new Date(Date.now() - 7*24*60*60*1000);
|
|
}
|
|
|
|
var to;
|
|
if (PMG.QuarantineList.to != 0) {
|
|
to = new Date(PMG.QuarantineList.to * 1000);
|
|
} else {
|
|
to = new Date();
|
|
}
|
|
|
|
// we to this to trigger the change event of those fields
|
|
me.lookupReference('from').setValue(from);
|
|
me.lookupReference('to').setValue(to);
|
|
|
|
Proxmox.Utils.monStoreErrors(view.getView(), view.getStore());
|
|
me.load(function() {
|
|
if (view.cselect) {
|
|
view.setSelection(view.getStore().getById(view.cselect));
|
|
}
|
|
});
|
|
},
|
|
// extjs has no method to dynamically change the emptytext on
|
|
// grids, so we have to do it this way
|
|
setEmptyText: function(emptyText) {
|
|
var me = this;
|
|
var view = me.getView();
|
|
var tableview = view.getView();
|
|
tableview.emptyText = '<div class="x-grid-empty">'+ (emptyText || view.notFoundText) + '</div>';
|
|
},
|
|
|
|
load: function(callback) {
|
|
var me = this;
|
|
var view = me.getView();
|
|
var store = view.getStore();
|
|
if (view.emailSelection) {
|
|
if (!me.lookupReference('email').getSelection()) {
|
|
// if the combobox has no selection we do not reload
|
|
return;
|
|
}
|
|
me.setEmptyText();
|
|
}
|
|
store.load(function() {
|
|
if (me.savedPosition !== undefined) {
|
|
if (store.getCount() - 1 < me.savedPosition) {
|
|
me.savedPosition = store.getCount() - 1;
|
|
}
|
|
view.setSelection(store.getAt(me.savedPosition));
|
|
}
|
|
if (Ext.isFunction(callback)) {
|
|
callback();
|
|
}
|
|
});
|
|
},
|
|
|
|
setFrom: function(from) {
|
|
var me = this.getView();
|
|
var params = me.getStore().getProxy().getExtraParams();
|
|
params.starttime = from;
|
|
PMG.QuarantineList.from = from;
|
|
me.getStore().getProxy().setExtraParams(params);
|
|
},
|
|
|
|
setTo: function(to) {
|
|
var end_of_to = to + 24*60*60; // we want the end of the day
|
|
var me = this.getView();
|
|
var params = me.getStore().getProxy().getExtraParams();
|
|
params.endtime = end_of_to;
|
|
PMG.QuarantineList.to = to; // we save the start of the day here
|
|
me.getStore().getProxy().setExtraParams(params);
|
|
},
|
|
|
|
setUser: function(user) {
|
|
var me = this.getView();
|
|
var params = me.getStore().getProxy().getExtraParams();
|
|
params.pmail = user;
|
|
me.getStore().getProxy().setExtraParams(params);
|
|
me.user = user;
|
|
},
|
|
|
|
changeTime: function(field, value) {
|
|
var me = this;
|
|
var list = me.getView();
|
|
|
|
if (!value) {
|
|
return;
|
|
}
|
|
|
|
var val = value.getTime()/1000;
|
|
var combobox = me.lookupReference('email');
|
|
var params = combobox.getStore().getProxy().getExtraParams();
|
|
|
|
var to = me.lookupReference('to');
|
|
var from = me.lookupReference('from');
|
|
|
|
if (field.name === 'from') {
|
|
me.setFrom(val);
|
|
params.starttime = val;
|
|
to.setMinValue(value);
|
|
|
|
} else if (field.name === 'to') {
|
|
me.setTo(val);
|
|
params.endtime = val + 24*60*60;
|
|
from.setMaxValue(value);
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
combobox.getStore().getProxy().setExtraParams(params);
|
|
combobox.getStore().load();
|
|
|
|
me.load();
|
|
},
|
|
|
|
resetEmail: function() {
|
|
var me = this;
|
|
var view = me.getView();
|
|
if (view.emailSelection) {
|
|
me.setUser(undefined);
|
|
}
|
|
},
|
|
|
|
changeEmail: function(tb, value) {
|
|
var me = this;
|
|
me.setUser(value);
|
|
me.load();
|
|
},
|
|
|
|
savePosition: function(grid, selected, eopts) {
|
|
if (!selected.length) {
|
|
return;
|
|
}
|
|
|
|
var me = this;
|
|
var view = me.getView();
|
|
|
|
var id = view.getStore().indexOf(selected[0]);
|
|
|
|
me.savedPosition = id;
|
|
},
|
|
|
|
|
|
control: {
|
|
'#':{
|
|
beforedestroy: 'resetEmail',
|
|
selectionchange: 'savePosition'
|
|
},
|
|
'combobox[reference=email]': {
|
|
change: 'changeEmail',
|
|
},
|
|
datefield: {
|
|
change: {
|
|
fn: 'changeTime'
|
|
}
|
|
}
|
|
|
|
}
|
|
},
|
|
|
|
features: [
|
|
{
|
|
ftype: 'grouping',
|
|
groupHeaderTpl: '{columnName}: {name} ({children.length})'
|
|
}
|
|
],
|
|
|
|
tbar: {
|
|
layout: {
|
|
type: 'vbox',
|
|
align: 'stretch'
|
|
},
|
|
defaults: {
|
|
margin: 2
|
|
},
|
|
items: [
|
|
{
|
|
fieldLabel: gettext('From'),
|
|
reference: 'from',
|
|
xtype: 'datefield',
|
|
format: 'Y-m-d',
|
|
name: 'from'
|
|
},
|
|
{
|
|
fieldLabel: gettext('To'),
|
|
reference: 'to',
|
|
xtype: 'datefield',
|
|
format: 'Y-m-d',
|
|
name: 'to'
|
|
},
|
|
{
|
|
xtype: 'combobox',
|
|
hidden: true,
|
|
displayField: 'mail',
|
|
valueField: 'mail',
|
|
listConfig: {
|
|
emptyText:
|
|
'<div class="x-grid-empty">' +
|
|
gettext('No data in database') +
|
|
'</div>'
|
|
},
|
|
store: {
|
|
proxy: {
|
|
type: 'proxmox',
|
|
url: '/api2/json/quarantine/spamusers'
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'mail',
|
|
renderer: Ext.htmlEncode
|
|
}
|
|
]
|
|
},
|
|
queryMode: 'local',
|
|
editable: true,
|
|
typeAhead: true,
|
|
forceSelection: true,
|
|
autoSelect: true,
|
|
anyMatch: true,
|
|
selectOnFocus: true,
|
|
reference: 'email',
|
|
fieldLabel: 'E-Mail'
|
|
}
|
|
]
|
|
}
|
|
});
|