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 @@
<% for type,value in @searchable_types %>
- ">
- <%= link_to value[:label], "?selected_type=#{type}&query=#{@query}"%>
+ <%= link_to value[:label], "?selected_type=#{type}&query=#{@query}&categories=#{@selected_categories.join(',')}"%>
<% end %>
@@ -36,11 +36,16 @@
<% for type, value in @sort_types %>
- ">
- <%= link_to value[:label], "?selected_type=#{@selected_type}&query=#{@query}&filter=#{type}" %>
+ <%= link_to value[:label], "?selected_type=#{@selected_type}&query=#{@query}&filter=#{type}&categories=#{@selected_categories.join(',')}" %>
<% end %>
+
+
+
<%= _("Categories") %>
+ <%= render_categories(@categories, @selected_categories) %>
+
@@ -59,5 +64,6 @@
<%= pagination_links @results if @results.count > 0 %>
+
--
libgit2 0.21.2