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])
+ ) %>
+
+
+ <% users.each do |u| %>
+ <%= profile_image_link(u) %>
+ <% end %>
+
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 %>
+
<% cache_timeout(profile.members_cache_key(params), 4.hours) do %>
-
- <% @members.each do |member| %>
- <%= profile_image_link(member) %>
- <% end %>
-
+
+ <% 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)
+ } %>
-
+ <% 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