Mercurial > hg > cmmr2012-drupal-site
diff core/misc/autocomplete.js @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | a9cd425dd02b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/misc/autocomplete.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,164 @@ +/** +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ + +(function ($, Drupal) { + var autocomplete = void 0; + + function autocompleteSplitValues(value) { + var result = []; + var quote = false; + var current = ''; + var valueLength = value.length; + var character = void 0; + + 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($.trim(current)); + } + + 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); + } + + function sourceCallbackHandler(data) { + autocomplete.cache[elementId][term] = data; + + showSuggestions(data); + } + + var term = autocomplete.extractLastTerm(request.term); + + 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 = $(context).find('input.form-autocomplete').once('autocomplete'); + 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') { + $(context).find('input.form-autocomplete').removeOnce('autocomplete').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' + } + }; + + Drupal.autocomplete = autocomplete; +})(jQuery, Drupal); \ No newline at end of file