Merge pull request #1019 from consul/spending-proposals-index
Spending proposals index
This commit is contained in:
@@ -7,7 +7,7 @@ class Admin::SpendingProposalsController < Admin::BaseController
|
|||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@spending_proposals = SpendingProposal.search(params, @current_filter).order(created_at: :desc).page(params[:page])
|
@spending_proposals = SpendingProposal.scoped_filter(params, @current_filter).order(created_at: :desc).page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ class SpendingProposalsController < ApplicationController
|
|||||||
feature_flag :spending_proposals
|
feature_flag :spending_proposals
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@spending_proposals = @search_terms.present? ? SpendingProposal.search(@search_terms) : SpendingProposal.all
|
||||||
|
@spending_proposals = @spending_proposals.page(params[:page]).for_render
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Valuation::SpendingProposalsController < Valuation::BaseController
|
|||||||
|
|
||||||
def index
|
def index
|
||||||
if current_user.valuator?
|
if current_user.valuator?
|
||||||
@spending_proposals = SpendingProposal.search(params_for_current_valuator, @current_filter).order(created_at: :desc).page(params[:page])
|
@spending_proposals = SpendingProposal.scoped_filter(params_for_current_valuator, @current_filter).order(created_at: :desc).page(params[:page])
|
||||||
else
|
else
|
||||||
@spending_proposals = SpendingProposal.none.page(params[:page])
|
@spending_proposals = SpendingProposal.none.page(params[:page])
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class SpendingProposal < ActiveRecord::Base
|
|||||||
scope :by_tag, -> (tag_name) { tagged_with(tag_name) }
|
scope :by_tag, -> (tag_name) { tagged_with(tag_name) }
|
||||||
scope :by_valuator, -> (valuator) { where("valuation_assignments.valuator_id = ?", valuator.presence).joins(:valuation_assignments) }
|
scope :by_valuator, -> (valuator) { where("valuation_assignments.valuator_id = ?", valuator.presence).joins(:valuation_assignments) }
|
||||||
|
|
||||||
scope :for_render, -> { includes(:geozone, administrator: :user, valuators: :user) }
|
scope :for_render, -> { includes(:geozone) }
|
||||||
|
|
||||||
def description
|
def description
|
||||||
super.try :html_safe
|
super.try :html_safe
|
||||||
@@ -42,14 +42,14 @@ class SpendingProposal < ActiveRecord::Base
|
|||||||
params.select{|x,_| %w{geozone_id administrator_id tag_name valuator_id}.include? x.to_s }
|
params.select{|x,_| %w{geozone_id administrator_id tag_name valuator_id}.include? x.to_s }
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.search(params, current_filter)
|
def self.scoped_filter(params, current_filter)
|
||||||
results = self
|
results = self
|
||||||
results = results.by_geozone(params[:geozone_id]) if params[:geozone_id].present?
|
results = results.by_geozone(params[:geozone_id]) if params[:geozone_id].present?
|
||||||
results = results.by_admin(params[:administrator_id]) if params[:administrator_id].present?
|
results = results.by_admin(params[:administrator_id]) if params[:administrator_id].present?
|
||||||
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
|
results = results.by_tag(params[:tag_name]) if params[:tag_name].present?
|
||||||
results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present?
|
results = results.by_valuator(params[:valuator_id]) if params[:valuator_id].present?
|
||||||
results = results.send(current_filter) if current_filter.present?
|
results = results.send(current_filter) if current_filter.present?
|
||||||
results.for_render
|
results.includes(:geozone, administrator: :user, valuators: :user)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.by_geozone(geozone)
|
def self.by_geozone(geozone)
|
||||||
|
|||||||
11
app/views/spending_proposals/_sidebar.html.erb
Normal file
11
app/views/spending_proposals/_sidebar.html.erb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<div class="sidebar-divider"></div>
|
||||||
|
<h3 class="sidebar-title"><%= t("spending_proposals.index.sidebar.geozones") %></h3>
|
||||||
|
<br>
|
||||||
|
<div class="geozone">
|
||||||
|
<% Geozone.names.each do |geozone| %>
|
||||||
|
<%= link_to geozone, spending_proposals_path(search: geozone) %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-divider"></div>
|
||||||
|
<h3 class="sidebar-title"><%= t("spending_proposals.index.sidebar.feasibility") %></h3>
|
||||||
|
<br>
|
||||||
53
app/views/spending_proposals/_spending_proposal.html.erb
Normal file
53
app/views/spending_proposals/_spending_proposal.html.erb
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<div id="<%= dom_id(spending_proposal) %>" class="investment-project clear">
|
||||||
|
<div class="panel">
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="small-12 medium-9 column">
|
||||||
|
<div class="investment-project-content">
|
||||||
|
|
||||||
|
<% 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="icon-budget"></span>
|
||||||
|
<h3><%= link_to spending_proposal.title, spending_proposal_path(spending_proposal) %></h3>
|
||||||
|
<p class="investment-project-info">
|
||||||
|
|
||||||
|
<%= l spending_proposal.created_at.to_date %>
|
||||||
|
|
||||||
|
<% if spending_proposal.author.hidden? || spending_proposal.author.erased? %>
|
||||||
|
<span class="bullet"> • </span>
|
||||||
|
<span class="author">
|
||||||
|
<%= t("spending_proposals.show.author_deleted") %>
|
||||||
|
</span>
|
||||||
|
<% else %>
|
||||||
|
<span class="bullet"> • </span>
|
||||||
|
<span class="author">
|
||||||
|
<%= spending_proposal.author.name %>
|
||||||
|
</span>
|
||||||
|
<% if spending_proposal.author.official? %>
|
||||||
|
<span class="bullet"> • </span>
|
||||||
|
<span class="label round level-<%= spending_proposal.author.official_level %>">
|
||||||
|
<%= spending_proposal.author.official_position %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% if spending_proposal.author.verified_organization? %>
|
||||||
|
<span class="bullet"> • </span>
|
||||||
|
<span class="label round is-association">
|
||||||
|
<%= t("shared.collective") %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
|
</p>
|
||||||
|
<div class="investment-project-description">
|
||||||
|
<p><%= link_to spending_proposal.description, spending_proposal_path(spending_proposal) %></p>
|
||||||
|
<div class="truncate"></div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -1,16 +1,35 @@
|
|||||||
<% provide :title do %><%= t('spending_proposals.index.title') %><% end %>
|
<% provide :title do %><%= t('spending_proposals.index.title') %><% end %>
|
||||||
<div class="page row-full">
|
<% content_for :header_addon do %>
|
||||||
<div class="row">
|
<%= render "shared/search_form",
|
||||||
<div class="more-information text small-12 medium-8 column">
|
search_path: spending_proposals_path(page: 1),
|
||||||
<h1><%= t('spending_proposals.index.title') %></h1>
|
i18n_namespace: "spending_proposals.index.search_form" %>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<p><%= t('spending_proposals.index.text_html') %></p>
|
<main>
|
||||||
|
<div class="wrap row">
|
||||||
|
<div id="investment-projects" class="investment-projects-list small-12 medium-9 column">
|
||||||
|
|
||||||
<% if can? :create, SpendingProposal %>
|
<div class="small-12 search-results">
|
||||||
<%= link_to t('spending_proposals.index.create_link'), new_spending_proposal_path, class: 'button' %>
|
<% if @search_terms %>
|
||||||
<% else %>
|
<h2>
|
||||||
<p><%= t('spending_proposals.index.verified_only', verify_account: link_to(t('spending_proposals.index.verify_account'), verification_path)).html_safe %></p>
|
<%= page_entries_info @spending_proposals %>
|
||||||
<% end %>
|
<%= t("spending_proposals.index.search_results", count: @spending_proposals.size, search_term: @search_terms) %>
|
||||||
|
</h2>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="show-for-small-only">
|
||||||
|
<%= link_to t("spending_proposals.index.start_spending_proposal"), new_spending_proposal_path, class: 'button expanded' %>
|
||||||
|
</div>
|
||||||
|
<%= render partial: 'spending_proposals/spending_proposal', collection: @spending_proposals %>
|
||||||
|
<%= paginate @spending_proposals %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="small-12 medium-3 column">
|
||||||
|
<aside class="margin-bottom">
|
||||||
|
<%= render 'sidebar' %>
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</main>
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ ignore_unused:
|
|||||||
- 'proposals.index.select_order'
|
- 'proposals.index.select_order'
|
||||||
- 'proposals.index.orders.*'
|
- 'proposals.index.orders.*'
|
||||||
- 'proposals.index.search_form.*'
|
- 'proposals.index.search_form.*'
|
||||||
|
- 'spending_proposals.index.search_form.*'
|
||||||
- 'notifications.index.comments_on*'
|
- 'notifications.index.comments_on*'
|
||||||
- 'notifications.index.replies_to*'
|
- 'notifications.index.replies_to*'
|
||||||
- 'helpers.page_entries_info.*' # kaminari
|
- 'helpers.page_entries_info.*' # kaminari
|
||||||
|
|||||||
@@ -412,11 +412,18 @@ en:
|
|||||||
new: Create
|
new: Create
|
||||||
title: Spending proposal title
|
title: Spending proposal title
|
||||||
index:
|
index:
|
||||||
create_link: Create spending proposal
|
|
||||||
text_html: Here you can send spending proposals to be considered in the frame of the annual participatory budgeting.
|
|
||||||
title: Participatory budgeting
|
title: Participatory budgeting
|
||||||
verified_only: Only verified users can create spending proposals, %{verify_account}.
|
search_form:
|
||||||
verify_account: verify your account
|
button: Search
|
||||||
|
placeholder: Investment projects...
|
||||||
|
title: Search
|
||||||
|
search_results:
|
||||||
|
one: " containing the term '%{search_term}'"
|
||||||
|
other: " containing the term '%{search_term}'"
|
||||||
|
sidebar:
|
||||||
|
geozones: Scope of operation
|
||||||
|
feasibility: Feasibility
|
||||||
|
start_spending_proposal: Create an investment project
|
||||||
new:
|
new:
|
||||||
back_link: Back
|
back_link: Back
|
||||||
more_info: How do participatory budgeting works?
|
more_info: How do participatory budgeting works?
|
||||||
@@ -425,6 +432,10 @@ en:
|
|||||||
recommendation_two: Any proposal or comment suggesting illegal action will be deleted.
|
recommendation_two: Any proposal or comment suggesting illegal action will be deleted.
|
||||||
recommendations_title: How to create a spending proposal
|
recommendations_title: How to create a spending proposal
|
||||||
start_new: Create spending proposal
|
start_new: Create spending proposal
|
||||||
|
show:
|
||||||
|
author_deleted: User deleted
|
||||||
|
spending_proposal:
|
||||||
|
spending_proposal: Investment project
|
||||||
wrong_price_format: Only integer numbers
|
wrong_price_format: Only integer numbers
|
||||||
stats:
|
stats:
|
||||||
index:
|
index:
|
||||||
|
|||||||
@@ -412,11 +412,18 @@ es:
|
|||||||
new: Crear
|
new: Crear
|
||||||
title: Título de la propuesta de gasto
|
title: Título de la propuesta de gasto
|
||||||
index:
|
index:
|
||||||
create_link: Enviar propuesta de gasto
|
|
||||||
text_html: Desde esta sección podrás sugerir propuestas de gasto que irán asociadas a las partidas de presupuestos ciudadanos.<br>El requisito principal es que sean propuestas presupuestables.
|
|
||||||
title: Presupuestos participativos
|
title: Presupuestos participativos
|
||||||
verified_only: Sólo los usuarios verificados pueden crear propuestas de gasto, %{verify_account}.
|
search_form:
|
||||||
verify_account: verifica tu cuenta
|
button: Buscar
|
||||||
|
placeholder: Propuestas de inversión...
|
||||||
|
title: Buscar
|
||||||
|
search_results:
|
||||||
|
one: " que contiene '%{search_term}'"
|
||||||
|
other: " que contienen '%{search_term}'"
|
||||||
|
sidebar:
|
||||||
|
geozones: Ámbitos de actuación
|
||||||
|
feasibility: Viabilidad
|
||||||
|
start_spending_proposal: Crea una propuesta de inversión
|
||||||
new:
|
new:
|
||||||
back_link: Volver
|
back_link: Volver
|
||||||
more_info: "¿Cómo funcionan los presupuestos participativos?"
|
more_info: "¿Cómo funcionan los presupuestos participativos?"
|
||||||
@@ -425,6 +432,10 @@ es:
|
|||||||
recommendation_two: Cualquier propuesta o comentario que implique acciones ilegales será eliminada.
|
recommendation_two: Cualquier propuesta o comentario que implique acciones ilegales será eliminada.
|
||||||
recommendations_title: Cómo crear una propuesta de gasto
|
recommendations_title: Cómo crear una propuesta de gasto
|
||||||
start_new: Crear una propuesta de gasto
|
start_new: Crear una propuesta de gasto
|
||||||
|
show:
|
||||||
|
author_deleted: Usuario eliminado
|
||||||
|
spending_proposal:
|
||||||
|
spending_proposal: Propuesta de inversión
|
||||||
wrong_price_format: Solo puede incluir caracteres numéricos
|
wrong_price_format: Solo puede incluir caracteres numéricos
|
||||||
stats:
|
stats:
|
||||||
index:
|
index:
|
||||||
|
|||||||
@@ -5,17 +5,17 @@ feature 'Spending proposals' do
|
|||||||
let(:author) { create(:user, :level_two, username: 'Isabel') }
|
let(:author) { create(:user, :level_two, username: 'Isabel') }
|
||||||
|
|
||||||
scenario 'Index' do
|
scenario 'Index' do
|
||||||
visit spending_proposals_path
|
spending_proposals = [create(:spending_proposal), create(:spending_proposal), create(:spending_proposal)]
|
||||||
|
|
||||||
expect(page).to_not have_link('Create spending proposal', href: new_spending_proposal_path)
|
|
||||||
expect(page).to have_link('verify your account')
|
|
||||||
|
|
||||||
login_as(author)
|
|
||||||
|
|
||||||
visit spending_proposals_path
|
visit spending_proposals_path
|
||||||
|
|
||||||
expect(page).to have_link('Create spending proposal', href: new_spending_proposal_path)
|
expect(page).to have_selector('#investment-projects .investment-project', count: 3)
|
||||||
expect(page).to_not have_link('verify your account')
|
spending_proposals.each do |spending_proposal|
|
||||||
|
within('#investment-projects') do
|
||||||
|
expect(page).to have_content spending_proposal.title
|
||||||
|
expect(page).to have_css("a[href='#{spending_proposal_path(spending_proposal)}']", text: spending_proposal.title)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Create' do
|
scenario 'Create' do
|
||||||
|
|||||||
Reference in New Issue
Block a user