annotate core/misc/autocomplete.js @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 /**
Chris@0 2 * DO NOT EDIT THIS FILE.
Chris@0 3 * See the following change record for more information,
Chris@0 4 * https://www.drupal.org/node/2815083
Chris@0 5 * @preserve
Chris@0 6 **/
Chris@0 7
Chris@0 8 (function ($, Drupal) {
Chris@0 9 var autocomplete = void 0;
Chris@0 10
Chris@0 11 function autocompleteSplitValues(value) {
Chris@0 12 var result = [];
Chris@0 13 var quote = false;
Chris@0 14 var current = '';
Chris@0 15 var valueLength = value.length;
Chris@0 16 var character = void 0;
Chris@0 17
Chris@0 18 for (var i = 0; i < valueLength; i++) {
Chris@0 19 character = value.charAt(i);
Chris@0 20 if (character === '"') {
Chris@0 21 current += character;
Chris@0 22 quote = !quote;
Chris@0 23 } else if (character === ',' && !quote) {
Chris@0 24 result.push(current.trim());
Chris@0 25 current = '';
Chris@0 26 } else {
Chris@0 27 current += character;
Chris@0 28 }
Chris@0 29 }
Chris@0 30 if (value.length > 0) {
Chris@0 31 result.push($.trim(current));
Chris@0 32 }
Chris@0 33
Chris@0 34 return result;
Chris@0 35 }
Chris@0 36
Chris@0 37 function extractLastTerm(terms) {
Chris@0 38 return autocomplete.splitValues(terms).pop();
Chris@0 39 }
Chris@0 40
Chris@0 41 function searchHandler(event) {
Chris@0 42 var options = autocomplete.options;
Chris@0 43
Chris@0 44 if (options.isComposing) {
Chris@0 45 return false;
Chris@0 46 }
Chris@0 47
Chris@0 48 var term = autocomplete.extractLastTerm(event.target.value);
Chris@0 49
Chris@0 50 if (term.length > 0 && options.firstCharacterBlacklist.indexOf(term[0]) !== -1) {
Chris@0 51 return false;
Chris@0 52 }
Chris@0 53
Chris@0 54 return term.length >= options.minLength;
Chris@0 55 }
Chris@0 56
Chris@0 57 function sourceData(request, response) {
Chris@0 58 var elementId = this.element.attr('id');
Chris@0 59
Chris@0 60 if (!(elementId in autocomplete.cache)) {
Chris@0 61 autocomplete.cache[elementId] = {};
Chris@0 62 }
Chris@0 63
Chris@0 64 function showSuggestions(suggestions) {
Chris@0 65 var tagged = autocomplete.splitValues(request.term);
Chris@0 66 var il = tagged.length;
Chris@0 67 for (var i = 0; i < il; i++) {
Chris@0 68 var index = suggestions.indexOf(tagged[i]);
Chris@0 69 if (index >= 0) {
Chris@0 70 suggestions.splice(index, 1);
Chris@0 71 }
Chris@0 72 }
Chris@0 73 response(suggestions);
Chris@0 74 }
Chris@0 75
Chris@17 76 var term = autocomplete.extractLastTerm(request.term);
Chris@17 77
Chris@0 78 function sourceCallbackHandler(data) {
Chris@0 79 autocomplete.cache[elementId][term] = data;
Chris@0 80
Chris@0 81 showSuggestions(data);
Chris@0 82 }
Chris@0 83
Chris@0 84 if (autocomplete.cache[elementId].hasOwnProperty(term)) {
Chris@0 85 showSuggestions(autocomplete.cache[elementId][term]);
Chris@0 86 } else {
Chris@0 87 var options = $.extend({ success: sourceCallbackHandler, data: { q: term } }, autocomplete.ajax);
Chris@0 88 $.ajax(this.element.attr('data-autocomplete-path'), options);
Chris@0 89 }
Chris@0 90 }
Chris@0 91
Chris@0 92 function focusHandler() {
Chris@0 93 return false;
Chris@0 94 }
Chris@0 95
Chris@0 96 function selectHandler(event, ui) {
Chris@0 97 var terms = autocomplete.splitValues(event.target.value);
Chris@0 98
Chris@0 99 terms.pop();
Chris@0 100
Chris@0 101 terms.push(ui.item.value);
Chris@0 102
Chris@0 103 event.target.value = terms.join(', ');
Chris@0 104
Chris@0 105 return false;
Chris@0 106 }
Chris@0 107
Chris@0 108 function renderItem(ul, item) {
Chris@0 109 return $('<li>').append($('<a>').html(item.label)).appendTo(ul);
Chris@0 110 }
Chris@0 111
Chris@0 112 Drupal.behaviors.autocomplete = {
Chris@0 113 attach: function attach(context) {
Chris@0 114 var $autocomplete = $(context).find('input.form-autocomplete').once('autocomplete');
Chris@0 115 if ($autocomplete.length) {
Chris@0 116 var blacklist = $autocomplete.attr('data-autocomplete-first-character-blacklist');
Chris@0 117 $.extend(autocomplete.options, {
Chris@0 118 firstCharacterBlacklist: blacklist || ''
Chris@0 119 });
Chris@0 120
Chris@0 121 $autocomplete.autocomplete(autocomplete.options).each(function () {
Chris@0 122 $(this).data('ui-autocomplete')._renderItem = autocomplete.options.renderItem;
Chris@0 123 });
Chris@0 124
Chris@0 125 $autocomplete.on('compositionstart.autocomplete', function () {
Chris@0 126 autocomplete.options.isComposing = true;
Chris@0 127 });
Chris@0 128 $autocomplete.on('compositionend.autocomplete', function () {
Chris@0 129 autocomplete.options.isComposing = false;
Chris@0 130 });
Chris@0 131 }
Chris@0 132 },
Chris@0 133 detach: function detach(context, settings, trigger) {
Chris@0 134 if (trigger === 'unload') {
Chris@0 135 $(context).find('input.form-autocomplete').removeOnce('autocomplete').autocomplete('destroy');
Chris@0 136 }
Chris@0 137 }
Chris@0 138 };
Chris@0 139
Chris@0 140 autocomplete = {
Chris@0 141 cache: {},
Chris@0 142
Chris@0 143 splitValues: autocompleteSplitValues,
Chris@0 144 extractLastTerm: extractLastTerm,
Chris@0 145
Chris@0 146 options: {
Chris@0 147 source: sourceData,
Chris@0 148 focus: focusHandler,
Chris@0 149 search: searchHandler,
Chris@0 150 select: selectHandler,
Chris@0 151 renderItem: renderItem,
Chris@0 152 minLength: 1,
Chris@0 153
Chris@0 154 firstCharacterBlacklist: '',
Chris@0 155
Chris@0 156 isComposing: false
Chris@0 157 },
Chris@0 158 ajax: {
Chris@0 159 dataType: 'json'
Chris@0 160 }
Chris@0 161 };
Chris@0 162
Chris@0 163 Drupal.autocomplete = autocomplete;
Chris@0 164 })(jQuery, Drupal);