2011-09-08 01:32:24 +02:00
/ * *
* eGroupWare eTemplate2 - JS Link object
*
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ package etemplate
* @ subpackage api
* @ link http : //www.egroupware.org
* @ author Nathan Gray
* @ copyright 2011 Nathan Gray
* @ version $Id$
* /
"use strict" ;
/ * e g w : u s e s
jquery . jquery ;
jquery . jquery - ui ;
et2 _core _inputWidget ;
et2 _core _valueWidget ;
* /
/ * *
* UI widgets for Egroupware linking system
* /
var et2 _link _to = et2 _inputWidget . extend ( {
attributes : {
"application" : {
"name" : "Application" ,
"type" : "string" ,
"default" : egw _getAppName ( ) ,
"description" : "Limit to the listed application or applications (comma seperated)"
} ,
"blur" : {
"name" : "Placeholder" ,
"type" : "string" ,
"default" : "" ,
"description" : "This text get displayed if an input-field is empty and does not have the input-focus (blur). It can be used to show a default value or a kind of help-text."
} ,
} ,
search _timeout : 200 , //ms after change to send query
minimum _characters : 2 , // Don't send query unless there's at least this many chars
init : function ( ) {
this . _super . apply ( this , arguments ) ;
this . div = null ;
this . search = null ;
this . app _select = null ;
this . cache = { } ;
this . createInputWidget ( ) ;
} ,
destroy : function ( ) {
this . _super . apply ( this , arguments ) ;
this . div = null ;
this . search . autocomplete ( "destroy" ) ;
this . search = null ;
this . app _select = null ;
this . createInputWidget ( ) ;
} ,
createInputWidget : function ( ) {
var self = this ;
this . div = $j ( document . createElement ( "div" ) ) ;
// Application selection
this . app _select = $j ( document . createElement ( "select" ) ) . appendTo ( this . div )
. change ( function ( e ) {
self . cache = { } ; // Clear cache when app changes
self . options . value . app = this . val ( ) ;
} ) ;
for ( var key in this . options . select _options ) {
var option = $j ( document . createElement ( "option" ) )
. attr ( "value" , key )
. text ( this . options . select _options [ key ] ) ;
option . appendTo ( this . app _select ) ;
}
self . options . value . app = this . app _select . val ( ) ;
// Search input
this . search = $j ( document . createElement ( "input" ) ) . attr ( "type" , "search" ) . appendTo ( this . div ) ;
// Link button
this . link _button = $j ( document . createElement ( "button" ) )
. text ( egw . lang ( "link" ) )
. appendTo ( this . div ) . hide ( )
. click ( this , this . createLink ) ;
this . set _blur ( this . blur ? this . blur : egw . lang ( "search" ) ) ;
this . search . autocomplete ( {
source : function ( request , response ) { return self . query ( request , response ) ; } ,
select : function ( event , item ) { event . data = self ; self . select ( event , item ) ; return false ; } ,
focus : function ( event , item ) {
event . stopPropagation ( ) ;
self . search . val ( item . item . label ) ;
return false ;
} ,
minLength : self . minimum _characters ,
disabled : self . options . disabled
} ) ;
this . setDOMNode ( this . div [ 0 ] ) ;
} ,
transformAttributes : function ( _attrs ) {
this . _super . apply ( this , arguments ) ;
2011-09-08 14:24:53 +02:00
_attrs [ "select_options" ] = egw . link _app _list ( 'query' ) ;
2011-09-08 01:32:24 +02:00
// Check whether the options entry was found, if not read it from the
// content array.
if ( _attrs [ "select_options" ] == null )
{
_attrs [ "select_options" ] = this . getArrayMgr ( 'content' )
2011-09-08 20:36:09 +02:00
. getEntry ( "options-" + this . id )
2011-09-08 01:32:24 +02:00
}
// Default to an empty object
if ( _attrs [ "select_options" ] == null )
{
_attrs [ "select_options" ] = { } ;
}
} ,
getValue : function ( ) {
return this . options . value ;
} ,
set _blur : function ( _value ) {
if ( _value ) {
this . search . attr ( "placeholder" , _value ) ; // HTML5
if ( ! this . search [ 0 ] . placeholder ) {
// Not HTML5
if ( this . search . val ( ) == "" ) this . search . val ( this . options . blur ) ;
this . search . focus ( this , function ( e ) {
if ( e . data . search . val ( ) == e . data . options . blur ) e . data . search . val ( "" ) ;
} ) . blur ( this , function ( e ) {
if ( e . data . search . val ( ) == "" ) e . data . search . val ( e . data . options . blur ) ;
} ) ;
}
} else {
this . search . removeAttr ( "placeholder" ) ;
}
} ,
/ * *
* Ask server for entries matching selected app / type and filtered by search string
* /
query : function ( request , response ) {
if ( request . term in this . cache ) {
return response ( this . cache [ request . term ] ) ;
}
this . search . addClass ( "loading" ) ;
this . link _button . hide ( ) ;
var request = new egw _json _request ( "etemplate_widget_link::ajax_link_search::etemplate" ,
[ this . app _select . val ( ) , '' , request . term ] ,
this
) ;
this . response = response ;
request . sendRequest ( true , this . _results , this ) ;
} ,
/ * *
* User selected a value
* /
select : function ( event , selected ) {
event . data . options . value . id = selected . item . value ;
event . data . search . val ( selected . item . label ) ;
event . data . link _button . show ( ) ;
} ,
/ * *
* Server found some results
* /
_results : function ( data ) {
this . search . removeClass ( "loading" ) ;
var result = [ ] ;
for ( var id in data ) {
result . push ( { "value" : id , "label" : data [ id ] } ) ;
}
this . cache [ this . search . val ( ) ] = result ;
this . response ( result ) ;
} ,
/ * *
* Create a link using the current internal values
* /
createLink : function ( event ) {
console . info ( "Link: " , event . data . options . value ) ;
event . data . link _button . hide ( ) ;
}
} ) ;
et2 _register _widget ( et2 _link _to , [ "link-to" ] ) ;