diff --git a/public/src/client/search.js b/public/src/client/search.js index c7330f1ab8..adee1adaee 100644 --- a/public/src/client/search.js +++ b/public/src/client/search.js @@ -80,9 +80,11 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco $('#posted-by-user').val(params.by); } - if (params.categories) { - $('#posted-in-categories').val(params.categories); - } + loadCategories(function() { + if (params.categories) { + $('#posted-in-categories').val(params.categories); + } + }); if (params.searchChildren) { $('#search-children').prop('checked', true); @@ -112,6 +114,38 @@ define('forum/search', ['search', 'autocomplete'], function(searchModule, autoco } } + function loadCategories(callback) { + var listEl = $('#posted-in-categories'); + + socket.emit('categories.getCategoriesByPrivilege', 'read', function(err, categories) { + if (err) { + return app.alertError(err.message); + } + + categories = categories.filter(function(category) { + return !category.link && !parseInt(category.parentCid, 10); + }); + + categories.forEach(function(category) { + recursive(category, listEl, ''); + }); + listEl.attr('size', listEl.find('option').length); + callback(); + }); + } + + function recursive(category, listEl, level) { + if (category.link) { + return; + } + var bullet = level ? '• ' : ''; + $('').appendTo(listEl); + + category.children.forEach(function(child) { + recursive(child, listEl, '    ' + level); + }); + } + function highlightMatches(searchQuery) { if (!searchQuery) { return; diff --git a/src/controllers/search.js b/src/controllers/search.js index 5da395c2b8..874cbea1a2 100644 --- a/src/controllers/search.js +++ b/src/controllers/search.js @@ -15,60 +15,46 @@ searchController.search = function(req, res, next) { return next(); } - var breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); + req.params.term = validator.escape(req.params.term); + var page = Math.max(1, parseInt(req.query.page, 10)) || 1; + if (req.query.categories && !Array.isArray(req.query.categories)) { + req.query.categories = [req.query.categories]; + } - categories.getCategoriesByPrivilege('categories:cid', req.uid, 'read', function(err, categories) { + var data = { + query: req.params.term, + searchIn: req.query.in || 'posts', + postedBy: req.query.by, + categories: req.query.categories, + searchChildren: req.query.searchChildren, + replies: req.query.replies, + repliesFilter: req.query.repliesFilter, + timeRange: req.query.timeRange, + timeFilter: req.query.timeFilter, + sortBy: req.query.sortBy, + sortDirection: req.query.sortDirection, + page: page, + uid: req.uid + }; + + search.search(data, function(err, results) { if (err) { return next(err); } - categories = categories.filter(function(category) { - return category && !category.link; - }); - - req.params.term = validator.escape(req.params.term); - var page = Math.max(1, parseInt(req.query.page, 10)) || 1; - if (req.query.categories && !Array.isArray(req.query.categories)) { - req.query.categories = [req.query.categories]; - } - - var data = { - query: req.params.term, - searchIn: req.query.in || 'posts', - postedBy: req.query.by, - categories: req.query.categories, - searchChildren: req.query.searchChildren, - replies: req.query.replies, - repliesFilter: req.query.repliesFilter, - timeRange: req.query.timeRange, - timeFilter: req.query.timeFilter, - sortBy: req.query.sortBy, - sortDirection: req.query.sortDirection, - page: page, - uid: req.uid - }; + results.pagination = pagination.create(page, results.pageCount, req.query); + results.showAsPosts = !req.query.showAs || req.query.showAs === 'posts'; + results.showAsTopics = req.query.showAs === 'topics'; + results.breadcrumbs = helpers.buildBreadcrumbs([{text: '[[global:search]]'}]); + results.expandSearch = !req.params.term; - search.search(data, function(err, results) { + plugins.fireHook('filter:search.build', {data: data, results: results}, function(err, data) { if (err) { return next(err); } - - results.pagination = pagination.create(page, results.pageCount, req.query); - results.showAsPosts = !req.query.showAs || req.query.showAs === 'posts'; - results.showAsTopics = req.query.showAs === 'topics'; - results.breadcrumbs = breadcrumbs; - results.categories = categories; - results.expandSearch = !req.params.term; - - plugins.fireHook('filter:search.build', {data: data, results: results}, function(err, data) { - if (err) { - return next(err); - } - res.render('search', data.results); - }); + res.render('search', data.results); }); }); }; - module.exports = searchController;