From cebb76c40b27d5d4d58d2300a2f808ac9697ab1c Mon Sep 17 00:00:00 2001 From: DylanGuedes Date: Tue, 12 Jul 2016 17:00:40 +0000 Subject: [PATCH] Elasticsearch: Fixes categories --- plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb | 10 +++++++++- plugins/elasticsearch/helpers/elasticsearch_helper.rb | 35 ++++++++++++++++++++++------------- plugins/elasticsearch/helpers/elasticsearch_plugin_helper.rb | 20 ++++++++++++++++++++ plugins/elasticsearch/lib/elasticsearch_plugin.rb | 4 ++++ plugins/elasticsearch/lib/ext/text_article.rb | 2 +- plugins/elasticsearch/lib/searchable_model/filter.rb | 9 +++++++++ plugins/elasticsearch/public/javascripts/categories.js | 27 +++++++++++++++++++++++++++ plugins/elasticsearch/public/style.css | 17 +++++++++++++++++ plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb | 10 ++++++++-- 9 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 plugins/elasticsearch/helpers/elasticsearch_plugin_helper.rb create mode 100644 plugins/elasticsearch/public/javascripts/categories.js diff --git a/plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb b/plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb index 6098ec9..e367e10 100644 --- a/plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb +++ b/plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb @@ -1,8 +1,10 @@ require_relative '../helpers/elasticsearch_helper' +require_relative '../helpers/elasticsearch_plugin_helper' class ElasticsearchPluginController < ApplicationController no_design_blocks include ElasticsearchHelper + helper ElasticsearchPluginHelper def index search() @@ -12,6 +14,7 @@ class ElasticsearchPluginController < ApplicationController def search define_searchable_types define_sort_types + define_categories define_results end @@ -23,7 +26,7 @@ class ElasticsearchPluginController < ApplicationController def define_searchable_types @searchable_types = searchable_types - @selected_type = (params[:selected_type]|| :all ).to_sym + @selected_type = (params[:selected_type] || :all).to_sym end def define_sort_types @@ -31,4 +34,9 @@ class ElasticsearchPluginController < ApplicationController @selected_sort = (params[:filter] || :relevance).to_sym end + def define_categories + @categories = Category.where(parent: nil) + @selected_categories = (params[:categories] || "").split(",") + end + end diff --git a/plugins/elasticsearch/helpers/elasticsearch_helper.rb b/plugins/elasticsearch/helpers/elasticsearch_helper.rb index 8cbd9b0..8aa76c3 100644 --- a/plugins/elasticsearch/helpers/elasticsearch_helper.rb +++ b/plugins/elasticsearch/helpers/elasticsearch_helper.rb @@ -37,7 +37,7 @@ module ElasticsearchHelper def search_from_all_models begin filter = (params[:filter] || "" ).to_sym - query = get_query params[:query], sort_by: get_sort_by(filter) + query = get_query params[:query], sort_by: get_sort_by(filter), categories: params[:categories] Elasticsearch::Model.search(query,searchable_models, size: default_per_page(params[:per_page])).page(params[:page]).records rescue [] @@ -48,7 +48,7 @@ module ElasticsearchHelper begin klass = model.to_s.classify.constantize filter = (params[:filter] || "" ).to_sym - query = get_query params[:query], klass: klass, sort_by: get_sort_by(filter,klass) + query = get_query params[:query], klass: klass, sort_by: get_sort_by(filter ,klass), categories: params[:categories] klass.search(query, size: default_per_page(params[:per_page])).page(params[:page]).records rescue [] @@ -87,28 +87,37 @@ module ElasticsearchHelper end - def query_method expression="", models=[] - { - query: { - filtered: { - query: query_string(expression,models), - filter: { - bool: { - should: models.map {|model| model.filter(environment: @environment.id) } - } - } + def query_method expression="", models=[], categories=[] + query = {} + query[:query] = { + filtered: { + query: query_string(expression, models), + filter: { + bool: {} } } } + + query[:query][:filtered][:filter][:bool] = { + should: models.map {|model| model.filter(environment: @environment.id) } + } + + unless categories.blank? + query[:query][:filtered][:filter][:bool][:must] = models.first.filter_category(categories) + end + + query end def get_query text="", options={} klass = options[:klass] sort_by = options[:sort_by] + categories = (options[:categories] || "").split(",") + categories = categories.map(&:to_i) models = (klass.nil?) ? searchable_models : [klass] - query = query_method(text, models) + query = query_method(text, models, categories) query[:sort] = sort_by if sort_by query diff --git a/plugins/elasticsearch/helpers/elasticsearch_plugin_helper.rb b/plugins/elasticsearch/helpers/elasticsearch_plugin_helper.rb new file mode 100644 index 0000000..16b8ffb --- /dev/null +++ b/plugins/elasticsearch/helpers/elasticsearch_plugin_helper.rb @@ -0,0 +1,20 @@ +module ElasticsearchPluginHelper + + def render_categories(collection, selected_collections) + content_tag :ul, class: "category-ident" do + if collection.respond_to? :each + collection.collect do |item| + concat ("
  • ".html_safe) + concat (check_box_tag(item.name, item.id, selected_collections.include?(item.id.to_s)) ) + concat (label_tag item.name) + concat (render_categories(item.children, selected_collections)) if item.children_count > 0 + concat ("
  • ".html_safe) + end + else + check_box_tag collection.name, collection.id, selected_collections.include?(collection.id) + label_tag collection.name + end + end + end + +end diff --git a/plugins/elasticsearch/lib/elasticsearch_plugin.rb b/plugins/elasticsearch/lib/elasticsearch_plugin.rb index bceac96..e50119b 100644 --- a/plugins/elasticsearch/lib/elasticsearch_plugin.rb +++ b/plugins/elasticsearch/lib/elasticsearch_plugin.rb @@ -16,6 +16,10 @@ class ElasticsearchPlugin < Noosfero::Plugin true end + def js_files + ['categories'].map{ |j| "javascripts/#{j}" } + end + def search_controller_filters block = proc do diff --git a/plugins/elasticsearch/lib/ext/text_article.rb b/plugins/elasticsearch/lib/ext/text_article.rb index bd65f03..5021ffa 100644 --- a/plugins/elasticsearch/lib/ext/text_article.rb +++ b/plugins/elasticsearch/lib/ext/text_article.rb @@ -11,7 +11,7 @@ class TextArticle def self.control_fields { :advertise => { type: :boolean }, - :published => { type: 'boolean'}, + :published => { type: :boolean }, :comments_count => { type: :integer }, :hits => { type: :integer }, :profile => { type: :nested , hash: NestedProfile.hash } diff --git a/plugins/elasticsearch/lib/searchable_model/filter.rb b/plugins/elasticsearch/lib/searchable_model/filter.rb index 1583b61..4efcf81 100644 --- a/plugins/elasticsearch/lib/searchable_model/filter.rb +++ b/plugins/elasticsearch/lib/searchable_model/filter.rb @@ -32,6 +32,15 @@ module Filter result_filter end + + def filter_category selected_categories + { + query: { + terms: { category_ids: selected_categories } + } + } + end + end module InstanceMethods diff --git a/plugins/elasticsearch/public/javascripts/categories.js b/plugins/elasticsearch/public/javascripts/categories.js new file mode 100644 index 0000000..6cad80e --- /dev/null +++ b/plugins/elasticsearch/public/javascripts/categories.js @@ -0,0 +1,27 @@ +var main = function() { + var categories = [] + var categoryParam = ""; + var url = window.location.href; + var indexOfCategories; + + url = url.replace(/&categories.*/g, ""); + url += "&categories="; + + $(".categories ul li input[checked]").map(function(idx, element) { + categories.push(element.value); + }); + + $('.categories ul li input[type=checkbox]').on('click', function(){ + var idx = categories.indexOf(this.value); + if (idx == -1) { + categories.push(this.value); + } else { + categories.splice(idx, 1); + } + + url += categories.join(","); + window.location.href = url; + }); +}; + +$(document).ready(main); diff --git a/plugins/elasticsearch/public/style.css b/plugins/elasticsearch/public/style.css index 62e1641..900de26 100644 --- a/plugins/elasticsearch/public/style.css +++ b/plugins/elasticsearch/public/style.css @@ -50,6 +50,7 @@ font-size: 18px; } +.controller-elasticsearch_plugin #content-inner .categories, .controller-elasticsearch_plugin #content-inner .search-filter, .controller-elasticsearch_plugin #content-inner ul.search-options { background: #fff; @@ -145,3 +146,19 @@ text-decoration: none; } +.controller-elasticsearch_plugin #content-inner .categories .category-ident { + margin-left: 10px; +} + +.controller-elasticsearch_plugin #content-inner .categories .box-title { + margin-bottom: 20px; +} + +.controller-elasticsearch_plugin #content-inner .categories ul li { + padding: 5px; + font-size: 15px; +} + +.controller-elasticsearch_plugin #content-inner .categories li input { + margin-right: 5px; +} diff --git a/plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb b/plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb index fa2226c..7ce5272 100644 --- a/plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb +++ b/plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb @@ -27,7 +27,7 @@ @@ -36,11 +36,16 @@ + +
    +

    <%= _("Categories") %>

    + <%= render_categories(@categories, @selected_categories) %> +
    @@ -59,5 +64,6 @@ <%= pagination_links @results if @results.count > 0 %>
    + -- libgit2 0.21.2