diff --git a/Gemfile.lock b/Gemfile.lock index 60af34f06..32d697aca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -436,6 +436,3 @@ DEPENDENCIES uglifier (>= 1.3.0) unicorn web-console (~> 2.0) - -BUNDLED WITH - 1.10.6 diff --git a/app/controllers/admin/moderators_controller.rb b/app/controllers/admin/moderators_controller.rb new file mode 100644 index 000000000..f2ef6f1c3 --- /dev/null +++ b/app/controllers/admin/moderators_controller.rb @@ -0,0 +1,33 @@ +class Admin::ModeratorsController < Admin::BaseController + + load_and_authorize_resource + + def index + @moderators = @moderators.page(params[:page]) + end + + def search + @user = User.find_by(email: params[:email]) + + respond_to do |format| + if @user + @moderator = Moderator.find_or_initialize_by(user: @user) + format.js + else + format.js { render "user_not_found" } + end + end + end + + def destroy + @moderator.destroy + redirect_to admin_moderators_path + end + + def create + @moderator.user_id = params[:user_id] + @moderator.save + + redirect_to admin_moderators_path + end +end diff --git a/app/models/ability.rb b/app/models/ability.rb index e931d037f..d8436a700 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -90,6 +90,8 @@ class Ability cannot :confirm_hide, User, hidden_at: nil can :comment_as_administrator, [Debate, Comment] + + can :manage, Moderator end end end diff --git a/app/views/admin/_menu.html.erb b/app/views/admin/_menu.html.erb index a76ecfe0f..80744f635 100644 --- a/app/views/admin/_menu.html.erb +++ b/app/views/admin/_menu.html.erb @@ -46,7 +46,14 @@ <% end %> -
  • > +
  • > + <%= link_to admin_moderators_path do %> + + <%= t('admin.menu.moderators') %> + <% end %> +
  • + +
  • > <%= link_to admin_settings_path do %> <%= t("admin.menu.settings") %> diff --git a/app/views/admin/moderators/_moderator.html.erb b/app/views/admin/moderators/_moderator.html.erb new file mode 100644 index 000000000..00fd9c602 --- /dev/null +++ b/app/views/admin/moderators/_moderator.html.erb @@ -0,0 +1,13 @@ +<%= moderator.name %> + •  +<%= moderator.email %> +<% if moderator.persisted? %> + <%= link_to t('admin.moderators.moderator.delete'), + admin_moderator_path(moderator), + method: :delete, + class: "button tiny radius alert right" + %> +<% else %> + <%= link_to t('admin.moderators.moderator.add'),{ controller: "admin/moderators", action: :create, user_id: moderator.user_id }, + method: :post, class: "button tiny radius success right" %> +<% end %> diff --git a/app/views/admin/moderators/index.html.erb b/app/views/admin/moderators/index.html.erb new file mode 100644 index 000000000..cf3855d05 --- /dev/null +++ b/app/views/admin/moderators/index.html.erb @@ -0,0 +1,24 @@ +

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

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

    <%= page_entries_info @moderators %>

    + + +<%= paginate @moderators %> diff --git a/app/views/admin/moderators/search.js.erb b/app/views/admin/moderators/search.js.erb new file mode 100644 index 000000000..5b8a61207 --- /dev/null +++ b/app/views/admin/moderators/search.js.erb @@ -0,0 +1 @@ +$("#search-result").html("
    <%= j render 'moderator', moderator: @moderator %>
    "); diff --git a/app/views/admin/moderators/user_not_found.js.erb b/app/views/admin/moderators/user_not_found.js.erb new file mode 100644 index 000000000..a3f86936c --- /dev/null +++ b/app/views/admin/moderators/user_not_found.js.erb @@ -0,0 +1 @@ +$("#search-result").html("
    <%= j t('admin.moderators.search.user_not_found') %>
    "); diff --git a/config/locales/admin.en.yml b/config/locales/admin.en.yml index 7a7f8f342..2f1606719 100644 --- a/config/locales/admin.en.yml +++ b/config/locales/admin.en.yml @@ -16,6 +16,7 @@ en: hidden_users: Hidden users organizations: Organizations officials: Officials + moderators: Moderators stats: Statistics organizations: index: @@ -95,3 +96,14 @@ en: flash: official_updated: 'Official position saved!' official_destroyed: 'User is not an official anymore' + moderators: + index: + title: Moderators + search: + email_placeholder: 'Search user by email' + search: Search + user_not_found: 'User not found' + moderator: + delete: Delete + add: Add + diff --git a/config/locales/admin.es.yml b/config/locales/admin.es.yml index 2e9dffe03..923b87925 100644 --- a/config/locales/admin.es.yml +++ b/config/locales/admin.es.yml @@ -16,6 +16,7 @@ es: hidden_users: Usuarios ocultos organizations: Organizaciones officials: Cargos públicos + moderators: Moderadores stats: Estadísticas organizations: index: @@ -95,3 +96,13 @@ es: flash: official_updated: 'Datos del cargo público guardados' official_destroyed: 'Datos guardados: el usuario ya no es cargo público' + moderators: + index: + title: Moderadores + search: + email_placeholder: 'Buscar usuario por email' + search: Buscar + user_not_found: 'Usuario no encontrado' + moderator: + delete: Borrar + add: Añadir diff --git a/config/routes.rb b/config/routes.rb index 2e6a23cb7..0cb6c8438 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,6 +87,9 @@ Rails.application.routes.draw do end resources :settings, only: [:index, :update] + resources :moderators, only: [:index, :create, :destroy] do + collection { get :search } + end end namespace :moderation do diff --git a/spec/features/admin/moderators_spec.rb b/spec/features/admin/moderators_spec.rb new file mode 100644 index 000000000..bdbd23b05 --- /dev/null +++ b/spec/features/admin/moderators_spec.rb @@ -0,0 +1,36 @@ +require 'rails_helper' + +feature 'Admin moderators' do + background do + @user = create(:user, username: 'Jose Luis Balbin') + @moderator = create(:moderator) + @admin = create(:administrator) + login_as(@admin.user) + end + + scenario 'Index' do + visit admin_moderators_path + expect(page).to have_content @moderator.name + expect(page).to have_content @moderator.email + expect(page).to_not have_content @user.name + end + + scenario 'Create Moderator', :js do + visit admin_moderators_path + fill_in 'email', with: @user.email + click_button 'Search' + + expect(page).to have_content @user.name + click_link 'Add' + + expect(page).to have_content @user.name + end + + scenario 'Delete Moderator' do + visit admin_moderators_path + click_link 'Delete' + + expect(page).to_not have_content @moderator.name + end +end +