From cc8a10edb037af11ac0aad211b2a468ac44cd305 Mon Sep 17 00:00:00 2001 From: Giga Chubinidze Date: Fri, 29 Dec 2023 12:53:46 +0400 Subject: [PATCH 1/6] "Move" feature for multiple selected tasks and experiments (bulk action) --- app/controllers/experiments_controller.rb | 50 ++++++++++++-------- app/services/toolbars/experiments_service.rb | 8 +--- app/services/toolbars/my_modules_service.rb | 6 +-- app/views/experiments/_move_modal.html.erb | 15 +++--- config/locales/en.yml | 2 +- 5 files changed, 43 insertions(+), 38 deletions(-) diff --git a/app/controllers/experiments_controller.rb b/app/controllers/experiments_controller.rb index 32542e5a2..fd4802707 100644 --- a/app/controllers/experiments_controller.rb +++ b/app/controllers/experiments_controller.rb @@ -10,17 +10,17 @@ class ExperimentsController < ApplicationController before_action :load_project, only: %i(new create archive_group restore_group) before_action :load_experiment, except: %i(new create archive_group restore_group - inventory_assigning_experiment_filter actions_toolbar) + inventory_assigning_experiment_filter actions_toolbar move_modal move) + before_action :load_experiments, only: %i(move_modal move) before_action :check_read_permissions, except: %i(edit archive clone move new create archive_group restore_group - inventory_assigning_experiment_filter actions_toolbar) + inventory_assigning_experiment_filter actions_toolbar move_modal) before_action :check_canvas_read_permissions, only: %i(canvas) before_action :check_create_permissions, only: %i(new create) before_action :check_manage_permissions, only: %i(edit batch_clone_my_modules) before_action :check_update_permissions, only: %i(update) before_action :check_archive_permissions, only: :archive before_action :check_clone_permissions, only: %i(clone_modal clone) - before_action :check_move_permissions, only: %i(move_modal move) before_action :set_inline_name_editing, only: %i(canvas table module_archive) before_action :set_breadcrumbs_items, only: %i(canvas table module_archive) before_action :set_navigator, only: %i(canvas module_archive table) @@ -274,7 +274,7 @@ class ExperimentsController < ApplicationController # GET: move_modal_experiment_path(id) def move_modal - @projects = @experiment.movable_projects(current_user) + @projects = @experiments.first.movable_projects(current_user) render json: { html: render_to_string(partial: 'move_modal', formats: :html) } @@ -297,23 +297,28 @@ class ExperimentsController < ApplicationController # POST: move_experiment(id) def move - service = Experiments::MoveToProjectService - .call(experiment_id: @experiment.id, - project_id: move_experiment_param, - user_id: current_user.id) - if service.succeed? - flash[:success] = t('experiments.move.success_flash', - experiment: @experiment.name) - status = :ok - view_state = @experiment.current_view_state(current_user) - view_type = view_state.state['my_modules']['view_type'] || 'canvas' - path = view_mode_redirect_url(view_type) - else - message = "#{service.errors.values.join('. ')}." - status = :unprocessable_entity - end + move_responses = [] - render json: { message: message, path: path }, status: status + @experiments.each do |experiment| + @experiment = experiment + service = Experiments::MoveToProjectService + .call(experiment_id: experiment.id, + project_id: params[:project_id], + user_id: current_user.id) + if service.succeed? + flash[:success] = t('experiments.move.success_flash', experiment: experiment.name) + status = :ok + view_state = experiment.current_view_state(current_user) + view_type = view_state.state['my_modules']['view_type'] || 'canvas' + path = view_mode_redirect_url(view_type) + else + message = "#{service.errors.values.join('. ')}." + status = :unprocessable_entity + end + + move_responses << {message: message, path: path, status: status } + end + render json: move_responses end def move_modules_modal @@ -531,6 +536,11 @@ class ExperimentsController < ApplicationController render_404 unless @experiment end + def load_experiments + @experiments = Experiment.preload(user_assignments: %i(user user_role)).where(id: params[:ids]) + render_404 unless @experiments + end + def load_project @project = Project.find_by(id: params[:project_id]) render_404 unless @project diff --git a/app/services/toolbars/experiments_service.rb b/app/services/toolbars/experiments_service.rb index 414bc05f6..a4a65affe 100644 --- a/app/services/toolbars/experiments_service.rb +++ b/app/services/toolbars/experiments_service.rb @@ -87,18 +87,14 @@ module Toolbars end def move_action - return unless @single - - experiment = @experiments.first - - return unless can_move_experiment?(experiment) + return unless @experiments.all? { |experiment| can_move_experiment?(experiment) } { name: 'move', label: I18n.t('experiments.toolbar.move_button'), icon: 'sn-icon sn-icon-move', button_class: 'move-experiments-btn', - path: move_modal_experiments_path(id: experiment.id), + path: move_modal_experiments_path(ids: @experiments.map(&:id)), type: 'remote-modal' } end diff --git a/app/services/toolbars/my_modules_service.rb b/app/services/toolbars/my_modules_service.rb index c8a7f6fac..989fb7e88 100644 --- a/app/services/toolbars/my_modules_service.rb +++ b/app/services/toolbars/my_modules_service.rb @@ -88,11 +88,7 @@ module Toolbars end def move_action - return unless @single - - my_module = @my_modules.first - - return unless can_move_my_module?(my_module) + return unless @my_modules.all? { |my_module| can_move_my_module?(my_module) } { name: 'move', diff --git a/app/views/experiments/_move_modal.html.erb b/app/views/experiments/_move_modal.html.erb index 68d45ee4f..e2cc90aa1 100644 --- a/app/views/experiments/_move_modal.html.erb +++ b/app/views/experiments/_move_modal.html.erb @@ -1,10 +1,10 @@