From f21dc998b94f5dc4c15328a7627fb0980e9dabe5 Mon Sep 17 00:00:00 2001 From: Soufiane Date: Wed, 24 May 2023 10:47:27 +0200 Subject: [PATCH] Add filtering for project/experiment filter for assignable tasks [SCI-8442] (#5441) * Remove object without edit permission in P/E/T filters [SCI-8442] * Leave only experiments and projects with active tasks [SCI-8442] --- app/assets/stylesheets/shared/select.scss | 5 ++ app/controllers/experiments_controller.rb | 15 +++- app/controllers/my_modules_controller.rb | 74 ++++++++++--------- app/controllers/projects_controller.rb | 30 +++++--- .../assign_items_to_tasks_modal/container.vue | 7 +- app/javascript/vue/shared/select.vue | 20 ++++- app/javascript/vue/shared/select_search.vue | 14 +++- config/locales/en.yml | 1 + 8 files changed, 109 insertions(+), 57 deletions(-) diff --git a/app/assets/stylesheets/shared/select.scss b/app/assets/stylesheets/shared/select.scss index 69195c5f9..41ed810b0 100644 --- a/app/assets/stylesheets/shared/select.scss +++ b/app/assets/stylesheets/shared/select.scss @@ -92,6 +92,11 @@ padding: .5em; } + .sn-select__no-options { + color: var(--sn-grey); + padding: .5em; + } + .sn-select__option:hover { background: var(--sn-blue); color: var(--sn-white); diff --git a/app/controllers/experiments_controller.rb b/app/controllers/experiments_controller.rb index 934dbc52d..ec72ab65c 100644 --- a/app/controllers/experiments_controller.rb +++ b/app/controllers/experiments_controller.rb @@ -445,12 +445,23 @@ class ExperimentsController < ApplicationController end def experiment_filter - project = Project.readable_by_user(current_user).find_by(id: params[:project_id]) + readable_experiments = Experiment.readable_by_user(current_user) + managable_active_my_modules = MyModule.managable_by_user(current_user).active + + project = Project.readable_by_user(current_user) + .joins(experiments: :my_modules) + .where(experiments: { id: readable_experiments }) + .where(my_modules: { id: managable_active_my_modules }) + .find_by(id: params[:project_id]) + return render_404 if project.blank? experiments = project.experiments - .readable_by_user(current_user) + .joins(:my_modules) + .where(experiments: { id: readable_experiments }) + .where(my_modules: { id: managable_active_my_modules }) .search(current_user, false, params[:query], 1, current_team) + .distinct .pluck(:id, :name) return render plain: [].to_json if experiments.blank? diff --git a/app/controllers/my_modules_controller.rb b/app/controllers/my_modules_controller.rb index 32288aad6..4620574c5 100644 --- a/app/controllers/my_modules_controller.rb +++ b/app/controllers/my_modules_controller.rb @@ -74,13 +74,13 @@ class MyModulesController < ApplicationController def show respond_to do |format| - format.json { - render :json => { - :html => render_to_string({ - :partial => "show.html.erb" - }) + format.json do + render json: { + html: render_to_string({ + partial: 'show.html.erb' + }) } - } + end end end @@ -88,15 +88,15 @@ class MyModulesController < ApplicationController def description respond_to do |format| format.html - format.json { + format.json do render json: { html: render_to_string({ - partial: "description.html.erb" - }), + partial: 'description.html.erb' + }), title: t('my_modules.description.title', module: escape_input(@my_module.name)) } - } + end end end @@ -164,13 +164,13 @@ class MyModulesController < ApplicationController respond_to do |format| format.html - format.json { - render :json => { - :html => render_to_string({ - :partial => "activities.html.erb" - }) + format.json do + render json: { + html: render_to_string({ + partial: 'activities.html.erb' + }) } - } + end end end @@ -178,15 +178,15 @@ class MyModulesController < ApplicationController def due_date respond_to do |format| format.html - format.json { + format.json do render json: { html: render_to_string({ - partial: "due_date.html.erb" - }), + partial: 'due_date.html.erb' + }), title: t('my_modules.due_date.title', module: escape_input(@my_module.name)) } - } + end end end @@ -198,21 +198,13 @@ class MyModulesController < ApplicationController start_date_changes = @my_module.changes[:started_on] due_date_changes = @my_module.changes[:due_date] - if @my_module.completed_on_changed? && !can_complete_my_module?(@my_module) - render_403 && return - end + render_403 && return if @my_module.completed_on_changed? && !can_complete_my_module?(@my_module) - if description_changed && !can_update_my_module_description?(@my_module) - render_403 && return - end + render_403 && return if description_changed && !can_update_my_module_description?(@my_module) - if start_date_changes.present? && !can_update_my_module_start_date?(@my_module) - render_403 && return - end + render_403 && return if start_date_changes.present? && !can_update_my_module_start_date?(@my_module) - if due_date_changes.present? && !can_update_my_module_start_date?(@my_module) - render_403 && return - end + render_403 && return if due_date_changes.present? && !can_update_my_module_start_date?(@my_module) if @my_module.archived_changed?(from: false, to: true) saved = @my_module.archive(current_user) @@ -273,7 +265,7 @@ class MyModulesController < ApplicationController else format.json do render json: @my_module.errors, - status: :unprocessable_entity + status: :unprocessable_entity end end end @@ -281,6 +273,7 @@ class MyModulesController < ApplicationController def update_description render_403 && return unless can_update_my_module_description?(@my_module) + old_description = @my_module.description respond_to do |format| format.json do @@ -414,7 +407,7 @@ class MyModulesController < ApplicationController log_activity(:change_status_on_task_flow, @my_module, my_module_status_old: old_status_id, my_module_status_new: @my_module.my_module_status.id) - return redirect_to protocols_my_module_path(@my_module) + redirect_to protocols_my_module_path(@my_module) else render json: { errors: @my_module.errors.messages.values.flatten.join('\n') }, status: :unprocessable_entity end @@ -457,11 +450,20 @@ class MyModulesController < ApplicationController end def my_module_filter - experiment = Experiment.readable_by_user(current_user).find_by(id: params[:experiment_id]) + readable_experiments = Experiment.readable_by_user(current_user) + managable_active_my_modules = MyModule.managable_by_user(current_user).active + + experiment = Experiment.readable_by_user(current_user) + .joins(:my_modules) + .where(experiments: { id: readable_experiments }) + .where(my_modules: { id: managable_active_my_modules }) + .find_by(id: params[:experiment_id]) + return render_404 if experiment.blank? my_modules = experiment.my_modules - .readable_by_user(current_user) + .where(my_modules: { id: managable_active_my_modules }) + .distinct .search(current_user, false, params[:query], 1, current_team) .pluck(:id, :name) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index e45eda1fc..5cdf9f625 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -10,6 +10,7 @@ class ProjectsController < ApplicationController include Breadcrumbs attr_reader :current_folder + helper_method :current_folder before_action :switch_team_with_param, only: :index @@ -105,8 +106,15 @@ class ProjectsController < ApplicationController end def project_filter + readable_experiments = Experiment.readable_by_user(current_user) + managable_active_my_modules = MyModule.managable_by_user(current_user).active + projects = Project.readable_by_user(current_user) + .joins(experiments: :my_modules) + .where(experiments: { id: readable_experiments }) + .where(my_modules: { id: managable_active_my_modules }) .search(current_user, false, params[:query], 1, current_team) + .distinct .pluck(:id, :name) return render plain: [].to_json if projects.blank? @@ -211,9 +219,7 @@ class ProjectsController < ApplicationController # Redirect URL for archive view is different as for other views. if project_params[:archived] == 'false' # The project should be restored - unless @project.archived - @project.restore(current_user) - end + @project.restore(current_user) unless @project.archived elsif @project.archived # The project should be archived @project.archive(current_user) @@ -339,17 +345,17 @@ class ProjectsController < ApplicationController def notifications @modules = @project - .assigned_modules(current_user) - .order(due_date: :desc) + .assigned_modules(current_user) + .order(due_date: :desc) respond_to do |format| - #format.html - format.json { - render :json => { - :html => render_to_string({ - :partial => "notifications.html.erb" - }) + # format.html + format.json do + render json: { + html: render_to_string({ + partial: 'notifications.html.erb' + }) } - } + end end end diff --git a/app/javascript/vue/assign_items_to_tasks_modal/container.vue b/app/javascript/vue/assign_items_to_tasks_modal/container.vue index feb53a36f..31227ecdb 100644 --- a/app/javascript/vue/assign_items_to_tasks_modal/container.vue +++ b/app/javascript/vue/assign_items_to_tasks_modal/container.vue @@ -95,9 +95,10 @@ ref="tasksSelector" @change="changeTask" :options="tasks" - :placeholder=" + :placeholder="tasksSelectorPlaceholder" + :no-options-placeholder=" i18n.t( - 'repositories.modal_assign_items_to_task.body.task_select.disabled_placeholder' + 'repositories.modal_assign_items_to_task.body.task_select.no_options_placeholder' ) " :searchPlaceholder=" @@ -162,8 +163,8 @@ export default { }); }); - $(this.$refs.modal).on("hidden.bs.modal", () => { + this.resetSelectors(); this.$emit("close"); }); }, diff --git a/app/javascript/vue/shared/select.vue b/app/javascript/vue/shared/select.vue index 27520e677..905a5bfe5 100644 --- a/app/javascript/vue/shared/select.vue +++ b/app/javascript/vue/shared/select.vue @@ -7,9 +7,22 @@
-
- {{ option[1] }} -
+ +
@@ -22,6 +35,7 @@ options: { type: Array, default: () => [] }, initialValue: { type: [String, Number] }, placeholder: { type: String }, + noOptionsPlaceholder: { type: String }, disabled: { type: Boolean, default: false } }, data() { diff --git a/app/javascript/vue/shared/select_search.vue b/app/javascript/vue/shared/select_search.vue index 7bdb79b55..298cfca36 100644 --- a/app/javascript/vue/shared/select_search.vue +++ b/app/javascript/vue/shared/select_search.vue @@ -1,5 +1,16 @@