Roles into their own controller. Rework interface. Add flash messages to ajax calls. Add description to roles. Possible to edit roles in use.

This commit is contained in:
Stella 2015-01-12 23:13:10 +02:00 committed by Stella Rouzi
parent eda5c2bc07
commit ccd7ecbb90
59 changed files with 618 additions and 356 deletions

View file

@ -66,13 +66,15 @@ module Admin
def create
@conference = Conference.new(conference_params)
if @conference.valid?
@conference.save
if @conference.save
flash[:notice] = 'Conference was successfully created.'
# user that creates the conference becomes organizer of that conference
current_user.add_role :organizer, @conference
redirect_to(admin_conference_path(id: @conference.short_title),
notice: 'Conference was successfully created.')
redirect_to admin_conference_path(id: @conference.short_title)
else
flash[:error] = 'Could not create conference. ' + @conference.errors.full_messages.to_sentence
render action: 'new'
end
end
@ -173,31 +175,6 @@ module Admin
end
end
def roles
@user = User.new
@roles = Role::ACTIONABLES + Role::LABELS
params[:user] ? (@selection = params[:user][:roles].parameterize.underscore) : (@selection = 'organizer')
@role_users = get_users(@selection)
end
def add_user
@user = User.find_by(email: params[:user][:email])
@selection = params[:role]
@user.add_role @selection, @conference
@role_users = get_users(@selection)
render 'roles', formats: [:js]
end
def remove_user
@selection = params[:role]
@user.revoke @selection, @conference
@role_users = get_users(@selection)
render 'roles', formats: [:js]
end
private
def conference_params
@ -213,14 +190,5 @@ module Admin
:photos_attributes, :targets, :targets_attributes,
:campaigns, :campaigns_attributes, :registration_limit)
end
def get_users(role_name)
@role_users = {}
# Initialize @role variable, so that view can show the role description
@role = Role.where(name: role_name, resource: @conference)
@role.blank? ? @role_users[role_name] = @role : @role_users[role_name] = @role.first.users
@role_users
end
end
end

View file

@ -0,0 +1,87 @@
module Admin
class RolesController < Admin::BaseController
load_and_authorize_resource :conference, find_by: :short_title
before_action :set_selection
# Show flash message with ajax calls
after_action :prepare_unobtrusive_flash, only: :toggle_user
def index
@roles = Role.where(resource: @conference)
end
def show
@users = @role.users
end
def edit
@users = @role.users
end
def update
role_name = @role.name
if @role.update_attributes(role_params)
flash[:notice] = 'Successfully updated role ' + @role.name
redirect_to admin_conference_role_path(@conference.short_title, @role.name)
else
@role.name = role_name
flash[:error] = 'Could not update role! ' + @role.errors.full_messages.to_sentence
render :edit
end
end
def toggle_user
user = User.find_by(email: user_params[:email])
state = user_params[:state]
unless user
flash[:error] = 'Could not find user. Please provide a valid email!'
redirect_to(admin_conference_role_path(@conference.short_title, @role.name)) && return
end
# The conference must have at least 1 organizer
if @role.name == 'organizer' && state == 'false' && @role.users.count == 1
flash[:error] = 'The conference must have at least 1 organizer!'
redirect_to(admin_conference_role_path(@conference.short_title, @role.name)) && return
end
# Remove user
if state == 'false'
if user.remove_role @role.name, @conference
flash[:notice] = "Successfully removed role #{@role.name} from user #{user.email}"
else
flash[:error] = "Could not remove role #{@role.name} from user #{user.email}"
end
elsif user.has_role? @role.name, @conference
flash[:error] = "User #{user.email} already has the role #{@role.name}"
# Add user
elsif user.add_role @role.name, @conference
flash[:notice] = "Successfully added role #{@role.name} to user #{user.email}"
else
flash[:error] = "Coud not add role #{@role.name} to #{user.email}"
end
respond_to do |format|
format.js
format.html { redirect_to admin_conference_role_path(@conference.short_title, @role.name) }
end
end
protected
def set_selection
# Set 'organizer' as default role, when there is no other selection
@selection = params[:id] ? params[:id].parameterize.underscore : 'organizer'
@role = Role.find_by(name: @selection, resource: @conference)
end
def role_params
params.require(:role).permit(:name, :description, user_ids: [])
end
def user_params
params.require(:user).permit(:email, :state)
end
end
end