adds index/show/voting to management for sps

This commit is contained in:
Juanjo Bazán
2016-04-06 12:05:43 +02:00
parent 3c37575f88
commit cb05231794
12 changed files with 200 additions and 6 deletions

View File

@@ -1,6 +1,12 @@
class Management::SpendingProposalsController < Management::BaseController class Management::SpendingProposalsController < Management::BaseController
before_action :check_verified_user 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 def new
@spending_proposal = SpendingProposal.new @spending_proposal = SpendingProposal.new
@@ -18,12 +24,20 @@ class Management::SpendingProposalsController < Management::BaseController
end end
def show 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) set_spending_proposal_votes(@spending_proposal)
end end
private private
def set_spending_proposal
@spending_proposal = SpendingProposal.find(params[:id])
end
def spending_proposal_params def spending_proposal_params
params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service, :captcha, :captcha_key) params.require(:spending_proposal).permit(:title, :description, :external_url, :geozone_id, :terms_of_service, :captcha, :captcha_key)
end end
@@ -43,4 +57,14 @@ class Management::SpendingProposalsController < Management::BaseController
@spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {} @spending_proposal_votes = current_user ? current_user.spending_proposal_votes(spending_proposals) : {}
end 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 end

View File

@@ -0,0 +1,10 @@
<%= form_for(SpendingProposal.new, url: url, as: :spending_proposal, method: :get) do |f| %>
<div class="row">
<div class="small-12 medium-6 column">
<%= text_field_tag :search, "", placeholder: t("admin.shared.spending_proposal_search.placeholder") %>
</div>
<div class="form-inline small-12 medium-6 column">
<%= f.submit t("admin.shared.spending_proposal_search.button"), class: "button success" %>
</div>
</div>
<% end %>

View File

@@ -0,0 +1 @@
<%= render partial: 'spending_proposals/spending_proposal', locals: {spending_proposal: spending_proposal} %>

View File

@@ -0,0 +1,2 @@
<%= render 'spending_proposals/votes',
{ spending_proposal: spending_proposal, vote_url: vote_management_spending_proposal_path(spending_proposal, value: 'yes') } %>

View File

@@ -0,0 +1,22 @@
<main>
<%= render 'admin/shared/spending_proposal_search', url: management_spending_proposals_path %>
<div class="wrap row">
<div id="investment-projects" class="investment-projects-list small-12 medium-9 column">
<div class="small-12 search-results">
<%= 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? %>
<h2>
<%= page_entries_info @spending_proposals %>
<%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: params[:search]) %>
</h2>
<% end %>
</div>
<%= render @spending_proposals %>
<%= paginate @spending_proposals %>
</div>
</div>
</main>

View File

@@ -0,0 +1 @@
<%= render template: 'spending_proposals/vote' %>

View File

@@ -8,7 +8,7 @@
<% cache [locale_and_user_status(spending_proposal), 'index', spending_proposal, spending_proposal.author] do %> <% cache [locale_and_user_status(spending_proposal), 'index', spending_proposal, spending_proposal.author] do %>
<span class="label-investment-project float-left"><%= t("spending_proposals.spending_proposal.spending_proposal") %></span> <span class="label-investment-project float-left"><%= t("spending_proposals.spending_proposal.spending_proposal") %></span>
<span class="icon-budget"></span> <span class="icon-budget"></span>
<h3><%= link_to spending_proposal.title, spending_proposal_path(spending_proposal) %></h3> <h3><%= link_to spending_proposal.title, namespaced_spending_proposal_path(spending_proposal) %></h3>
<p class="investment-project-info"> <p class="investment-project-info">
<%= l spending_proposal.created_at.to_date %> <%= l spending_proposal.created_at.to_date %>
@@ -42,7 +42,7 @@
<%= geozone_name(spending_proposal) %> <%= geozone_name(spending_proposal) %>
</p> </p>
<div class="investment-project-description"> <div class="investment-project-description">
<p><%= link_to spending_proposal.description, spending_proposal_path(spending_proposal) %></p> <p><%= link_to spending_proposal.description, namespaced_spending_proposal_path(spending_proposal) %></p>
<div class="truncate"></div> <div class="truncate"></div>
</div> </div>
<% end %> <% end %>
@@ -50,7 +50,7 @@
</div> </div>
<div id="<%= dom_id(spending_proposal) %>_votes" class="small-12 medium-3 column text-center"> <div id="<%= dom_id(spending_proposal) %>_votes" class="small-12 medium-3 column text-center">
<%= render 'spending_proposals/votes', <%= render 'votes',
{ spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: 'yes') } %> { spending_proposal: spending_proposal, vote_url: vote_spending_proposal_path(spending_proposal, value: 'yes') } %>
</div> </div>

View File

@@ -36,7 +36,7 @@
<h3><%= t("votes.supports") %></h3> <h3><%= t("votes.supports") %></h3>
<div class="text-center"> <div class="text-center">
<div id="<%= dom_id(@spending_proposal) %>_votes"> <div id="<%= dom_id(@spending_proposal) %>_votes">
<%= render 'spending_proposals/votes', <%= render 'votes',
{ spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: 'yes') } %> { spending_proposal: @spending_proposal, vote_url: vote_spending_proposal_path(@spending_proposal, value: 'yes') } %>
</div> </div>
</div> </div>

View File

@@ -145,6 +145,9 @@ en:
proposal_search: proposal_search:
button: Search button: Search
placeholder: Search proposals by title, code, description or question placeholder: Search proposals by title, code, description or question
spending_proposal_search:
button: Search
placeholder: Search spending proposals by title or description
user_search: user_search:
button: Search button: Search
placeholder: Search user by name or email' placeholder: Search user by name or email'

View File

@@ -145,6 +145,9 @@ es:
proposal_search: proposal_search:
button: Buscar button: Buscar
placeholder: Buscar propuestas por título, código, descripción o pregunta 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: user_search:
button: Buscar button: Buscar
placeholder: Buscar usuario por nombre o email placeholder: Buscar usuario por nombre o email

View File

@@ -252,7 +252,11 @@ Rails.application.routes.draw do
end end
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 end
if Rails.env.development? if Rails.env.development?

View File

@@ -51,4 +51,128 @@ feature 'Spending Proposals' do
end end
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 end