spletna-stran/web/core/misc/autocomplete.js

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);