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 %>