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
|
//= require admin_valuators_forms
|
||||||
|
|
||||||
var initialize_admin_modules = function() {
|
var initialize_admin_modules = function() {
|
||||||
|
App.AdminValuatorsForms.initialize();
|
||||||
};
|
};
|
||||||
|
|
||||||
$(function(){
|
$(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(){
|
$(function(){
|
||||||
|
|
||||||
$(document).ready(initialize_stats_modules);
|
$(document).ready(initialize_stats_modules);
|
||||||
$(document).on('page:load', initialize_stats_modules);
|
$(document).on('page:load', initialize_stats_modules);
|
||||||
$(document).on('ajax:complete', initialize_stats_modules);
|
$(document).on('ajax:complete', initialize_stats_modules);
|
||||||
|
|||||||
@@ -1,25 +1,27 @@
|
|||||||
class Admin::SpendingProposalsController < Admin::BaseController
|
class Admin::SpendingProposalsController < Admin::BaseController
|
||||||
include FeatureFlags
|
include FeatureFlags
|
||||||
|
feature_flag :spending_proposals
|
||||||
|
|
||||||
load_and_authorize_resource
|
load_and_authorize_resource
|
||||||
|
|
||||||
feature_flag :spending_proposals
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@spending_proposals = @spending_proposals.includes([:geozone], [administrator: :user]).order(created_at: :desc).page(params[:page])
|
@spending_proposals = @spending_proposals.includes([:geozone], [administrator: :user]).order(created_at: :desc).page(params[:page])
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@admins = Administrator.includes(:user).all
|
||||||
|
@valuators = Valuator.includes(:user).all.order("users.username ASC")
|
||||||
end
|
end
|
||||||
|
|
||||||
def accept
|
def assign_admin
|
||||||
@spending_proposal.accept
|
@spending_proposal.update(params.require(:spending_proposal).permit(:administrator_id))
|
||||||
redirect_to request.query_parameters.merge(action: :index)
|
render nothing: true
|
||||||
end
|
end
|
||||||
|
|
||||||
def reject
|
def assign_valuators
|
||||||
@spending_proposal.reject
|
params[:spending_proposal] ||= {}
|
||||||
redirect_to request.query_parameters.merge(action: :index)
|
params[:spending_proposal][:valuator_ids] ||= []
|
||||||
|
@spending_proposal.update(params.require(:spending_proposal).permit(valuator_ids: []))
|
||||||
end
|
end
|
||||||
|
|
||||||
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? %>
|
<% if @spending_proposal.external_url.present? %>
|
||||||
<p><%= text_with_links @spending_proposal.external_url %></p>
|
<p><%= text_with_links @spending_proposal.external_url %></p>
|
||||||
<% end %>
|
<% 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) %>
|
<%= link_to @spending_proposal.author.name, admin_user_path(@spending_proposal.author) %>
|
||||||
</p>
|
</p>
|
||||||
<p><%= t("admin.spending_proposals.show.association_name") %>:
|
|
||||||
|
<% if @spending_proposal.association_name.present? %>
|
||||||
|
<p><strong><%= t("admin.spending_proposals.show.association_name") %>:</strong>
|
||||||
<%= @spending_proposal.association_name %>
|
<%= @spending_proposal.association_name %>
|
||||||
</p>
|
</p>
|
||||||
<p><%= t("admin.spending_proposals.show.geozone") %>:
|
<% end %>
|
||||||
|
|
||||||
|
<p><strong><%= t("admin.spending_proposals.show.geozone") %>:</strong>
|
||||||
<%= geozone_name(@spending_proposal) %>
|
<%= geozone_name(@spending_proposal) %>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p><strong><%= t("admin.spending_proposals.show.sent") %>:</strong>
|
||||||
|
<%= l @spending_proposal.created_at, format: :datetime %>
|
||||||
</p>
|
</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.assigned_valuators") %>:</strong></p>
|
||||||
<p><strong><%= t("admin.spending_proposals.show.feasibility") %>:</strong> <%= t("admin.spending_proposals.show.#{@spending_proposal.feasibility}") %></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
|
unresolved: Unresolved
|
||||||
title: Spending proposals for participatory budgeting
|
title: Spending proposals for participatory budgeting
|
||||||
show:
|
show:
|
||||||
|
heading: Investment project
|
||||||
|
info: Author info
|
||||||
association_name: Asociación
|
association_name: Asociación
|
||||||
by: Sent by
|
by: Sent by
|
||||||
|
sent: Sent at
|
||||||
geozone: Scope
|
geozone: Scope
|
||||||
dossier: Dossier
|
dossier: Dossier
|
||||||
price: Price
|
price: Price
|
||||||
|
currency: "€"
|
||||||
feasibility: Feasibility
|
feasibility: Feasibility
|
||||||
feasible: Feasible
|
feasible: Feasible
|
||||||
not_feasible: Not feasible
|
not_feasible: Not feasible
|
||||||
undefined: Undefined
|
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:
|
stats:
|
||||||
show:
|
show:
|
||||||
stats_title: Stats
|
stats_title: Stats
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ es:
|
|||||||
officials: Cargos públicos
|
officials: Cargos públicos
|
||||||
organizations: Organizaciones
|
organizations: Organizaciones
|
||||||
settings: Configuración global
|
settings: Configuración global
|
||||||
spending_proposals: Propuestas de gasto
|
spending_proposals: Propuestas de inversión
|
||||||
stats: Estadísticas
|
stats: Estadísticas
|
||||||
moderators:
|
moderators:
|
||||||
index:
|
index:
|
||||||
@@ -145,15 +145,26 @@ es:
|
|||||||
unresolved: Sin resolver
|
unresolved: Sin resolver
|
||||||
title: Propuestas de gasto para presupuestos participativos
|
title: Propuestas de gasto para presupuestos participativos
|
||||||
show:
|
show:
|
||||||
|
heading: Propuesta de inversión
|
||||||
|
info: Datos de envío
|
||||||
association_name: Asociación
|
association_name: Asociación
|
||||||
by: Enviada por
|
by: Enviada por
|
||||||
|
sent: Fecha de creación
|
||||||
geozone: Ámbito
|
geozone: Ámbito
|
||||||
dossier: Informe
|
dossier: Informe
|
||||||
price: Coste
|
price: Coste
|
||||||
|
currency: "€"
|
||||||
feasibility: Viabilidad
|
feasibility: Viabilidad
|
||||||
feasible: Viable
|
feasible: Viable
|
||||||
not_feasible: No viable
|
not_feasible: No viable
|
||||||
undefined: Sin definir
|
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:
|
stats:
|
||||||
show:
|
show:
|
||||||
stats_title: Estadísticas
|
stats_title: Estadísticas
|
||||||
|
|||||||
@@ -131,10 +131,10 @@ Rails.application.routes.draw do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
resources :spending_proposals, only: [:index, :show], path: 'investment_projects' do
|
resources :spending_proposals, only: [:index, :show] do
|
||||||
member do
|
member do
|
||||||
put :accept
|
patch :assign_admin
|
||||||
put :reject
|
patch :assign_valuators
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -20,12 +20,17 @@ feature 'Admin spending proposals' do
|
|||||||
end
|
end
|
||||||
|
|
||||||
scenario 'Show' do
|
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,
|
spending_proposal = create(:spending_proposal,
|
||||||
geozone: create(:geozone),
|
geozone: create(:geozone),
|
||||||
association_name: 'People of the neighbourhood',
|
association_name: 'People of the neighbourhood',
|
||||||
price: 1234.56,
|
price: 1234.56,
|
||||||
feasible: false,
|
feasible: false,
|
||||||
feasible_explanation: "It's impossible")
|
feasible_explanation: 'It is impossible',
|
||||||
|
administrator: administrator)
|
||||||
|
spending_proposal.valuators << valuator
|
||||||
|
|
||||||
visit admin_spending_proposals_path
|
visit admin_spending_proposals_path
|
||||||
|
|
||||||
click_link spending_proposal.title
|
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.author.name)
|
||||||
expect(page).to have_content(spending_proposal.association_name)
|
expect(page).to have_content(spending_proposal.association_name)
|
||||||
expect(page).to have_content(spending_proposal.geozone.name)
|
expect(page).to have_content(spending_proposal.geozone.name)
|
||||||
expect(page).to have_content("1234.56")
|
expect(page).to have_content('1234.56')
|
||||||
expect(page).to have_content("Not feasible")
|
expect(page).to have_content('Not feasible')
|
||||||
expect(page).to have_content("It's impossible")
|
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
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user