MDL-68167 lib: autocomplete focos should not be removed on blur
[moodle.git] / lib / amd / build / form-autocomplete.min.js.map
CommitLineData
0438cd60 1{"version":3,"sources":["../src/form-autocomplete.js"],"names":["define","$","log","str","templates","notification","LoadingIcon","Aria","KEYS","DOWN","ENTER","SPACE","ESCAPE","COMMA","UP","LEFT","RIGHT","uniqueId","Date","now","activateSelection","index","state","selectionElement","document","getElementById","selectionId","length","children","element","get","itemId","attr","Deferred","resolve","updateSelectionList","options","originalSelect","pendingKey","inputId","M","util","js_pending","items","newSelection","activeId","activeValue","each","ele","prop","label","data","html","push","value","context","extend","render","then","js","replaceNodeContents","js_complete","catch","exception","notifyChange","core_formchangechecker","set_form_changed","dispatchEvent","Event","deselectItem","item","selectedItemValue","remove","activateItem","inputElement","suggestionsElement","suggestionsId","globalIndex","scrollPos","offset","top","scrollTop","height","animate","promise","activateNextItem","current","activatePreviousSelection","selectionsElement","activateNextSelection","activatePreviousItem","closeSuggestions","hide","updateSuggestions","query","matchingElements","suggestions","option","innerHTML","searchquery","caseSensitive","toLocaleLowerCase","returnVal","replaceNode","unhide","show","node","text","indexOf","tags","get_string","done","nosuggestionsstr","createItem","val","split","found","tagindex","tag","trim","multiple","append","createTextNode","selectCurrentItem","closeSuggestionsOnSelect","focus","updateAjax","e","ajaxHandler","pendingPromise","addPendingJSPromise","parentElement","selectId","parent","addIconToContainerRemoveOnCompletion","currentTarget","transport","selector","results","processedResults","processResults","existingValues","optionIndex","isArray","resultIndex","result","error","reject","addNavigation","on","pendingJsPromise","keyCode","showSuggestions","ajax","require","preventDefault","closest","window","setTimeout","focusElement","activeElement","timeoutPromise","is","arrowElement","downArrowId","off","selectedItem","throttleTimeout","inProgress","handler","arguments","throttledHandler","clearTimeout","bind","last","key","enhance","placeholder","noSelectionString","templateOverrides","input","layout","selection","fail","debug","css","prepend","originalLabel","collectedjs","renderLayout","renderInput","renderDatalist","renderSelection","when","container","find","replaceWith","runTemplateJS"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Autocomplete wrapper for select2 library.\n *\n * @module core/form-autocomplete\n * @class autocomplete\n * @package core\n * @copyright 2015 Damyon Wiese <damyon@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 3.0\n */\n/* globals require: false */\ndefine(\n ['jquery', 'core/log', 'core/str', 'core/templates', 'core/notification', 'core/loadingicon', 'core/aria'],\nfunction($, log, str, templates, notification, LoadingIcon, Aria) {\n\n // Private functions and variables.\n /** @var {Object} KEYS - List of keycode constants. */\n var KEYS = {\n DOWN: 40,\n ENTER: 13,\n SPACE: 32,\n ESCAPE: 27,\n COMMA: 44,\n UP: 38,\n LEFT: 37,\n RIGHT: 39\n };\n\n var uniqueId = Date.now();\n\n /**\n * Make an item in the selection list \"active\".\n *\n * @method activateSelection\n * @private\n * @param {Number} index The index in the current (visible) list of selection.\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activateSelection = function(index, state) {\n // Find the elements in the DOM.\n var selectionElement = $(document.getElementById(state.selectionId));\n\n // Count the visible items.\n var length = selectionElement.children('[aria-selected=true]').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(selectionElement.children('[aria-selected=true]').get(index));\n // Create an id we can assign to this element.\n var itemId = state.selectionId + '-' + index;\n\n // Deselect all the selections.\n selectionElement.children().attr('data-active-selection', false).attr('id', '');\n // Select only this suggestion and assign it the id.\n element.attr('data-active-selection', true).attr('id', itemId);\n // Tell the input field it has a new active descendant so the item is announced.\n selectionElement.attr('aria-activedescendant', itemId);\n\n return $.Deferred().resolve();\n };\n\n /**\n * Update the element that shows the currently selected items.\n *\n * @method updateSelectionList\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSelectionList = function(options, state, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSelectionList-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Build up a valid context to re-render the template.\n var items = [];\n var newSelection = $(document.getElementById(state.selectionId));\n var activeId = newSelection.attr('aria-activedescendant');\n var activeValue = false;\n\n if (activeId) {\n activeValue = $(document.getElementById(activeId)).attr('data-value');\n }\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).prop('selected')) {\n var label;\n if ($(ele).data('html')) {\n label = $(ele).data('html');\n } else {\n label = $(ele).html();\n }\n if (label !== '') {\n items.push({label: label, value: $(ele).attr('value')});\n }\n }\n });\n var context = $.extend({items: items}, options, state);\n // Render the template.\n return templates.render(options.templates.items, context)\n .then(function(html, js) {\n // Add it to the page.\n templates.replaceNodeContents(newSelection, html, js);\n\n if (activeValue !== false) {\n // Reselect any previously selected item.\n newSelection.children('[aria-selected=true]').each(function(index, ele) {\n if ($(ele).attr('data-value') === activeValue) {\n activateSelection(index, state);\n }\n });\n }\n\n return activeValue;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n };\n\n /**\n * Notify of a change in the selection.\n *\n * @param {jQuery} originalSelect The jQuery object matching the hidden select list.\n */\n var notifyChange = function(originalSelect) {\n if (typeof M.core_formchangechecker !== 'undefined') {\n M.core_formchangechecker.set_form_changed();\n }\n\n // Note, jQuery .change() was not working here. Better to\n // use plain JavaScript anyway.\n originalSelect[0].dispatchEvent(new Event('change'));\n };\n\n /**\n * Remove the given item from the list of selected things.\n *\n * @method deselectItem\n * @private\n * @param {Object} options Original options for this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {Element} item The item to be deselected.\n * @param {Element} originalSelect The original select list.\n * @return {Promise}\n */\n var deselectItem = function(options, state, item, originalSelect) {\n var selectedItemValue = $(item).attr('data-value');\n\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', false);\n // We remove newly created custom tags from the suggestions list when they are deselected.\n if ($(ele).attr('data-iscustom')) {\n $(ele).remove();\n }\n }\n });\n // Rerender the selection list.\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n });\n };\n\n /**\n * Make an item in the suggestions \"active\" (about to be selected).\n *\n * @method activateItem\n * @private\n * @param {Number} index The index in the current (visible) list of suggestions.\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateItem = function(index, state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Count the visible items.\n var length = suggestionsElement.children(':not([aria-hidden])').length;\n // Limit the index to the upper/lower bounds of the list (wrap in both directions).\n index = index % length;\n while (index < 0) {\n index += length;\n }\n // Find the specified element.\n var element = $(suggestionsElement.children(':not([aria-hidden])').get(index));\n // Find the index of this item in the full list of suggestions (including hidden).\n var globalIndex = $(suggestionsElement.children('[role=option]')).index(element);\n // Create an id we can assign to this element.\n var itemId = state.suggestionsId + '-' + globalIndex;\n\n // Deselect all the suggestions.\n suggestionsElement.children().attr('aria-selected', false).attr('id', '');\n // Select only this suggestion and assign it the id.\n element.attr('aria-selected', true).attr('id', itemId);\n // Tell the input field it has a new active descendant so the item is announced.\n inputElement.attr('aria-activedescendant', itemId);\n\n // Scroll it into view.\n var scrollPos = element.offset().top\n - suggestionsElement.offset().top\n + suggestionsElement.scrollTop()\n - (suggestionsElement.height() / 2);\n return suggestionsElement.animate({\n scrollTop: scrollPos\n }, 100).promise();\n };\n\n /**\n * Find the index of the current active suggestion, and activate the next one.\n *\n * @method activateNextItem\n * @private\n * @param {Object} state State variable for this auto complete element.\n * @return {Promise}\n */\n var activateNextItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n // Activate the next one.\n return activateItem(current + 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the previous one.\n *\n * @method activatePreviousSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activatePreviousSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection=true]');\n if (!element) {\n return activateSelection(0, state);\n }\n // Find it's index.\n var current = selectionsElement.children('[aria-selected=true]').index(element);\n // Activate the next one.\n return activateSelection(current - 1, state);\n };\n\n /**\n * Find the index of the current active selection, and activate the next one.\n *\n * @method activateNextSelection\n * @private\n * @param {Object} state State variables for this instance of autocomplete.\n * @return {Promise}\n */\n var activateNextSelection = function(state) {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection=true]');\n var current = 0;\n\n if (element) {\n // The element was found. Determine the index and move to the next one.\n current = selectionsElement.children('[aria-selected=true]').index(element);\n current = current + 1;\n } else {\n // No selected item found. Move to the first.\n current = 0;\n }\n\n return activateSelection(current, state);\n };\n\n /**\n * Find the index of the current active suggestion, and activate the previous one.\n *\n * @method activatePreviousItem\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var activatePreviousItem = function(state) {\n // Find the list of suggestions.\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Find the active one.\n var element = suggestionsElement.children('[aria-selected=true]');\n\n // Find it's index.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate the previous one.\n return activateItem(current - 1, state);\n };\n\n /**\n * Close the list of suggestions.\n *\n * @method closeSuggestions\n * @private\n * @param {Object} state State variables for this autocomplete element.\n * @return {Promise}\n */\n var closeSuggestions = function(state) {\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n if (inputElement.attr('aria-expanded') === \"true\") {\n // Announce the list of suggestions was closed.\n inputElement.attr('aria-expanded', false);\n }\n // Read the current list of selections.\n inputElement.attr('aria-activedescendant', state.selectionId);\n\n // Hide the suggestions list (from screen readers too).\n Aria.hide(suggestionsElement.get());\n suggestionsElement.hide();\n\n return $.Deferred().resolve();\n };\n\n /**\n * Rebuild the list of suggestions based on the current values in the select list, and the query.\n *\n * @method updateSuggestions\n * @private\n * @param {Object} options The original options for this autocomplete.\n * @param {Object} state The state variables for this autocomplete.\n * @param {String} query The current text for the search string.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var updateSuggestions = function(options, state, query, originalSelect) {\n var pendingKey = 'form-autocomplete-updateSuggestions-' + state.inputId;\n M.util.js_pending(pendingKey);\n\n // Find the elements in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Used to track if we found any visible suggestions.\n var matchingElements = false;\n // Options is used by the context when rendering the suggestions from a template.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n if ($(option).prop('selected') !== true) {\n suggestions[suggestions.length] = {label: option.innerHTML, value: $(option).attr('value')};\n }\n });\n\n // Re-render the list of suggestions.\n var searchquery = state.caseSensitive ? query : query.toLocaleLowerCase();\n var context = $.extend({options: suggestions}, options, state);\n var returnVal = templates.render(\n 'core/form_autocomplete_suggestions',\n context\n )\n .then(function(html, js) {\n // We have the new template, insert it in the page.\n templates.replaceNode(suggestionsElement, html, js);\n\n // Get the element again.\n suggestionsElement = $(document.getElementById(state.suggestionsId));\n\n // Show it if it is hidden.\n Aria.unhide(suggestionsElement.get());\n suggestionsElement.show();\n\n // For each option in the list, hide it if it doesn't match the query.\n suggestionsElement.children().each(function(index, node) {\n node = $(node);\n if ((options.caseSensitive && node.text().indexOf(searchquery) > -1) ||\n (!options.caseSensitive && node.text().toLocaleLowerCase().indexOf(searchquery) > -1)) {\n Aria.unhide(node.get());\n node.show();\n matchingElements = true;\n } else {\n node.hide();\n Aria.hide(node.get());\n }\n });\n // If we found any matches, show the list.\n inputElement.attr('aria-expanded', true);\n if (originalSelect.attr('data-notice')) {\n // Display a notice rather than actual suggestions.\n suggestionsElement.html(originalSelect.attr('data-notice'));\n } else if (matchingElements) {\n // We only activate the first item in the list if tags is false,\n // because otherwise \"Enter\" would select the first item, instead of\n // creating a new tag.\n if (!options.tags) {\n activateItem(0, state);\n }\n } else {\n // Nothing matches. Tell them that.\n str.get_string('nosuggestions', 'form').done(function(nosuggestionsstr) {\n suggestionsElement.html(nosuggestionsstr);\n });\n }\n\n return suggestionsElement;\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(notification.exception);\n\n return returnVal;\n };\n\n /**\n * Create a new item for the list (a tag).\n *\n * @method createItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var createItem = function(options, state, originalSelect) {\n // Find the element in the DOM.\n var inputElement = $(document.getElementById(state.inputId));\n // Get the current text in the input field.\n var query = inputElement.val();\n var tags = query.split(',');\n var found = false;\n\n $.each(tags, function(tagindex, tag) {\n // If we can only select one at a time, deselect any current value.\n tag = tag.trim();\n if (tag !== '') {\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for an existing option in the select list that matches this new tag.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == tag) {\n found = true;\n $(ele).prop('selected', true);\n }\n });\n // Only create the item if it's new.\n if (!found) {\n var option = $('<option>');\n option.append(document.createTextNode(tag));\n option.attr('value', tag);\n originalSelect.append(option);\n option.prop('selected', true);\n // We mark newly created custom options as we handle them differently if they are \"deselected\".\n option.attr('data-iscustom', true);\n }\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n // Clear the input field.\n inputElement.val('');\n\n return;\n })\n .then(function() {\n // Close the suggestions list.\n return closeSuggestions(state);\n });\n };\n\n /**\n * Select the currently active item from the suggestions list.\n *\n * @method selectCurrentItem\n * @private\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state State variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @return {Promise}\n */\n var selectCurrentItem = function(options, state, originalSelect) {\n // Find the elements in the page.\n var inputElement = $(document.getElementById(state.inputId));\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Here loop through suggestions and set val to join of all selected items.\n\n var selectedItemValue = suggestionsElement.children('[aria-selected=true]').attr('data-value');\n // The select will either be a single or multi select, so the following will either\n // select one or more items correctly.\n // Take care to use 'prop' and not 'attr' for selected properties.\n // If only one can be selected at a time, start by deselecting everything.\n if (!options.multiple) {\n originalSelect.children('option').prop('selected', false);\n }\n // Look for a match, and toggle the selected property if there is a match.\n originalSelect.children('option').each(function(index, ele) {\n if ($(ele).attr('value') == selectedItemValue) {\n $(ele).prop('selected', true);\n }\n });\n\n return updateSelectionList(options, state, originalSelect)\n .then(function() {\n // Notify that the selection changed.\n notifyChange(originalSelect);\n\n return;\n })\n .then(function() {\n if (options.closeSuggestionsOnSelect) {\n // Clear the input element.\n inputElement.val('');\n // Close the list of suggestions.\n return closeSuggestions(state);\n } else {\n // Focus on the input element so the suggestions does not auto-close.\n inputElement.focus();\n // Remove the last selected item from the suggestions list.\n return updateSuggestions(options, state, inputElement.val(), originalSelect);\n }\n });\n };\n\n /**\n * Fetch a new list of options via ajax.\n *\n * @method updateAjax\n * @private\n * @param {Event} e The event that triggered this update.\n * @param {Object} options The original options for the autocomplete.\n * @param {Object} state The state variables for the autocomplete.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n * @param {Object} ajaxHandler This is a module that does the ajax fetch and translates the results.\n * @return {Promise}\n */\n var updateAjax = function(e, options, state, originalSelect, ajaxHandler) {\n var pendingPromise = addPendingJSPromise('updateAjax');\n // We need to show the indicator outside of the hidden select list.\n // So we get the parent id of the hidden select list.\n var parentElement = $(document.getElementById(state.selectId)).parent();\n LoadingIcon.addIconToContainerRemoveOnCompletion(parentElement, pendingPromise);\n\n // Get the query to pass to the ajax function.\n var query = $(e.currentTarget).val();\n // Call the transport function to do the ajax (name taken from Select2).\n ajaxHandler.transport(options.selector, query, function(results) {\n // We got a result - pass it through the translator before using it.\n var processedResults = ajaxHandler.processResults(options.selector, results);\n var existingValues = [];\n\n // Now destroy all options that are not currently selected.\n if (!options.multiple) {\n originalSelect.children('option').remove();\n }\n originalSelect.children('option').each(function(optionIndex, option) {\n option = $(option);\n if (!option.prop('selected')) {\n option.remove();\n } else {\n existingValues.push(String(option.attr('value')));\n }\n });\n\n if (!options.multiple && originalSelect.children('option').length === 0) {\n // If this is a single select - and there are no current options\n // the first option added will be selected by the browser. This causes a bug!\n // We need to insert an empty option so that none of the real options are selected.\n var option = $('<option>');\n originalSelect.append(option);\n }\n if ($.isArray(processedResults)) {\n // Add all the new ones returned from ajax.\n $.each(processedResults, function(resultIndex, result) {\n if (existingValues.indexOf(String(result.value)) === -1) {\n var option = $('<option>');\n option.append(result.label);\n option.attr('value', result.value);\n originalSelect.append(option);\n }\n });\n originalSelect.attr('data-notice', '');\n } else {\n // The AJAX handler returned a string instead of the array.\n originalSelect.attr('data-notice', processedResults);\n }\n // Update the list of suggestions now from the new values in the select list.\n pendingPromise.resolve(updateSuggestions(options, state, '', originalSelect));\n }, function(error) {\n pendingPromise.reject(error);\n });\n\n return pendingPromise;\n };\n\n /**\n * Add all the event listeners required for keyboard nav, blur clicks etc.\n *\n * @method addNavigation\n * @private\n * @param {Object} options The options used to create this autocomplete element.\n * @param {Object} state State variables for this autocomplete element.\n * @param {JQuery} originalSelect The JQuery object matching the hidden select list.\n */\n var addNavigation = function(options, state, originalSelect) {\n // Start with the input element.\n var inputElement = $(document.getElementById(state.inputId));\n // Add keyboard nav with keydown.\n inputElement.on('keydown', function(e) {\n var pendingJsPromise = addPendingJSPromise('addNavigation-' + state.inputId + '-' + e.keyCode);\n\n switch (e.keyCode) {\n case KEYS.DOWN:\n // If the suggestion list is open, move to the next item.\n if (!options.showSuggestions) {\n // Do not consume this event.\n pendingJsPromise.resolve();\n return true;\n } else if (inputElement.attr('aria-expanded') === \"true\") {\n pendingJsPromise.resolve(activateNextItem(state));\n } else {\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingJsPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Open the suggestions list.\n pendingJsPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.UP:\n // Choose the previous active item.\n pendingJsPromise.resolve(activatePreviousItem(state));\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ENTER:\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n if ((inputElement.attr('aria-expanded') === \"true\") &&\n (suggestionsElement.children('[aria-selected=true]').length > 0)) {\n // If the suggestion list has an active item, select it.\n pendingJsPromise.resolve(selectCurrentItem(options, state, originalSelect));\n } else if (options.tags) {\n // If tags are enabled, create a tag.\n pendingJsPromise.resolve(createItem(options, state, originalSelect));\n } else {\n pendingJsPromise.resolve();\n }\n\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n case KEYS.ESCAPE:\n if (inputElement.attr('aria-expanded') === \"true\") {\n // If the suggestion list is open, close it.\n pendingJsPromise.resolve(closeSuggestions(state));\n } else {\n pendingJsPromise.resolve();\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n pendingJsPromise.resolve();\n return true;\n });\n // Support multi lingual COMMA keycode (44).\n inputElement.on('keypress', function(e) {\n\n if (e.keyCode === KEYS.COMMA) {\n if (options.tags) {\n // If we are allowing tags, comma should create a tag (or enter).\n addPendingJSPromise('keypress-' + e.keyCode)\n .resolve(createItem(options, state, originalSelect));\n }\n // We handled this event, so prevent it.\n e.preventDefault();\n return false;\n }\n return true;\n });\n // Support submitting the form without leaving the autocomplete element,\n // or submitting too quick before the blur handler action is completed.\n inputElement.closest('form').on('submit', function() {\n if (options.tags) {\n // If tags are enabled, create a tag.\n addPendingJSPromise('form-autocomplete-submit')\n .resolve(createItem(options, state, originalSelect));\n }\n\n return true;\n });\n inputElement.on('blur', function() {\n var pendingPromise = addPendingJSPromise('form-autocomplete-blur');\n window.setTimeout(function() {\n // Get the current element with focus.\n var focusElement = $(document.activeElement);\n var timeoutPromise = $.Deferred();\n\n // Only close the menu if the input hasn't regained focus and if the element still exists,\n // and regain focus if the scrollbar is clicked.\n // Due to the half a second delay, it is possible that the input element no longer exist\n // by the time this code is being executed.\n if (focusElement.is(document.getElementById(state.suggestionsId))) {\n inputElement.focus(); // Probably the scrollbar is clicked. Regain focus.\n } else if (!focusElement.is(inputElement) && $(document.getElementById(state.inputId)).length) {\n if (options.tags) {\n timeoutPromise.then(function() {\n return createItem(options, state, originalSelect);\n })\n .catch();\n }\n timeoutPromise.then(function() {\n return closeSuggestions(state);\n })\n .catch();\n }\n\n timeoutPromise.then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n timeoutPromise.resolve();\n }, 500);\n });\n if (options.showSuggestions) {\n var arrowElement = $(document.getElementById(state.downArrowId));\n arrowElement.on('click', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-show-suggestions');\n\n // Prevent the close timer, or we will open, then close the suggestions.\n inputElement.focus();\n\n // Handle ajax population of suggestions.\n if (!inputElement.val() && options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n pendingPromise.resolve(updateAjax(e, options, state, originalSelect, ajaxHandler));\n });\n } else {\n // Else - open the suggestions list.\n pendingPromise.resolve(updateSuggestions(options, state, inputElement.val(), originalSelect));\n }\n });\n }\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Remove any click handler first.\n suggestionsElement.parent().prop(\"onclick\", null).off(\"click\");\n suggestionsElement.parent().on('click', `#${state.suggestionsId} [role=option]`, function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-parent');\n // Handle clicks on suggestions.\n var element = $(e.currentTarget).closest('[role=option]');\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Find the index of the clicked on suggestion.\n var current = suggestionsElement.children(':not([aria-hidden])').index(element);\n\n // Activate it.\n activateItem(current, state)\n .then(function() {\n // And select it.\n return selectCurrentItem(options, state, originalSelect);\n })\n .then(function() {\n return pendingPromise.resolve();\n })\n .catch();\n });\n var selectionElement = $(document.getElementById(state.selectionId));\n // Handle clicks on the selected items (will unselect an item).\n selectionElement.on('click', '[role=option]', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-clicks');\n\n // Remove it from the selection.\n pendingPromise.resolve(deselectItem(options, state, $(e.currentTarget), originalSelect));\n });\n // When listbox is focused, focus on the first option if there is no focused option.\n selectionElement.on('focus', function() {\n // Find the list of selections.\n var selectionsElement = $(document.getElementById(state.selectionId));\n // Find the active one.\n var element = selectionsElement.children('[data-active-selection=true]');\n if (!element.length) {\n return activateSelection(0, state);\n }\n });\n // Keyboard navigation for the selection list.\n selectionElement.on('keydown', function(e) {\n var pendingPromise = addPendingJSPromise('form-autocomplete-keydown-' + e.keyCode);\n switch (e.keyCode) {\n case KEYS.RIGHT:\n case KEYS.DOWN:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the next selection item.\n pendingPromise.resolve(activateNextSelection(state));\n return false;\n case KEYS.LEFT:\n case KEYS.UP:\n // We handled this event, so prevent it.\n e.preventDefault();\n\n // Choose the previous selection item.\n pendingPromise.resolve(activatePreviousSelection(state));\n return false;\n case KEYS.SPACE:\n case KEYS.ENTER:\n // Get the item that is currently selected.\n var selectedItem = $(document.getElementById(state.selectionId)).children('[data-active-selection=true]');\n if (selectedItem) {\n e.preventDefault();\n\n // Unselect this item.\n pendingPromise.resolve(deselectItem(options, state, selectedItem, originalSelect));\n }\n return false;\n }\n\n // Not handled. Resolve the promise.\n pendingPromise.resolve();\n return true;\n });\n // Whenever the input field changes, update the suggestion list.\n if (options.showSuggestions) {\n // Store the value of the field as its last value, when the field gains focus.\n inputElement.on('focus', function(e) {\n var query = $(e.currentTarget).val();\n $(e.currentTarget).data('last-value', query);\n });\n\n // If this field uses ajax, set it up.\n if (options.ajax) {\n require([options.ajax], function(ajaxHandler) {\n // Creating throttled handlers free of race conditions, and accurate.\n // This code keeps track of a throttleTimeout, which is periodically polled.\n // Once the throttled function is executed, the fact that it is running is noted.\n // If a subsequent request comes in whilst it is running, this request is re-applied.\n var throttleTimeout = null;\n var inProgress = false;\n var pendingKey = 'autocomplete-throttledhandler';\n var handler = function(e) {\n // Empty the current timeout.\n throttleTimeout = null;\n\n // Mark this request as in-progress.\n inProgress = true;\n\n // Process the request.\n updateAjax(e, options, state, originalSelect, ajaxHandler)\n .then(function() {\n // Check if the throttleTimeout is still empty.\n // There's a potential condition whereby the JS request takes long enough to complete that\n // another task has been queued.\n // In this case another task will be kicked off and we must wait for that before marking htis as\n // complete.\n if (null === throttleTimeout) {\n // Mark this task as complete.\n M.util.js_complete(pendingKey);\n }\n inProgress = false;\n\n return arguments[0];\n })\n .catch(notification.exception);\n };\n\n // For input events, we do not want to trigger many, many updates.\n var throttledHandler = function(e) {\n window.clearTimeout(throttleTimeout);\n if (inProgress) {\n // A request is currently ongoing.\n // Delay this request another 100ms.\n throttleTimeout = window.setTimeout(throttledHandler.bind(this, e), 100);\n return;\n }\n\n if (throttleTimeout === null) {\n // There is currently no existing timeout handler, and it has not been recently cleared, so\n // this is the start of a throttling check.\n M.util.js_pending(pendingKey);\n }\n\n // There is currently no existing timeout handler, and it has not been recently cleared, so this\n // is the start of a throttling check.\n // Queue a call to the handler.\n throttleTimeout = window.setTimeout(handler.bind(this, e), 300);\n };\n\n // Trigger an ajax update after the text field value changes.\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n if (last !== query) {\n throttledHandler(e);\n }\n $(e.currentTarget).data('last-value', query);\n });\n });\n } else {\n inputElement.on('input', function(e) {\n var query = $(e.currentTarget).val();\n var last = $(e.currentTarget).data('last-value');\n // IE11 fires many more input events than required - even when the value has not changed.\n // We need to only do this for real value changed events or the suggestions will be\n // unclickable on IE11 (because they will be rebuilt before the click event fires).\n // Note - because of this we cannot close the list when the query is empty or it will break\n // on IE11.\n if (last !== query) {\n updateSuggestions(options, state, query, originalSelect);\n }\n $(e.currentTarget).data('last-value', query);\n });\n }\n }\n };\n\n /**\n * Create and return an unresolved Promise for some pending JS.\n *\n * @param {String} key The unique identifier for this promise\n * @return {Promise}\n */\n var addPendingJSPromise = function(key) {\n var pendingKey = 'form-autocomplete:' + key;\n\n M.util.js_pending(pendingKey);\n\n var pendingPromise = $.Deferred();\n\n pendingPromise\n .then(function() {\n M.util.js_complete(pendingKey);\n\n return arguments[0];\n })\n .catch(notification.exception);\n\n return pendingPromise;\n };\n\n return /** @alias module:core/form-autocomplete */ {\n // Public variables and functions.\n /**\n * Turn a boring select box into an auto-complete beast.\n *\n * @method enhance\n * @param {string} selector The selector that identifies the select box.\n * @param {boolean} tags Whether to allow support for tags (can define new entries).\n * @param {string} ajax Name of an AMD module to handle ajax requests. If specified, the AMD\n * module must expose 2 functions \"transport\" and \"processResults\".\n * These are modeled on Select2 see: https://select2.github.io/options.html#ajax\n * @param {String} placeholder - The text to display before a selection is made.\n * @param {Boolean} caseSensitive - If search has to be made case sensitive.\n * @param {Boolean} showSuggestions - If suggestions should be shown\n * @param {String} noSelectionString - Text to display when there is no selection\n * @param {Boolean} closeSuggestionsOnSelect - Whether to close the suggestions immediately after making a selection.\n * @param {Object} templateOverrides A set of templates to use instead of the standard templates\n * @return {Promise}\n */\n enhance: function(selector, tags, ajax, placeholder, caseSensitive, showSuggestions, noSelectionString,\n closeSuggestionsOnSelect, templateOverrides) {\n // Set some default values.\n var options = {\n selector: selector,\n tags: false,\n ajax: false,\n placeholder: placeholder,\n caseSensitive: false,\n showSuggestions: true,\n noSelectionString: noSelectionString,\n templates: $.extend({\n input: 'core/form_autocomplete_input',\n items: 'core/form_autocomplete_selection_items',\n layout: 'core/form_autocomplete_layout',\n selection: 'core/form_autocomplete_selection',\n suggestions: 'core/form_autocomplete_suggestions',\n }, templateOverrides),\n };\n var pendingKey = 'autocomplete-setup-' + selector;\n M.util.js_pending(pendingKey);\n if (typeof tags !== \"undefined\") {\n options.tags = tags;\n }\n if (typeof ajax !== \"undefined\") {\n options.ajax = ajax;\n }\n if (typeof caseSensitive !== \"undefined\") {\n options.caseSensitive = caseSensitive;\n }\n if (typeof showSuggestions !== \"undefined\") {\n options.showSuggestions = showSuggestions;\n }\n if (typeof noSelectionString === \"undefined\") {\n str.get_string('noselection', 'form').done(function(result) {\n options.noSelectionString = result;\n }).fail(notification.exception);\n }\n\n // Look for the select element.\n var originalSelect = $(selector);\n if (!originalSelect) {\n log.debug('Selector not found: ' + selector);\n M.util.js_complete(pendingKey);\n return false;\n }\n\n Aria.hide(originalSelect.get());\n originalSelect.css('visibility', 'hidden');\n\n // Hide the original select.\n\n // Find or generate some ids.\n var state = {\n selectId: originalSelect.attr('id'),\n inputId: 'form_autocomplete_input-' + uniqueId,\n suggestionsId: 'form_autocomplete_suggestions-' + uniqueId,\n selectionId: 'form_autocomplete_selection-' + uniqueId,\n downArrowId: 'form_autocomplete_downarrow-' + uniqueId\n };\n\n // Increment the unique counter so we don't get duplicates ever.\n uniqueId++;\n\n options.multiple = originalSelect.attr('multiple');\n if (!options.multiple) {\n // If this is a single select then there is no way to de-select the current value -\n // unless we add a bogus blank option to be selected when nothing else is.\n // This matches similar code in updateAjax above.\n originalSelect.prepend('<option>');\n }\n\n if (typeof closeSuggestionsOnSelect !== \"undefined\") {\n options.closeSuggestionsOnSelect = closeSuggestionsOnSelect;\n } else {\n // If not specified, this will close suggestions by default for single-select elements only.\n options.closeSuggestionsOnSelect = !options.multiple;\n }\n\n var originalLabel = $('[for=' + state.selectId + ']');\n // Create the new markup and insert it after the select.\n var suggestions = [];\n originalSelect.children('option').each(function(index, option) {\n suggestions[index] = {label: option.innerHTML, value: $(option).attr('value')};\n });\n\n // Render all the parts of our UI.\n var context = $.extend({}, options, state);\n context.options = suggestions;\n context.items = [];\n\n // Collect rendered inline JS to be executed once the HTML is shown.\n var collectedjs = '';\n\n var renderLayout = templates.render(options.templates.layout, {})\n .then(function(html) {\n return $(html);\n });\n\n var renderInput = templates.render(options.templates.input, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderDatalist = templates.render(options.templates.suggestions, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n var renderSelection = templates.render(options.templates.selection, context).then(function(html, js) {\n collectedjs += js;\n return $(html);\n });\n\n return $.when(renderLayout, renderInput, renderDatalist, renderSelection)\n .then(function(layout, input, suggestions, selection) {\n originalSelect.hide();\n var container = originalSelect.parent();\n\n container.append(layout);\n container.find('[data-region=\"form_autocomplete-input\"]').replaceWith(input);\n container.find('[data-region=\"form_autocomplete-suggestions\"]').replaceWith(suggestions);\n container.find('[data-region=\"form_autocomplete-selection\"]').replaceWith(selection);\n\n templates.runTemplateJS(collectedjs);\n\n // Update the form label to point to the text input.\n originalLabel.attr('for', state.inputId);\n // Add the event handlers.\n addNavigation(options, state, originalSelect);\n\n var suggestionsElement = $(document.getElementById(state.suggestionsId));\n // Hide the suggestions by default.\n suggestionsElement.hide();\n Aria.hide(suggestionsElement.get());\n\n return;\n })\n .then(function() {\n // Show the current values in the selection list.\n return updateSelectionList(options, state, originalSelect);\n })\n .then(function() {\n return M.util.js_complete(pendingKey);\n })\n .catch(function(error) {\n M.util.js_complete(pendingKey);\n notification.exception(error);\n });\n }\n };\n});\n"],"file":"form-autocomplete.min.js"}