3ecfb8deb165083b0d3df5081aeb5dda2c4b6ff1 angie Mon Sep 24 10:53:38 2018 -0700 Libifying JS module autocompleteCat (autocomplete with optional category labels) from hgGateway. diff --git src/hg/js/hgGateway.js src/hg/js/hgGateway.js index fae0cdb..45514fd 100644 --- src/hg/js/hgGateway.js +++ src/hg/js/hgGateway.js @@ -5,38 +5,35 @@ // Several modules are defined in this file -- if some other code needs them someday, // they can be moved out to lib files. // function svgCreateEl: convenience function for creating new SVG elements, used by // speciesTree and rainbow modules. // speciesTree: module that exports draw() function for drawing a phylogenetic tree // (and list of hubs above the tree, if any) in a pre-existing SVG element -- see // hg/hgGateway/hgGateway.html. // rainbow: module that exports draw() function and colors. draw() adds stripes using // a spectrum of colors that are associated to species groups. The hgGateway view code // uses coordinates of stripes within the tree image to create a corresponding "rainbow" // slider bar to the left of the phylogenetic tree container. -// autocompleteCat: customized JQuery autocomplete plugin that includes watermark and -// can display results broken down by category (for example, genomes from various -// assembly hubs and native genomes). - // hgGateway: module of mostly view/controller code (model state comes directly from server). // Globals (pragma for jshint): /* globals dbDbTree, activeGenomes, surveyLink, surveyLabel, surveyLabelImage, cart */ +/* globals autoCompleteCat */ /* globals calculateHgTracksWidth */ // function is defined in utils.js window.hgsid = ''; window.activeGenomes = {}; window.surveyLink=null; window.surveyLabel=null; window.surveyLabelImage=null; function svgCreateEl(type, config) { // Helper function for creating a new SVG element and initializing its // properties and attributes. Type is something like 'rect', 'text', 'g', etc; // config is an object like { id: 'newThingie', x: 0, y: 10, title: 'blah blah' }. var svgns = 'http://www.w3.org/2000/svg'; var xlinkns = 'http://www.w3.org/1999/xlink'; @@ -605,144 +602,30 @@ drawIcons(newG, leafTops); if (oldG) { svg.removeChild(oldG); } svg.appendChild(newG); return stripeTops; } return { draw: draw, colors: stripeColors, hubColor: hubColor }; }()); // rainbow -///////////////////////////// Module: autocompleteCat ///////////////////////////// - -var autocompleteCat = (function() { - // Customize jQuery UI autocomplete to show item categories and support html markup in labels. - // Adapted from https://jqueryui.com/autocomplete/#categories and - // http://forum.jquery.com/topic/using-html-in-autocomplete - // Also adds watermark to input. - $.widget("custom.autocompleteCat", - $.ui.autocomplete, - { - _renderMenu: function(ul, items) { - var that = this; - var currentCategory = ""; - // There's no this._super as shown in the doc, so I can't override - // _create as shown in the doc -- just do this every time we render... - this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); - $.each(items, - function(index, item) { - // Add a heading each time we see a new category: - if (item.category && item.category !== currentCategory) { - ul.append("
  • " + - item.category + "
  • " ); - currentCategory = item.category; - } - that._renderItem( ul, item ); - }); - }, - _renderItem: function(ul, item) { - // In order to use HTML markup in the autocomplete, one has to overwrite - // autocomplete's _renderItem method using .html instead of .text. - // http://forum.jquery.com/topic/using-html-in-autocomplete - return $("
  • ") - .data("item.autocomplete", item) - .append($("").html(item.label)) - .appendTo(ul); - } - }); - - function init($input, options) { - // Set up an autocomplete and watermark for $input, with a callback options.onSelect - // for when the user chooses a result. - // If options.baseUrl is null, the autocomplete will not do anything, but we (re)initialize - // it anyway in case the same input had a previous db's autocomplete in effect. - // options.onServerReply (if given) is a function (Array, term) -> Array that - // post-processes the list of items returned by the server before the list is - // passed back to autocomplete for rendering. - // The following two options apply only when using our locally modified jquery-ui: - // If options.enterSelectsIdentical is true, then if the user hits Enter in the text input - // and their term has an exact match in the autocomplete results, that result is selected. - // options.onEnterTerm (if provided) is a callback function (jqEvent, jqUi) invoked - // when the user hits Enter, after handling enterSelectsIdentical. - - // The function closure allows us to keep a private cache of past searches. - var cache = {}; - - var doSearch = function(term, acCallback) { - // Look up term in searchObj and by sending an ajax request - var timestamp = new Date().getTime(); - var url = options.baseUrl + encodeURIComponent(term) + '&_=' + timestamp; - $.getJSON(url) - .done(function(results) { - if (_.isFunction(options.onServerReply)) { - results = options.onServerReply(results, term); - } - cache[term] = results; - acCallback(results); - }); - // ignore errors to avoid spamming people on flaky network connections - // with tons of error messages (#8816). - }; - - var autoCompleteSource = function(request, acCallback) { - // This is a callback for jqueryui.autocomplete: when the user types - // a character, this is called with the input value as request.term and an acCallback - // for this to return the result to autocomplete. - // See http://api.jqueryui.com/autocomplete/#option-source - var results = cache[request.term]; - if (results) { - acCallback(results); - } else if (options.baseUrl) { - doSearch(request.term, acCallback); - } - }; - - var autoCompleteSelect = function(event, ui) { - // This is a callback for autocomplete to let us know that the user selected - // a term from the list. See http://api.jqueryui.com/autocomplete/#event-select - options.onSelect(ui.item); - $input.blur(); - }; - - // Provide default values where necessary: - options.onSelect = options.onSelect || console.log; - options.enterSelectsIdentical = options.enterSelectsIdentical || false; - - $input.autocompleteCat({ - delay: 500, - minLength: 2, - source: autoCompleteSource, - select: autoCompleteSelect, - enterSelectsIdentical: options.enterSelectsIdentical, - enterTerm: options.onEnterTerm - }); - - if (options.watermark) { - $input.css('color', 'black'); - $input.Watermark(options.watermark, '#686868'); - } - } - - return { init: init }; -}()); // autocompleteCat - - ///////////////////////////// Module: hgGateway ///////////////////////////// var hgGateway = (function() { // Interactive parts of the new gateway page: species autocomplete, // graphical species-picker, db select, and position autocomplete. // Constants var speciesWatermark = 'Enter species or common name'; var positionWatermark = 'Enter position, gene symbol or search terms'; // Shortcuts to popular species: var favIconTaxId = [ ['Human', 9606], ['Mouse', 10090], ['Rat', 10116], ['Fly', 7227], ['Worm', 6239],