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? %> -
+
- <%= 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