forked from extern/egroupware
Implement searchbox widget
This commit is contained in:
parent
1f762e92b2
commit
83d47aed72
@ -406,3 +406,156 @@ var et2_textbox_ro = et2_valueWidget.extend([et2_IDetachedDOM],
|
||||
});
|
||||
et2_register_widget(et2_textbox_ro, ["textbox_ro"]);
|
||||
|
||||
/**
|
||||
* et2_searchbox is a widget which provides a collapsable input search
|
||||
* with on searching indicator and clear handler regardless of any browser limitation.
|
||||
*
|
||||
* @type type
|
||||
*/
|
||||
var et2_searchbox = et2_textbox.extend(
|
||||
{
|
||||
/**
|
||||
* Ignore all more advanced attributes.
|
||||
*/
|
||||
attributes: {},
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @memberOf et2_searchbox
|
||||
*/
|
||||
init: function() {
|
||||
this.value = "";
|
||||
this.div = jQuery(document.createElement('div'))
|
||||
.addClass('et2_searchbox');
|
||||
|
||||
this._super.apply(this, arguments);
|
||||
this.setDOMNode(this.div[0]);
|
||||
this._createWidget();
|
||||
},
|
||||
|
||||
_createWidget:function()
|
||||
{
|
||||
var self = this;
|
||||
// search button indicator
|
||||
this.button = et2_createWidget('button',{class:"et2_button_with_image"},this);
|
||||
this.button.onclick= function(){
|
||||
self._show_hide(true);
|
||||
self.search.input.focus()
|
||||
};
|
||||
this.div.prepend(this.button.getDOMNode());
|
||||
|
||||
// input field
|
||||
this.search = et2_createWidget('textbox',{"blur":egw.lang("search"),
|
||||
onkeypress:function(event) {
|
||||
if(event.which == 13)
|
||||
{
|
||||
event.preventDefault();
|
||||
self.getInstanceManager().autocomplete_fixer();
|
||||
// Use a timeout to make sure we get the autocomplete value,
|
||||
// if one was chosen, instead of what was actually typed.
|
||||
// Chrome doesn't need this, but FF does.
|
||||
window.setTimeout(function() {
|
||||
self.set_value(self.search.input.val());
|
||||
self.change();
|
||||
},0);
|
||||
}
|
||||
}},this);
|
||||
this.search.input.on({
|
||||
keyup:function(event)
|
||||
{
|
||||
if(event.which == 27) // Escape
|
||||
{
|
||||
// Excape clears search
|
||||
self.set_value('');
|
||||
}
|
||||
},
|
||||
|
||||
blur: function(event){
|
||||
self._show_hide(false);
|
||||
if (self._oldValue != self.get_value()) {
|
||||
self.change();
|
||||
}
|
||||
},
|
||||
mousedown:function(event){
|
||||
if (event.target.type == 'span') event.stopImmidatePropagation();
|
||||
}
|
||||
});
|
||||
this.div.append(this.search.getDOMNode());
|
||||
|
||||
// clear button implementation
|
||||
this.clear = jQuery(document.createElement('span'))
|
||||
.addClass('ui-icon clear')
|
||||
.on('mousedown',function(event){
|
||||
event.preventDefault();
|
||||
})
|
||||
.on('click',function(event) {
|
||||
if (self.get_value()){
|
||||
self.search.input.val('');
|
||||
self.search.input.focus();
|
||||
self._show_hide(true);
|
||||
if (self._oldValue) self.change();
|
||||
}
|
||||
else
|
||||
{
|
||||
self._show_hide(false);
|
||||
}
|
||||
})
|
||||
.appendTo(this.div);
|
||||
},
|
||||
|
||||
/**
|
||||
* Show/hide search field
|
||||
* @param {boolean} _stat true means show and false means hide
|
||||
*/
|
||||
_show_hide: function(_stat)
|
||||
{
|
||||
jQuery(this.search.getDOMNode()).toggleClass('hide',!_stat);
|
||||
jQuery('span.clear',this.div).toggleClass('hide',!_stat);
|
||||
},
|
||||
|
||||
/**
|
||||
* toggle search button status based on value
|
||||
*/
|
||||
_searchToggleState:function()
|
||||
{
|
||||
if (!this.get_value())
|
||||
{
|
||||
jQuery(this.button.getDOMNode()).removeClass('searched');
|
||||
}
|
||||
else
|
||||
{
|
||||
jQuery(this.button.getDOMNode()).addClass('searched');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* override change function in order to preset the toggle state
|
||||
*/
|
||||
change:function()
|
||||
{
|
||||
this._searchToggleState();
|
||||
|
||||
this._super.apply(this,arguments);
|
||||
},
|
||||
|
||||
|
||||
get_value:function(){
|
||||
return this.search.input.val();
|
||||
},
|
||||
|
||||
/**
|
||||
* override doLoadingFinished in order to set initial state
|
||||
*/
|
||||
doLoadingFinished: function()
|
||||
{
|
||||
this._super.apply(this,arguments);
|
||||
if (!this.get_value()) {
|
||||
this._show_hide(false);
|
||||
}
|
||||
else{
|
||||
this._searchToggleState();
|
||||
}
|
||||
}
|
||||
});
|
||||
et2_register_widget(et2_searchbox, ["searchbox"]);
|
Loading…
Reference in New Issue
Block a user