redux admin for spending proposals
adds dossier info adds assignments to admin and valuators
This commit is contained in:
committed by
Juanjo Bazán
parent
91cedd78ab
commit
2cddad22d6
@@ -5,7 +5,7 @@
|
||||
//= require admin_valuators_forms
|
||||
|
||||
var initialize_admin_modules = function() {
|
||||
|
||||
App.AdminValuatorsForms.initialize();
|
||||
};
|
||||
|
||||
$(function(){
|
||||
|
||||
17
app/assets/javascripts/admin_valuators_forms.js.coffee
Normal file
17
app/assets/javascripts/admin_valuators_forms.js.coffee
Normal 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
|
||||
)
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
$('#assigned_valuators').html("<%= j(render 'assigned_valuators') %>")
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user