Commit ece9470c594d2bff7b1496c25e7ae98d2de536cb
1 parent
fd65e2c1
Exists in
2_split_by_role
Profile members page now show members in tabs by role
Signed-off-by: Tallys Martins <tallysmartins@yahoo.com.br>
Showing
10 changed files
with
82 additions
and
175 deletions
Show diff stats
app/controllers/public/profile_controller.rb
@@ -70,12 +70,12 @@ class ProfileController < PublicController | @@ -70,12 +70,12 @@ class ProfileController < PublicController | ||
70 | else | 70 | else |
71 | profile.members.order("name asc") | 71 | profile.members.order("name asc") |
72 | end | 72 | end |
73 | - | ||
74 | @profile_admins = profile.admins | 73 | @profile_admins = profile.admins |
75 | - @total_members = all_members.count | ||
76 | - @members_except_admins = all_members - @profile_admins | ||
77 | - @members_count = @members_except_admins.count | ||
78 | - @members_except_admins = @members_except_admins.paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => @members_count) | 74 | + @profile_members = all_members - @profile_admins |
75 | + @profile_members = @profile_members.paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => @profile_members.size) | ||
76 | + @profile_admins = @profile_admins.paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => @profile_admins.size) | ||
77 | + @total_members = all_members.size | ||
78 | + @profile_members_url = url_for(:controller => "profile", :action => "members") | ||
79 | end | 79 | end |
80 | 80 | ||
81 | end | 81 | end |
app/models/profile.rb
@@ -898,7 +898,11 @@ private :generate_url, :url_options | @@ -898,7 +898,11 @@ private :generate_url, :url_options | ||
898 | 898 | ||
899 | def members_cache_key(params = {}) | 899 | def members_cache_key(params = {}) |
900 | page = params[:npage] || '1' | 900 | page = params[:npage] || '1' |
901 | - cache_key + '-members-page-' + page | 901 | + if params[:sort] and params[:sort].downcase == "desc" |
902 | + cache_key + '-members-page-' + page + "desc" | ||
903 | + else | ||
904 | + cache_key + '-members-page-' + page + "asc" | ||
905 | + end | ||
902 | end | 906 | end |
903 | 907 | ||
904 | def more_recent_label | 908 | def more_recent_label |
@@ -0,0 +1,14 @@ | @@ -0,0 +1,14 @@ | ||
1 | + <div id="profile-members-sort-options"> | ||
2 | + <%= label_tag("sort-#{role}", _("Sort by:")) %> | ||
3 | + <%= select_tag("sort-#{role}", | ||
4 | + options_for_select([ | ||
5 | + [_("Name A-Z"), 'asc'], | ||
6 | + [_("Name Z-A"), 'desc'], | ||
7 | + ], :selected=>params[:sort]) | ||
8 | + ) %> | ||
9 | + </div> | ||
10 | + <ul class="profile-list-<%= role %>" > | ||
11 | + <% users.each do |u| %> | ||
12 | + <%= profile_image_link(u) %> | ||
13 | + <% end %> | ||
14 | +</ul> |
app/views/profile/members.html.erb
@@ -4,43 +4,49 @@ | @@ -4,43 +4,49 @@ | ||
4 | <h3 class="community-name-members"><%= _("%s") % profile.name %></h3> | 4 | <h3 class="community-name-members"><%= _("%s") % profile.name %></h3> |
5 | 5 | ||
6 | <% cache_timeout(profile.members_cache_key(params), 4.hours) do %> | 6 | <% cache_timeout(profile.members_cache_key(params), 4.hours) do %> |
7 | +<div class="profile-members-tabs-container"> | ||
8 | + <% tabs = [] %> | ||
9 | + <% div_admins = content_tag :div, :class => "profile-admins" do | ||
10 | + render :partial => 'profile_members_list', | ||
11 | + :locals => { | ||
12 | + :users => @profile_admins, | ||
13 | + :role => "admins" | ||
14 | + } | ||
15 | + end %> | ||
16 | + | ||
17 | + <% admins_pagination = content_tag :div, :class => "pagination-profile-admins" do | ||
18 | + pagination_links @profile_admins, :param_name => 'npage' | ||
19 | + end %> | ||
20 | + | ||
21 | + <% tabs << {:title => "#{@profile_admins.size} "+_("Administrators"), | ||
22 | + :id => "admins-tab", | ||
23 | + :content => (div_admins+admins_pagination) | ||
24 | + } %> | ||
25 | + | ||
26 | + | ||
27 | + <% div_members = content_tag :div, :class => "profile-members" do | ||
28 | + render :partial => 'profile_members_list', | ||
29 | + :locals => { | ||
30 | + :users => @profile_members, | ||
31 | + :role => "members" | ||
32 | + } | ||
33 | + | ||
34 | + end %> | ||
35 | + | ||
36 | + <% members_pagination = content_tag :div, :class => "pagination-profile-members" do | ||
37 | + pagination_links @profile_members, :param_name => 'npage' | ||
38 | + end %> | ||
39 | + | ||
40 | + | ||
41 | + <% tabs << {:title => "#{@profile_members.size} "+_("Members"), | ||
42 | + :id => "members-tab", | ||
43 | + :content => (div_members + members_pagination) | ||
44 | + } %> | ||
45 | + | ||
46 | + <%= render_tabs(tabs) %> | ||
47 | + <% end %> | ||
48 | +</div> | ||
7 | 49 | ||
8 | - <div class='profile-admins'> | ||
9 | - <h2><%= "#{@profile_admins.count} "+_("admins") %></h2> | ||
10 | - <ul class='profile-list'> | ||
11 | - <% @profile_admins.each do |admin| %> | ||
12 | - <%= profile_image_link(admin) %> | ||
13 | - <% end %> | ||
14 | - </ul> | ||
15 | - </div> | ||
16 | - | ||
17 | - <div class="profile-members-title-sort"> | ||
18 | - <h2><%= "#{@members_count} "+ _("members") %></h2> | ||
19 | - | ||
20 | - <div id="members-display-options-sort"> | ||
21 | - <%= label_tag("sort", _("Sort by:")) %> | ||
22 | - <%= select_tag("sort", | ||
23 | - options_for_select( | ||
24 | - [ | ||
25 | - [_("Name A-Z"), 'asc'], | ||
26 | - [_("Name Z-A"), 'desc'], | ||
27 | - ], :selected=>params[:sort]) | ||
28 | - ) %> | ||
29 | - </div> | ||
30 | - </div> | ||
31 | - | ||
32 | - <div class='profile-members'> | ||
33 | - <ul class='profile-list'> | ||
34 | - <% @members_except_admins.each do |member| %> | ||
35 | - <%= profile_image_link(member) %> | ||
36 | - <% end %> | ||
37 | - </ul> | ||
38 | - </div> | ||
39 | - | ||
40 | - <div id='pagination-profiles'> | ||
41 | - <%= pagination_links @members_except_admins, :param_name => 'npage' %> | ||
42 | - </div> | ||
43 | -<% end %> | ||
44 | 50 | ||
45 | <% button_bar do %> | 51 | <% button_bar do %> |
46 | <%= button :back, _('Go back'), { :controller => 'profile' } %> | 52 | <%= button :back, _('Go back'), { :controller => 'profile' } %> |
@@ -54,7 +60,8 @@ | @@ -54,7 +60,8 @@ | ||
54 | <% end %> | 60 | <% end %> |
55 | <% end %> | 61 | <% end %> |
56 | 62 | ||
57 | -<%= hidden_field_tag "current_profile", profile.identifier %> | 63 | +<%= hidden_field_tag "profile_url", @profile_members_url %> |
64 | +<%= hidden_field_tag "sort", "asc" %> | ||
58 | </div><!-- fim class="common-profile-list-block" --> | 65 | </div><!-- fim class="common-profile-list-block" --> |
59 | 66 | ||
60 | <%= javascript_include_tag "members_page.js" %> | 67 | <%= javascript_include_tag "members_page.js" %> |
plugins/people_block/controllers/people_block_plugin_profile_controller.rb
@@ -1,20 +0,0 @@ | @@ -1,20 +0,0 @@ | ||
1 | -class PeopleBlockPluginProfileController < ProfileController | ||
2 | - | ||
3 | - append_view_path File.join(File.dirname(__FILE__) + '/../views') | ||
4 | - | ||
5 | - def members | ||
6 | - if is_cache_expired?(profile.members_cache_key(params)) | ||
7 | - unless params[:role_key].blank? | ||
8 | - role = Role.find_by_key_and_environment_id(params[:role_key], profile.environment) | ||
9 | - @members = profile.members.with_role(role.id) | ||
10 | - @members_title = role.name | ||
11 | - else | ||
12 | - @members = profile.members | ||
13 | - @members_title = 'members' | ||
14 | - end | ||
15 | - @members = @members.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => @members.count) | ||
16 | - end | ||
17 | - render "people_block_profile/members" | ||
18 | - end | ||
19 | - | ||
20 | -end |
plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb
@@ -1,76 +0,0 @@ | @@ -1,76 +0,0 @@ | ||
1 | -require_relative '../test_helper' | ||
2 | -require_relative '../../controllers/people_block_plugin_profile_controller' | ||
3 | - | ||
4 | - | ||
5 | -# Re-raise errors caught by the controller. | ||
6 | -class PeopleBlockPluginProfileController; def rescue_action(e) raise e end; end | ||
7 | - | ||
8 | -class PeopleBlockPluginProfileControllerTest < ActionController::TestCase | ||
9 | - | ||
10 | - def setup | ||
11 | - @controller = PeopleBlockPluginProfileController.new | ||
12 | - @request = ActionController::TestRequest.new | ||
13 | - @response = ActionController::TestResponse.new | ||
14 | - | ||
15 | - @profile = fast_create(Community) | ||
16 | - | ||
17 | - @environment = @profile.environment | ||
18 | - @environment.enabled_plugins = ['PeopleBlockPlugin'] | ||
19 | - @environment.save! | ||
20 | - | ||
21 | - MembersBlock.delete_all | ||
22 | - @block = MembersBlock.new | ||
23 | - @block.box = @profile.boxes.first | ||
24 | - @block.save! | ||
25 | - | ||
26 | - @admin = create_user('adminprofile').person | ||
27 | - @member = create_user('memberprofile').person | ||
28 | - @moderator = create_user('moderatorprofile').person | ||
29 | - @profile.add_moderator(@moderator) | ||
30 | - @profile.add_member(@member) | ||
31 | - @profile.add_admin(@admin) | ||
32 | - end | ||
33 | - | ||
34 | - attr_accessor :profile, :block, :admin, :member, :moderator | ||
35 | - | ||
36 | - should 'list members without role_key' do | ||
37 | - get :members, :profile => profile.identifier, :role_key => "" | ||
38 | - assert_response :success | ||
39 | - assert_template 'members' | ||
40 | - assert_equivalent [@admin, @member, @moderator], assigns(:members) | ||
41 | - assert_match /adminprofile/, @response.body | ||
42 | - assert_match /memberprofile/, @response.body | ||
43 | - assert_match /moderatorprofile/, @response.body | ||
44 | - end | ||
45 | - | ||
46 | - should 'list members with role_key=nil' do | ||
47 | - get :members, :profile => profile.identifier, :role_key => nil | ||
48 | - assert_response :success | ||
49 | - assert_template 'members' | ||
50 | - assert_equivalent [@admin, @member, @moderator], assigns(:members) | ||
51 | - assert_match /adminprofile/, @response.body | ||
52 | - assert_match /memberprofile/, @response.body | ||
53 | - assert_match /moderatorprofile/, @response.body | ||
54 | - end | ||
55 | - | ||
56 | - should 'list members only' do | ||
57 | - get :members, :profile => profile.identifier, :role_key => Profile::Roles.member(profile.environment.id).key | ||
58 | - assert_response :success | ||
59 | - assert_template 'members' | ||
60 | - assert_equal [@member], assigns(:members) | ||
61 | - assert_no_match /adminprofile/, @response.body | ||
62 | - assert_match /memberprofile/, @response.body | ||
63 | - assert_no_match /moderatorprofile/, @response.body | ||
64 | - end | ||
65 | - | ||
66 | - should 'list moderators only' do | ||
67 | - get :members, :profile => profile.identifier, :role_key => Profile::Roles.moderator(profile.environment.id).key | ||
68 | - assert_response :success | ||
69 | - assert_template 'members' | ||
70 | - assert_equal [@moderator], assigns(:members) | ||
71 | - assert_no_match /adminprofile/, @response.body | ||
72 | - assert_no_match /memberprofile/, @response.body | ||
73 | - assert_match /moderatorprofile/, @response.body | ||
74 | - end | ||
75 | - | ||
76 | -end |
plugins/people_block/views/blocks/members.html.erb
1 | -<%= link_to c_('View all'), {:profile => profile.identifier, :controller => 'people_block_plugin_profile', :action => 'members', :role_key => role_key}, :class => 'view-all' %> | 1 | +<% anchor = role_key == "profile_admin" ? "admins-tab" : "members-tab" %> |
2 | +<%= link_to c_('View all'), {:profile => profile.identifier, :controller => 'profile', :action => 'members', :anchor =>anchor }, :class => 'view-all' %> | ||
2 | 3 | ||
3 | <% if show_join_leave_button %> | 4 | <% if show_join_leave_button %> |
4 | <%= render :partial => 'blocks/profile_info_actions/join_leave_community' %> | 5 | <%= render :partial => 'blocks/profile_info_actions/join_leave_community' %> |
plugins/people_block/views/people_block_profile/members.html.erb
@@ -1,29 +0,0 @@ | @@ -1,29 +0,0 @@ | ||
1 | -<div class="common-profile-list-block"> | ||
2 | - | ||
3 | -<h1><%= _("%s's members") % profile.name %></h1> | ||
4 | - | ||
5 | -<% cache_timeout(profile.members_cache_key(params), 4.hours) do %> | ||
6 | - <ul class='profile-list'> | ||
7 | - <% @members.each do |member| %> | ||
8 | - <%= profile_image_link(member) %> | ||
9 | - <% end %> | ||
10 | - </ul> | ||
11 | - | ||
12 | - <div id='pagination-profiles'> | ||
13 | - <%= pagination_links @members, :param_name => 'npage' %> | ||
14 | - </div> | ||
15 | -<% end %> | ||
16 | - | ||
17 | -<% button_bar do %> | ||
18 | - <%= button :back, _('Go back'), { :controller => 'profile' } %> | ||
19 | - <% if profile.community? and user %> | ||
20 | - <% if user.has_permission?(:invite_members, profile) %> | ||
21 | - <%= button :person, _('Invite people to join'), :controller => 'invite', :action => 'invite_friends' %> | ||
22 | - <% end %> | ||
23 | - <% if user.has_permission?(:send_mail_to_members, profile) %> | ||
24 | - <%= button :send, _('Send e-mail to members'), :controller => 'profile', :action => 'send_mail' %> | ||
25 | - <% end %> | ||
26 | - <% end %> | ||
27 | -<% end %> | ||
28 | - | ||
29 | -</div><!-- fim class="common-profile-list-block" --> | ||
30 | \ No newline at end of file | 0 | \ No newline at end of file |
public/javascripts/members_page.js
@@ -2,17 +2,18 @@ | @@ -2,17 +2,18 @@ | ||
2 | "use strict"; | 2 | "use strict"; |
3 | 3 | ||
4 | function set_members_sort() { | 4 | function set_members_sort() { |
5 | - var page_profile = $("#current_profile").val(); | ||
6 | - var members_url = noosfero_root() + "/profile/" + page_profile + "/members"; | 5 | + var profile_members_url = $("#profile_url").val(); |
7 | 6 | ||
8 | - $("#sort").on("change", function() { | 7 | + $("#sort-members, #sort-admins").on("change", function() { |
9 | var sort_value = this.value; | 8 | var sort_value = this.value; |
10 | - var actual_page_content = $(".common-profile-list-block"); | 9 | + var role = this.id; |
10 | + role = role.replace("sort-", ''); | ||
11 | + var actual_page_content = $(".profile-list-"+role); | ||
11 | 12 | ||
12 | - $.get(members_url, {sort: sort_value}, function(response) { | 13 | + $.get(profile_members_url, {sort: sort_value}, function(response) { |
13 | var html_response = $(response); | 14 | var html_response = $(response); |
14 | 15 | ||
15 | - actual_page_content.html(html_response.html()); | 16 | + actual_page_content.html(html_response.find(".profile-list-"+role).html()); |
16 | set_members_sort(); | 17 | set_members_sort(); |
17 | }); | 18 | }); |
18 | }); | 19 | }); |
public/stylesheets/application.css
@@ -4787,6 +4787,11 @@ h1#agenda-title { | @@ -4787,6 +4787,11 @@ h1#agenda-title { | ||
4787 | background-image: url(../images/control-panel/role-management.gif) | 4787 | background-image: url(../images/control-panel/role-management.gif) |
4788 | } | 4788 | } |
4789 | /* ==> public/stylesheets/controller_profile_members.css <== */ | 4789 | /* ==> public/stylesheets/controller_profile_members.css <== */ |
4790 | + | ||
4791 | +.profile-members-tabs-container .ui-corner-all { | ||
4792 | + overflow: auto; | ||
4793 | +} | ||
4794 | + | ||
4790 | .controller-profile_members .no-boxes { | 4795 | .controller-profile_members .no-boxes { |
4791 | margin: 30px | 4796 | margin: 30px |
4792 | } | 4797 | } |