diff --git a/public/language/en-GB/search.json b/public/language/en-GB/search.json index 061cd0423c..48a4acb446 100644 --- a/public/language/en-GB/search.json +++ b/public/language/en-GB/search.json @@ -43,5 +43,6 @@ "clear-preferences": "Clear preferences", "search-preferences-saved": "Search preferences saved", "search-preferences-cleared": "Search preferences cleared", - "show-results-as": "Show results as" + "show-results-as": "Show results as", + "see-more-results": "See more results" } diff --git a/public/src/app.js b/public/src/app.js index a300db8901..6b0dcb4cec 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -568,6 +568,7 @@ app.cacheBuster = null; var searchButton = $('#search-button'); var searchFields = $('#search-fields'); var searchInput = $('#search-fields input'); + var quickSearchResults = $('#quick-search-results'); $('#search-form .advanced-search-link').on('mousedown', function () { ajaxify.go('/search'); @@ -575,10 +576,47 @@ app.cacheBuster = null; $('#search-form').on('submit', dismissSearch); searchInput.on('blur', dismissSearch); + searchInput.on('focus', function () { + if (searchInput.val() && quickSearchResults.children().length) { + quickSearchResults.removeClass('hidden').show(); + } + }); + + var searchTimeoutId = 0; + searchInput.on('keyup', function () { + if (searchTimeoutId) { + clearTimeout(searchTimeoutId); + searchTimeoutId = 0; + } + if (searchInput.val().length < 3) { + return; + } + + searchTimeoutId = setTimeout(function () { + require(['search'], function (search) { + var data = search.getSearchPreferences(); + data.term = searchInput.val(); + data.in = 'titles'; + data.searchOnly = 1; + search.api(data, function (data) { + if (!data.matchCount) { + return; + } + + app.parseAndTranslate('partials/quick-search-results', data, function (html) { + quickSearchResults.html(html).removeClass('hidden').show(); + }); + }); + }); + }, 400); + }); function dismissSearch() { searchFields.addClass('hidden'); searchButton.removeClass('hidden'); + setTimeout(function () { + quickSearchResults.addClass('hidden'); + }, 100); } searchButton.on('click', function (e) { diff --git a/public/src/modules/search.js b/public/src/modules/search.js index ea0f775fd1..5da78c2b8f 100644 --- a/public/src/modules/search.js +++ b/public/src/modules/search.js @@ -23,6 +23,16 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat } }; + Search.api = function (data, callback) { + var apiURL = '/api/search?' + createQueryString(data); + data.searchOnly = undefined; + var searchURL = '/search?' + createQueryString(data); + $.get(apiURL, function (result) { + result.url = searchURL; + callback(result); + }); + }; + function createQueryString(data) { var searchIn = data.in || 'titlesposts'; var postedBy = data.by || ''; @@ -76,6 +86,10 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat query.showAs = data.showAs; } + if (data.searchOnly) { + query.searchOnly = data.searchOnly; + } + $(window).trigger('action:search.createQueryString', { query: query, data: data, diff --git a/src/controllers/search.js b/src/controllers/search.js index 443d2801c3..0ee2ec4cc0 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -67,6 +67,7 @@ searchController.search = function (req, res, next) { var searchData = results.search; searchData.pagination = pagination.create(page, searchData.pageCount, req.query); + searchData.multiplePages = searchData.pageCount > 1; searchData.search_query = validator.escape(String(req.query.term || '')); searchData.term = req.query.term;