2015-08-17 17:00:26 -07:00
/ * *
2018-11-23 12:29:20 +00:00
* DO NOT EDIT THIS FILE .
* See the following change record for more information ,
* https : //www.drupal.org/node/2815083
* @ preserve
* * /
2015-08-17 17:00:26 -07:00
( function ( $ , Drupal ) {
2018-11-23 12:29:20 +00:00
var autocomplete = void 0 ;
2015-08-17 17:00:26 -07:00
function autocompleteSplitValues ( value ) {
var result = [ ] ;
var quote = false ;
var current = '' ;
var valueLength = value . length ;
2018-11-23 12:29:20 +00:00
var character = void 0 ;
2015-08-17 17:00:26 -07:00
for ( var i = 0 ; i < valueLength ; i ++ ) {
character = value . charAt ( i ) ;
if ( character === '"' ) {
current += character ;
quote = ! quote ;
2018-11-23 12:29:20 +00:00
} else if ( character === ',' && ! quote ) {
2015-08-17 17:00:26 -07:00
result . push ( current . trim ( ) ) ;
current = '' ;
2018-11-23 12:29:20 +00:00
} else {
2015-08-17 17:00:26 -07:00
current += character ;
}
}
if ( value . length > 0 ) {
result . push ( $ . trim ( current ) ) ;
}
return result ;
}
function extractLastTerm ( terms ) {
return autocomplete . splitValues ( terms ) . pop ( ) ;
}
function searchHandler ( event ) {
var options = autocomplete . options ;
2016-12-07 12:19:38 -08:00
if ( options . isComposing ) {
return false ;
}
2015-08-17 17:00:26 -07:00
var term = autocomplete . extractLastTerm ( event . target . value ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
if ( term . length > 0 && options . firstCharacterBlacklist . indexOf ( term [ 0 ] ) !== - 1 ) {
return false ;
}
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
return term . length >= options . minLength ;
}
function sourceData ( request , response ) {
var elementId = this . element . attr ( 'id' ) ;
if ( ! ( elementId in autocomplete . cache ) ) {
autocomplete . cache [ elementId ] = { } ;
}
function showSuggestions ( suggestions ) {
var tagged = autocomplete . splitValues ( request . term ) ;
var il = tagged . length ;
for ( var i = 0 ; i < il ; i ++ ) {
var index = suggestions . indexOf ( tagged [ i ] ) ;
if ( index >= 0 ) {
suggestions . splice ( index , 1 ) ;
}
}
response ( suggestions ) ;
}
2018-11-23 12:29:20 +00:00
var term = autocomplete . extractLastTerm ( request . term ) ;
2015-08-17 17:00:26 -07:00
function sourceCallbackHandler ( data ) {
autocomplete . cache [ elementId ] [ term ] = data ;
showSuggestions ( data ) ;
}
if ( autocomplete . cache [ elementId ] . hasOwnProperty ( term ) ) {
showSuggestions ( autocomplete . cache [ elementId ] [ term ] ) ;
2018-11-23 12:29:20 +00:00
} else {
var options = $ . extend ( { success : sourceCallbackHandler , data : { q : term } } , autocomplete . ajax ) ;
2015-08-17 17:00:26 -07:00
$ . ajax ( this . element . attr ( 'data-autocomplete-path' ) , options ) ;
}
}
function focusHandler ( ) {
return false ;
}
function selectHandler ( event , ui ) {
var terms = autocomplete . splitValues ( event . target . value ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
terms . pop ( ) ;
2018-11-23 12:29:20 +00:00
2017-07-03 16:47:07 +01:00
terms . push ( ui . item . value ) ;
2015-08-17 17:00:26 -07:00
event . target . value = terms . join ( ', ' ) ;
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
return false ;
}
function renderItem ( ul , item ) {
2018-11-23 12:29:20 +00:00
return $ ( '<li>' ) . append ( $ ( '<a>' ) . html ( item . label ) ) . appendTo ( ul ) ;
2015-08-17 17:00:26 -07:00
}
Drupal . behaviors . autocomplete = {
2018-11-23 12:29:20 +00:00
attach : function attach ( context ) {
2015-08-17 17:00:26 -07:00
var $autocomplete = $ ( context ) . find ( 'input.form-autocomplete' ) . once ( 'autocomplete' ) ;
if ( $autocomplete . length ) {
var blacklist = $autocomplete . attr ( 'data-autocomplete-first-character-blacklist' ) ;
$ . extend ( autocomplete . options , {
2018-11-23 12:29:20 +00:00
firstCharacterBlacklist : blacklist || ''
} ) ;
$autocomplete . autocomplete ( autocomplete . options ) . each ( function ( ) {
$ ( this ) . data ( 'ui-autocomplete' ) . _renderItem = autocomplete . options . renderItem ;
2015-08-17 17:00:26 -07:00
} ) ;
2016-12-07 12:19:38 -08:00
$autocomplete . on ( 'compositionstart.autocomplete' , function ( ) {
autocomplete . options . isComposing = true ;
} ) ;
$autocomplete . on ( 'compositionend.autocomplete' , function ( ) {
autocomplete . options . isComposing = false ;
} ) ;
2015-08-17 17:00:26 -07:00
}
} ,
2018-11-23 12:29:20 +00:00
detach : function detach ( context , settings , trigger ) {
2015-08-17 17:00:26 -07:00
if ( trigger === 'unload' ) {
2018-11-23 12:29:20 +00:00
$ ( context ) . find ( 'input.form-autocomplete' ) . removeOnce ( 'autocomplete' ) . autocomplete ( 'destroy' ) ;
2015-08-17 17:00:26 -07:00
}
}
} ;
autocomplete = {
cache : { } ,
2018-11-23 12:29:20 +00:00
2015-08-17 17:00:26 -07:00
splitValues : autocompleteSplitValues ,
extractLastTerm : extractLastTerm ,
options : {
source : sourceData ,
focus : focusHandler ,
search : searchHandler ,
select : selectHandler ,
renderItem : renderItem ,
minLength : 1 ,
2018-11-23 12:29:20 +00:00
2016-12-07 12:19:38 -08:00
firstCharacterBlacklist : '' ,
2018-11-23 12:29:20 +00:00
2016-12-07 12:19:38 -08:00
isComposing : false
2015-08-17 17:00:26 -07:00
} ,
ajax : {
dataType : 'json'
}
} ;
Drupal . autocomplete = autocomplete ;
2018-11-23 12:29:20 +00:00
} ) ( jQuery , Drupal ) ;