redux admin for spending proposals

adds dossier info
adds assignments to admin and valuators
This commit is contained in:
Juanjo Bazán
2016-02-24 19:34:02 +01:00
committed by Juanjo Bazán
parent 91cedd78ab
commit 2cddad22d6
11 changed files with 198 additions and 28 deletions

View File

@@ -5,7 +5,7 @@
//= require admin_valuators_forms
var initialize_admin_modules = function() {
App.AdminValuatorsForms.initialize();
};
$(function(){

View File

@@ -0,0 +1,17 @@
App.AdminValuatorsForms =
initialize: ->
$('#spending_proposal_administrator_id').unbind('change').on('change', ->
$('#administrator_assignment_form').submit()
false
)
$('#assign-valuators-link').unbind('click').on('click', ->
$('#valuators-assign-list').toggle("down")
false
)
$('.js-assign-valuators-check').unbind('change').on('change', ->
$('#valuators_assignment_form').submit()
false
)

View File

@@ -8,7 +8,6 @@ var initialize_stats_modules = function() {
};
$(function(){
$(document).ready(initialize_stats_modules);
$(document).on('page:load', initialize_stats_modules);
$(document).on('ajax:complete', initialize_stats_modules);

View File

@@ -1,25 +1,27 @@
class Admin::SpendingProposalsController < Admin::BaseController
include FeatureFlags
feature_flag :spending_proposals
load_and_authorize_resource
feature_flag :spending_proposals
def index
@spending_proposals = @spending_proposals.includes([:geozone], [administrator: :user]).order(created_at: :desc).page(params[:page])
end
def show
@admins = Administrator.includes(:user).all
@valuators = Valuator.includes(:user).all.order("users.username ASC")
end
def accept
@spending_proposal.accept
redirect_to request.query_parameters.merge(action: :index)
def assign_admin
@spending_proposal.update(params.require(:spending_proposal).permit(:administrator_id))
render nothing: true
end
def reject
@spending_proposal.reject
redirect_to request.query_parameters.merge(action: :index)
def assign_valuators
params[:spending_proposal] ||= {}
params[:spending_proposal][:valuator_ids] ||= []
@spending_proposal.update(params.require(:spending_proposal).permit(valuator_ids: []))
end
end

View File

@@ -0,0 +1,9 @@
<ul>
<% @spending_proposal.valuators.each do |valuator| %>
<li><%= valuator.name %> (<%= valuator.email %>)</li>
<% end %>
<% if @spending_proposal.valuators.empty? %>
<li><%= t("admin.spending_proposals.show.undefined") %></li>
<% end %>
</ul>

View File

@@ -0,0 +1 @@
$('#assigned_valuators').html("<%= j(render 'assigned_valuators') %>")

View File

@@ -1,25 +1,78 @@
<h2><%= @spending_proposal.title %></h2>
<h2><%= t("admin.spending_proposals.show.heading") %> <%= @spending_proposal.id %></h2>
<h1><%= @spending_proposal.title %></h1>
<%= safe_html_with_links @spending_proposal.description.html_safe %>
<%= safe_html_with_links @spending_proposal.description %>
<% if @spending_proposal.external_url.present? %>
<p><%= text_with_links @spending_proposal.external_url %></p>
<% end %>
<p><%= t("admin.spending_proposals.show.by") %>:
<h2><%= t("admin.spending_proposals.show.info") %></h2>
<p><strong><%= t("admin.spending_proposals.show.by") %>:</strong>
<%= link_to @spending_proposal.author.name, admin_user_path(@spending_proposal.author) %>
</p>
<p><%= t("admin.spending_proposals.show.association_name") %>:
<%= @spending_proposal.association_name %>
</p>
<p><%= t("admin.spending_proposals.show.geozone") %>:
<% if @spending_proposal.association_name.present? %>
<p><strong><%= t("admin.spending_proposals.show.association_name") %>:</strong>
<%= @spending_proposal.association_name %>
</p>
<% end %>
<p><strong><%= t("admin.spending_proposals.show.geozone") %>:</strong>
<%= geozone_name(@spending_proposal) %>
</p>
<p><strong><%= t("admin.spending_proposals.show.sent") %>:</strong>
<%= l @spending_proposal.created_at, format: :datetime %>
</p>
<h2><%= t("admin.spending_proposals.show.responsibles") %></h2>
<h2><%= t("admin.spending_proposals.show.dossier") %>:</h2>
<p><strong><%= t("admin.spending_proposals.show.assigned_admin") %>:</strong>
<%= form_for(@spending_proposal, url: assign_admin_admin_spending_proposal_path(@spending_proposal), remote: true, html: {id: 'administrator_assignment_form'}) do |f| %>
<%= f.select :administrator_id, @admins.collect { |a| [ "#{a.name} (#{a.email})", a.id ] }, {include_blank: t("admin.spending_proposals.show.undefined"), label: false} %>
<% end %>
</p>
<p><strong><%= t("admin.spending_proposals.show.price") %>:</strong> <%= @spending_proposal.price %></p>
<p><strong><%= t("admin.spending_proposals.show.feasibility") %>:</strong> <%= t("admin.spending_proposals.show.#{@spending_proposal.feasibility}") %></p>
<p><strong><%= t("admin.spending_proposals.show.assigned_valuators") %>:</strong></p>
<div id="assigned_valuators">
<%= render "assigned_valuators" %>
</div>
<h3><%= link_to t("admin.spending_proposals.show.assign_valuators"), "", id: "assign-valuators-link" %></h3>
<div style="display:none" id="valuators-assign-list">
<%= form_for(@spending_proposal, url: assign_valuators_admin_spending_proposal_path(@spending_proposal), remote: true, html: {id: 'valuators_assignment_form'}) do |f| %>
<% @valuators.each do |valuator| -%>
<div>
<%= check_box_tag "valuator_ids_#{valuator.id}", valuator.id, @spending_proposal.valuators.include?(valuator),
name: 'spending_proposal[valuator_ids][]',
class: "js-assign-valuators-check" %>
<%= label_tag "valuator_ids_#{valuator.id}", valuator.name %>
</div>
<% end -%>
<% end -%>
</div>
<h2><%= t("admin.spending_proposals.show.dossier") %></h2>
<p><strong><%= t("admin.spending_proposals.show.price") %> (<%= t("admin.spending_proposals.show.currency") %>):</strong>
<%= @spending_proposal.price.present? ? @spending_proposal.price : t("admin.spending_proposals.show.undefined") %>
</p>
<%= simple_format(safe_html_with_links(@spending_proposal.price_explanation.html_safe), {}, sanitize: false) if @spending_proposal.price_explanation.present? %>
<p><strong><%= t("admin.spending_proposals.show.feasibility") %>:</strong>
<%= t("admin.spending_proposals.show.#{@spending_proposal.feasibility}") %>
</p>
<%= simple_format(safe_html_with_links(@spending_proposal.feasible_explanation.html_safe), {}, sanitize: false) if @spending_proposal.feasible_explanation.present? %>
<% if @spending_proposal.valuation_finished %>
<p><strong><%= t("admin.spending_proposals.show.valuation_finished") %></strong>
<% end %>
<% if @spending_proposal.internal_comments.present? %>
<h2><%= t("admin.spending_proposals.show.internal_comments") %></h2>
<%= simple_format(safe_html_with_links(@spending_proposal.internal_comments.html_safe), {}, sanitize: false) %>
<% end %>

View File

@@ -145,15 +145,26 @@ en:
unresolved: Unresolved
title: Spending proposals for participatory budgeting
show:
heading: Investment project
info: Author info
association_name: Asociación
by: Sent by
sent: Sent at
geozone: Scope
dossier: Dossier
price: Price
currency: "€"
feasibility: Feasibility
feasible: Feasible
not_feasible: Not feasible
undefined: Undefined
valuation_finished: Valuation finished
internal_comments: Internal comments
responsibles: Responsibles
assigned_admin: Assigned admin
assigned_valuators: Assigned valuators
assign_valuators: Assign valuators
assign: Assign
stats:
show:
stats_title: Stats

View File

@@ -57,7 +57,7 @@ es:
officials: Cargos públicos
organizations: Organizaciones
settings: Configuración global
spending_proposals: Propuestas de gasto
spending_proposals: Propuestas de inversión
stats: Estadísticas
moderators:
index:
@@ -145,15 +145,26 @@ es:
unresolved: Sin resolver
title: Propuestas de gasto para presupuestos participativos
show:
heading: Propuesta de inversión
info: Datos de envío
association_name: Asociación
by: Enviada por
sent: Fecha de creación
geozone: Ámbito
dossier: Informe
price: Coste
currency: "€"
feasibility: Viabilidad
feasible: Viable
not_feasible: No viable
undefined: Sin definir
valuation_finished: Informe finalizado
internal_comments: Commentarios internos
responsibles: Responsables
assigned_admin: Administrador asignado
assigned_valuators: Evaluadores asignados
assign_valuators: Asignar evaluadores
assign: Asignar
stats:
show:
stats_title: Estadísticas

View File

@@ -131,10 +131,10 @@ Rails.application.routes.draw do
end
end
resources :spending_proposals, only: [:index, :show], path: 'investment_projects' do
resources :spending_proposals, only: [:index, :show] do
member do
put :accept
put :reject
patch :assign_admin
patch :assign_valuators
end
end

View File

@@ -20,12 +20,17 @@ feature 'Admin spending proposals' do
end
scenario 'Show' do
administrator = create(:administrator, user: create(:user, username: 'Ana', email: 'ana@admins.org'))
valuator = create(:valuator, user: create(:user, username: 'Rachel', email: 'rachel@valuators.org'))
spending_proposal = create(:spending_proposal,
geozone: create(:geozone),
association_name: 'People of the neighbourhood',
price: 1234.56,
feasible: false,
feasible_explanation: "It's impossible")
feasible_explanation: 'It is impossible',
administrator: administrator)
spending_proposal.valuators << valuator
visit admin_spending_proposals_path
click_link spending_proposal.title
@@ -35,9 +40,71 @@ feature 'Admin spending proposals' do
expect(page).to have_content(spending_proposal.author.name)
expect(page).to have_content(spending_proposal.association_name)
expect(page).to have_content(spending_proposal.geozone.name)
expect(page).to have_content("1234.56")
expect(page).to have_content("Not feasible")
expect(page).to have_content("It's impossible")
expect(page).to have_content('1234.56')
expect(page).to have_content('Not feasible')
expect(page).to have_content('It is impossible')
expect(page).to have_select('spending_proposal[administrator_id]', selected: 'Ana (ana@admins.org)')
within('#assigned_valuators') do
expect(page).to have_content('Rachel (rachel@valuators.org)')
end
end
scenario 'Administrator assigment', :js do
spending_proposal = create(:spending_proposal)
administrator = create(:administrator, user: create(:user, username: 'Ana', email: 'ana@admins.org'))
visit admin_spending_proposal_path(spending_proposal)
expect(page).to have_select('spending_proposal[administrator_id]', selected: 'Undefined')
select 'Ana (ana@admins.org)', from: 'spending_proposal[administrator_id]'
visit admin_spending_proposal_path(spending_proposal)
expect(page).to have_select('spending_proposal[administrator_id]', selected: 'Ana (ana@admins.org)')
end
scenario 'Valuators assigments', :js do
spending_proposal = create(:spending_proposal)
valuator1 = create(:valuator, user: create(:user, username: 'Valentina', email: 'v1@valuators.org'))
valuator2 = create(:valuator, user: create(:user, username: 'Valerian', email: 'v2@valuators.org'))
valuator3 = create(:valuator, user: create(:user, username: 'Val', email: 'v3@valuators.org'))
visit admin_spending_proposal_path(spending_proposal)
within('#assigned_valuators') do
expect(page).to have_content('Undefined')
expect(page).to_not have_content('Valentina (v1@valuators.org)')
expect(page).to_not have_content('Valerian (v2@valuators.org)')
expect(page).to_not have_content('Val (v3@valuators.org)')
end
visit admin_spending_proposal_path(spending_proposal)
click_link "Assign valuators"
within('#valuators-assign-list') do
check "valuator_ids_#{valuator1.id}"
check "valuator_ids_#{valuator3.id}"
end
within('#assigned_valuators') do
expect(page).to have_content('Valentina (v1@valuators.org)')
expect(page).to have_content('Val (v3@valuators.org)')
expect(page).to_not have_content('Undefined')
expect(page).to_not have_content('Valerian (v2@valuators.org)')
end
visit admin_spending_proposal_path(spending_proposal)
within('#assigned_valuators') do
expect(page).to have_content('Valentina (v1@valuators.org)')
expect(page).to have_content('Val (v3@valuators.org)')
expect(page).to_not have_content('Undefined')
expect(page).to_not have_content('Valerian (v2@valuators.org)')
end
end
end