From 2c9b904e15e6e74dfd70351cb3379ef47da29e38 Mon Sep 17 00:00:00 2001 From: Justin DiRose Date: Fri, 26 Jul 2019 10:50:22 -0500 Subject: [PATCH] Working tag filtering of topics --- .../knowledge_explorer_controller.rb | 62 ++++++++++++++++--- .../components/knowledge-explorer-tag.js.es6 | 1 - .../controllers/knowledge-explorer.js.es6 | 43 ++++++++++--- .../routes/knowledge-explorer.js.es6 | 3 +- .../templates/knowledge-explorer.hbs | 10 ++- 5 files changed, 99 insertions(+), 20 deletions(-) diff --git a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb index 6f2d57a..97033d0 100644 --- a/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb +++ b/app/controllers/knowledge_explorer/knowledge_explorer_controller.rb @@ -4,21 +4,26 @@ module KnowledgeExplorer before_action :init_guardian def index - category_topic_lists = [] - tag_topic_lists = [] - knowledge_explorer_categories.each do |c| - if topic_list = TopicQuery.new(current_user, category: c.id).list_latest - category_topic_lists << TopicListSerializer.new(topic_list, scope: @guardian).as_json - end + filters = { + tags: params[:tags], + category: params[:category] + } + + if filters[:category] + category_topic_lists = get_topics_from_categories(category_by_filter(filters[:category])) + else + category_topic_lists = get_topics_from_categories(knowledge_explorer_categories) end - knowledge_explorer_tags.each do |t| - if topic_list = TopicQuery.new(current_user, tags: t.name).list_latest - tag_topic_lists << TopicListSerializer.new(topic_list, scope: @guardian).as_json - end + if filters[:tags] + tag_topic_lists = get_topics_from_tags(tags_by_filter(filters[:tags])) + else + tag_topic_lists = get_topics_from_tags(knowledge_explorer_tags) end + # Deduplicate results + topics = [] category_topic_lists.each do |list| @@ -43,6 +48,30 @@ module KnowledgeExplorer render json: topics end + def get_topics_from_categories(categories) + category_topic_lists = [] + + categories.each do |c| + if topic_list = TopicQuery.new(current_user, category: c.id).list_latest + category_topic_lists << TopicListSerializer.new(topic_list, scope: @guardian).as_json + end + end + + category_topic_lists + end + + def get_topics_from_tags(tags) + tag_topic_lists = [] + + tags.each do |t| + if topic_list = TopicQuery.new(current_user, tags: t.name).list_latest + tag_topic_lists << TopicListSerializer.new(topic_list, scope: @guardian).as_json + end + end + + tag_topic_lists + end + def count_tags(topics) tags = [] @@ -79,5 +108,18 @@ module KnowledgeExplorer Tag.where('name IN (?)', selected_tags) end + + def category_by_filter(category_filter) + selected_category = category_filter + + category = Category.where('slug IN (?)', selected_category) + + category.select { |c| @guardian.can_see_category?(c) } + end + + def tags_by_filter(tags) + selected_tags = tags.split(' ') + Tag.where('name IN (?)', selected_tags) + end end end diff --git a/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 b/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 index 68b144a..4ca65d8 100644 --- a/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 +++ b/assets/javascripts/discourse/components/knowledge-explorer-tag.js.es6 @@ -13,6 +13,5 @@ export default Ember.Component.extend({ } this.set("filterTags", filter); - this.send("refreshRoute"); } }); diff --git a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 index 4e9213a..a254355 100644 --- a/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/controllers/knowledge-explorer.js.es6 @@ -1,15 +1,44 @@ -import { - default as computed, - observes, - on -} from "ember-addons/ember-computed-decorators"; +import { observes } from "ember-addons/ember-computed-decorators"; + +function arrayContainsArray(superset, subset) { + if (0 === subset.length) { + return false; + } + return subset.every(v => superset.indexOf(v) >= 0); +} export default Ember.Controller.extend({ application: Ember.inject.controller(), queryParams: { - filterCategory: 'category', - filterTags: 'tags' + filterCategory: "category", + filterTags: "tags" }, + filtered: false, filterTags: null, filterCategory: null, + + filteredTopics: null, + + @observes("filterTags") + filterByTags() { + debugger; + const filterTags = this.get("filterTags"); + if (filterTags != null) { + const filter = filterTags.split(" "); + const topics = this.get("topics"); + const tags = this.get("tags"); + + if (filter != "") { + const filteredTopics = topics.filter(topic => + arrayContainsArray(topic.tags, filter) + ); + this.set("filteredTopics", filteredTopics); + this.set("filtered", true); + } else { + this.set("filteredTopics", null); + this.set("filterTags", null); + this.set("filtered", false); + } + } + } }); diff --git a/assets/javascripts/discourse/routes/knowledge-explorer.js.es6 b/assets/javascripts/discourse/routes/knowledge-explorer.js.es6 index 5e7cc08..9203b85 100644 --- a/assets/javascripts/discourse/routes/knowledge-explorer.js.es6 +++ b/assets/javascripts/discourse/routes/knowledge-explorer.js.es6 @@ -10,5 +10,6 @@ export default Ember.Route.extend({ tags: model.tags, topics: model.topics }); - } + }, + }); diff --git a/assets/javascripts/discourse/templates/knowledge-explorer.hbs b/assets/javascripts/discourse/templates/knowledge-explorer.hbs index ab8c08a..284db81 100644 --- a/assets/javascripts/discourse/templates/knowledge-explorer.hbs +++ b/assets/javascripts/discourse/templates/knowledge-explorer.hbs @@ -4,6 +4,14 @@ tags=tags filterTags=filterTags searchResults=searchResults}} - {{knowledge-explorer-topic-list topics=topics}} + {{#if filtered}} + {{#if filteredTopics}} + {{knowledge-explorer-topic-list topics=filteredTopics}} + {{else}} +
No results match the current filter
+ {{/if}} + {{else}} + {{knowledge-explorer-topic-list topics=topics}} + {{/if}}