diff --git a/app/controllers/access_permissions/projects_controller.rb b/app/controllers/access_permissions/projects_controller.rb index 4f55863c0..e837970fb 100644 --- a/app/controllers/access_permissions/projects_controller.rb +++ b/app/controllers/access_permissions/projects_controller.rb @@ -53,21 +53,36 @@ module AccessPermissions permitted_create_params[:resource_members].each do |_k, user_assignment_params| next unless user_assignment_params[:assign] == '1' - user_assignment = UserAssignment.find_or_initialize_by( - assignable: @project, - user_id: user_assignment_params[:user_id], - team: current_team - ) + if user_assignment_params[:user_id] == 'all' + @project.update!(visibility: :visible, default_public_user_role_id: user_assignment_params[:user_role_id]) + Activities::CreateActivityService + .call(activity_type: :change_project_visibility, + owner: current_user, + subject: @project, + team: @project.team, + project: @project, + message_items: { + project: @project.id, + visibility: t('projects.activity.visibility_visible') + }) + else - user_assignment.update!( - user_role_id: user_assignment_params[:user_role_id], - assigned_by: current_user, - assigned: :manually - ) + user_assignment = UserAssignment.find_or_initialize_by( + assignable: @project, + user_id: user_assignment_params[:user_id], + team: current_team + ) - log_activity(:assign_user_to_project, user_assignment) - created_count += 1 - propagate_job(user_assignment) + user_assignment.update!( + user_role_id: user_assignment_params[:user_role_id], + assigned_by: current_user, + assigned: :manually + ) + + log_activity(:assign_user_to_project, user_assignment) + created_count += 1 + propagate_job(user_assignment) + end end respond_to do |format| diff --git a/app/controllers/access_permissions/protocols_controller.rb b/app/controllers/access_permissions/protocols_controller.rb index 77a84113f..8de246555 100644 --- a/app/controllers/access_permissions/protocols_controller.rb +++ b/app/controllers/access_permissions/protocols_controller.rb @@ -51,25 +51,31 @@ module AccessPermissions permitted_create_params[:resource_members].each do |_k, user_assignment_params| next unless user_assignment_params[:assign] == '1' - user_assignment = UserAssignment.find_or_initialize_by( - assignable: @protocol, - user_id: user_assignment_params[:user_id], - team: current_team - ) + if user_assignment_params[:user_id] == 'all' + @protocol.update!(visibility: :visible, default_public_user_role_id: user_assignment_params[:user_role_id]) + else + user_assignment = UserAssignment.find_or_initialize_by( + assignable: @protocol, + user_id: user_assignment_params[:user_id], + team: current_team + ) - user_assignment.update!( - user_role_id: user_assignment_params[:user_role_id], - assigned_by: current_user, - assigned: :manually - ) + user_assignment.update!( + user_role_id: user_assignment_params[:user_role_id], + assigned_by: current_user, + assigned: :manually + ) - created_count += 1 - log_activity(:protocol_template_access_granted, user_assignment) + created_count += 1 + log_activity(:protocol_template_access_granted, user_assignment) + end end + respond_to do |format| @message = t('access_permissions.create.success', count: created_count) format.json { render :edit } end + rescue ActiveRecord::RecordInvalid respond_to do |format| @message = t('access_permissions.create.failure') diff --git a/app/models/protocol.rb b/app/models/protocol.rb index 6dd9c8b23..492ed73b7 100644 --- a/app/models/protocol.rb +++ b/app/models/protocol.rb @@ -21,6 +21,7 @@ class Protocol < ApplicationRecord after_save :update_user_assignments, if: -> { saved_change_to_visibility? && in_repository? } after_save :update_linked_children skip_callback :create, :after, :create_users_assignments, if: -> { in_module? } + before_update :sync_protocol_assignments, if: :visibility_changed? enum visibility: { hidden: 0, visible: 1 } enum protocol_type: { @@ -798,4 +799,12 @@ class Protocol < ApplicationRecord errors.add(:base, I18n.t('activerecord.errors.models.protocol.wrong_parent_draft_number')) end end + + def sync_protocol_assignments + if visible? + auto_assign_protocol_members + else + user_assignments.where(assigned: :automatically).destroy_all + end + end end diff --git a/app/views/access_permissions/partials/_new_assignments_form.html.erb b/app/views/access_permissions/partials/_new_assignments_form.html.erb index 3f6aefe31..880ba6f29 100644 --- a/app/views/access_permissions/partials/_new_assignments_form.html.erb +++ b/app/views/access_permissions/partials/_new_assignments_form.html.erb @@ -16,6 +16,11 @@ <%= text_field_tag :search_users, '', placeholder: t('.find_people_html'), class: 'sci-input-field', data: { action: 'filter-list', target: 'new-user-assignment-to-project-form' } %> + <% if assignable.visibility && assignable.visibility == 'hidden' %> + <%= f.fields_for :users, UserAssignment.new do |user_form| %> + <%= render 'access_permissions/partials/public_assignment_field.html.erb', user_form: user_form, assignable: assignable %> + <% end %> + <% end %> <% users.each do |user| %> <%= f.fields_for :users, UserAssignment.new(user: user) do |user_form| %> <%= render 'access_permissions/partials/user_assignment_field.html.erb', user_form: user_form, assignable: assignable %> diff --git a/app/views/access_permissions/partials/_public_assignment_field.html.erb b/app/views/access_permissions/partials/_public_assignment_field.html.erb new file mode 100644 index 000000000..19c644c72 --- /dev/null +++ b/app/views/access_permissions/partials/_public_assignment_field.html.erb @@ -0,0 +1,31 @@ +<% # frozen_string_literal: true %> + +