diff --git a/app/controllers/public/profile_controller.rb b/app/controllers/public/profile_controller.rb index 10c92bd..266b6c1 100644 --- a/app/controllers/public/profile_controller.rb +++ b/app/controllers/public/profile_controller.rb @@ -66,7 +66,10 @@ class ProfileController < PublicController def members if is_cache_expired?(profile.members_cache_key(params)) - @members = profile.members_by_name.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => profile.members.count) + sort = (params[:sort] == 'desc') ? params[:sort] : 'asc' + @profile_admins = profile.admins.order("name #{sort}").paginate(:per_page => members_per_page, :page => params[:npage]) + @profile_members = profile.members.order("name #{sort}").paginate(:per_page => members_per_page, :page => params[:npage]) + @profile_members_url = url_for(:controller => 'profile', :action => 'members') end end diff --git a/app/models/profile.rb b/app/models/profile.rb index 0be86af..57745ea 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -913,7 +913,8 @@ private :generate_url, :url_options def members_cache_key(params = {}) page = params[:npage] || '1' - cache_key + '-members-page-' + page + sort = (params[:sort] == 'desc') ? params[:sort] : 'asc' + cache_key + '-members-page-' + page + '-' + sort end def more_recent_label diff --git a/app/views/profile/_profile_members_list.html.erb b/app/views/profile/_profile_members_list.html.erb new file mode 100644 index 0000000..56bf10d --- /dev/null +++ b/app/views/profile/_profile_members_list.html.erb @@ -0,0 +1,14 @@ +
+ <%= label_tag("sort-#{role}", _("Sort by:")) %> + <%= select_tag("sort-#{role}", + options_for_select([ + [_("Name A-Z"), 'asc'], + [_("Name Z-A"), 'desc'], + ], :selected => params[:sort]) + ) %> +
+ diff --git a/app/views/profile/members.html.erb b/app/views/profile/members.html.erb index fc9f1ae..52dc45f 100644 --- a/app/views/profile/members.html.erb +++ b/app/views/profile/members.html.erb @@ -1,17 +1,48 @@
-

<%= _("%s's members") % profile.name %>

+

<%= _("Members (%d)") % @profile_members.total_entries %>

+

<%= profile.name %>

<% cache_timeout(profile.members_cache_key(params), 4.hours) do %> - +
+ <% tabs = [] %> + + <% div_members = content_tag :div, :class => "profile-members" do + render :partial => 'profile_members_list', + :locals => { + :users => @profile_members, + :role => "members" + } + end %> + + <% members_pagination = content_tag :div, :class => "pagination-profile-members" do + pagination_links @profile_members, :param_name => 'npage' + end %> + + <% tabs << {:title => _("%d Members") % @profile_members.size, + :id => "members-tab", + :content => (div_members + members_pagination) + } %> -
- <%= pagination_links @members, :param_name => 'npage' %> -
+ <% div_admins = content_tag :div, :class => "profile-admins" do + render :partial => 'profile_members_list', + :locals => { + :users => @profile_admins, + :role => "admins" + } + end %> + + <% admins_pagination = content_tag :div, :class => "pagination-profile-admins" do + pagination_links @profile_admins, :param_name => 'npage' + end %> + + <% tabs << {:title => _("%d Administrators") % @profile_admins.size, + :id => "admins-tab", + :content => (div_admins+admins_pagination) + } %> + + <%= render_tabs(tabs) %> +
<% end %> <% button_bar do %> @@ -26,4 +57,8 @@ <% end %> <% end %> -
+<%= hidden_field_tag "profile_url", @profile_members_url %> +<%= hidden_field_tag "sort", "asc" %> + + +<%= javascript_include_tag "members_page.js" %> diff --git a/plugins/people_block/controllers/people_block_plugin_profile_controller.rb b/plugins/people_block/controllers/people_block_plugin_profile_controller.rb deleted file mode 100644 index f879976..0000000 --- a/plugins/people_block/controllers/people_block_plugin_profile_controller.rb +++ /dev/null @@ -1,20 +0,0 @@ -class PeopleBlockPluginProfileController < ProfileController - - append_view_path File.join(File.dirname(__FILE__) + '/../views') - - def members - if is_cache_expired?(profile.members_cache_key(params)) - unless params[:role_key].blank? - role = Role.find_by_key_and_environment_id(params[:role_key], profile.environment) - @members = profile.members.with_role(role.id) - @members_title = role.name - else - @members = profile.members - @members_title = 'members' - end - @members = @members.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => @members.count) - end - render "profile/members" - end - -end diff --git a/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb b/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb deleted file mode 100644 index 4014672..0000000 --- a/plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb +++ /dev/null @@ -1,76 +0,0 @@ -require_relative '../test_helper' -require_relative '../../controllers/people_block_plugin_profile_controller' - - -# Re-raise errors caught by the controller. -class PeopleBlockPluginProfileController; def rescue_action(e) raise e end; end - -class PeopleBlockPluginProfileControllerTest < ActionController::TestCase - - def setup - @controller = PeopleBlockPluginProfileController.new - @request = ActionController::TestRequest.new - @response = ActionController::TestResponse.new - - @profile = fast_create(Community) - - @environment = @profile.environment - @environment.enabled_plugins = ['PeopleBlockPlugin'] - @environment.save! - - MembersBlock.delete_all - @block = MembersBlock.new - @block.box = @profile.boxes.first - @block.save! - - @admin = create_user('adminprofile').person - @member = create_user('memberprofile').person - @moderator = create_user('moderatorprofile').person - @profile.add_moderator(@moderator) - @profile.add_member(@member) - @profile.add_admin(@admin) - end - - attr_accessor :profile, :block, :admin, :member, :moderator - - should 'list members without role_key' do - get :members, :profile => profile.identifier, :role_key => "" - assert_response :success - assert_template 'members' - assert_equivalent [@admin, @member, @moderator], assigns(:members) - assert_match /adminprofile/, @response.body - assert_match /memberprofile/, @response.body - assert_match /moderatorprofile/, @response.body - end - - should 'list members with role_key=nil' do - get :members, :profile => profile.identifier, :role_key => nil - assert_response :success - assert_template 'members' - assert_equivalent [@admin, @member, @moderator], assigns(:members) - assert_match /adminprofile/, @response.body - assert_match /memberprofile/, @response.body - assert_match /moderatorprofile/, @response.body - end - - should 'list members only' do - get :members, :profile => profile.identifier, :role_key => Profile::Roles.member(profile.environment.id).key - assert_response :success - assert_template 'members' - assert_equal [@member], assigns(:members) - assert_no_match /adminprofile/, @response.body - assert_match /memberprofile/, @response.body - assert_no_match /moderatorprofile/, @response.body - end - - should 'list moderators only' do - get :members, :profile => profile.identifier, :role_key => Profile::Roles.moderator(profile.environment.id).key - assert_response :success - assert_template 'members' - assert_equal [@moderator], assigns(:members) - assert_no_match /adminprofile/, @response.body - assert_no_match /memberprofile/, @response.body - assert_match /moderatorprofile/, @response.body - end - -end diff --git a/plugins/people_block/test/unit/members_block_test.rb b/plugins/people_block/test/unit/members_block_test.rb index 5887de1..9edc92c 100644 --- a/plugins/people_block/test/unit/members_block_test.rb +++ b/plugins/people_block/test/unit/members_block_test.rb @@ -147,11 +147,11 @@ class MembersBlockTest < ActionView::TestCase instance_eval(&block.footer) assert_select 'a.view-all' do |elements| - assert_select '[href=/profile/mytestuser/plugin/people_block/members]' + assert_select "[href=/profile/mytestuser/members#members-tab]" end end - should 'provide link to members page with a selected role' do + should 'provide link to members page when visible_role is profile_member' do profile = create_user('mytestuser').person block = MembersBlock.new block.box = profile.boxes.first @@ -160,7 +160,33 @@ class MembersBlockTest < ActionView::TestCase instance_eval(&block.footer) assert_select 'a.view-all' do |elements| - assert_select '[href=/profile/mytestuser/plugin/people_block/members?role_key=profile_member]' + assert_select '[href=/profile/mytestuser/members#members-tab]' + end + end + + should 'provide link to members page when visible_role is profile_moderator' do + profile = create_user('mytestuser').person + block = MembersBlock.new + block.box = profile.boxes.first + block.visible_role = 'profile_moderator' + block.save! + + instance_eval(&block.footer) + assert_select 'a.view-all' do |elements| + assert_select '[href=/profile/mytestuser/members#members-tab]' + end + end + + should 'provide link to admins page when visible_role is profile_admin' do + profile = create_user('mytestuser').person + block = MembersBlock.new + block.box = profile.boxes.first + block.visible_role = 'profile_admin' + block.save! + + instance_eval(&block.footer) + assert_select 'a.view-all' do |elements| + assert_select '[href=/profile/mytestuser/members#admins-tab]' end end diff --git a/plugins/people_block/views/blocks/members.html.erb b/plugins/people_block/views/blocks/members.html.erb index 5881147..89ed71b 100644 --- a/plugins/people_block/views/blocks/members.html.erb +++ b/plugins/people_block/views/blocks/members.html.erb @@ -1,4 +1,5 @@ -<%= link_to c_('View all'), {:profile => profile.identifier, :controller => 'people_block_plugin_profile', :action => 'members', :role_key => role_key}, :class => 'view-all' %> +<% anchor = role_key == "profile_admin" ? "admins-tab" : "members-tab" %> +<%= link_to c_('View all'), {:profile => profile.identifier, :controller => 'profile', :action => 'members', :anchor =>anchor }, :class => 'view-all' %> <% if show_join_leave_button %> <%= render :partial => 'blocks/profile_info_actions/join_leave_community' %> diff --git a/public/designs/themes/base/style.scss b/public/designs/themes/base/style.scss index ffe34c5..7c688a4 100644 --- a/public/designs/themes/base/style.scss +++ b/public/designs/themes/base/style.scss @@ -231,6 +231,10 @@ body, th, td, input { border-left: 0px; } +.menu-submenu-list>li{ + width: 100%; +} + #navigation .menu-submenu ul{ border: 1px solid #888a85; border-top: 0px; @@ -1534,3 +1538,7 @@ table#recaptcha_table tr:hover td { width: 494px; padding-left: 2px; } + +.profile-members-title-sort { + clear: both; +} diff --git a/public/javascripts/members_page.js b/public/javascripts/members_page.js new file mode 100644 index 0000000..9b7eee4 --- /dev/null +++ b/public/javascripts/members_page.js @@ -0,0 +1,24 @@ +(function($) { + "use strict"; + + function set_members_sort() { + var profile_members_url = $("#profile_url").val(); + + $("#sort-members, #sort-admins").on("change", function() { + var sort_value = this.value; + var role = this.id; + role = role.replace("sort-", ''); + var actual_page_content = $(".profile-list-"+role); + + $.get(profile_members_url, {sort: sort_value}, function(response) { + var html_response = $(response); + + actual_page_content.html(html_response.find(".profile-list-"+role).html()); + }); + }); + } + + $(document).ready(function() { + set_members_sort(); + }); +}) (jQuery); diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 575a76e..19dcdc3 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -4775,6 +4775,11 @@ h1#agenda-title { background-image: url(../images/control-panel/role-management.gif) } /* ==> public/stylesheets/controller_profile_members.css <== */ + +.profile-members-tabs-container .ui-corner-all { + overflow: auto; +} + .controller-profile_members .no-boxes { margin: 30px } @@ -5430,6 +5435,7 @@ h1#agenda-title { margin: 0; padding: 0; width: 100%; + height: 92px; } #content .menu-submenu-content ul { margin: 0; diff --git a/test/functional/profile_controller_test.rb b/test/functional/profile_controller_test.rb index d5695b4..610529e 100644 --- a/test/functional/profile_controller_test.rb +++ b/test/functional/profile_controller_test.rb @@ -55,7 +55,8 @@ class ProfileControllerTest < ActionController::TestCase assert_response :success assert_template 'members' - assert assigns(:members) + assert assigns(:profile_members) + assert assigns(:profile_admins) end should 'list favorite enterprises' do @@ -1747,4 +1748,68 @@ class ProfileControllerTest < ActionController::TestCase assert_no_tag :tag => 'td', :descendant => { :tag => 'a', :content => /#{person.enterprises.count}/, :attributes => { :href => /profile\/#{person.identifier}\/enterprises$/ }} end + should 'admins from a community be present in admin users div and members div' do + community = fast_create(Community) + another_user = create_user('another_user').person + + login_as(@profile.identifier) + + community.add_admin(@profile) + + assert community.admins.include? @profile + get :members, :profile => community.identifier + + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-admins/}, + :descendant => { :tag => 'a', :attributes => { :title => "testuser" } } + + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-members/}, + :descendant => { :tag => 'a', :attributes => { :title => "testuser" } } + end + + should 'all members, except admins, be present in members div' do + community = fast_create(Community) + community.add_member(@profile) + + another_user = create_user('another_user').person + community.add_member(another_user) + + assert_equal false, community.admins.include?(another_user) + + get :members, :profile => community.identifier + + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-members/}, + :descendant => { :tag => 'a', :attributes => { :title => "another_user" } } + + assert_no_tag :tag => 'ul', :attributes => { :class => /profile-list-admins/}, + :descendant => { :tag => 'a', :attributes => { :title => "another_user" } } + end + + should 'members be sorted by name in ascendant order' do + community = fast_create(Community) + another_user = create_user('another_user').person + different_user = create_user('different_user').person + + community.add_member(@profile) + community.add_member(another_user) + community.add_member(different_user) + + get :members, :profile => community.identifier, :sort => "asc" + + assert @response.body.index("another_user") < @response.body.index("different_user") + end + + should 'members be sorted by name in descendant order' do + community = fast_create(Community) + another_user = create_user('another_user').person + different_user = create_user('different_user').person + + community.add_member(@profile) + community.add_member(another_user) + community.add_member(different_user) + + get :members, :profile => community.identifier, :sort => "desc" + + assert @response.body.index("another_user") > @response.body.index("different_user") + end + end -- libgit2 0.21.2