@@ -7,7 +7,7 @@ class Admin::SpendingProposalsController < Admin::BaseController
|
||||
load_and_authorize_resource
|
||||
|
||||
def index
|
||||
@spending_proposals = geozone_filter(params[:geozone_id].presence).includes(:geozone, administrator: :user, valuators: :user).send(@current_filter).order(created_at: :desc).page(params[:page])
|
||||
@spending_proposals = SpendingProposal.search(params, @current_filter).order(created_at: :desc).page(params[:page])
|
||||
end
|
||||
|
||||
def show
|
||||
@@ -26,17 +26,5 @@ class Admin::SpendingProposalsController < Admin::BaseController
|
||||
@spending_proposal.update(params.require(:spending_proposal).permit(valuator_ids: []))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def geozone_filter(geozone)
|
||||
case geozone
|
||||
when nil
|
||||
@spending_proposals
|
||||
when 'all'
|
||||
@spending_proposals.where(geozone_id: nil)
|
||||
else
|
||||
@spending_proposals.where(geozone_id: params[:geozone_id].presence)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
27
app/controllers/admin/valuators_controller.rb
Normal file
27
app/controllers/admin/valuators_controller.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
class Admin::ValuatorsController < Admin::BaseController
|
||||
load_and_authorize_resource
|
||||
|
||||
def index
|
||||
@valuators = @valuators.page(params[:page])
|
||||
end
|
||||
|
||||
def search
|
||||
@user = User.find_by(email: params[:email])
|
||||
|
||||
respond_to do |format|
|
||||
if @user
|
||||
@valuator = Valuator.find_or_initialize_by(user: @user)
|
||||
format.js
|
||||
else
|
||||
format.js { render "user_not_found" }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
@valuator.user_id = params[:user_id]
|
||||
@valuator.save
|
||||
|
||||
redirect_to admin_valuators_path
|
||||
end
|
||||
end
|
||||
@@ -12,6 +12,10 @@ module AdminHelper
|
||||
options
|
||||
end
|
||||
|
||||
def admin_select_options
|
||||
Administrator.all.order('users.username asc').includes(:user).collect { |v| [ v.name, v.id ] }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def namespace
|
||||
|
||||
@@ -32,6 +32,7 @@ module Abilities
|
||||
can :comment_as_administrator, [Debate, Comment, Proposal]
|
||||
|
||||
can [:search, :create, :index, :destroy], ::Moderator
|
||||
can [:search, :create, :index], ::Valuator
|
||||
|
||||
can :manage, Annotation
|
||||
|
||||
|
||||
@@ -23,10 +23,32 @@ class SpendingProposal < ActiveRecord::Base
|
||||
scope :valuating, -> { where("valuation_assignments_count > 0 AND valuation_finished = ?", false) }
|
||||
scope :valuation_finished, -> { where(valuation_finished: true) }
|
||||
|
||||
scope :for_render, -> { includes(:geozone, administrator: :user, valuators: :user) }
|
||||
|
||||
def description
|
||||
super.try :html_safe
|
||||
end
|
||||
|
||||
def self.search(params, current_filter)
|
||||
results = self
|
||||
results = results.by_geozone(params[:geozone_id]) if params[:geozone_id].present?
|
||||
results = results.by_administrator(params[:administrator_id]) if params[:administrator_id].present?
|
||||
results = results.send(current_filter) if current_filter.present?
|
||||
results.for_render
|
||||
end
|
||||
|
||||
def self.by_geozone(geozone)
|
||||
if geozone == 'all'
|
||||
where(geozone_id: nil)
|
||||
else
|
||||
where(geozone_id: geozone.presence)
|
||||
end
|
||||
end
|
||||
|
||||
def self.by_administrator(administrator)
|
||||
where(administrator_id: administrator.presence)
|
||||
end
|
||||
|
||||
def feasibility
|
||||
case feasible
|
||||
when true
|
||||
|
||||
@@ -78,6 +78,13 @@
|
||||
<% end %>
|
||||
</li>
|
||||
|
||||
<li <%= 'class=active' if controller_name == 'valuators' %>>
|
||||
<%= link_to admin_valuators_path do %>
|
||||
<i class="icon-user"></i>
|
||||
<%= t('admin.menu.valuators') %>
|
||||
<% end %>
|
||||
</li>
|
||||
|
||||
<li <%= 'class=active' if controller_name == 'activity' %>>
|
||||
<%= link_to admin_activity_path do %>
|
||||
<i class="icon-eye"></i>
|
||||
|
||||
@@ -1,11 +1,21 @@
|
||||
<h2><%= t("admin.spending_proposals.index.title") %></h2>
|
||||
|
||||
<div class="small-12 medium-4 column float-right">
|
||||
<div>
|
||||
<%= form_tag admin_spending_proposals_path, method: :get, enforce_utf8: false do %>
|
||||
<%= select_tag :geozone_id, options_for_select(geozone_select_options.unshift([t("geozones.none"), "all"]), params[:geozone_id]),
|
||||
{ prompt: t("admin.spending_proposals.index.geozone_filter_all"),
|
||||
label: false,
|
||||
class: "js-submit-on-change"} %>
|
||||
<div class="small-12 medium-4 column float-right">
|
||||
<%= select_tag :geozone_id,
|
||||
options_for_select(geozone_select_options.unshift([t("geozones.none"), "all"]), params[:geozone_id]),
|
||||
{ prompt: t("admin.spending_proposals.index.geozone_filter_all"),
|
||||
label: false,
|
||||
class: "js-submit-on-change" } %>
|
||||
</div>
|
||||
<div class="small-12 medium-4 column float-right">
|
||||
<%= select_tag :administrator_id,
|
||||
options_for_select(admin_select_options, params[:administrator_id]),
|
||||
{ prompt: t("admin.spending_proposals.index.administrator_filter_all"),
|
||||
label: false,
|
||||
class: "js-submit-on-change" } %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
|
||||
7
app/views/admin/valuators/_valuator.html.erb
Normal file
7
app/views/admin/valuators/_valuator.html.erb
Normal file
@@ -0,0 +1,7 @@
|
||||
<span><%= valuator.name %></span>
|
||||
<span class="bullet"> • </span>
|
||||
<span><%= valuator.email %></span>
|
||||
<% unless valuator.persisted? %>
|
||||
<%= link_to t('admin.valuators.valuator.add'),{ controller: "admin/valuators", action: :create, user_id: valuator.user_id },
|
||||
method: :post, class: "button small success float-right" %>
|
||||
<% end %>
|
||||
24
app/views/admin/valuators/index.html.erb
Normal file
24
app/views/admin/valuators/index.html.erb
Normal file
@@ -0,0 +1,24 @@
|
||||
<h2><%= t("admin.valuators.index.title") %></h2>
|
||||
<div class="row">
|
||||
<div class="column">
|
||||
<%= form_tag search_admin_valuators_path, method: :get, remote: true do %>
|
||||
<div class="small-12 medium-6 column">
|
||||
<%= text_field_tag :email, '', placeholder: t('admin.valuators.search.email_placeholder') %>
|
||||
</div>
|
||||
<div class="small-12 medium-6 column">
|
||||
<%= submit_tag t('admin.valuators.search.search'), class: 'button radius' %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result" class="row small"></div>
|
||||
<h3><%= page_entries_info @valuators %></h3>
|
||||
<ul id="valuators" class="admin-list">
|
||||
<% @valuators.each do |valuator| %>
|
||||
<li>
|
||||
<%= render 'valuator', valuator: valuator %>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
|
||||
<%= paginate @valuators %>
|
||||
1
app/views/admin/valuators/search.js.erb
Normal file
1
app/views/admin/valuators/search.js.erb
Normal file
@@ -0,0 +1 @@
|
||||
$("#search-result").html("<div class=\"panel column\"><%= j render 'valuator', valuator: @valuator %></div>");
|
||||
1
app/views/admin/valuators/user_not_found.js.erb
Normal file
1
app/views/admin/valuators/user_not_found.js.erb
Normal file
@@ -0,0 +1 @@
|
||||
$("#search-result").html("<div class=\"panel column\"><%= j t('admin.valuators.search.user_not_found') %></div>");
|
||||
@@ -54,6 +54,7 @@ en:
|
||||
hidden_users: Hidden users
|
||||
incomplete_verifications: Incomplete verifications
|
||||
moderators: Moderators
|
||||
valuators: Valuators
|
||||
officials: Officials
|
||||
organizations: Organisations
|
||||
settings: Configuration settings
|
||||
@@ -69,6 +70,15 @@ en:
|
||||
email_placeholder: Search user by email
|
||||
search: Search
|
||||
user_not_found: User not found
|
||||
valuators:
|
||||
index:
|
||||
title: Valuators
|
||||
valuator:
|
||||
add: Add
|
||||
search:
|
||||
email_placeholder: Search user by email
|
||||
search: Search
|
||||
user_not_found: User not found
|
||||
officials:
|
||||
edit:
|
||||
back: Back
|
||||
@@ -139,6 +149,7 @@ en:
|
||||
spending_proposals:
|
||||
index:
|
||||
geozone_filter_all: All zones
|
||||
administrator_filter_all: All administrators
|
||||
filters:
|
||||
all: All
|
||||
without_admin: Without assigned admin
|
||||
|
||||
@@ -54,6 +54,7 @@ es:
|
||||
hidden_users: Usuarios bloqueados
|
||||
incomplete_verifications: Verificaciones incompletas
|
||||
moderators: Moderadores
|
||||
valuators: Evaluadores
|
||||
officials: Cargos públicos
|
||||
organizations: Organizaciones
|
||||
settings: Configuración global
|
||||
@@ -69,6 +70,15 @@ es:
|
||||
email_placeholder: Buscar usuario por email
|
||||
search: Buscar
|
||||
user_not_found: Usuario no encontrado
|
||||
valuators:
|
||||
index:
|
||||
title: Evaluadores
|
||||
valuator:
|
||||
add: Añadir
|
||||
search:
|
||||
email_placeholder: Buscar usuario por email
|
||||
search: Buscar
|
||||
user_not_found: Usuario no encontrado
|
||||
officials:
|
||||
edit:
|
||||
back: Volver
|
||||
@@ -139,6 +149,7 @@ es:
|
||||
spending_proposals:
|
||||
index:
|
||||
geozone_filter_all: Todos los ámbitos de actuación
|
||||
administrator_filter_all: Todos los administradores
|
||||
filters:
|
||||
all: Todas
|
||||
without_admin: Sin administrador asignado
|
||||
|
||||
@@ -155,6 +155,10 @@ Rails.application.routes.draw do
|
||||
collection { get :search }
|
||||
end
|
||||
|
||||
resources :valuators, only: [:index, :create] do
|
||||
collection { get :search }
|
||||
end
|
||||
|
||||
resources :verifications, controller: :verifications, only: :index do
|
||||
collection { get :search}
|
||||
end
|
||||
|
||||
@@ -74,6 +74,28 @@ feature 'Admin spending proposals' do
|
||||
expect(page).to have_link("Destroy the city")
|
||||
end
|
||||
|
||||
scenario "Index filtering by admin", :js do
|
||||
user = create(:user, username: 'Admin 1')
|
||||
administrator = create(:administrator, user: user)
|
||||
|
||||
create(:spending_proposal, title: "Realocate visitors", administrator: administrator)
|
||||
create(:spending_proposal, title: "Destroy the city")
|
||||
|
||||
visit admin_spending_proposals_path
|
||||
expect(page).to have_link("Realocate visitors")
|
||||
expect(page).to have_link("Destroy the city")
|
||||
|
||||
select "Admin 1", from: "administrator_id"
|
||||
|
||||
expect(page).to have_link("Realocate visitors")
|
||||
expect(page).to_not have_link("Destroy the city")
|
||||
|
||||
select "All administrators", from: "administrator_id"
|
||||
|
||||
expect(page).to have_link("Destroy the city")
|
||||
expect(page).to have_link("Realocate visitors")
|
||||
end
|
||||
|
||||
scenario "Current filter is properly highlighted" do
|
||||
filters_links = {'all' => 'All',
|
||||
'without_admin' => 'Without assigned admin',
|
||||
|
||||
30
spec/features/admin/valuators_spec.rb
Normal file
30
spec/features/admin/valuators_spec.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
require 'rails_helper'
|
||||
|
||||
feature 'Admin valuators' do
|
||||
background do
|
||||
@admin = create(:administrator)
|
||||
@user = create(:user, username: 'Jose Luis Balbin')
|
||||
@valuator = create(:valuator)
|
||||
login_as(@admin.user)
|
||||
visit admin_valuators_path
|
||||
end
|
||||
|
||||
scenario 'Index' do
|
||||
expect(page).to have_content @valuator.name
|
||||
expect(page).to have_content @valuator.email
|
||||
expect(page).to_not have_content @user.name
|
||||
end
|
||||
|
||||
scenario 'Create Valuator', :js do
|
||||
fill_in 'email', with: @user.email
|
||||
click_button 'Search'
|
||||
|
||||
expect(page).to have_content @user.name
|
||||
click_link 'Add'
|
||||
within("#valuators") do
|
||||
expect(page).to have_content @user.name
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user