Commit 8f571a5e74cc2e9f92f57a7e44ac8bb2455a616c
Committed by
Daniela Feitosa
1 parent
86fab629
Exists in
master
and in
29 other branches
Split members page in admins and non-admins
- Order members by name - Removed white spaces - Changed strings to be translated - Renamed div id and test - Adjust ul tag members - Fixed plugin dependency Signed-off-by: Omar Junior <omarroinuj@gmail.com> Signed-off-by: DylanGuedes <djmgguedes@gmail.com> Signed-off-by: Vitor Barbosa <vitormga15@gmail.com> Signed-off-by: Brenddon Gontijo <brenddongontijo@msn.com> Signed-off-by: Tallys Martins <tallysmartins@yahoo.com.br> Signed-off-by: Simiao Carvalho <simiaosimis@gmail.com>
Showing
12 changed files
with
200 additions
and
113 deletions
Show diff stats
app/controllers/public/profile_controller.rb
| ... | ... | @@ -66,7 +66,10 @@ class ProfileController < PublicController |
| 66 | 66 | |
| 67 | 67 | def members |
| 68 | 68 | if is_cache_expired?(profile.members_cache_key(params)) |
| 69 | - @members = profile.members_by_name.includes(relations_to_include).paginate(:per_page => members_per_page, :page => params[:npage], :total_entries => profile.members.count) | |
| 69 | + sort = (params[:sort] == 'desc') ? params[:sort] : 'asc' | |
| 70 | + @profile_admins = profile.admins.order("name #{sort}").paginate(:per_page => members_per_page, :page => params[:npage]) | |
| 71 | + @profile_members = profile.members.order("name #{sort}").paginate(:per_page => members_per_page, :page => params[:npage]) | |
| 72 | + @profile_members_url = url_for(:controller => 'profile', :action => 'members') | |
| 70 | 73 | end |
| 71 | 74 | end |
| 72 | 75 | ... | ... |
app/models/profile.rb
| ... | ... | @@ -913,7 +913,8 @@ private :generate_url, :url_options |
| 913 | 913 | |
| 914 | 914 | def members_cache_key(params = {}) |
| 915 | 915 | page = params[:npage] || '1' |
| 916 | - cache_key + '-members-page-' + page | |
| 916 | + sort = (params[:sort] == 'desc') ? params[:sort] : 'asc' | |
| 917 | + cache_key + '-members-page-' + page + '-' + sort | |
| 917 | 918 | end |
| 918 | 919 | |
| 919 | 920 | def more_recent_label | ... | ... |
| ... | ... | @@ -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
| 1 | 1 | <div class="common-profile-list-block"> |
| 2 | 2 | |
| 3 | -<h1><%= _("%s's members") % profile.name %></h1> | |
| 3 | +<h1><%= _("Members (%d)") % @profile_members.total_entries %></h1> | |
| 4 | +<h2 class="community-name"><%= profile.name %></h2> | |
| 4 | 5 | |
| 5 | 6 | <% 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> | |
| 7 | + <div class="profile-members-tabs-container"> | |
| 8 | + <% tabs = [] %> | |
| 9 | + | |
| 10 | + <% div_members = content_tag :div, :class => "profile-members" do | |
| 11 | + render :partial => 'profile_members_list', | |
| 12 | + :locals => { | |
| 13 | + :users => @profile_members, | |
| 14 | + :role => "members" | |
| 15 | + } | |
| 16 | + end %> | |
| 17 | + | |
| 18 | + <% members_pagination = content_tag :div, :class => "pagination-profile-members" do | |
| 19 | + pagination_links @profile_members, :param_name => 'npage' | |
| 20 | + end %> | |
| 21 | + | |
| 22 | + <% tabs << {:title => _("%d Members") % @profile_members.size, | |
| 23 | + :id => "members-tab", | |
| 24 | + :content => (div_members + members_pagination) | |
| 25 | + } %> | |
| 11 | 26 | |
| 12 | - <div id='pagination-profiles'> | |
| 13 | - <%= pagination_links @members, :param_name => 'npage' %> | |
| 14 | - </div> | |
| 27 | + <% div_admins = content_tag :div, :class => "profile-admins" do | |
| 28 | + render :partial => 'profile_members_list', | |
| 29 | + :locals => { | |
| 30 | + :users => @profile_admins, | |
| 31 | + :role => "admins" | |
| 32 | + } | |
| 33 | + end %> | |
| 34 | + | |
| 35 | + <% admins_pagination = content_tag :div, :class => "pagination-profile-admins" do | |
| 36 | + pagination_links @profile_admins, :param_name => 'npage' | |
| 37 | + end %> | |
| 38 | + | |
| 39 | + <% tabs << {:title => _("%d Administrators") % @profile_admins.size, | |
| 40 | + :id => "admins-tab", | |
| 41 | + :content => (div_admins+admins_pagination) | |
| 42 | + } %> | |
| 43 | + | |
| 44 | + <%= render_tabs(tabs) %> | |
| 45 | + </div><!-- end of class="profile-members-tabs-container" --> | |
| 15 | 46 | <% end %> |
| 16 | 47 | |
| 17 | 48 | <% button_bar do %> |
| ... | ... | @@ -26,4 +57,8 @@ |
| 26 | 57 | <% end %> |
| 27 | 58 | <% end %> |
| 28 | 59 | |
| 29 | -</div><!-- fim class="common-profile-list-block" --> | |
| 60 | +<%= hidden_field_tag "profile_url", @profile_members_url %> | |
| 61 | +<%= hidden_field_tag "sort", "asc" %> | |
| 62 | +</div><!-- end of class="common-profile-list-block" --> | |
| 63 | + | |
| 64 | +<%= javascript_include_tag "members_page.js" %> | ... | ... |
plugins/people_block/controllers/people_block_plugin_profile_controller.rb
| ... | ... | @@ -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 "profile/members" | |
| 18 | - end | |
| 19 | - | |
| 20 | -end |
plugins/people_block/test/functional/people_block_plugin_profile_controller_test.rb
| ... | ... | @@ -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/test/unit/members_block_test.rb
| ... | ... | @@ -147,11 +147,11 @@ class MembersBlockTest < ActionView::TestCase |
| 147 | 147 | |
| 148 | 148 | instance_eval(&block.footer) |
| 149 | 149 | assert_select 'a.view-all' do |elements| |
| 150 | - assert_select '[href=/profile/mytestuser/plugin/people_block/members]' | |
| 150 | + assert_select "[href=/profile/mytestuser/members#members-tab]" | |
| 151 | 151 | end |
| 152 | 152 | end |
| 153 | 153 | |
| 154 | - should 'provide link to members page with a selected role' do | |
| 154 | + should 'provide link to members page when visible_role is profile_member' do | |
| 155 | 155 | profile = create_user('mytestuser').person |
| 156 | 156 | block = MembersBlock.new |
| 157 | 157 | block.box = profile.boxes.first |
| ... | ... | @@ -160,7 +160,33 @@ class MembersBlockTest < ActionView::TestCase |
| 160 | 160 | |
| 161 | 161 | instance_eval(&block.footer) |
| 162 | 162 | assert_select 'a.view-all' do |elements| |
| 163 | - assert_select '[href=/profile/mytestuser/plugin/people_block/members?role_key=profile_member]' | |
| 163 | + assert_select '[href=/profile/mytestuser/members#members-tab]' | |
| 164 | + end | |
| 165 | + end | |
| 166 | + | |
| 167 | + should 'provide link to members page when visible_role is profile_moderator' do | |
| 168 | + profile = create_user('mytestuser').person | |
| 169 | + block = MembersBlock.new | |
| 170 | + block.box = profile.boxes.first | |
| 171 | + block.visible_role = 'profile_moderator' | |
| 172 | + block.save! | |
| 173 | + | |
| 174 | + instance_eval(&block.footer) | |
| 175 | + assert_select 'a.view-all' do |elements| | |
| 176 | + assert_select '[href=/profile/mytestuser/members#members-tab]' | |
| 177 | + end | |
| 178 | + end | |
| 179 | + | |
| 180 | + should 'provide link to admins page when visible_role is profile_admin' do | |
| 181 | + profile = create_user('mytestuser').person | |
| 182 | + block = MembersBlock.new | |
| 183 | + block.box = profile.boxes.first | |
| 184 | + block.visible_role = 'profile_admin' | |
| 185 | + block.save! | |
| 186 | + | |
| 187 | + instance_eval(&block.footer) | |
| 188 | + assert_select 'a.view-all' do |elements| | |
| 189 | + assert_select '[href=/profile/mytestuser/members#admins-tab]' | |
| 164 | 190 | end |
| 165 | 191 | end |
| 166 | 192 | ... | ... |
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 | 4 | <% if show_join_leave_button %> |
| 4 | 5 | <%= render :partial => 'blocks/profile_info_actions/join_leave_community' %> | ... | ... |
public/designs/themes/base/style.scss
| ... | ... | @@ -231,6 +231,10 @@ body, th, td, input { |
| 231 | 231 | border-left: 0px; |
| 232 | 232 | } |
| 233 | 233 | |
| 234 | +.menu-submenu-list>li{ | |
| 235 | + width: 100%; | |
| 236 | +} | |
| 237 | + | |
| 234 | 238 | #navigation .menu-submenu ul{ |
| 235 | 239 | border: 1px solid #888a85; |
| 236 | 240 | border-top: 0px; |
| ... | ... | @@ -1534,3 +1538,7 @@ table#recaptcha_table tr:hover td { |
| 1534 | 1538 | width: 494px; |
| 1535 | 1539 | padding-left: 2px; |
| 1536 | 1540 | } |
| 1541 | + | |
| 1542 | +.profile-members-title-sort { | |
| 1543 | + clear: both; | |
| 1544 | +} | ... | ... |
| ... | ... | @@ -0,0 +1,24 @@ |
| 1 | +(function($) { | |
| 2 | + "use strict"; | |
| 3 | + | |
| 4 | + function set_members_sort() { | |
| 5 | + var profile_members_url = $("#profile_url").val(); | |
| 6 | + | |
| 7 | + $("#sort-members, #sort-admins").on("change", function() { | |
| 8 | + var sort_value = this.value; | |
| 9 | + var role = this.id; | |
| 10 | + role = role.replace("sort-", ''); | |
| 11 | + var actual_page_content = $(".profile-list-"+role); | |
| 12 | + | |
| 13 | + $.get(profile_members_url, {sort: sort_value}, function(response) { | |
| 14 | + var html_response = $(response); | |
| 15 | + | |
| 16 | + actual_page_content.html(html_response.find(".profile-list-"+role).html()); | |
| 17 | + }); | |
| 18 | + }); | |
| 19 | + } | |
| 20 | + | |
| 21 | + $(document).ready(function() { | |
| 22 | + set_members_sort(); | |
| 23 | + }); | |
| 24 | +}) (jQuery); | ... | ... |
public/stylesheets/application.css
| ... | ... | @@ -4775,6 +4775,11 @@ h1#agenda-title { |
| 4775 | 4775 | background-image: url(../images/control-panel/role-management.gif) |
| 4776 | 4776 | } |
| 4777 | 4777 | /* ==> public/stylesheets/controller_profile_members.css <== */ |
| 4778 | + | |
| 4779 | +.profile-members-tabs-container .ui-corner-all { | |
| 4780 | + overflow: auto; | |
| 4781 | +} | |
| 4782 | + | |
| 4778 | 4783 | .controller-profile_members .no-boxes { |
| 4779 | 4784 | margin: 30px |
| 4780 | 4785 | } |
| ... | ... | @@ -5430,6 +5435,7 @@ h1#agenda-title { |
| 5430 | 5435 | margin: 0; |
| 5431 | 5436 | padding: 0; |
| 5432 | 5437 | width: 100%; |
| 5438 | + height: 92px; | |
| 5433 | 5439 | } |
| 5434 | 5440 | #content .menu-submenu-content ul { |
| 5435 | 5441 | margin: 0; | ... | ... |
test/functional/profile_controller_test.rb
| ... | ... | @@ -55,7 +55,8 @@ class ProfileControllerTest < ActionController::TestCase |
| 55 | 55 | |
| 56 | 56 | assert_response :success |
| 57 | 57 | assert_template 'members' |
| 58 | - assert assigns(:members) | |
| 58 | + assert assigns(:profile_members) | |
| 59 | + assert assigns(:profile_admins) | |
| 59 | 60 | end |
| 60 | 61 | |
| 61 | 62 | should 'list favorite enterprises' do |
| ... | ... | @@ -1747,4 +1748,68 @@ class ProfileControllerTest < ActionController::TestCase |
| 1747 | 1748 | assert_no_tag :tag => 'td', :descendant => { :tag => 'a', :content => /#{person.enterprises.count}/, :attributes => { :href => /profile\/#{person.identifier}\/enterprises$/ }} |
| 1748 | 1749 | end |
| 1749 | 1750 | |
| 1751 | + should 'admins from a community be present in admin users div and members div' do | |
| 1752 | + community = fast_create(Community) | |
| 1753 | + another_user = create_user('another_user').person | |
| 1754 | + | |
| 1755 | + login_as(@profile.identifier) | |
| 1756 | + | |
| 1757 | + community.add_admin(@profile) | |
| 1758 | + | |
| 1759 | + assert community.admins.include? @profile | |
| 1760 | + get :members, :profile => community.identifier | |
| 1761 | + | |
| 1762 | + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-admins/}, | |
| 1763 | + :descendant => { :tag => 'a', :attributes => { :title => "testuser" } } | |
| 1764 | + | |
| 1765 | + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-members/}, | |
| 1766 | + :descendant => { :tag => 'a', :attributes => { :title => "testuser" } } | |
| 1767 | + end | |
| 1768 | + | |
| 1769 | + should 'all members, except admins, be present in members div' do | |
| 1770 | + community = fast_create(Community) | |
| 1771 | + community.add_member(@profile) | |
| 1772 | + | |
| 1773 | + another_user = create_user('another_user').person | |
| 1774 | + community.add_member(another_user) | |
| 1775 | + | |
| 1776 | + assert_equal false, community.admins.include?(another_user) | |
| 1777 | + | |
| 1778 | + get :members, :profile => community.identifier | |
| 1779 | + | |
| 1780 | + assert_tag :tag => 'ul', :attributes => { :class => /profile-list-members/}, | |
| 1781 | + :descendant => { :tag => 'a', :attributes => { :title => "another_user" } } | |
| 1782 | + | |
| 1783 | + assert_no_tag :tag => 'ul', :attributes => { :class => /profile-list-admins/}, | |
| 1784 | + :descendant => { :tag => 'a', :attributes => { :title => "another_user" } } | |
| 1785 | + end | |
| 1786 | + | |
| 1787 | + should 'members be sorted by name in ascendant order' do | |
| 1788 | + community = fast_create(Community) | |
| 1789 | + another_user = create_user('another_user').person | |
| 1790 | + different_user = create_user('different_user').person | |
| 1791 | + | |
| 1792 | + community.add_member(@profile) | |
| 1793 | + community.add_member(another_user) | |
| 1794 | + community.add_member(different_user) | |
| 1795 | + | |
| 1796 | + get :members, :profile => community.identifier, :sort => "asc" | |
| 1797 | + | |
| 1798 | + assert @response.body.index("another_user") < @response.body.index("different_user") | |
| 1799 | + end | |
| 1800 | + | |
| 1801 | + should 'members be sorted by name in descendant order' do | |
| 1802 | + community = fast_create(Community) | |
| 1803 | + another_user = create_user('another_user').person | |
| 1804 | + different_user = create_user('different_user').person | |
| 1805 | + | |
| 1806 | + community.add_member(@profile) | |
| 1807 | + community.add_member(another_user) | |
| 1808 | + community.add_member(different_user) | |
| 1809 | + | |
| 1810 | + get :members, :profile => community.identifier, :sort => "desc" | |
| 1811 | + | |
| 1812 | + assert @response.body.index("another_user") > @response.body.index("different_user") | |
| 1813 | + end | |
| 1814 | + | |
| 1750 | 1815 | end | ... | ... |