add my module assigments modals

This commit is contained in:
zmagoD 2021-05-09 16:59:10 +02:00
parent ac91d9c2c4
commit d145dd6d36
19 changed files with 277 additions and 11 deletions

View file

@ -1,6 +1,6 @@
@import "constants";
.project-member-item {
.member-item {
border-bottom: .1rem solid $btn-default-border;
margin: 10px 0;
padding: 10px;

View file

@ -0,0 +1,67 @@
# frozen_string_literal: true
module AccessPermissions
class MyModulesController < ApplicationController
before_action :set_project
before_action :set_experiment
before_action :set_my_module
before_action :check_read_permissions, only: %i(show)
before_action :check_manage_permissions, only: %i(create edit update)
def show
respond_to do |format|
format.json
end
end
def edit
respond_to do |format|
format.json
end
end
def update
@my_module_member = MyModuleMember.new(current_user, @my_module, @experiment, @project)
@my_module_member.update(permitted_update_params)
respond_to do |format|
format.json do
render :my_module_member
end
end
end
private
def permitted_update_params
params.require(:my_module_member)
.permit(%i(user_role_id user_id))
end
def set_project
@project = current_team.projects.find_by(id: params[:project_id])
render_404 unless @project
end
def set_experiment
@experiment = @project.experiments.find_by(id: params[:experiment_id])
render_404 unless @experiment
end
def set_my_module
@my_module = @experiment.my_modules.includes(user_assignments: %i(user user_role)).find_by(id: params[:id])
render_404 unless @my_module
end
def check_manage_permissions
render_403 unless can_manage_module?(@my_module)
end
def check_read_permissions
render_403 unless can_read_module?(@my_module)
end
end
end

View file

@ -22,7 +22,15 @@ module UserAssignmentsHelper
current_user_assignment_name
].compact.join(' / ')
elsif resource.is_a?(MyModule)
# TODO
project_user_assignment = resource.permission_parent.permission_parent.user_assignments.find_by(user: user)
experiment_user_assignment = resource.permission_parent.user_assignments.find_by(user: user)
current_user_assignment_name = user_assignment&.user_role&.name
[
t('user_assignment.from_project', user_role: project_user_assignment.user_role.name),
(t('user_assignment.from_experiment', user_role: experiment_user_assignment.user_role.name) if experiment_user_assignment.present?),
current_user_assignment_name
].compact.join(' / ')
else
user_assignment.user_role.name
end

View file

@ -0,0 +1,45 @@
# frozen_string_literal: true
class MyModuleMember
include ActiveModel::Model
attr_accessor :user_id, :user_role_id
attr_reader :current_user, :my_module, :experiment, :user, :project, :user_role
def initialize(current_user, my_module, experiment, project, user = nil)
@experiment = experiment
@current_user = current_user
@project = project
@my_module = my_module
if user
@user = user
@user_role = UserAssignment.find_by(assignable: my_module, user: user)&.user_role
end
end
def update(params)
self.user_role_id = params[:user_role_id]
self.user_id = params[:user_id]
ActiveRecord::Base.transaction do
@user = @project.users.find(user_id)
@user_role = UserRole.find_by(id: user_role_id)
user_assignment = UserAssignment.find_by(assignable: my_module, user: user)
if user_assignment.present? && user_role.nil?
user_assignment.destroy
elsif user_assignment.present?
user_assignment.update!(user_role: user_role)
else
UserAssignment.create!(
assignable: my_module,
user: user,
user_role: user_role,
assigned_by: current_user
)
end
end
end
end

View file

@ -1,13 +1,17 @@
<% # frozen_string_literal: true %>
<div class="modal fade" tabindex="-1" role="dialog" data-action="modal-close" data-target="<%= project_path %>">
<div class="modal-dialog modal-md" role="document">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="user_assignments_modal">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title"><%= t '.title', resource_name: experiment.name %></h4>
</div>
<div class="modal-body">
<p>
<%= t '.description' %>
</p>
<hr />
<% users.each do |user| %>
<% user_assignment = experiment.user_assignments.find_by(user: user) %>

View file

@ -0,0 +1,13 @@
# frozen_string_literal: true
json.modal controller.render_to_string(
partial: 'access_permissions/my_modules/modals/edit_modal',
formats: [:html],
locals: {
my_module: @my_module,
experiment: @experiment,
project: @project,
users: @project.users
},
layout: false
)

View file

@ -0,0 +1,35 @@
<% # frozen_string_literal: true %>
<div class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="user_assignments_modal">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title"><%= t '.title', resource_name: my_module.name %></h4>
</div>
<div class="modal-body">
<p>
<%= t '.description' %>
</p>
<hr />
<% users.each do |user| %>
<% user_assignment = my_module.user_assignments.find_by(user: user) %>
<% cache [user_assignment, my_module, user] do %>
<%= render partial: 'access_permissions/partials/my_module_member_field',
locals: {
user: user,
project: project,
experiment: experiment,
my_module: my_module,
update_path: access_permissions_project_experiment_my_module_path(project, experiment, my_module)
} %>
<% end %>
<% end %>
</div>
<div class="modal-footer">
<button type='button' class='btn btn-default' data-dismiss='modal'><%= t('general.cancel')%></button>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,24 @@
<% # frozen_string_literal: true %>
<div class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog modal-md" role="document">
<div class="modal-content" id="user_assignments_modal">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title"><%= t '.title', resource_name: my_module.name %></h4>
</div>
<div class="modal-body">
<% users.each do |user| %>
<% user_assignment = my_module.user_assignments.find_by(user: user) %>
<% cache [user_assignment, my_module, current_user, user] do %>
<%= render partial: 'access_permissions/partials/user_assignment', locals: { user_assignment: user_assignment, user: user, resource: my_module } %>
<% end %>
<% end %>
</div>
<div class="modal-footer">
<button type='button' class='btn btn-default' data-dismiss='modal'><%= t('general.cancel')%></button>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,14 @@
# frozen_string_literal: true
json.form controller.render_to_string(
partial: 'access_permissions/partials/my_module_member_field',
formats: [:html],
locals: {
user: @my_module_member.user,
experiment: @my_module_member.experiment,
my_module: @my_module_member.my_module,
project: @my_module_member.project,
update_path: access_permissions_project_experiment_my_module_path(@my_module_member.project, @my_module_member.experiment, @my_module_member.my_module)
},
layout: false
)

View file

@ -0,0 +1,12 @@
# frozen_string_literal: true
json.modal controller.render_to_string(
partial: 'access_permissions/my_modules/modals/show_modal',
formats: [:html],
locals: {
my_module: @my_module,
experiment: @experiment,
users: @project.users
},
layout: false
)

View file

@ -5,7 +5,7 @@
item_id = dom_id(user, :experiment_member)
%>
<%= form_with(model: experiment_member, url: update_path, method: :put, remote: true, html: { class: 'row experiment-member-item', id: item_id, data: { action: 'replace-form autosave-form' } }) do |f| %>
<%= form_with(model: experiment_member, url: update_path, method: :put, remote: true, html: { class: 'row member-item', id: item_id, data: { action: 'replace-form autosave-form' } }) do |f| %>
<%= f.hidden_field :user_id, value: f.object.user.id %>
<div class="col-xs-1">
<span class="global-avatar-container">

View file

@ -0,0 +1,25 @@
<% # frozen_string_literal: true %>
<%
my_module_member = MyModuleMember.new(current_user, my_module, experiment, project, user)
item_id = dom_id(user, :my_module_member)
%>
<%= form_with(model: my_module_member, url: update_path, method: :put, remote: true, html: { class: 'row member-item', id: item_id, data: { action: 'replace-form autosave-form' } }) do |f| %>
<%= f.hidden_field :user_id, value: f.object.user.id %>
<div class="col-xs-1">
<span class="global-avatar-container">
<%= image_tag avatar_path(user, :icon_small), title: current_assignee_name(user), class: 'img-circle pull-left' %>
</span>
</div>
<div class="col-xs-6">
<span><%= current_assignee_name(user) %></span>
<br>
<small class="text-muted"><%= user_assignment_resource_role_name(my_module_member, user, my_module) %></small>
</div>
<% unless user == current_user %>
<div class="col-xs-5">
<%= f.select :user_role_id, options_for_select(experiment_user_roles_collection, selected: f.object.user_role&.id), {}, class: 'form-control selectpicker' %>
</div>
<% end %>
<% end %>

View file

@ -5,7 +5,7 @@
item_id = dom_id(user, :project_member)
%>
<%= form_with(model: project_member, url: update_path, method: :put, remote: true, html: { class: 'row project-member-item', id: item_id, data: { action: 'replace-form autosave-form' } }) do |f| %>
<%= form_with(model: project_member, url: update_path, method: :put, remote: true, html: { class: 'row member-item', id: item_id, data: { action: 'replace-form autosave-form' } }) do |f| %>
<%= f.hidden_field :user_id, value: f.object.user.id %>
<div class="col-xs-2">
<span class="global-avatar-container">

View file

@ -1,13 +1,13 @@
<% # frozen_string_literal: true %>
<div class="row project-member-item">
<div class="row member-item">
<div class="col-xs-2">
<span class="global-avatar-container">
<%= image_tag avatar_path(user, :icon_small), title: current_assignee_name(user), class: 'img-circle pull-left' %>
</span>
</div>
<div class="col-xs-10 col-sm-4">
<div class="col-xs-10">
<span><%= current_assignee_name(user) %></span>
<br>
<small class="text-muted"><%= user_assignment_resource_role_name(user_assignment, user, resource) %></small>

View file

@ -6,7 +6,7 @@
id = dom_id(user, :new_project_member)
%>
<div class="row project-member-item" data-filter-item="<%= user.full_name %>">
<div class="row member-item" data-filter-item="<%= user.full_name %>">
<%= f.hidden_field :user_id, value: user.id, name:"access_permissions_new_user_project_form[resource_members][#{user.id}][user_id]" %>
<div class="col-xs-1 checkbox text-center">
<label>

View file

@ -35,6 +35,13 @@
<a class="move-module" href="" data-module-id="<%= my_module.id %>"><%= t('experiments.canvas.edit.move_module') %></a>
</li>
<% end %>
<% if %>
<li>
<%= link_to t('experiments.canvas.edit.task_access'),
can_manage_module?(my_module) ? edit_access_permissions_project_experiment_my_module_path(my_module.experiment.project, my_module.experiment, my_module) : access_permissions_project_experiment_my_module_path(my_module.experiment.project, my_module.experiment, my_module),
data: { action: 'remote-modal'} %>
</li>
<% end %>
<% if module_group&.my_modules&.all? { |my_module| can_move_module?(my_module) } %>
<li>
<a class="move-module-group" href="" data-module-id="<%= my_module.id %>"><%= t('experiments.canvas.edit.move_module_group') %></a>

View file

@ -56,8 +56,8 @@
</div>
</div>
<div class="description-cell table-cell">
<%= link_to 'Experiment Accesss', edit_access_permissions_project_experiment_path(project, experiment), remote: true, data: { action: 'remote-modal'} %>
<%= link_to 'Show Experiment Accesss', access_permissions_project_experiment_path(project, experiment), remote: true, data: { action: 'remote-modal'} %>
<%= link_to 'Experiment Accesss', edit_access_permissions_project_experiment_path(project, experiment), data: { action: 'remote-modal'} %>
<%= link_to 'Show Experiment Accesss', access_permissions_project_experiment_path(project, experiment), data: { action: 'remote-modal'} %>
<div class="description-text">
<%= custom_auto_link(experiment.description, team: current_team) %>
</div>

View file

@ -1057,6 +1057,7 @@ en:
drag_connections: "Drag connection/s from here"
options_header: "Options"
edit_module: "Rename task"
task_access: "Task access"
clone_module: "Copy task as template (only Protocols steps copied)"
clone_module_group: "Copy workflow as template (only Protocols steps copied)"
move_module: "Move task to another experiment"
@ -2319,6 +2320,7 @@ en:
current_assignee: "(you)"
select_role: "Select role"
from_project: "%{user_role} [from project]"
from_experiment: "%{user_role} [from experiment]"
experiment_select_role: "Change experiment role"
access_permissions:
create:
@ -2350,6 +2352,14 @@ en:
title: "Access to %{resource_name}"
edit_modal:
title: "Manage access for %{resource_name}"
description: "Changing roles will not take away any permissions from previous levels. Permissions can only be added with a new role. New permissions apply only to this concrete experiment."
my_modules:
modals:
show_modal:
title: "Access to %{resource_name}"
edit_modal:
title: "Manage access for %{resource_name}"
description: "Changing roles will not take away any permissions from previous levels. Permissions can only be added with a new role. New permissions apply only to this concrete task."
zip_export:
modal_label: 'Export inventory'
notification_title: 'Your requested export package is ready!'

View file

@ -229,7 +229,9 @@ Rails.application.routes.draw do
namespace :access_permissions do
resources :projects, defaults: { format: 'json' } do
resources :experiments, only: %i(show update edit)
resources :experiments, only: %i(show update edit) do
resources :my_modules, only: %i(show update edit)
end
end
end