Commit ab66733b3d0249a72d9213cabe6622eb7de989d0
Committed by
Gabriela Navarro
1 parent
8d0bfa0c
Exists in
master
and in
5 other branches
Refactor search dynamic text
Signed-off-by: Fabio Teixeira <fabio1079@gmail.com> Signed-off-by: Luciano Prestes <lucianopcbr@gmail.com>
Showing
6 changed files
with
59 additions
and
10 deletions
Show diff stats
features/software_catalog.feature
| ... | ... | @@ -37,7 +37,7 @@ Feature: Search software |
| 37 | 37 | @selenium |
| 38 | 38 | Scenario: Show software "One" when searching for "Software One" |
| 39 | 39 | Given I go to /search/software_infos |
| 40 | - And I fill in "search-input" with "Software One" | |
| 40 | + And I fill in "search-input" with "One" | |
| 41 | 41 | And I keyup on selector "#search-input" |
| 42 | 42 | Then I should see "Software One" |
| 43 | 43 | Then I should not see "Software Two" | ... | ... |
lib/ext/community.rb
lib/ext/search_controller.rb
| ... | ... | @@ -26,6 +26,7 @@ class SearchController |
| 26 | 26 | results = results.paginate(:per_page => @per_page, :page => params[:page]) |
| 27 | 27 | @searches[@asset] = {:results => results} |
| 28 | 28 | @search = results |
| 29 | + @software_count = filter_software_infos_list.count | |
| 29 | 30 | render :layout=>false if request.xhr? |
| 30 | 31 | end |
| 31 | 32 | |
| ... | ... | @@ -65,7 +66,8 @@ class SearchController |
| 65 | 66 | end |
| 66 | 67 | |
| 67 | 68 | def get_filtered_software_list |
| 68 | - filtered_software_list = SoftwareInfo.like_search(params[:query]) | |
| 69 | + params[:query] ||= "" | |
| 70 | + filtered_software_list = SoftwareInfo.search_by_query(params[:query]) | |
| 69 | 71 | |
| 70 | 72 | category_ids = get_filter_category_ids |
| 71 | 73 | ... | ... |
lib/software_info.rb
| 1 | 1 | class SoftwareInfo < ActiveRecord::Base |
| 2 | 2 | acts_as_having_settings :field => :settings |
| 3 | 3 | |
| 4 | + SEARCHABLE_SOFTWARE_FIELDS = { | |
| 5 | + :acronym => 1, | |
| 6 | + :finality => 2, | |
| 7 | + } | |
| 8 | + | |
| 9 | + scope :search_by_query, lambda {|query = ""| | |
| 10 | + filtered_query = query.gsub(/[\|\(\)\\\/\s\[\]'"*%&!:]/,' ').split.map{|w| w += ":*"}.join('|') | |
| 11 | + search_fields = SoftwareInfo.pg_search_plugin_fields | |
| 12 | + | |
| 13 | + if query.empty? | |
| 14 | + SoftwareInfo.all | |
| 15 | + else | |
| 16 | + joins(:community).where("to_tsvector('simple', #{search_fields}) @@ to_tsquery('#{filtered_query}')") | |
| 17 | + end | |
| 18 | + } | |
| 19 | + | |
| 20 | + def self.pg_search_plugin_fields | |
| 21 | + searchable_fields = Community::SEARCHABLE_SOFTWARE_FIELDS.keys.map(&:to_s).sort.map {|f| "coalesce(#{Community.table_name}.#{f}, '')"}.join(" || ' ' || ") | |
| 22 | + searchable_fields += " || ' ' || " | |
| 23 | + searchable_fields += self::SEARCHABLE_SOFTWARE_FIELDS.keys.map(&:to_s).sort.map {|f| "coalesce(#{table_name}.#{f}, '')"}.join(" || ' ' || ") | |
| 24 | + | |
| 25 | + searchable_fields | |
| 26 | + end | |
| 27 | + | |
| 4 | 28 | SEARCH_FILTERS = [] |
| 5 | 29 | SEARCH_DISPLAYS = %w[full] |
| 6 | 30 | |
| ... | ... | @@ -41,7 +65,7 @@ class SoftwareInfo < ActiveRecord::Base |
| 41 | 65 | # used on find_by_contents |
| 42 | 66 | scope :like_search, lambda{ |name| |
| 43 | 67 | joins(:community).where( |
| 44 | - "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?", | |
| 68 | + "name ILIKE ? OR acronym ILIKE ? OR finality ILIKE ?", | |
| 45 | 69 | "%#{name}%", "%#{name}%", "%#{name}%" |
| 46 | 70 | ) |
| 47 | 71 | } | ... | ... |
public/software-catalog.js
| ... | ... | @@ -95,20 +95,27 @@ |
| 95 | 95 | |
| 96 | 96 | |
| 97 | 97 | function update_search_page_on_ajax(response) { |
| 98 | - close_loading(); | |
| 99 | 98 | response = $(response); |
| 100 | 99 | var search_list = $("#search-results"); |
| 101 | 100 | var selected_categories_field = $("#filter-categories-select-catalog"); |
| 102 | 101 | var pagination = $("#software-pagination"); |
| 102 | + var software_count = $("#software-count"); | |
| 103 | 103 | |
| 104 | 104 | var result_list = response.find("#search-results").html(); |
| 105 | 105 | var result_categories = response.find("#filter-categories-select-catalog").html(); |
| 106 | 106 | var result_pagination = response.find("#software-pagination").html(); |
| 107 | + var result_software_count = response.find("#software-count").html(); | |
| 107 | 108 | |
| 108 | 109 | search_list.html(result_list); |
| 109 | 110 | selected_categories_field.html(result_categories); |
| 110 | 111 | pagination.html(result_pagination); |
| 112 | + software_count.html(result_software_count); | |
| 111 | 113 | show_head_message(); |
| 114 | + | |
| 115 | + setTimeout(function(){ | |
| 116 | + console.log("fgdjfgdsh"); | |
| 117 | + close_loading(); | |
| 118 | + }, 1000); | |
| 112 | 119 | } |
| 113 | 120 | |
| 114 | 121 | |
| ... | ... | @@ -127,10 +134,17 @@ |
| 127 | 134 | |
| 128 | 135 | function update_page_by_text_filter() { |
| 129 | 136 | var text = this.value; |
| 137 | + dispatch_search_ajax(update_search_page_on_ajax, false); | |
| 138 | + } | |
| 130 | 139 | |
| 131 | - if (text.length >= 3) { | |
| 132 | - dispatch_search_ajax(update_search_page_on_ajax, false); | |
| 133 | - } | |
| 140 | + function search_input_keyup() { | |
| 141 | + var timer = null; | |
| 142 | + | |
| 143 | + $("#search-input").keyup(function() { | |
| 144 | + timer = setTimeout(update_page_by_text_filter, 400); | |
| 145 | + }).keydown(function() { | |
| 146 | + clearTimeout(timer); | |
| 147 | + }); | |
| 134 | 148 | } |
| 135 | 149 | |
| 136 | 150 | function set_events() { |
| ... | ... | @@ -142,7 +156,8 @@ |
| 142 | 156 | $(".project-software").click(selectProjectSoftwareCheckbox); |
| 143 | 157 | $("#software_display").change(update_page_by_ajax_on_select_change); |
| 144 | 158 | $("#sort").change(update_page_by_ajax_on_select_change); |
| 145 | - $("#search-input").keyup(update_page_by_text_filter); | |
| 159 | + | |
| 160 | + search_input_keyup(); | |
| 146 | 161 | } |
| 147 | 162 | |
| 148 | 163 | ... | ... |
views/search/_mpog_search_form.html.erb
| ... | ... | @@ -11,14 +11,16 @@ |
| 11 | 11 | <span class="formfield"> |
| 12 | 12 | <%= text_field_tag 'query', @query, :id => 'search-input', :size => 50, :placeholder=>_("Type words about the software_info you're looking for") %> |
| 13 | 13 | </span> |
| 14 | + | |
| 15 | + <%= submit_button(:search, _('Filter')) %> | |
| 14 | 16 | </div> |
| 15 | 17 | <%= render :partial => 'search_form_extra_fields' %> |
| 16 | 18 | <%= render :partial => 'catalog_filter' %> |
| 17 | 19 | |
| 18 | 20 | <!-- #display-options sera substituido pelo html passado pela equipe de design --> |
| 19 | 21 | <div id="display-options" class=""> |
| 20 | - <div> | |
| 21 | - <strong><%= SoftwareInfo.count %> Softwares</strong> | |
| 22 | + <div id="software-count"> | |
| 23 | + <strong><%= "#{@software_count} Software(s)" %> </strong> | |
| 22 | 24 | </div> |
| 23 | 25 | |
| 24 | 26 | <div> | ... | ... |