From cb052317941e5236cad5db5109b1f4b975442391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Wed, 6 Apr 2016 12:05:43 +0200 Subject: [PATCH] adds index/show/voting to management for sps --- .../spending_proposals_controller.rb | 26 +++- .../shared/_spending_proposal_search.html.erb | 10 ++ .../_spending_proposal.html.erb | 1 + .../spending_proposals/_votes.html.erb | 2 + .../spending_proposals/index.html.erb | 22 ++++ .../management/spending_proposals/vote.js.erb | 1 + .../_spending_proposal.html.erb | 6 +- app/views/spending_proposals/show.html.erb | 2 +- config/locales/admin.en.yml | 3 + config/locales/admin.es.yml | 3 + config/routes.rb | 6 +- .../management/spending_proposals_spec.rb | 124 ++++++++++++++++++ 12 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 app/views/admin/shared/_spending_proposal_search.html.erb create mode 100644 app/views/management/spending_proposals/_spending_proposal.html.erb create mode 100644 app/views/management/spending_proposals/_votes.html.erb create mode 100644 app/views/management/spending_proposals/index.html.erb create mode 100644 app/views/management/spending_proposals/vote.js.erb 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