From 148b47c547a58f30906ea35e08fae7f6d5e0bede Mon Sep 17 00:00:00 2001 From: André Guedes Date: Mon, 9 Feb 2015 18:15:01 -0200 Subject: [PATCH] Added assign option to roles --- app/controllers/my_profile/profile_roles_controller.rb | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ app/views/profile_roles/assign.html.erb | 35 +++++++++++++++++++++++++++++++++++ app/views/profile_roles/index.html.erb | 1 + public/javascripts/assign_role.js | 19 +++++++++++++++++++ 4 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 app/views/profile_roles/assign.html.erb create mode 100644 public/javascripts/assign_role.js diff --git a/app/controllers/my_profile/profile_roles_controller.rb b/app/controllers/my_profile/profile_roles_controller.rb index 0390088..9d83731 100644 --- a/app/controllers/my_profile/profile_roles_controller.rb +++ b/app/controllers/my_profile/profile_roles_controller.rb @@ -3,7 +3,7 @@ class ProfileRolesController < MyProfileController include RoleHelper def index - @roles = environment.roles.find(:all, :conditions => {:profile_id => profile.id} ) + @roles = Profile::Roles.organization_custom_roles(environment.id, profile.id) end def new @@ -28,6 +28,13 @@ class ProfileRolesController < MyProfileController @role = environment.roles.find(params[:id]) end + def assign_role_by_members + return redirect_to "/" if params[:q].nil? or !request.xhr? + arg = params[:q].downcase + result = profile.members.where('LOWER(name) LIKE ?', "%#{arg}%") + render :text => prepare_to_token_input(result).to_json + end + def destroy @role = environment.roles.find(params[:id]) @members = profile.members_by_role(@role) @@ -38,11 +45,8 @@ class ProfileRolesController < MyProfileController def remove @role = environment.roles.find(params[:id]) @members = profile.members_by_role(@role) - new_roles = params[:roles] ? environment.roles.find(params[:roles].select{|r|!r.to_i.zero?}) : [] - @members.each do |person| - member_roles = person.find_roles(profile).map(&:role) + new_roles - person.define_roles(member_roles, profile) - end + member_roles = params[:roles] ? environment.roles.find(params[:roles].select{|r|!r.to_i.zero?}) : [] + append_roles(@members, member_roles, profile) if @role.destroy session[:notice] = _('Role successfuly removed!') else @@ -61,5 +65,45 @@ class ProfileRolesController < MyProfileController end end + def assign + @role = environment.roles.find(params[:id]) + @roles_list = Profile::Roles.organization_all_roles(environment.id, profile.id) + @roles_list.delete(@role) + end + + def define + @role = environment.roles.find(params[:id]) + selected_role = params[:selected_role] ? environment.roles.find(params[:selected_role].to_i) : nil + if params[:assign_role_by].eql? "members" + members_list = params[:person_id].split(',').collect {|id| environment.profiles.find(id.to_i)} + members_list.collect{|person| person.add_role(@role, profile)} + elsif params[:assign_role_by].eql? "roles" + members = profile.members_by_role(selected_role) + replace_role(members, selected_role, @role, profile) + else + session[:notice] = _("Error") + end + redirect_to :action => 'index' + end + + protected + + def append_roles(members, roles, profile) + members.each do |person| + all_roles = person.find_roles(profile).map(&:role) + roles + person.define_roles(all_roles, profile) + end + end + def replace_roles(members, roles, profile) + members.each do |person| + person.define_roles(roles, profile) + end + end + def replace_role(members, role, new_role, profile) + members.each do |person| + person.remove_role(role, profile) + person.add_role(new_role, profile) + end + end end diff --git a/app/views/profile_roles/assign.html.erb b/app/views/profile_roles/assign.html.erb new file mode 100644 index 0000000..0bb8b34 --- /dev/null +++ b/app/views/profile_roles/assign.html.erb @@ -0,0 +1,35 @@ +<%= javascript_include_tag('assign_role.js') %> + +

<%= _("Assign #{@role.name}") %>

+ + +<%= labelled_form_for :role, :url => { :action => 'define', :id => @role.id } do |f| %> + +

+ <%= _("Assign role by:") %> +

+

+ <%= labelled_radio_button _("Members"), :assign_role_by, "members", true, :id => "assign_role_by_members", :class => "assign_role_by" %> +   + <%= labelled_radio_button _("Roles"), :assign_role_by, "roles", false, :id => "assign_role_by_roles", :class => "assign_role_by" %> +

+
+ <%=token_input_field_tag(:person_id, 'search-article-privacy-exceptions', {:action => 'assign_role_by_members'}, + {:focus => false, :hint_text => _('Select members to assign the role')}) %> + + <% button_bar do %> + <%= submit_button(:forward, _("Confirm")) %> + <% end %> +
+ +<% end %> diff --git a/app/views/profile_roles/index.html.erb b/app/views/profile_roles/index.html.erb index 419c1f9..e54ce47 100644 --- a/app/views/profile_roles/index.html.erb +++ b/app/views/profile_roles/index.html.erb @@ -13,6 +13,7 @@ <%= button_without_text :edit, _('Edit'), :action => 'edit', :id => role %> <%= button_without_text :delete, _('Delete'), :action => 'destroy', :id => role %> + <%= button_without_text :delete, _('Assign'), :action => 'assign', :id => role %> <% end %> diff --git a/public/javascripts/assign_role.js b/public/javascripts/assign_role.js new file mode 100644 index 0000000..be29d3c --- /dev/null +++ b/public/javascripts/assign_role.js @@ -0,0 +1,19 @@ +(function($){ + 'use strict'; + + function toggle_assignment_method() { + if (this.value != "roles") { + $('.assign_by_roles').hide(); + $('.assign_by_members').show(); + } else { + $('.assign_by_members').hide(); + $('.assign_by_roles').show(); + } + } + + $(document).ready(function() { + $('.assign_by_roles').hide(); + // Event triggers + $('.assign_role_by').click(toggle_assignment_method); + }); +})(jQuery); -- libgit2 0.21.2