mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-09-14 00:54:32 +08:00
add my module assigments modals
This commit is contained in:
parent
ac91d9c2c4
commit
d145dd6d36
19 changed files with 277 additions and 11 deletions
|
@ -1,6 +1,6 @@
|
|||
@import "constants";
|
||||
|
||||
.project-member-item {
|
||||
.member-item {
|
||||
border-bottom: .1rem solid $btn-default-border;
|
||||
margin: 10px 0;
|
||||
padding: 10px;
|
67
app/controllers/access_permissions/my_modules_controller.rb
Normal file
67
app/controllers/access_permissions/my_modules_controller.rb
Normal 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
|
|
@ -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
|
||||
|
|
45
app/models/my_module_member.rb
Normal file
45
app/models/my_module_member.rb
Normal 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
|
|
@ -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">×</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) %>
|
||||
|
||||
|
|
13
app/views/access_permissions/my_modules/edit.json.jbuilder
Normal file
13
app/views/access_permissions/my_modules/edit.json.jbuilder
Normal 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
|
||||
)
|
|
@ -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">×</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>
|
|
@ -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">×</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>
|
|
@ -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
|
||||
)
|
12
app/views/access_permissions/my_modules/show.json.jbuilder
Normal file
12
app/views/access_permissions/my_modules/show.json.jbuilder
Normal 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
|
||||
)
|
|
@ -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">
|
||||
|
|
|
@ -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 %>
|
|
@ -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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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!'
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue