diff --git a/app/controllers/concerns/commentable_actions.rb b/app/controllers/concerns/commentable_actions.rb index ebea082ea..a6f3fd817 100644 --- a/app/controllers/concerns/commentable_actions.rb +++ b/app/controllers/concerns/commentable_actions.rb @@ -85,7 +85,20 @@ module CommentableActions def parse_advanced_search_terms @advanced_search_present = @advanced_search_terms = params[:advanced_search] if params[:advanced_search].present? - @search_terms = params[:advanced_search][:search] if params[:advanced_search] && params[:advanced_search][:search].present? + parse_search_date + end + + def parse_search_date + return unless search_by_date? + + start = params[:advanced_search][:date_min].to_time + finish = params[:advanced_search][:date_max].try(:to_time) || Time.now + + params[:advanced_search][:date_range] = start.beginning_of_day..finish.end_of_day + end + + def search_by_date? + params[:advanced_search] && params[:advanced_search][:date_min].present? end def set_search_order diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb new file mode 100644 index 000000000..8af4eaa52 --- /dev/null +++ b/app/helpers/search_helper.rb @@ -0,0 +1,23 @@ +module SearchHelper + + def official_level_options + options_for_select([ + [t("shared.advanced_search.author_type_1"), 1], + [t("shared.advanced_search.author_type_2"), 2], + [t("shared.advanced_search.author_type_3"), 3], + [t("shared.advanced_search.author_type_4"), 4], + [t("shared.advanced_search.author_type_5"), 5]], + params[:official_level]) + end + + def date_range_options + options_for_select([ + [t("shared.advanced_search.date_1"), 24.hours.ago], + [t("shared.advanced_search.date_2"), 7.days.ago], + [t("shared.advanced_search.date_3"), 30.days.ago], + [t("shared.advanced_search.date_4"), 365.days.ago], + [t("shared.advanced_search.date_5"), 'custom']], + params[:date_range]) + end + +end \ No newline at end of file diff --git a/app/models/concerns/filterable.rb b/app/models/concerns/filterable.rb index 40576f09c..274c19ac4 100644 --- a/app/models/concerns/filterable.rb +++ b/app/models/concerns/filterable.rb @@ -2,62 +2,28 @@ module Filterable extend ActiveSupport::Concern included do - scope :by_author, -> (author) { where(author: author) } - scope :by_official_level, -> (official_level) { where(users: { official_level: official_level }).joins(:author) } - scope :by_date_range, -> (start, finish) { where(created_at: start.beginning_of_day..finish.end_of_day) } + scope :by_author, -> (username) { where(users: { username: username }).includes(:author) } + scope :by_official_level, -> (official_level) { where(users: { official_level: official_level }).includes(:author) } + scope :by_date_range, -> (date_range) { where(created_at: date_range) } end class_methods do + def filter(params) resources = self.all - filters = parse_filters(params) - - if filters[:params_author] - author = User.where(username: filters[:params_author]).first - resources = author.present? ? self.by_author(author) : self.none - end - - if filters[:params_date] - case filters[:params_date] - when '1' - min_date_time = DateTime.now - 24.hour - when '2' - min_date_time = DateTime.now - 7.day - when '3' - min_date_time = DateTime.now - 30.day - when '4' - min_date_time = DateTime.now - 365.day - when '5' - min_date_time = filters[:params_date_min].to_time + params.each do |filter, value| + if allowed_filter?(filter, value) + resources = resources.send("by_#{filter}", value) end - - max_date_time = filters[:params_date_max].present? ? filters[:params_date_max].to_time : DateTime.now - if min_date_time && max_date_time - resources = self.by_date_range(min_date_time, max_date_time) - end - end - - if filters[:params_author_type] - resources = self.by_official_level(filters[:params_author_type].to_i) end resources end - def parse_filters(params) - search = params - filters = {} - if search - filters[:params_author] = search[:author] if search[:author].present? - filters[:params_author_type] = search[:author_type] if search[:author_type].present? - - filters[:params_date] = search[:date] if search[:date].present? - filters[:params_date_min] = search[:date_min] if (filters[:params_date] == '5') && search[:date_min].present? - filters[:params_date_max] = search[:date_max] if (filters[:params_date]== '5') && search[:date_max].present? - - filters[:advanced_search_present] = true if params[:commit] || filters[:params_author] || filters[:params_author_type] || filters[:params_date] - end - filters + def allowed_filter?(filter, value) + return if value.blank? + ['author', 'official_level', 'date_range'].include?(filter) end + end end \ No newline at end of file diff --git a/app/views/shared/_advanced_search.html.erb b/app/views/shared/_advanced_search.html.erb index a36ba7daf..ebe4b50e4 100644 --- a/app/views/shared/_advanced_search.html.erb +++ b/app/views/shared/_advanced_search.html.erb @@ -1,8 +1,3 @@ -<% # Params: - # - # search_path: for example proposals_path -%> -

<%= t("shared.advanced_search.title") %>

@@ -12,30 +7,37 @@ @@ -73,14 +75,16 @@ $('.advanced-search-title').on({ //hide customized-date if it is not selected -if($('#advanced_search_date').val() != 5){ +if($('#advanced_search_date_min').val() != 'custom'){ $('.customized-date').hide(); + $('.customized-date input').prop('disabled', true); } -$('#advanced_search_date').on('change',function(e){ +$('#advanced_search_date_min').on('change',function(e){ var next = $(e.target).next(); - if($(this).val() == 5){ + if($(this).val() == 'custom'){ next.show(); + $('.customized-date input').prop('disabled', false); } else{ next.hide(); diff --git a/app/views/shared/_search_form_header.html.erb b/app/views/shared/_search_form_header.html.erb index 106072327..9631bd4a1 100644 --- a/app/views/shared/_search_form_header.html.erb +++ b/app/views/shared/_search_form_header.html.erb @@ -1,10 +1,4 @@ -<% # Params: - # - # i18n_namespace: for example "debates.index.search_form" - # search_path: for example debates_path -%> - -
+
<%= form_tag search_path, method: :get do %> diff --git a/spec/features/debates_spec.rb b/spec/features/debates_spec.rb index 6b6798bfc..52964baba 100644 --- a/spec/features/debates_spec.rb +++ b/spec/features/debates_spec.rb @@ -462,8 +462,11 @@ feature 'Debates' do debate3 = create(:debate, title: "Do not show me") visit debates_path - fill_in "search", with: "Schwifty" - click_button "Search" + + within "#search_form" do + fill_in "search", with: "Schwifty" + click_button "Search" + end within("#debates") do expect(page).to have_css('.debate', count: 2) @@ -478,7 +481,7 @@ feature 'Debates' do context "Advanced search" do - scenario "Search by text", :js do + scenario "Search by text", :js, :focus do debate1 = create(:debate, title: "Get Schwifty") debate2 = create(:debate, title: "Schwifty Hello") debate3 = create(:debate, title: "Do not show me") @@ -522,7 +525,7 @@ feature 'Debates' do end #NOTE: Test the different offical levels with unit tests. - scenario "Search by author category", :js do + scenario "Search by author type", :js do ana = create :user, official_level: 1 john = create :user, official_level: 2 @@ -533,7 +536,7 @@ feature 'Debates' do visit debates_path find("h4.advanced-search-title").click - select "Public employee", from: "advanced_search_author_type" + select "Public employee", from: "advanced_search_official_level" click_button "Filter" within("#debates") do @@ -556,7 +559,7 @@ feature 'Debates' do visit debates_path find("h4.advanced-search-title").click - select "Last 24 hours", from: "advanced_search_date" + select "Last 24 hours", from: "advanced_search_date_min" click_button "Filter" within("#debates") do @@ -576,7 +579,7 @@ feature 'Debates' do visit debates_path find("h4.advanced-search-title").click - select "Customized", from: "advanced_search_date" + select "Customized", from: "advanced_search_date_min" fill_in "advanced_search_date_min", with: 7.days.ago fill_in "advanced_search_date_max", with: 1.days.ago click_button "Filter" @@ -636,8 +639,10 @@ feature 'Debates' do debate = create(:debate, title: "Abcdefghi") visit debates_path - fill_in "search", with: debate.title - click_button "Search" + within "#search_form" do + fill_in "search", with: debate.title + click_button "Search" + end expect(page).to_not have_selector('#debates .debate-featured') expect(page).to_not have_selector('#featured-debates') diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index 90957484d..0efd5916f 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -525,8 +525,11 @@ feature 'Proposals' do proposal3 = create(:proposal, title: "Do not show me") visit proposals_path - fill_in "search", with: "Schwifty" - click_button "Search" + + within "#search_form" do + fill_in "search", with: "Schwifty" + click_button "Search" + end within("#proposals") do expect(page).to have_css('.proposal', count: 2) @@ -541,7 +544,7 @@ feature 'Proposals' do context "Advanced search" do - scenario "Search by text", :js do + scenario "Search by text", :js, :focus do proposal1 = create(:proposal, title: "Get Schwifty") proposal2 = create(:proposal, title: "Schwifty Hello") proposal3 = create(:proposal, title: "Do not show me") @@ -585,7 +588,7 @@ feature 'Proposals' do end #NOTE: Test the different offical levels with unit tests. - scenario "Search by author category", :js do + scenario "Search by author type", :js do ana = create :user, official_level: 1 john = create :user, official_level: 2 @@ -596,7 +599,7 @@ feature 'Proposals' do visit proposals_path find("h4.advanced-search-title").click - select "Public employee", from: "advanced_search_author_type" + select "Public employee", from: "advanced_search_official_level" click_button "Filter" within("#proposals") do @@ -619,7 +622,7 @@ feature 'Proposals' do visit proposals_path find("h4.advanced-search-title").click - select "Last 24 hours", from: "advanced_search_date" + select "Last 24 hours", from: "advanced_search_date_min" click_button "Filter" within("#proposals") do @@ -639,7 +642,7 @@ feature 'Proposals' do visit proposals_path find("h4.advanced-search-title").click - select "Customized", from: "advanced_search_date" + select "Customized", from: "advanced_search_date_min" fill_in "advanced_search_date_min", with: 7.days.ago fill_in "advanced_search_date_max", with: 1.days.ago click_button "Filter" @@ -699,8 +702,10 @@ feature 'Proposals' do proposal = create(:proposal, title: "Abcdefghi") visit proposals_path - fill_in "search", with: proposal.title - click_button "Search" + within "#search_form" do + fill_in "search", with: proposal.title + click_button "Search" + end expect(page).to_not have_selector('#proposals .proposal-featured') expect(page).to_not have_selector('#featured-proposals')