Commit 90c1659995b840fd24d71faf6766c16a9b05e18e
1 parent
3509f25c
Exists in
fix_sign_up_form
Elasticsearch: Adding style to views
Create initial style of elasticsearch, and refectored html Changes style of elasticsearch plugin, add variable to store search types. Adds style for communities partial. Adds person partial style Adding event to models and adding styles Refactored search controller and view - Changed search-form to use get instead of post - Uses search method directly in models - Refactored process results - Adding pagination Removed hardcode name from community view Signed-off-by: DylanGuedes <djmgguedes@gmail.com> Signed-off-by: Macartur Sousa <macartur.sc@gmail.com>
Showing
8 changed files
with
219 additions
and
77 deletions
Show diff stats
plugins/elasticsearch/controllers/elasticsearch_plugin_controller.rb
1 | class ElasticsearchPluginController < ApplicationController | 1 | class ElasticsearchPluginController < ApplicationController |
2 | no_design_blocks | 2 | no_design_blocks |
3 | 3 | ||
4 | - SEARCHABLE_MODELS = {communities: true, articles: true, people: true} | 4 | + SEARCHABLE_TYPES = { :all => { label: _("All Results")}, |
5 | + :community => { label: _("Communities")}, | ||
6 | + :event => { label: _("Events")}, | ||
7 | + :person => { label: _("People")} | ||
8 | + } | ||
9 | + | ||
10 | + SEARCH_FILTERS = { :lexical => { label: _("Alphabetical Order")}, | ||
11 | + :recent => { label: _("More Recent Order")}, | ||
12 | + :access => { label: _("More accessed")} | ||
13 | + } | ||
5 | 14 | ||
6 | def index | 15 | def index |
7 | search() | 16 | search() |
@@ -9,39 +18,37 @@ class ElasticsearchPluginController < ApplicationController | @@ -9,39 +18,37 @@ class ElasticsearchPluginController < ApplicationController | ||
9 | end | 18 | end |
10 | 19 | ||
11 | def search | 20 | def search |
12 | - @results = [] | 21 | + define_searchable_types |
22 | + define_search_fields_types | ||
23 | + | ||
24 | + process_results | ||
25 | + end | ||
26 | + | ||
27 | + def process_results | ||
13 | @query = params[:q] | 28 | @query = params[:q] |
14 | - @checkbox = {} | ||
15 | 29 | ||
16 | - if params[:model].present? | ||
17 | - params[:model].keys.each do |model| | ||
18 | - @checkbox[model.to_sym] = true | ||
19 | - results model | ||
20 | - end | 30 | + if @selected_type == :all |
31 | + @results = search_from_all_models | ||
21 | else | 32 | else |
22 | - unless params[:q].blank? | ||
23 | - SEARCHABLE_MODELS.keys.each do |model| | ||
24 | - results model | ||
25 | - end | ||
26 | - end | 33 | + @results = search_from_model @selected_type |
27 | end | 34 | end |
28 | - | ||
29 | end | 35 | end |
30 | 36 | ||
31 | private | 37 | private |
32 | 38 | ||
33 | - def get_query text, klass | 39 | + def fields_from_model |
40 | + klass::SEARCHABLE_FIELDS.map do |key, value| | ||
41 | + if value[:weight] | ||
42 | + "#{key}^#{value[:weight]}" | ||
43 | + else | ||
44 | + "#{key}" | ||
45 | + end | ||
46 | + end | ||
47 | + end | ||
48 | + | ||
49 | + def get_query text, klass=nil | ||
34 | query = {} | 50 | query = {} |
35 | unless text.blank? | 51 | unless text.blank? |
36 | - text = text.downcase | ||
37 | - fields = klass::SEARCHABLE_FIELDS.map do |key, value| | ||
38 | - if value[:weight] | ||
39 | - "#{key}^#{value[:weight]}" | ||
40 | - else | ||
41 | - "#{key}" | ||
42 | - end | ||
43 | - end | ||
44 | - | ||
45 | query = { | 52 | query = { |
46 | query: { | 53 | query: { |
47 | match_all: { | 54 | match_all: { |
@@ -68,23 +75,37 @@ class ElasticsearchPluginController < ApplicationController | @@ -68,23 +75,37 @@ class ElasticsearchPluginController < ApplicationController | ||
68 | query | 75 | query |
69 | end | 76 | end |
70 | 77 | ||
71 | - def get_terms params | ||
72 | - terms = {} | ||
73 | - return terms unless params[:filter].present? | ||
74 | - params[:filter].keys.each do |model| | ||
75 | - terms[model] = {} | ||
76 | - params[:filter][model].keys.each do |filter| | ||
77 | - @checkbox[filter.to_sym] = true | ||
78 | - terms[model][params[:filter][model.to_sym][filter]] = filter | ||
79 | - end | 78 | + |
79 | + def search_from_all_models | ||
80 | + models = [] | ||
81 | + query = get_query params[:q] | ||
82 | + | ||
83 | + SEARCHABLE_TYPES.keys.each {| model | models.append( model.to_s.classify.constantize) if model != :all } | ||
84 | + Elasticsearch::Model.search(query, models, size: default_per_page).page(params[:page]).records | ||
85 | + end | ||
86 | + | ||
87 | + def search_from_model model | ||
88 | + begin | ||
89 | + klass = model.to_s.classify.constantize | ||
90 | + query = get_query params[:q], klass | ||
91 | + klass.search(query, size: default_per_page).page(params[:page]).records | ||
92 | + rescue | ||
93 | + [] | ||
80 | end | 94 | end |
81 | - terms | ||
82 | end | 95 | end |
83 | 96 | ||
84 | - def results model | ||
85 | - klass = model.to_s.classify.constantize | ||
86 | - query = get_query params[:q], klass | ||
87 | - @results |= klass.__elasticsearch__.search(query).records.to_a | 97 | + def define_searchable_types |
98 | + @searchable_types = SEARCHABLE_TYPES | ||
99 | + @selected_type = params[:selected_type].nil? ? :all : params[:selected_type].to_sym | ||
100 | + end | ||
101 | + | ||
102 | + def define_search_fields_types | ||
103 | + @search_filter_types = SEARCH_FILTERS | ||
104 | + @selected_filter_field = params[:selected_filter_field].nil? ? SEARCH_FILTERS.keys.first : params[:selected_filter_field].to_sym | ||
105 | + end | ||
106 | + | ||
107 | + def default_per_page | ||
108 | + 10 | ||
88 | end | 109 | end |
89 | 110 | ||
90 | end | 111 | end |
plugins/elasticsearch/lib/elasticsearch_plugin.rb
@@ -8,4 +8,7 @@ class ElasticsearchPlugin < Noosfero::Plugin | @@ -8,4 +8,7 @@ class ElasticsearchPlugin < Noosfero::Plugin | ||
8 | _("This plugin is used to communicate a elasticsearch to privide a search.") | 8 | _("This plugin is used to communicate a elasticsearch to privide a search.") |
9 | end | 9 | end |
10 | 10 | ||
11 | + def stylesheet? | ||
12 | + true | ||
13 | + end | ||
11 | end | 14 | end |
@@ -0,0 +1,78 @@ | @@ -0,0 +1,78 @@ | ||
1 | +.controller-elasticsearch_plugin .wrapper { | ||
2 | + display: flex; | ||
3 | +} | ||
4 | + | ||
5 | +.controller-elasticsearch_plugin .sidebar { | ||
6 | + width: 150px; | ||
7 | +} | ||
8 | + | ||
9 | +.controller-elasticsearch_plugin .search_form { | ||
10 | + flex: 1; | ||
11 | +} | ||
12 | + | ||
13 | +.controller-elasticsearch_plugin .search_form .search_field { | ||
14 | + margin-top: 5px; | ||
15 | +} | ||
16 | +.controller-elasticsearch_plugin .search_form .search_field #q { | ||
17 | + width: 500px; | ||
18 | +} | ||
19 | + | ||
20 | +.controller-elasticsearch_plugin .results-count { | ||
21 | + margin-top: 7px; | ||
22 | + margin-right: 15px; | ||
23 | + text-align: right; | ||
24 | +} | ||
25 | + | ||
26 | +.controller-elasticsearch_plugin ul { | ||
27 | + list-style: none; | ||
28 | + list-style-position: inside; | ||
29 | + padding-left: 0px; | ||
30 | +} | ||
31 | + | ||
32 | +.controller-elasticsearch_plugin .select-search-type { | ||
33 | + padding: 10px; | ||
34 | + margin: 10px; | ||
35 | + font-weight: 900; | ||
36 | + font-family: arial; | ||
37 | + border: 1px solid #ddd; | ||
38 | + margin-top: 0px; | ||
39 | + margin-bottom: 0px; | ||
40 | +} | ||
41 | +.controller-elasticsearch_plugin .select-search-type.active { | ||
42 | + padding: 10px; | ||
43 | + background: #ccc; | ||
44 | + margin-left: 10px; | ||
45 | + margin-right: 10px; | ||
46 | + font-weight: 900; | ||
47 | + font-family: arial; | ||
48 | +} | ||
49 | + | ||
50 | +.controller-elasticsearch_plugin .select-search-type a { | ||
51 | + text-decoration: none; | ||
52 | + color: black; | ||
53 | +} | ||
54 | + | ||
55 | +.controller-elasticsearch_plugin .search-item .model-label { | ||
56 | + background: #ddd; | ||
57 | + color: black; | ||
58 | + font-weight: 900; | ||
59 | + padding: 3px; | ||
60 | +} | ||
61 | + | ||
62 | +.controller-elasticsearch_plugin .search-item { | ||
63 | + margin-bottom: 25px; | ||
64 | + margin-top: 25px; | ||
65 | +} | ||
66 | + | ||
67 | +.controller-elasticsearch_plugin .search-item .person-item { | ||
68 | + display: flex; | ||
69 | +} | ||
70 | + | ||
71 | +.controller-elasticsearch_plugin .right-side { | ||
72 | + flex: 2; | ||
73 | +} | ||
74 | + | ||
75 | +.controller-elasticsearch_plugin .left-side { | ||
76 | + margin-left: 25px; | ||
77 | + width: 100px; | ||
78 | +} |
plugins/elasticsearch/views/elasticsearch_plugin/_article_display.html.erb
plugins/elasticsearch/views/elasticsearch_plugin/_community_display.html.erb
plugins/elasticsearch/views/elasticsearch_plugin/_event_display.html.erb
0 → 100644
plugins/elasticsearch/views/elasticsearch_plugin/_person_display.html.erb
1 | - | ||
2 | -Person: <%= person.name %> | 1 | +<div class="person-item"> |
2 | + <div class="left-side"> | ||
3 | + <%= profile_image person %> | ||
4 | + </div> | ||
5 | + <div class="right-side"> | ||
6 | + <%= person.created_at.strftime("%d %B %Y at %H:%M") %> - <%= person.name %> <span class="model-label"><%= _("PERSON") %></span> | ||
7 | + <div class="body"> | ||
8 | + <h2><%= person.name %></h2> | ||
9 | + <p><%= person.description %></p> | ||
10 | + </div> | ||
11 | + </div> | ||
12 | +</div> |
plugins/elasticsearch/views/elasticsearch_plugin/search.html.erb
1 | -<h1> Search </h1> | ||
2 | - | ||
3 | -<%= form_tag controller: "elasticsearch_plugin", action: "search" do %> | ||
4 | - <%= label_tag(:q, _("Search")) %> | ||
5 | - <%= text_field_tag(:q, @query) %> | ||
6 | - | ||
7 | - <%= submit_tag _("Send") %> | ||
8 | - | ||
9 | - <%= check_box_tag 'model[communities]', 1, @checkbox[:communities] %> | ||
10 | - <%= label_tag('communities', _("communities")) %> | ||
11 | - | ||
12 | - <%= check_box_tag 'model[people]', 1, @checkbox[:people] %> | ||
13 | - <%= label_tag('people', _("people")) %> | ||
14 | - | ||
15 | - <%= check_box_tag 'model[articles]', 1, @checkbox[:articles] %> | ||
16 | - <%= label_tag('articles', _("articles")) %> | ||
17 | - | ||
18 | -<% end %> | ||
19 | - | ||
20 | -<% for result in @results %> | ||
21 | - <% if result.is_a? Article %> | ||
22 | - <%= render partial: "article_display", :locals => {:article => result} %> | ||
23 | - <br> | ||
24 | - <% end %> | ||
25 | - | ||
26 | - <% if result.is_a? Person %> | ||
27 | - <%= render partial: "person_display", :locals => {:person => result} %> | ||
28 | - <br> | ||
29 | - <% end %> | ||
30 | - <% if result.is_a? Community %> | ||
31 | - <%= render partial: "community_display", :locals => {:community => result} %> | ||
32 | - <br> | ||
33 | - <% end %> | ||
34 | -<% end %> | 1 | +<div class="wrapper"> |
2 | + | ||
3 | + <div class="sidebar"> | ||
4 | + <div class="results-count"> | ||
5 | + <%= @results.total %> <%= _(" results by") %> : | ||
6 | + </div> | ||
7 | + <ul> | ||
8 | + <% for type,value in @searchable_types %> | ||
9 | + <li class="select-search-type <%= "active" if type == @selected_type %>"> | ||
10 | + <%= link_to value[:label], "?selected_type=#{type}&q=#{@query}&selected_filter_field=#{@selected_filter_field}"%> | ||
11 | + </li> | ||
12 | + <% end %> | ||
13 | + </ul> | ||
14 | + | ||
15 | + <div class="search-filter"> | ||
16 | + <h3><%= _("Filter by") %></h3> | ||
17 | + <ul> | ||
18 | + <% for type in @search_filter_types.values %> | ||
19 | + <li><a href="#"><%= type[:label] %></a></li> | ||
20 | + <% end %> | ||
21 | + </ul> | ||
22 | + </div> | ||
23 | + </div> | ||
24 | + | ||
25 | + <div class="search_form"> | ||
26 | + <div class="search_field"> | ||
27 | + <%= form_tag '/plugin/elasticsearch/search', method: :get do %> | ||
28 | + <%= hidden_field_tag "selected_type", @selected_type %> | ||
29 | + <%= hidden_field_tag "selected_filter_field", @selected_filter_field %> | ||
30 | + <%= text_field_tag :q, @query %> | ||
31 | + <%= submit_tag _("Send") %> | ||
32 | + <% end %> | ||
33 | + </div> | ||
34 | + | ||
35 | + <div class="results"> | ||
36 | + <% for result in @results.to_a %> | ||
37 | + <% for klass in @searchable_types.keys %> | ||
38 | + <% next if klass.to_s.include? "all" %> | ||
39 | + <% if result.is_a? klass.to_s.classify.constantize %> | ||
40 | + <div class="search-item"> | ||
41 | + <%= render partial: "#{klass}_display", :locals => { klass => result} %> | ||
42 | + </div> | ||
43 | + <% break %> | ||
44 | + <% end %> | ||
45 | + <% end %> | ||
46 | + <% end %> | ||
47 | + <div class="search_paginate"> | ||
48 | + <%= pagination_links @results %> | ||
49 | + </div> | ||
50 | + </div> | ||
51 | + </div> | ||
52 | +</div> |