diff --git a/app/models/proposal.rb b/app/models/proposal.rb index 5d3a693c6..8100d79fc 100644 --- a/app/models/proposal.rb +++ b/app/models/proposal.rb @@ -55,7 +55,16 @@ class Proposal < ActiveRecord::Base end def self.search(terms) - self.pg_search(terms) + by_code = self.search_by_code(terms.strip) + by_code.present? ? by_code : self.pg_search(terms) + end + + def self.search_by_code(terms) + if code_match = /\A#{Setting["proposal_code_prefix"]}-\d\d\d\d-\d\d-(\d*)\z/.match(terms) + results = where(id: code_match[1]) + end + + return results if (results.present? && results.first.code == terms) end def description diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index 51091b1ed..296ad7167 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -132,7 +132,7 @@ en: shared: proposal_search: button: Search - placeholder: Search proposals by title, description or question + placeholder: Search proposals by title, code, description or question user_search: button: Search placeholder: Search user by name or email' diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index e6c75ccbf..55df87412 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -132,7 +132,7 @@ es: shared: proposal_search: button: Buscar - placeholder: Buscar propuestas por título, descripción o pregunta + placeholder: Buscar propuestas por título, código, descripción o pregunta user_search: button: Buscar placeholder: Buscar usuario por nombre o email diff --git a/spec/features/proposals_spec.rb b/spec/features/proposals_spec.rb index acd2a6e0d..4d1de0af1 100644 --- a/spec/features/proposals_spec.rb +++ b/spec/features/proposals_spec.rb @@ -575,6 +575,25 @@ feature 'Proposals' do end end + scenario 'Search by proposal code' do + proposal1 = create(:proposal, title: "Get Schwifty") + proposal2 = create(:proposal, title: "Schwifty Hello") + + visit proposals_path + + within "#search_form" do + fill_in "search", with: proposal1.code + click_button "Search" + end + + within("#proposals") do + expect(page).to have_css('.proposal', count: 1) + + expect(page).to have_content(proposal1.title) + expect(page).to_not have_content(proposal2.title) + end + end + scenario "Maintain search criteria" do visit proposals_path @@ -1119,10 +1138,10 @@ feature 'Proposals' do create(:proposal, title: 'Seventh proposal, has search term') visit new_proposal_path - fill_in 'proposal_title', with: 'search' + fill_in 'proposal_title', with: 'search' check "proposal_terms_of_service" - - within('div#js-suggest') do + + within('div#js-suggest') do expect(page).to have_content ("You are seeing 5 of 6 proposals containing the term 'search'") end end @@ -1133,14 +1152,14 @@ feature 'Proposals' do create(:proposal, title: 'First proposal').update_column(:confidence_score, 10) create(:proposal, title: 'Second proposal').update_column(:confidence_score, 8) - + visit new_proposal_path fill_in 'proposal_title', with: 'debate' check "proposal_terms_of_service" - within('div#js-suggest') do + within('div#js-suggest') do expect(page).to_not have_content ('You are seeing') end - end + end end end