diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss
index e01655f6d..cfec260e1 100644
--- a/app/assets/stylesheets/admin.scss
+++ b/app/assets/stylesheets/admin.scss
@@ -116,7 +116,7 @@ body.admin {
[class^="icon-"] {
display: inline-block;
font-size: rem-calc(24);
- padding-right: rem-calc(24);
+ padding-right: rem-calc(12);
padding-top: rem-calc(4);
padding-left: 12px\9 !important;
padding-right: 12px\9 !important;
@@ -349,3 +349,9 @@ body.admin {
margin-bottom: 0;
}
+body.admin {
+
+ .investment-projects-list.medium-9 {
+ width: 100%;
+ }
+}
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/helpers/spending_proposals_helper.rb b/app/helpers/spending_proposals_helper.rb
index 43ef7311a..ba68ad42a 100644
--- a/app/helpers/spending_proposals_helper.rb
+++ b/app/helpers/spending_proposals_helper.rb
@@ -3,4 +3,14 @@ module SpendingProposalsHelper
def spending_proposal_tags_select_options
ActsAsTaggableOn::Tag.spending_proposal_tags.pluck(:name)
end
+
+ def namespaced_spending_proposal_path(spending_proposal, options={})
+ @namespace_spending_proposal_path ||= namespace
+ case @namespace_spending_proposal_path
+ when "management"
+ management_spending_proposal_path(spending_proposal, options)
+ else
+ spending_proposal_path(spending_proposal, options)
+ end
+ end
end
\ No newline at end of file
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..c3e276ebe
--- /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 expanded" %>
+
+
+<% end %>
\ No newline at end of file
diff --git a/app/views/management/_account_info.html.erb b/app/views/management/_account_info.html.erb
index d27f1524d..20a6bc24d 100644
--- a/app/views/management/_account_info.html.erb
+++ b/app/views/management/_account_info.html.erb
@@ -1,5 +1,5 @@
<% if managed_user.document_number.present? %>
-
+
<%= link_to(t("management.account_info.change_user"), logout_management_users_path, method: :delete, class: 'float-right change-user') %>
diff --git a/app/views/management/_menu.html.erb b/app/views/management/_menu.html.erb
index 1810ab568..520cd9f8c 100644
--- a/app/views/management/_menu.html.erb
+++ b/app/views/management/_menu.html.erb
@@ -34,6 +34,13 @@
<% end %>
+
>
+ <%= link_to management_spending_proposals_path do %>
+
+ <%= t("management.menu.support_spending_proposals") %>
+ <% end %>
+
+
>
<%= link_to print_management_proposals_path do %>
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..e02d6920f
--- /dev/null
+++ b/app/views/management/spending_proposals/index.html.erb
@@ -0,0 +1,25 @@
+
+
+ <%= 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/locales/management.en.yml b/config/locales/management.en.yml
index 7d8a9f12e..1e8e99196 100644
--- a/config/locales/management.en.yml
+++ b/config/locales/management.en.yml
@@ -41,6 +41,7 @@ en:
print_proposals: Print proposals
support_proposals: Support proposals
create_spending_proposal: Create spending proposal
+ support_spending_proposals: Support spending proposals
title: Management
users: Users
permissions:
diff --git a/config/locales/management.es.yml b/config/locales/management.es.yml
index 5c1fe68d9..f1de3cf88 100644
--- a/config/locales/management.es.yml
+++ b/config/locales/management.es.yml
@@ -40,7 +40,8 @@ es:
create_proposal: Crear propuesta
print_proposals: Imprimir propuestas
support_proposals: Apoyar propuestas
- create_spending_proposal: Crear propuesta de gasto
+ create_spending_proposal: Crear propuesta de inversión
+ support_spending_proposals: Apoyar propuestas de inversión
title: Gestión
users: Usuarios
permissions:
@@ -62,7 +63,7 @@ es:
spending_proposals:
alert:
unverified_user: Este usuario no está verificado
- create: Crear propuesta de gasto
+ create: Crear propuesta de inversión
sessions:
signed_out: Has cerrado la sesión correctamente.
signed_out_managed_user: Se ha cerrado correctamente la sesión del usuario.
diff --git a/config/routes.rb b/config/routes.rb
index 0d704be04..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: [: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/db/dev_seeds.rb b/db/dev_seeds.rb
index ac4695d0f..ffbc8237d 100644
--- a/db/dev_seeds.rb
+++ b/db/dev_seeds.rb
@@ -46,6 +46,12 @@ moderator.create_moderator
valuator = create_user('valuator@madrid.es', 'valuator')
valuator.create_valuator
+level_2 = create_user('leveltwo@madrid.es', 'level 2')
+level_2.update(residence_verified_at: Time.now, confirmed_phone: Faker::PhoneNumber.phone_number, document_number: "2222222222", document_type: "1" )
+
+verified = create_user('verified@madrid.es', 'verified')
+verified.update(residence_verified_at: Time.now, confirmed_phone: Faker::PhoneNumber.phone_number, document_type: "1", verified_at: Time.now, document_number: "3333333333")
+
(1..10).each do |i|
org_name = Faker::Company.name
org_user = create_user("org#{i}@madrid.es", org_name)
diff --git a/db/schema.rb b/db/schema.rb
index 55021dfa0..a031c51f5 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -312,7 +312,7 @@ ActiveRecord::Schema.define(version: 20160329160106) do
t.integer "price_first_year", limit: 8
t.string "time_scope"
t.datetime "unfeasible_email_sent_at"
- t.integer "cached_votes_up"
+ t.integer "cached_votes_up", default: 0
t.tsvector "tsv"
end
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