2020-02-13 11:08:12 +01:00
"use strict" ;
2012-07-14 17:38:02 +02:00
/ * *
2013-04-13 21:00:13 +02:00
* EGroupware eTemplate2 - JS Itempicker object
2012-07-14 17:38:02 +02:00
* derived from et2 _link _entry widget @ copyright 2011 Nathan Gray
*
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ package etemplate
* @ subpackage api
* @ link http : //www.egroupware.org
* @ author Christian Binder
* @ author Nathan Gray
* @ copyright 2012 Christian Binder
* @ copyright 2011 Nathan Gray
* /
2020-02-13 11:08:12 +01:00
var _ _extends = ( this && this . _ _extends ) || ( function ( ) {
var extendStatics = function ( d , b ) {
extendStatics = Object . setPrototypeOf ||
( { _ _proto _ _ : [ ] } instanceof Array && function ( d , b ) { d . _ _proto _ _ = b ; } ) ||
function ( d , b ) { for ( var p in b ) if ( b . hasOwnProperty ( p ) ) d [ p ] = b [ p ] ; } ;
return extendStatics ( d , b ) ;
} ;
return function ( d , b ) {
extendStatics ( d , b ) ;
function _ _ ( ) { this . constructor = d ; }
d . prototype = b === null ? Object . create ( b ) : ( _ _ . prototype = b . prototype , new _ _ ( ) ) ;
} ;
} ) ( ) ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2012-07-14 17:38:02 +02:00
/ * e g w : u s e s
2020-02-13 11:08:12 +01:00
/ v e n d o r / b o w e r - a s s e t / j q u e r y / d i s t / j q u e r y . j s ;
et2 _core _inputWidget ;
et2 _core _valueWidget ;
et2 _extension _itempicker _actions ;
egw _action . egw _action _common ;
2012-07-14 17:38:02 +02:00
* /
2020-02-13 11:08:12 +01:00
var et2 _core _widget _1 = require ( "./et2_core_widget" ) ;
var et2 _core _inputWidget _1 = require ( "./et2_core_inputWidget" ) ;
var et2 _core _inheritance _1 = require ( "./et2_core_inheritance" ) ;
2012-07-14 17:38:02 +02:00
/ * *
* Class which implements the "itempicker" XET - Tag
2016-02-29 21:40:43 +01:00
*
2013-04-13 21:00:13 +02:00
* @ augments et2 _inputWidget
2016-02-29 21:40:43 +01:00
* /
2020-02-13 11:08:12 +01:00
var et2 _itempicker = /** @class */ ( function ( _super ) {
_ _extends ( et2 _itempicker , _super ) ;
/ * *
* Constructor
*
* @ memberOf et2 _itempicker
* /
function et2 _itempicker ( _parent , _attrs , _child ) {
var _this =
// Call the inherited constructor
_super . call ( this , _parent , _attrs , et2 _core _inheritance _1 . ClassWithAttributes . extendAttributes ( et2 _itempicker . _attributes , _child || { } ) ) || this ;
_this . last _search = "" ; // Remember last search value
_this . action = null ; // Action function for button
_this . current _app = "" ; // Remember currently chosen application
_this . div = null ;
_this . left = null ;
_this . right = null ;
_this . right _container = null ;
_this . app _select = null ;
_this . search = null ;
_this . button _action = null ;
_this . itemlist = null ;
_this . div = null ;
_this . left = null ;
_this . right = null ;
_this . right _container = null ;
_this . app _select = null ;
_this . search = null ;
_this . button _action = null ;
_this . itemlist = null ;
if ( _this . options . action !== null && typeof _this . options . action == "string" ) {
_this . action = new egwFnct ( _this , "javaScript:" + _this . options . action ) ;
}
else {
console . log ( "itempicker widget: no action provided for button" ) ;
}
_this . createInputWidget ( ) ;
return _this ;
}
et2 _itempicker . prototype . clearSearchResults = function ( ) {
this . search . val ( "" ) ;
this . itemlist . html ( "" ) ;
this . search . focus ( ) ;
this . clear . hide ( ) ;
} ;
et2 _itempicker . prototype . createInputWidget = function ( ) {
var _self = this ;
this . div = jQuery ( document . createElement ( "div" ) ) ;
this . left = jQuery ( document . createElement ( "div" ) ) ;
this . right = jQuery ( document . createElement ( "div" ) ) ;
this . right _container = jQuery ( document . createElement ( "div" ) ) ;
this . app _select = jQuery ( document . createElement ( "ul" ) ) ;
this . search = jQuery ( document . createElement ( "input" ) ) ;
this . clear = jQuery ( document . createElement ( "span" ) ) ;
this . itemlist = jQuery ( document . createElement ( "div" ) ) ;
// Container elements
this . div . addClass ( "et2_itempicker" ) ;
this . left . addClass ( "et2_itempicker_left" ) ;
this . right . addClass ( "et2_itempicker_right" ) ;
this . right _container . addClass ( "et2_itempicker_right_container" ) ;
// Application select
this . app _select . addClass ( "et2_itempicker_app_select" ) ;
var item _count = 0 ;
for ( var key in this . options . select _options ) {
var img _icon = this . egw ( ) . image ( key + "/navbar" ) ;
if ( img _icon === null ) {
continue ;
}
var img = jQuery ( document . createElement ( "img" ) ) ;
img . attr ( "src" , img _icon ) ;
var item = jQuery ( document . createElement ( "li" ) ) ;
item . attr ( "id" , key )
. click ( function ( ) {
_self . selectApplication ( jQuery ( this ) ) ;
} )
. append ( img ) ;
if ( item _count == 0 ) {
this . selectApplication ( item ) ; // select first item by default
}
this . app _select . append ( item ) ;
item _count ++ ;
}
// Search input field
this . search . addClass ( "et2_itempicker_search" ) ;
this . search . keyup ( function ( ) {
var request = { } ;
request . term = jQuery ( this ) . val ( ) ;
_self . query ( request ) ;
} ) ;
this . set _blur ( this . options . blur , this . search ) ;
// Clear button for search
this . clear
. addClass ( "et2_itempicker_clear ui-icon ui-icon-close" )
. click ( function ( ) {
_self . clearSearchResults ( ) ;
} )
. hide ( ) ;
// Action button
this . button _action = et2 _createWidget ( "button" ) ;
jQuery ( this . button _action . getDOMNode ( ) ) . addClass ( "et2_itempicker_button_action" ) ;
this . button _action . set _label ( this . egw ( ) . lang ( this . options . action _label ) ) ;
this . button _action . click = function ( ) { _self . doAction ( ) ; } ;
// Itemlist
this . itemlist . attr ( "id" , "itempicker_itemlist" ) ;
this . itemlist . addClass ( "et2_itempicker_itemlist" ) ;
// Put everything together
this . left . append ( this . app _select ) ;
this . right _container . append ( this . search ) ;
this . right _container . append ( this . clear ) ;
this . right _container . append ( this . button _action . getDOMNode ( ) ) ;
this . right _container . append ( this . itemlist ) ;
this . right . append ( this . right _container ) ;
this . div . append ( this . right ) ; // right before left to have a natural
this . div . append ( this . left ) ; // z-index for left div over right div
this . setDOMNode ( this . div [ 0 ] ) ;
} ;
et2 _itempicker . prototype . doAction = function ( ) {
if ( this . action !== null ) {
var data = { } ;
data . app = this . current _app ;
data . value = this . options . value ;
data . checked = this . getSelectedItems ( ) ;
return this . action . exec ( this , data ) ;
}
return false ;
} ;
et2 _itempicker . prototype . getSelectedItems = function ( ) {
var items = [ ] ;
jQuery ( this . itemlist ) . children ( "ul" ) . children ( "li.selected" ) . each ( function ( index ) {
items [ index ] = jQuery ( this ) . attr ( "id" ) ;
} ) ;
return items ;
} ;
/ * *
* Ask server for entries matching selected app / type and filtered by search string
* /
et2 _itempicker . prototype . query = function ( request ) {
if ( request . term . length < 3 ) {
return true ;
}
// Remember last search
this . last _search = request . term ;
// Allow hook / tie in
if ( this . options . query && typeof this . options . query == 'function' ) {
if ( ! this . options . query ( request , response ) )
return false ;
}
//if(request.term in this.cache) {
// return response(this.cache[request.term]);
//}
this . itemlist . addClass ( "loading" ) ;
this . clear . css ( "display" , "inline-block" ) ;
egw . json ( "EGroupware\\Api\\Etemplate\\Widget\\ItemPicker::ajax_item_search" , [ this . current _app , '' , request . term , request . options ] , this . queryResults , this , true , this ) . sendRequest ( ) ;
} ;
/ * *
* Server found some results for query
* /
et2 _itempicker . prototype . queryResults = function ( data ) {
this . itemlist . removeClass ( "loading" ) ;
this . updateItemList ( data ) ;
} ;
et2 _itempicker . prototype . selectApplication = function ( app ) {
this . clearSearchResults ( ) ;
jQuery ( ".et2_itempicker_app_select li" ) . removeClass ( "selected" ) ;
app . addClass ( "selected" ) ;
this . current _app = app . attr ( "id" ) ;
return true ;
} ;
et2 _itempicker . prototype . set _blur = function ( _value , input ) {
if ( typeof input == 'undefined' )
input = this . search ;
if ( _value ) {
input . attr ( "placeholder" , _value ) ; // HTML5
if ( ! input [ 0 ] . placeholder ) {
// Not HTML5
if ( input . val ( ) == "" )
input . val ( _value ) ;
input . focus ( input , function ( e ) {
var placeholder = _value ;
if ( e . data . val ( ) == placeholder )
e . data . val ( "" ) ;
} ) . blur ( input , function ( e ) {
var placeholder = _value ;
if ( e . data . val ( ) == "" )
e . data . val ( placeholder ) ;
} ) ;
if ( input . val ( ) == "" )
input . val ( _value ) ;
}
}
else {
this . search . removeAttr ( "placeholder" ) ;
}
} ;
et2 _itempicker . prototype . transformAttributes = function ( _attrs ) {
_super . prototype . transformAttributes . call ( this , _attrs ) ;
_attrs [ "select_options" ] = { } ;
if ( _attrs [ "application" ] ) {
var apps = et2 _csvSplit ( _attrs [ "application" ] , null , "," ) ;
for ( var i = 0 ; i < apps . length ; i ++ ) {
_attrs [ "select_options" ] [ apps [ i ] ] = this . egw ( ) . lang ( apps [ i ] ) ;
}
}
else {
_attrs [ "select_options" ] = this . egw ( ) . link _app _list ( 'query' ) ;
}
// 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' )
. getEntry ( "options-" + this . id ) ;
}
// Default to an empty object
if ( _attrs [ "select_options" ] == null ) {
_attrs [ "select_options" ] = { } ;
}
} ;
et2 _itempicker . prototype . updateItemList = function ( data ) {
var list = jQuery ( document . createElement ( "ul" ) ) ;
var item _count = 0 ;
for ( var id in data ) {
var item = jQuery ( document . createElement ( "li" ) ) ;
if ( item _count % 2 == 0 ) {
item . addClass ( "row_on" ) ;
}
else {
item . addClass ( "row_off" ) ;
}
item . attr ( "id" , id )
. html ( data [ id ] )
. click ( function ( e ) {
if ( e . ctrlKey || e . metaKey ) {
// add to selection
jQuery ( this ) . addClass ( "selected" ) ;
}
else if ( e . shiftKey ) {
// select range
var start = jQuery ( this ) . siblings ( ".selected" ) . first ( ) ;
2021-03-22 18:42:50 +01:00
if ( ( start === null || start === void 0 ? void 0 : start . length ) == 0 ) {
2020-02-13 11:08:12 +01:00
// no start item - cannot select range - select single item
jQuery ( this ) . addClass ( "selected" ) ;
return true ;
}
var end = jQuery ( this ) ;
// swap start and end if start appears after end in dom hierarchy
if ( start . index ( ) > end . index ( ) ) {
var startOld = start ;
start = end ;
end = startOld ;
}
// select start to end
start . addClass ( "selected" ) ;
start . nextUntil ( end ) . addClass ( "selected" ) ;
end . addClass ( "selected" ) ;
}
else {
// select single item
jQuery ( this ) . siblings ( ".selected" ) . removeClass ( "selected" ) ;
jQuery ( this ) . addClass ( "selected" ) ;
}
} ) ;
list . append ( item ) ;
item _count ++ ;
}
this . itemlist . html ( list ) ;
} ;
et2 _itempicker . _attributes = {
"action" : {
"name" : "Action callback" ,
"type" : "string" ,
"default" : false ,
"description" : "Callback for action. Must be a function(context, data)"
} ,
"action_label" : {
"name" : "Action label" ,
"type" : "string" ,
"default" : "Action" ,
"description" : "Label for action button"
} ,
"application" : {
"name" : "Application" ,
"type" : "string" ,
"default" : "" ,
"description" : "Limit to the listed application or applications (comma separated)"
} ,
"blur" : {
"name" : "Placeholder" ,
"type" : "string" ,
"default" : et2 _no _init ,
"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."
} ,
"value" : {
"name" : "value" ,
"type" : "any" ,
"default" : "" ,
"description" : "Optional itempicker value(s) - can be used for e.g. environmental information"
} ,
"query" : {
"name" : "Query callback" ,
"type" : "any" ,
"default" : false ,
"description" : "Callback before query to server. Must return true, or false to abort query."
}
} ;
2020-03-30 18:28:48 +02:00
et2 _itempicker . legacyOptions = [ "application" ] ;
2020-02-13 11:08:12 +01:00
return et2 _itempicker ;
} ( et2 _core _inputWidget _1 . et2 _inputWidget ) ) ;
et2 _core _widget _1 . et2 _register _widget ( et2 _itempicker , [ "itempicker" ] ) ;
//# sourceMappingURL=et2_widget_itempicker.js.map