163 lines
4.1 KiB
JavaScript
163 lines
4.1 KiB
JavaScript
/**
|
|
* DO NOT EDIT THIS FILE.
|
|
* See the following change record for more information,
|
|
* https://www.drupal.org/node/2815083
|
|
* @preserve
|
|
**/
|
|
|
|
(function ($, Drupal) {
|
|
var autocomplete;
|
|
|
|
function autocompleteSplitValues(value) {
|
|
var result = [];
|
|
var quote = false;
|
|
var current = '';
|
|
var valueLength = value.length;
|
|
var character;
|
|
|
|
for (var i = 0; i < valueLength; i++) {
|
|
character = value.charAt(i);
|
|
|
|
if (character === '"') {
|
|
current += character;
|
|
quote = !quote;
|
|
} else if (character === ',' && !quote) {
|
|
result.push(current.trim());
|
|
current = '';
|
|
} else {
|
|
current += character;
|
|
}
|
|
}
|
|
|
|
if (value.length > 0) {
|
|
result.push(current.trim());
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
function extractLastTerm(terms) {
|
|
return autocomplete.splitValues(terms).pop();
|
|
}
|
|
|
|
function searchHandler(event) {
|
|
var options = autocomplete.options;
|
|
|
|
if (options.isComposing) {
|
|
return false;
|
|
}
|
|
|
|
var term = autocomplete.extractLastTerm(event.target.value);
|
|
|
|
if (term.length > 0 && options.firstCharacterBlacklist.indexOf(term[0]) !== -1) {
|
|
return false;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
var term = autocomplete.extractLastTerm(request.term);
|
|
|
|
function sourceCallbackHandler(data) {
|
|
autocomplete.cache[elementId][term] = data;
|
|
showSuggestions(data);
|
|
}
|
|
|
|
if (autocomplete.cache[elementId].hasOwnProperty(term)) {
|
|
showSuggestions(autocomplete.cache[elementId][term]);
|
|
} else {
|
|
var options = $.extend({
|
|
success: sourceCallbackHandler,
|
|
data: {
|
|
q: term
|
|
}
|
|
}, autocomplete.ajax);
|
|
$.ajax(this.element.attr('data-autocomplete-path'), options);
|
|
}
|
|
}
|
|
|
|
function focusHandler() {
|
|
return false;
|
|
}
|
|
|
|
function selectHandler(event, ui) {
|
|
var terms = autocomplete.splitValues(event.target.value);
|
|
terms.pop();
|
|
terms.push(ui.item.value);
|
|
event.target.value = terms.join(', ');
|
|
return false;
|
|
}
|
|
|
|
function renderItem(ul, item) {
|
|
return $('<li>').append($('<a>').html(item.label)).appendTo(ul);
|
|
}
|
|
|
|
Drupal.behaviors.autocomplete = {
|
|
attach: function attach(context) {
|
|
var $autocomplete = $(once('autocomplete', 'input.form-autocomplete', context));
|
|
|
|
if ($autocomplete.length) {
|
|
var blacklist = $autocomplete.attr('data-autocomplete-first-character-blacklist');
|
|
$.extend(autocomplete.options, {
|
|
firstCharacterBlacklist: blacklist || ''
|
|
});
|
|
$autocomplete.autocomplete(autocomplete.options).each(function () {
|
|
$(this).data('ui-autocomplete')._renderItem = autocomplete.options.renderItem;
|
|
});
|
|
$autocomplete.on('compositionstart.autocomplete', function () {
|
|
autocomplete.options.isComposing = true;
|
|
});
|
|
$autocomplete.on('compositionend.autocomplete', function () {
|
|
autocomplete.options.isComposing = false;
|
|
});
|
|
}
|
|
},
|
|
detach: function detach(context, settings, trigger) {
|
|
if (trigger === 'unload') {
|
|
$(once.remove('autocomplete', 'input.form-autocomplete', context)).autocomplete('destroy');
|
|
}
|
|
}
|
|
};
|
|
autocomplete = {
|
|
cache: {},
|
|
splitValues: autocompleteSplitValues,
|
|
extractLastTerm: extractLastTerm,
|
|
options: {
|
|
source: sourceData,
|
|
focus: focusHandler,
|
|
search: searchHandler,
|
|
select: selectHandler,
|
|
renderItem: renderItem,
|
|
minLength: 1,
|
|
firstCharacterBlacklist: '',
|
|
isComposing: false
|
|
},
|
|
ajax: {
|
|
dataType: 'json',
|
|
jsonp: false
|
|
}
|
|
};
|
|
Drupal.autocomplete = autocomplete;
|
|
})(jQuery, Drupal); |