From 4f09d552ed6a4ecbced5c7c927fc3fae3391ee34 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 2 Sep 2014 19:15:08 +1000 Subject: [PATCH] FEATURE: increase search expansion to 50 results refactor search code to deal with proper objects use proper serializers, test the controllers --- .../discourse/controllers/search.js.es6 | 57 ++++-- .../discourse/templates/search.js.handlebars | 2 +- .../search/category_result.js.handlebars | 2 +- .../search/topic_result.js.handlebars | 2 +- .../search/user_result.js.handlebars | 6 +- app/controllers/search_controller.rb | 3 +- .../grouped_search_result_serializer.rb | 6 + app/serializers/search_post_serializer.rb | 9 + lib/search.rb | 111 +++++------ lib/search/grouped_search_results.rb | 64 ++++--- lib/search/search_result.rb | 9 +- spec/components/search_spec.rb | 176 +++++++----------- spec/controllers/search_controller_spec.rb | 19 ++ 13 files changed, 261 insertions(+), 205 deletions(-) create mode 100644 app/serializers/grouped_search_result_serializer.rb create mode 100644 app/serializers/search_post_serializer.rb diff --git a/app/assets/javascripts/discourse/controllers/search.js.es6 b/app/assets/javascripts/discourse/controllers/search.js.es6 index c36cd69a3b4..97ed1fdcb17 100644 --- a/app/assets/javascripts/discourse/controllers/search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/search.js.es6 @@ -57,21 +57,50 @@ export default Em.ArrayController.extend(Discourse.Presence, { if (results) { self.set('noResults', results.length === 0); - var index = 0; - results = _(['topic', 'category', 'user']) - .map(function(n){ - return _(results).where({type: n}).first(); - }) - .compact() - .each(function(list){ - _.each(list.results, function(item){ - item.index = index++; - urls.pushObject(item.url); - }); - }) - .value(); + var topicMap = {}; + results.topics = results.topics.map(function(topic){ + topic = Discourse.Topic.create(topic); + topicMap[topic.id] = topic; + return topic; + }); - self.setProperties({ resultCount: index, content: results, urls: urls }); + results.posts = results.posts.map(function(post){ + post = Discourse.Post.create(post); + post.set('topic', topicMap[post.topic_id]); + urls.push(post.get('url')); + return post; + }); + + results.users = results.users.map(function(user){ + user = Discourse.User.create(user); + urls.push(user.get('path')); + return user; + }); + + results.categories = results.categories.map(function(category){ + category = Discourse.Category.create(category); + urls.push(category.get('url')); + return category; + }); + + var r = results.grouped_search_result; + results.resultTypes = []; + + // TODO: consider refactoring front end to take a better structure + [['topic','posts'],['user','users'],['category','categories']].forEach(function(pair){ + var type = pair[0], name = pair[1]; + if(results[name].length > 0) { + results.resultTypes.push({ + results: results[name], + type: type, + more: r['more_' + name] + }); + } + }); + + console.log(results) + + self.setProperties({ resultCount: urls.length, content: results, urls: urls }); } self.set('loading', false); diff --git a/app/assets/javascripts/discourse/templates/search.js.handlebars b/app/assets/javascripts/discourse/templates/search.js.handlebars index 641e0445cab..3c5d20f81a6 100644 --- a/app/assets/javascripts/discourse/templates/search.js.handlebars +++ b/app/assets/javascripts/discourse/templates/search.js.handlebars @@ -10,7 +10,7 @@
{{else}} {{#unless noResults}} - {{#each resultType in content}} + {{#each resultType in content.resultTypes}}