diff --git a/BrainPortal/app/helpers/select_box_helper.rb b/BrainPortal/app/helpers/select_box_helper.rb index 63ca15f7b..1ebb99797 100644 --- a/BrainPortal/app/helpers/select_box_helper.rb +++ b/BrainPortal/app/helpers/select_box_helper.rb @@ -118,6 +118,21 @@ def group_select(parameter_name = "group_id", options = {}, select_tag_options = selected = selector.to_s end + # for Admin filter out only public, invisible or non_assignable to reduce the clutter (unless groups passed) + if current_user.has_role?(:admin_user) && !options.has_key?(:groups) + admin_ids = AdminUser.all.pluck(:id) || [] + groups = groups.select do |g| + ( g.is_a?(SystemGroup) || # everyone group, to make a private tool public + g.is_a?(UserGroup) && (admin_ids & g.user_ids).present? || # admin usergroups + g.public || + g.invisible || + g.not_assignable && (g.user_ids & admin_ids ).present? || # notassingable admin groups + g.not_assignable && admin_ids.include?(g.creator_id) || # notassignable created by admin + (selected == g.id.to_s) || selected.include?(g.id.to_s) # already selected + ) + end + end + # Optimize the labels for UserGroups and SiteGroups, by extracting in a hash group_labels = {} group_labels.merge!(UserGroup.prepare_pretty_labels(groups)) @@ -145,15 +160,17 @@ def group_select(parameter_name = "group_id", options = {}, select_tag_options = # Step 1: My Work Projects first ordered_category_grouped << [ "My Work Projects", category_grouped_pairs.delete("My Work Projects") ] if category_grouped_pairs["My Work Projects"] - + ordered_category_grouped << [ "My Public Work Projects", category_grouped_pairs.delete("My Public Work Projects") ] if category_grouped_pairs["My Public Work Projects"] # Step 2: All personal work projects first - category_grouped_pairs.keys.select { |proj| proj =~ /Personal Work Projects/ }.sort.each do |proj| + category_grouped_pairs.keys.select { |proj| proj =~ /Personal (Public )?Work Projects/ }.sort.each do |proj| ordered_category_grouped << [ proj, category_grouped_pairs.delete(proj) ] end - # Step 3: Other project categories, in that order - [ "Shared Work Projects", "Empty Work Projects", "Site Projects", "User Projects", "System Projects", "Invisible Projects", "Everyone Projects" ].each do |proj| + [ "Shared Work Projects", "Empty Work Projects", "Site Projects", "System Projects", "Invisible Projects", "Everyone Projects", "User Projects"].each do |proj| + ordered_category_grouped << [ proj, category_grouped_pairs.delete(proj) ] if category_grouped_pairs[proj] + proj = proj.sub(" ", " Public ") ordered_category_grouped << [ proj, category_grouped_pairs.delete(proj) ] if category_grouped_pairs[proj] + end # Step 4: Other mysterious categories ?!? diff --git a/BrainPortal/app/models/work_group.rb b/BrainPortal/app/models/work_group.rb index c7f1851fe..dc3ff49a9 100644 --- a/BrainPortal/app/models/work_group.rb +++ b/BrainPortal/app/models/work_group.rb @@ -77,20 +77,28 @@ def self.prepare_pretty_category_names(groups = [], as_user = nil) wgs end - def pretty_category_name(as_user) #:nodoc: + def pretty_category_name(as_user = nil) #:nodoc: return @_pretty_category_name if @_pretty_category_name - if self.invisible? - @_pretty_category_name = 'Invisible Project' - elsif self.public? - @_pretty_category_name = 'Public Project' - elsif self.users.count == 0 - @_pretty_category_name = 'Empty Work Project' - elsif self.users.count > 1 - @_pretty_category_name = 'Shared Work Project' - elsif as_user.present? && (self.creator_id == as_user.id || self.users.first.id == as_user.id) - @_pretty_category_name = 'My Work Project' + if @_pretty_category_name.blank? + if self.invisible? + @_pretty_category_name = 'Invisible Project' + elsif self.public? + @_pretty_category_name = 'Public Project' + elsif self.users.count == 0 + @_pretty_category_name = 'Empty Work Project' + elsif self.users.count > 1 + @_pretty_category_name = 'Shared Work Project' + elsif as_user.present? && (self.creator_id == as_user.id || self.users.first.id == as_user.id) + @_pretty_category_name = 'My Work Project' + else + @_pretty_category_name = "Personal Work Project of #{self.users.first.full_name}" + end + end + # Public is more of quantifier, there could be public shared or public personal projects + if @_pretty_category_name.present? && self.public && ! @_pretty_category_name.include?('Public') + @_pretty_category_name = @_pretty_category_name.sub(" ", " Public ") else - @_pretty_category_name = "Personal Work Project of #{self.users.first.full_name}" + @_pretty_category_name end @_pretty_category_name end diff --git a/BrainPortal/app/views/shared/_group_tables.html.erb b/BrainPortal/app/views/shared/_group_tables.html.erb index fec0288db..1de78e117 100644 --- a/BrainPortal/app/views/shared/_group_tables.html.erb +++ b/BrainPortal/app/views/shared/_group_tables.html.erb @@ -23,19 +23,29 @@ -%> <% + public_groups = [] if current_user.has_role? :admin_user - work_groups = WorkGroup.where(invisible: false).all - invis_groups = WorkGroup.where(invisible: true).all + admin_ids = AdminUser.all.pluck(:id) || [] + public_groups = WorkGroup.where( invisible: false, public: true ).all + nonassign_groups = WorkGroup.joins(:users).where( invisible: false, public: false, + not_assignable: true, "users.id" => admin_ids ).all + nonassign_groups |= WorkGroup.where( invisible: false, public: false, + not_assignable: true, creator_id: admin_ids ).all + nonassign_groups = nonassign_groups.uniq + work_groups = model.groups.select { |g| g.is_a?(WorkGroup) && ! g.invisible && ! g.public && + ! nonassign_groups.include?(g) } + invis_groups = WorkGroup.where( invisible: true ).all elsif current_user.has_role? :site_manager - work_groups = current_user.site.groups.where( :type => "WorkGroup", :invisible => false ).all | current_user.groups.where( :type => "WorkGroup", :invisible => false ) - invis_groups = current_user.site.groups.where( :type => "WorkGroup", :invisible => true ) + work_groups = current_user.site.groups.where( :type => "WorkGroup", :invisible => false ).all | current_user.groups.where( :type => "WorkGroup", :invisible => false ) + invis_groups = current_user.site.groups.where( :type => "WorkGroup", :invisible => true ) else - work_groups = [] - invis_groups = [] + work_groups = [] + invis_groups = [] end - work_groups = work_groups.sort { |a,b| a.name <=> b.name } - invis_groups = invis_groups.sort { |a,b| a.name <=> b.name } - class_name = model.class.sti_root_class.to_s.underscore + work_groups = work_groups.sort { |a,b| a.name <=> b.name } + invis_groups = invis_groups.sort { |a,b| a.name <=> b.name } + public_groups = public_groups.sort { |a,b| a.name <=> b.name } + class_name = model.class.sti_root_class.to_s.underscore %> <% @@ -75,3 +85,26 @@ <% end %> + + +<% if public_groups.present? %> + +
+ + <%= array_to_table(public_groups, :cols => 4, :td_class => 'left_align no_wrap') do |group,r,c| %> + <%= group_check_box.(group) %> + <% end %> + +<% end %> + + + +<% if nonassign_groups.present? %> + +
+ + <%= array_to_table(nonassign_groups, :cols => 4, :td_class => 'left_align no_wrap') do |group,r,c| %> + <%= group_check_box.(group) %> + <% end %> + +<% end %>