diff --git a/app/controllers/management/spending_proposals_controller.rb b/app/controllers/management/spending_proposals_controller.rb
index e6170722a..ee2c3c695 100644
--- a/app/controllers/management/spending_proposals_controller.rb
+++ b/app/controllers/management/spending_proposals_controller.rb
@@ -1,6 +1,12 @@
class Management::SpendingProposalsController < Management::BaseController
before_action :check_verified_user
+ before_action :set_spending_proposal, only: [:vote, :show]
+
+ def index
+ @spending_proposals = apply_filters_and_search(SpendingProposal).page(params[:page]).for_render
+ set_spending_proposal_votes(@spending_proposals)
+ end
def new
@spending_proposal = SpendingProposal.new
@@ -18,12 +24,20 @@ class Management::SpendingProposalsController < Management::BaseController
end
def show
- @spending_proposal = SpendingProposal.find(params[:id])
+ set_spending_proposal_votes(@spending_proposal)
+ end
+
+ def vote
+ @spending_proposal.register_vote(current_user, 'yes')
set_spending_proposal_votes(@spending_proposal)
end
private
+ def set_spending_proposal
+ @spending_proposal = SpendingProposal.find(params[:id])
+ end
+
def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service, :captcha, :captcha_key)
end
@@ -43,4 +57,14 @@ class Management::SpendingProposalsController < Management::BaseController
@spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {}
end
+ def apply_filters_and_search(target)
+ target = params[:unfeasible].present? ? target.unfeasible : target.not_unfeasible
+ if params[:geozone].present?
+ target = target.by_geozone(params[:geozone])
+ set_geozone_name
+ end
+ target = target.search(params[:search]) if params[:search].present?
+ target
+ end
+
end
diff --git a/app/views/admin/shared/_spending_proposal_search.html.erb b/app/views/admin/shared/_spending_proposal_search.html.erb
new file mode 100644
index 000000000..d017d2716
--- /dev/null
+++ b/app/views/admin/shared/_spending_proposal_search.html.erb
@@ -0,0 +1,10 @@
+<%= form_for(SpendingProposal.new, url: url, as: :spending_proposal, method: :get) do |f| %>
+
+
+ <%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %>
+
+
+ <%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success" %>
+
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/management/spending_proposals/_spending_proposal.html.erb b/app/views/management/spending_proposals/_spending_proposal.html.erb
new file mode 100644
index 000000000..59b8bc675
--- /dev/null
+++ b/app/views/management/spending_proposals/_spending_proposal.html.erb
@@ -0,0 +1 @@
+<%= render partial: 'spending_proposals/spending_proposal', locals: {spending_proposal: spending_proposal} %>
\ No newline at end of file
diff --git a/app/views/management/spending_proposals/_votes.html.erb b/app/views/management/spending_proposals/_votes.html.erb
new file mode 100644
index 000000000..6549aa204
--- /dev/null
+++ b/app/views/management/spending_proposals/_votes.html.erb
@@ -0,0 +1,2 @@
+<%= render 'spending_proposals/votes',
+ { spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: 'yes') } %>
\ No newline at end of file
diff --git a/app/views/management/spending_proposals/index.html.erb b/app/views/management/spending_proposals/index.html.erb
new file mode 100644
index 000000000..63f4c6ea2
--- /dev/null
+++ b/app/views/management/spending_proposals/index.html.erb
@@ -0,0 +1,22 @@
+
+ <%= render 'admin/shared/spending_proposal_search', url: management_spending_proposals_path %>
+
+
+
+
+
+ <%= content_tag(:h2, t("spending_proposals.index.unfeasible")) if params[:unfeasible].present? %>
+ <%= content_tag(:h2, t("spending_proposals.index.by_geozone", geozone: @geozone_name)) if @geozone_name.present? %>
+ <% if params[:search].present? %>
+
+ <%= page_entries_info @spending_proposals %>
+ <%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: params[:search]) %>
+
+ <% end %>
+
+
+ <%= render @spending_proposals %>
+ <%= paginate @spending_proposals %>
+
+
+
\ No newline at end of file
diff --git a/app/views/management/spending_proposals/vote.js.erb b/app/views/management/spending_proposals/vote.js.erb
new file mode 100644
index 000000000..2c789f995
--- /dev/null
+++ b/app/views/management/spending_proposals/vote.js.erb
@@ -0,0 +1 @@
+<%= render template: 'spending_proposals/vote' %>
\ No newline at end of file
diff --git a/app/views/spending_proposals/_spending_proposal.html.erb b/app/views/spending_proposals/_spending_proposal.html.erb
index 7dff660fc..af59def70 100644
--- a/app/views/spending_proposals/_spending_proposal.html.erb
+++ b/app/views/spending_proposals/_spending_proposal.html.erb
@@ -8,7 +8,7 @@
<% cache [locale_and_user_status(spending_proposal), 'index', spending_proposal, spending_proposal.author] do %>
<%= t("spending_proposals.spending_proposal.spending_proposal") %>
- <%= link_to spending_proposal.title, spending_proposal_path(spending_proposal) %>
+ <%= link_to spending_proposal.title, namespaced_spending_proposal_path(spending_proposal) %>
<%= l spending_proposal.created_at.to_date %>
@@ -42,7 +42,7 @@
<%= geozone_name(spending_proposal) %>
-
<%= link_to spending_proposal.description, spending_proposal_path(spending_proposal) %>
+
<%= link_to spending_proposal.description, namespaced_spending_proposal_path(spending_proposal) %>
<% end %>
@@ -50,7 +50,7 @@
- <%= render 'spending_proposals/votes',
+ <%= render 'votes',
{ spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: 'yes') } %>
diff --git a/app/views/spending_proposals/show.html.erb b/app/views/spending_proposals/show.html.erb
index ba80fc223..99aab4e17 100644
--- a/app/views/spending_proposals/show.html.erb
+++ b/app/views/spending_proposals/show.html.erb
@@ -36,7 +36,7 @@
<%= t("votes.supports") %>
- <%= render 'spending_proposals/votes',
+ <%= render 'votes',
{ spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: 'yes') } %>
diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml
index 47cbad031..33d3c8434 100755
--- a/config/locales/admin.en.yml
+++ b/config/locales/admin.en.yml
@@ -145,6 +145,9 @@ en:
proposal_search:
button: Search
placeholder: Search proposals by title, code, description or question
+ spending_proposal_search:
+ button: Search
+ placeholder: Search spending proposals by title or description
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 c8a710d72..ec0fa5483 100644
--- a/config/locales/admin.es.yml
+++ b/config/locales/admin.es.yml
@@ -145,6 +145,9 @@ es:
proposal_search:
button: Buscar
placeholder: Buscar propuestas por título, código, descripción o pregunta
+ spending_proposal_search:
+ button: Buscar
+ placeholder: Buscar propuestas por título o descripción
user_search:
button: Buscar
placeholder: Buscar usuario por nombre o email
diff --git a/config/routes.rb b/config/routes.rb
index e27d035f2..f5e22b91a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -252,7 +252,11 @@ Rails.application.routes.draw do
end
end
- resources :spending_proposals, only: [:index, :new, :create, :show]
+ resources :spending_proposals, only: [:index, :new, :create, :show] do
+ member do
+ post :vote
+ end
+ end
end
if Rails.env.development?
diff --git a/spec/features/management/spending_proposals_spec.rb b/spec/features/management/spending_proposals_spec.rb
index 52ea36801..9ee161fd8 100644
--- a/spec/features/management/spending_proposals_spec.rb
+++ b/spec/features/management/spending_proposals_spec.rb
@@ -51,4 +51,128 @@ feature 'Spending Proposals' do
end
end
+ context "Searching" do
+ scenario "by title" do
+ spending_proposal1 = create(:spending_proposal, title: "Show me what you got")
+ spending_proposal2 = create(:spending_proposal, title: "Get Schwifty")
+
+ user = create(:user, :level_two)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ fill_in "search", with: "what you got"
+ click_button "Search"
+
+ expect(current_path).to eq(management_spending_proposals_path)
+
+ within("#investment-projects") do
+ expect(page).to have_css('.investment-project', count: 1)
+ expect(page).to have_content(spending_proposal1.title)
+ expect(page).to_not have_content(spending_proposal2.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.description)
+ end
+ end
+
+ scenario "by district" do
+ spending_proposal1 = create(:spending_proposal, title: "Hey ho", geozone_id: create(:geozone, name: "District 9").id)
+ spending_proposal2 = create(:spending_proposal, title: "Let's go", geozone_id: create(:geozone, name: "Area 52").id)
+
+ user = create(:user, :level_two)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ fill_in "search", with: "Area 52"
+ click_button "Search"
+
+ expect(current_path).to eq(management_spending_proposals_path)
+
+ within("#investment-projects") do
+ expect(page).to have_css('.investment-project', count: 1)
+ expect(page).to_not have_content(spending_proposal1.title)
+ expect(page).to have_content(spending_proposal2.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.description)
+ end
+ end
+ end
+
+ scenario "Listing" do
+ spending_proposal1 = create(:spending_proposal, title: "Show me what you got")
+ spending_proposal2 = create(:spending_proposal, title: "Get Schwifty")
+
+ user = create(:user, :level_two)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ expect(current_path).to eq(management_spending_proposals_path)
+
+ within(".account-info") do
+ expect(page).to have_content "Identified as"
+ expect(page).to have_content "#{user.username}"
+ expect(page).to have_content "#{user.email}"
+ expect(page).to have_content "#{user.document_number}"
+ end
+
+ within("#investment-projects") do
+ expect(page).to have_css('.investment-project', count: 2)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal1)}']", text: spending_proposal1.description)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.title)
+ expect(page).to have_css("a[href='#{management_spending_proposal_path(spending_proposal2)}']", text: spending_proposal2.description)
+ end
+ end
+
+ context "Voting" do
+
+ scenario 'Voting spending proposals on behalf of someone in index view', :js do
+ spending_proposal = create(:spending_proposal)
+
+ user = create(:user, :level_two)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ within("#investment-projects") do
+ find('.in-favor a').click
+
+ expect(page).to have_content "1 support"
+ expect(page).to have_content "You have already supported this. Share it!"
+ end
+ expect(current_path).to eq(management_spending_proposals_path)
+ end
+
+ scenario 'Voting spending proposals on behalf of someone in show view', :js do
+ spending_proposal = create(:spending_proposal)
+
+ user = create(:user, :level_two)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ within("#investment-projects") do
+ click_link spending_proposal.title
+ end
+
+ find('.in-favor a').click
+ expect(page).to have_content "1 support"
+ expect(page).to have_content "You have already supported this. Share it!"
+ expect(current_path).to eq(management_spending_proposal_path(spending_proposal))
+ end
+
+ scenario "Should not allow unverified users to vote proposals" do
+ spending_proposal = create(:spending_proposal)
+
+ user = create(:user)
+ login_managed_user(user)
+
+ click_link "Support spending proposals"
+
+ expect(page).to have_content "User is not verified"
+ end
+ end
+
end
\ No newline at end of file