diff --git a/app/controllers/admin/spending_proposals_controller.rb b/app/controllers/admin/spending_proposals_controller.rb index d6457ea20..4a910f6d9 100644 --- a/app/controllers/admin/spending_proposals_controller.rb +++ b/app/controllers/admin/spending_proposals_controller.rb @@ -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 diff --git a/app/controllers/admin/valuators_controller.rb b/app/controllers/admin/valuators_controller.rb new file mode 100644 index 000000000..35c449299 --- /dev/null +++ b/app/controllers/admin/valuators_controller.rb @@ -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 diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb index f986eee8d..515a54deb 100644 --- a/app/helpers/admin_helper.rb +++ b/app/helpers/admin_helper.rb @@ -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 diff --git a/app/models/abilities/administrator.rb b/app/models/abilities/administrator.rb index 6ba99e4fa..6bf2b0b53 100644 --- a/app/models/abilities/administrator.rb +++ b/app/models/abilities/administrator.rb @@ -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 diff --git a/app/models/spending_proposal.rb b/app/models/spending_proposal.rb index 221528582..ba8ef7e78 100644 --- a/app/models/spending_proposal.rb +++ b/app/models/spending_proposal.rb @@ -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 diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb index 00bfc279b..49bd6957d 100644 --- a/app/views/admin/_menu.html.erb +++ b/app/views/admin/_menu.html.erb @@ -78,6 +78,13 @@ <% end %> +
  • > + <%= link_to admin_valuators_path do %> + + <%= t('admin.menu.valuators') %> + <% end %> +
  • +
  • > <%= link_to admin_activity_path do %> diff --git a/app/views/admin/spending_proposals/index.html.erb b/app/views/admin/spending_proposals/index.html.erb index 8bd95ff74..18be63a1b 100644 --- a/app/views/admin/spending_proposals/index.html.erb +++ b/app/views/admin/spending_proposals/index.html.erb @@ -1,11 +1,21 @@

    <%= t("admin.spending_proposals.index.title") %>

    -
    +
    <%= 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"} %> +
    + <%= 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" } %> +
    +
    + <%= 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" } %> +
    <% end %>
    diff --git a/app/views/admin/valuators/_valuator.html.erb b/app/views/admin/valuators/_valuator.html.erb new file mode 100644 index 000000000..68c2ae46d --- /dev/null +++ b/app/views/admin/valuators/_valuator.html.erb @@ -0,0 +1,7 @@ +<%= valuator.name %> + •  +<%= valuator.email %> +<% 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 %> diff --git a/app/views/admin/valuators/index.html.erb b/app/views/admin/valuators/index.html.erb new file mode 100644 index 000000000..ba5881192 --- /dev/null +++ b/app/views/admin/valuators/index.html.erb @@ -0,0 +1,24 @@ +

    <%= t("admin.valuators.index.title") %>

    +
    +
    + <%= form_tag search_admin_valuators_path, method: :get, remote: true do %> +
    + <%= text_field_tag :email, '', placeholder: t('admin.valuators.search.email_placeholder') %> +
    +
    + <%= submit_tag t('admin.valuators.search.search'), class: 'button radius' %> +
    + <% end %> +
    +
    +
    +

    <%= page_entries_info @valuators %>

    + + +<%= paginate @valuators %> diff --git a/app/views/admin/valuators/search.js.erb b/app/views/admin/valuators/search.js.erb new file mode 100644 index 000000000..e899668ee --- /dev/null +++ b/app/views/admin/valuators/search.js.erb @@ -0,0 +1 @@ +$("#search-result").html("
    <%= j render 'valuator', valuator: @valuator %>
    "); diff --git a/app/views/admin/valuators/user_not_found.js.erb b/app/views/admin/valuators/user_not_found.js.erb new file mode 100644 index 000000000..c28e72e01 --- /dev/null +++ b/app/views/admin/valuators/user_not_found.js.erb @@ -0,0 +1 @@ +$("#search-result").html("
    <%= j t('admin.valuators.search.user_not_found') %>
    "); diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index ddd205726..0a78be2f1 100755 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -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 diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index 5d2000782..2a57c92f7 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -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 diff --git a/config/routes.rb b/config/routes.rb index 302ce602c..ebc0d8989 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 diff --git a/spec/features/admin/spending_proposals_spec.rb b/spec/features/admin/spending_proposals_spec.rb index a357c4007..2f2ba8c4b 100644 --- a/spec/features/admin/spending_proposals_spec.rb +++ b/spec/features/admin/spending_proposals_spec.rb @@ -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', diff --git a/spec/features/admin/valuators_spec.rb b/spec/features/admin/valuators_spec.rb new file mode 100644 index 000000000..a4b17f699 --- /dev/null +++ b/spec/features/admin/valuators_spec.rb @@ -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 +