app/assets/javascripts/umlaut/search_autocomplete.js in umlaut-3.3.1 vs app/assets/javascripts/umlaut/search_autocomplete.js in umlaut-4.0.0.beta1
- old
+ new
@@ -1,105 +1,110 @@
/* search_autocomplete.js. Add autocomplete to Umlaut journal title search. */
jQuery(document).ready(function($) {
+ if (typeof $.fn.typeahead === "undefined") {
+ if ( window.console && window.console.log ) {
+ window.console.log("ERROR: Can not load Umlaut autocomplete code, jQuery.fn.typeahead not available.")
+ }
+ } else {
+ // We override typeahead's 'render' function to NOT have the first
+ // item selected. We simply copy and pasted it, and removed the line
+ // `items.first().addClass('active')`, then set the prototype to our
+ // own function. Yes, this changes typeahead globally, sorry we don't have
+ // a way to change it just for certain typeaheads.
+ //
+ // The default first-item-selected behavior has been hated by users
+ // in the journal search scenario, since when they hit return they
+ // get it even if they didn't want it.
+ var newRender = function(items) {
+ var that = this
- // We override typeahead's 'render' function to NOT have the first
- // item selected. We simply copy and pasted it, and removed the line
- // `items.first().addClass('active')`, then set the prototype to our
- // own function. Yes, this changes typeahead globally, sorry we don't have
- // a way to change it just for certain typeaheads.
- //
- // The default first-item-selected behavior has been hated by users
- // in the journal search scenario, since when they hit return they
- // get it even if they didn't want it.
- var newRender = function(items) {
- var that = this
+ items = $(items).map(function (i, item) {
+ i = $(that.options.item).attr('data-value', item)
+ i.find('a').html(that.highlighter(item))
+ return i[0]
+ })
- items = $(items).map(function (i, item) {
- i = $(that.options.item).attr('data-value', item)
- i.find('a').html(that.highlighter(item))
- return i[0]
- })
+ this.$menu.html(items)
+ return this
+ };
+ $.fn.typeahead.Constructor.prototype.render = newRender;
+ // have to fix 'select' to accomodate possible no selection too
+ $.fn.typeahead.Constructor.prototype.select = function() {
+ var val = this.$menu.find('.active').attr('data-value');
+ if (val) {
+ this.$element
+ .val(this.updater(val))
+ .change();
+ }
+ return this.hide()
+ }
- this.$menu.html(items)
- return this
- };
- $.fn.typeahead.Constructor.prototype.render = newRender;
- // have to fix 'select' to accomodate possible no selection too
- $.fn.typeahead.Constructor.prototype.select = function() {
- var val = this.$menu.find('.active').attr('data-value');
- if (val) {
- this.$element
- .val(this.updater(val))
- .change();
- }
- return this.hide()
- }
+ $(document).on("submit", "form.OpenURL", function() {
+ var form = $(this);
+ if ( form.find(".rft_title").val() != $(this).val()) {
+ form.find(".rft_object_id").val("");
+ form.find(".rft_title").val("");
+ }
+ });
- $(document).on("submit", "form.OpenURL", function() {
- var form = $(this);
- if ( form.find(".rft_title").val() != $(this).val()) {
- form.find(".rft_object_id").val("");
- form.find(".rft_title").val("");
+ // Search for the title with the current form. Only search
+ // if there are more than two chars though!
+ //
+ var search_title = function(query, process) {
+ if (query.length > 2) {
+ var form = this.$element.closest("form");
+ var url = form.attr("action").replace("journal_search", "auto_complete_for_journal_title");
+ // Get JSON from
+ $.getJSON(
+ form.attr("action").replace("journal_search", "auto_complete_for_journal_title"),
+ form.serialize(),
+ function(data) {
+ process(data)
+ }
+ )
+ }
}
- });
- // Search for the title with the current form. Only search
- // if there are more than two chars though!
- //
- var search_title = function(query, process) {
- if (query.length > 2) {
- var form = this.$element.closest("form");
- var url = form.attr("action").replace("journal_search", "auto_complete_for_journal_title");
- // Get JSON from
- $.getJSON(
- form.attr("action").replace("journal_search", "auto_complete_for_journal_title"),
- form.serialize(),
- function(data) {
- process(data)
- }
- )
- }
- }
+ var lookup_limit = 300; //ms
+ // Uses a timer to only do a lookup at most once every
+ // 300ms . Based on rejected pull request at:
+ // https://github.com/twitter/bootstrap/pull/6320
+ var throttled_search_title = function(query, process) {
+ if(this.lookupTimer) {
+ clearTimeout(this.lookupTimer);
+ }
- var lookup_limit = 300; //ms
- // Uses a timer to only do a lookup at most once every
- // 300ms . Based on rejected pull request at:
- // https://github.com/twitter/bootstrap/pull/6320
- var throttled_search_title = function(query, process) {
- if(this.lookupTimer) {
- clearTimeout(this.lookupTimer);
+ this.lookupTimer = setTimeout($.proxy(search_title, this, query, process), lookup_limit);
+ return this;
}
- this.lookupTimer = setTimeout($.proxy(search_title, this, query, process), lookup_limit);
- return this;
- }
-
- $("input.title_search").typeahead({
- items: 10,
- minLength: 3,
- source: throttled_search_title,
- highlighter: function(item) {
- // Bootstrap updates the item as it passes through the callback chain
- // so this is a hack to ensure we get the proper values.
- return "<span id=\"" + item.object_id + "\" class=\"title\">"+ item.title + "</span>";
- },
- sorter: function(items) { return items },
- matcher: function(item) { return true; },
- updater: function(item) {
- // Get the selected item via our hack.
- var selected_item = this.$menu.find('.active .title');
- if (selected_item.length > 0) {
- // We set the id attribute as the object id
- var object_id = selected_item.attr("id");
- // We set the inner text with the title
- var title = selected_item.text();
- var form = this.$element.closest("form");
- form.find("input.rft_object_id").val(object_id);
- form.find("input.rft_title").val(title);
- form.find("select.title_search_type").val("exact");
- return title;
+ $("input.title_search").typeahead({
+ items: 10,
+ minLength: 3,
+ source: throttled_search_title,
+ highlighter: function(item) {
+ // Bootstrap updates the item as it passes through the callback chain
+ // so this is a hack to ensure we get the proper values.
+ return "<span id=\"" + item.object_id + "\" class=\"title\">"+ item.title + "</span>";
+ },
+ sorter: function(items) { return items },
+ matcher: function(item) { return true; },
+ updater: function(item) {
+ // Get the selected item via our hack.
+ var selected_item = this.$menu.find('.active .title');
+ if (selected_item.length > 0) {
+ // We set the id attribute as the object id
+ var object_id = selected_item.attr("id");
+ // We set the inner text with the title
+ var title = selected_item.text();
+ var form = this.$element.closest("form");
+ form.find("input.rft_object_id").val(object_id);
+ form.find("input.rft_title").val(title);
+ form.find("select.title_search_type").val("exact");
+ return title;
+ }
}
- }
- });
+ });
+ }
});
\ No newline at end of file