mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
feat: quick search
This commit is contained in:
@@ -43,5 +43,6 @@
|
|||||||
"clear-preferences": "Clear preferences",
|
"clear-preferences": "Clear preferences",
|
||||||
"search-preferences-saved": "Search preferences saved",
|
"search-preferences-saved": "Search preferences saved",
|
||||||
"search-preferences-cleared": "Search preferences cleared",
|
"search-preferences-cleared": "Search preferences cleared",
|
||||||
"show-results-as": "Show results as"
|
"show-results-as": "Show results as",
|
||||||
|
"see-more-results": "See more results"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -568,6 +568,7 @@ app.cacheBuster = null;
|
|||||||
var searchButton = $('#search-button');
|
var searchButton = $('#search-button');
|
||||||
var searchFields = $('#search-fields');
|
var searchFields = $('#search-fields');
|
||||||
var searchInput = $('#search-fields input');
|
var searchInput = $('#search-fields input');
|
||||||
|
var quickSearchResults = $('#quick-search-results');
|
||||||
|
|
||||||
$('#search-form .advanced-search-link').on('mousedown', function () {
|
$('#search-form .advanced-search-link').on('mousedown', function () {
|
||||||
ajaxify.go('/search');
|
ajaxify.go('/search');
|
||||||
@@ -575,10 +576,47 @@ app.cacheBuster = null;
|
|||||||
|
|
||||||
$('#search-form').on('submit', dismissSearch);
|
$('#search-form').on('submit', dismissSearch);
|
||||||
searchInput.on('blur', 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() {
|
function dismissSearch() {
|
||||||
searchFields.addClass('hidden');
|
searchFields.addClass('hidden');
|
||||||
searchButton.removeClass('hidden');
|
searchButton.removeClass('hidden');
|
||||||
|
setTimeout(function () {
|
||||||
|
quickSearchResults.addClass('hidden');
|
||||||
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
searchButton.on('click', function (e) {
|
searchButton.on('click', function (e) {
|
||||||
|
|||||||
@@ -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) {
|
function createQueryString(data) {
|
||||||
var searchIn = data.in || 'titlesposts';
|
var searchIn = data.in || 'titlesposts';
|
||||||
var postedBy = data.by || '';
|
var postedBy = data.by || '';
|
||||||
@@ -76,6 +86,10 @@ define('search', ['navigator', 'translator', 'storage'], function (nav, translat
|
|||||||
query.showAs = data.showAs;
|
query.showAs = data.showAs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.searchOnly) {
|
||||||
|
query.searchOnly = data.searchOnly;
|
||||||
|
}
|
||||||
|
|
||||||
$(window).trigger('action:search.createQueryString', {
|
$(window).trigger('action:search.createQueryString', {
|
||||||
query: query,
|
query: query,
|
||||||
data: data,
|
data: data,
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ searchController.search = function (req, res, next) {
|
|||||||
var searchData = results.search;
|
var searchData = results.search;
|
||||||
|
|
||||||
searchData.pagination = pagination.create(page, searchData.pageCount, req.query);
|
searchData.pagination = pagination.create(page, searchData.pageCount, req.query);
|
||||||
|
searchData.multiplePages = searchData.pageCount > 1;
|
||||||
searchData.search_query = validator.escape(String(req.query.term || ''));
|
searchData.search_query = validator.escape(String(req.query.term || ''));
|
||||||
searchData.term = req.query.term;
|
searchData.term = req.query.term;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user