diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb index f41cb4367..2785d419e 100644 --- a/app/controllers/assets_controller.rb +++ b/app/controllers/assets_controller.rb @@ -18,7 +18,7 @@ class AssetsController < ApplicationController before_action :load_vars, except: :create_wopi_file before_action :check_read_permission, except: %i(edit destroy create_wopi_file toggle_view_mode) - before_action :check_edit_permission, only: %i(edit destroy toggle_view_mode rename) + before_action :check_manage_permission, only: %i(edit destroy toggle_view_mode rename) def file_preview render json: { html: render_to_string( @@ -315,22 +315,43 @@ class AssetsController < ApplicationController new_name = params.require(:asset).permit(:name)[:name] if new_name.empty? - render json: { error: 'File name must be at least 1 character long.' }, status: :unprocessable_entity + render json: { error: I18n.t('assets.rename_modal.min_length_error') }, status: :unprocessable_entity return elsif new_name.length > Constants::NAME_MAX_LENGTH - render json: { error: 'File name is too long (maximum number is 255 characters).' }, status: :unprocessable_entity + render json: { error: I18n.t('assets.rename_modal.max_length_error') }, status: :unprocessable_entity return end ActiveRecord::Base.transaction do + old_name = @asset.name @asset.last_modified_by = current_user @asset.rename_file(new_name) @asset.save! + + case @asset.parent + when Step + message_items = { old_name:, new_name:, user: current_user.id } + message_items[:my_module] = @assoc.protocol.my_module.id if @assoc.protocol.in_module? + + log_step_activity( + "#{@assoc.protocol.in_module? ? 'task' : 'protocol'}_step_asset_renamed", + @assoc, + @assoc.my_module&.project, + message_items + ) + when Result + log_result_activity( + :result_asset_renamed, + @assoc, + old_name:, + new_name:, + user: current_user.id, + my_module: @assoc.my_module.id + ) + end end render json: @asset, serializer: AssetSerializer, user: current_user - rescue ActiveRecord::RecordInvalid - render json: @asset.errors, status: :unprocessable_entity end def checksum @@ -362,7 +383,7 @@ class AssetsController < ApplicationController render_403 and return unless can_read_asset?(@asset) end - def check_edit_permission + def check_manage_permission render_403 and return unless can_manage_asset?(@asset) end diff --git a/app/controllers/gene_sequence_assets_controller.rb b/app/controllers/gene_sequence_assets_controller.rb index bb8242187..a706a200f 100644 --- a/app/controllers/gene_sequence_assets_controller.rb +++ b/app/controllers/gene_sequence_assets_controller.rb @@ -64,34 +64,6 @@ class GeneSequenceAssetsController < ApplicationController head :ok end - def rename - new_name = params.require(:asset).permit(:name)[:name] - - if new_name.empty? - render json: { error: 'File name must be at least 1 character long.' }, status: :unprocessable_entity - return - elsif new_name.length > Constants::NAME_MAX_LENGTH - render json: { error: 'File name is too long (maximum number is 255 characters).' }, status: :unprocessable_entity - return - end - - asset = current_team.assets.find_by(id: params[:id]) - return render_404 unless asset - - ActiveRecord::Base.transaction do - asset.last_modified_by = current_user - asset.rename_file(new_name) - asset.save! - # log_activity(TODO) - end - - render json: asset, serializer: AssetSerializer, user: current_user - rescue StandardError => e - Rails.logger.error(e.message) - Rails.logger.error(e.backtrace.join("\n")) - render json: { error: I18n.t('errors.general') }, status: :unprocessable_entity - end - private def save_asset! diff --git a/app/controllers/marvin_js_assets_controller.rb b/app/controllers/marvin_js_assets_controller.rb index 7c5cdc630..5800e3e4e 100644 --- a/app/controllers/marvin_js_assets_controller.rb +++ b/app/controllers/marvin_js_assets_controller.rb @@ -8,7 +8,7 @@ class MarvinJsAssetsController < ApplicationController before_action :load_create_vars, only: :create before_action :check_read_permission - before_action :check_edit_permission, only: %i(update create start_editing) + before_action :check_manage_permission, only: %i(update create start_editing) def create result = MarvinJsService.create_sketch(marvin_params, current_user, current_team) @@ -45,28 +45,6 @@ class MarvinJsAssetsController < ApplicationController end end - def rename - new_name = params.require(:asset).permit(:name)[:name] - - if new_name.empty? - render json: { error: 'File name must be at least 1 character long.' }, status: :unprocessable_entity - return - elsif new_name.length > Constants::NAME_MAX_LENGTH - render json: { error: 'File name is too long (maximum number is 255 characters).' }, status: :unprocessable_entity - return - end - - asset = MarvinJsService.update_file_name(new_name, params[:id], current_user, current_team) - - # create_rename_marvinjs_activity(asset, current_user, :TODO) - - if asset - render json: asset, serializer: AssetSerializer, user: current_user - else - render json: { error: t('marvinjs.no_sketches_found') }, status: :unprocessable_entity - end - end - def start_editing create_edit_marvinjs_activity(@asset, current_user, :start_editing) end @@ -109,7 +87,7 @@ class MarvinJsAssetsController < ApplicationController end end - def check_edit_permission + def check_manage_permission if @assoc.class == Step return render_403 unless can_manage_step?(@assoc) elsif @assoc.class == Result diff --git a/app/javascript/vue/protocol/step.vue b/app/javascript/vue/protocol/step.vue index d696481c1..a52a1f42f 100644 --- a/app/javascript/vue/protocol/step.vue +++ b/app/javascript/vue/protocol/step.vue @@ -550,8 +550,6 @@ this.$emit('stepUpdated'); }, updateAttachment(attachment) { - console.log(this.attachments) - console.log(attachment) const index = this.attachments.findIndex(a => a.id === attachment.id); if (index !== -1) { this.attachments[index] = attachment; diff --git a/app/javascript/vue/shared/content/modal/rename_modal.vue b/app/javascript/vue/shared/content/modal/rename_modal.vue index 6773badc6..7fee9337c 100644 --- a/app/javascript/vue/shared/content/modal/rename_modal.vue +++ b/app/javascript/vue/shared/content/modal/rename_modal.vue @@ -79,9 +79,9 @@ export default { this.close(); } catch (error) { if (error.response) { - console.error('Error: ', error.response.data.error || error.response.statusText); + this.error = error.response.data.errors || error.response.statusText; } else { - console.error('Error: ', error.message); + this.error = error.message; } } } diff --git a/app/serializers/asset_serializer.rb b/app/serializers/asset_serializer.rb index e882af113..f8a1640a9 100644 --- a/app/serializers/asset_serializer.rb +++ b/app/serializers/asset_serializer.rb @@ -146,16 +146,7 @@ class AssetSerializer < ActiveModel::Serializer delete: asset_destroy_path(object), move_targets: asset_move_tagets_path(object), move: asset_move_path(object), - rename: if object.file.attached? - case object.file.metadata['asset_type'] - when 'marvinjs' - rename_marvin_js_asset_path(object) - when 'gene_sequence' - rename_gene_sequence_asset_path(object) - else - asset_rename_path(object) - end - end + rename: asset_rename_path(object) ) end urls[:open_vector_editor_edit] = edit_gene_sequence_asset_path(object.id) if can_manage_asset?(user, object) diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index 5604e3274..528d049db 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -488,16 +488,19 @@ class Extends inventory_item_relationships_unlinked: 298, edit_task_step_file_locally: 299, edit_protocol_template_file_locally: 300, - edit_task_result_file_locally: 301 + edit_task_result_file_locally: 301, + task_step_asset_renamed: 305, + result_asset_renamed: 306, + protocol_step_asset_renamed: 307 } ACTIVITY_GROUPS = { projects: [*0..7, 32, 33, 34, 95, 108, 65, 109, *158..162, 241, 242, 243], - task_results: [23, 26, 25, 42, 24, 40, 41, 99, 110, 122, 116, 128, *246..248, *257..273, *284..291, 301], + task_results: [23, 26, 25, 42, 24, 40, 41, 99, 110, 122, 116, 128, *246..248, *257..273, *284..291, 301, 306], task: [8, 58, 9, 59, *10..14, 35, 36, 37, 53, 54, *60..63, 138, 139, 140, 64, 66, 106, 126, 120, 132, 148, 166], task_protocol: [15, 22, 16, 18, 19, 20, 21, 17, 38, 39, 100, 111, 45, 46, 47, 121, 124, 115, 118, 127, 130, 137, - 184, 185, 188, 189, *192..203, 221, 222, 224, 225, 226, 236, *249..252, *274..278, 299], + 184, 185, 188, 189, *192..203, 221, 222, 224, 225, 226, 236, *249..252, *274..278, 299, 305], task_inventory: [55, 56, 146, 147, 183], experiment: [*27..31, 57, 141, 165], reports: [48, 50, 49, 163, 164], @@ -506,7 +509,7 @@ class Extends protocol_repository: [80, 103, 89, 87, 79, 90, 91, 88, 85, 86, 84, 81, 82, 83, 101, 112, 123, 125, 117, 119, 129, 131, 187, 186, 190, 191, *204..215, 220, 223, 227, 228, 229, *230..235, - *237..240, *253..256, *279..283, 300], + *237..240, *253..256, *279..283, 300, 307], team: [92, 94, 93, 97, 104, 244, 245], label_templates: [*216..219] } diff --git a/config/locales/global_activities/en.yml b/config/locales/global_activities/en.yml index 64af75c00..bc7a35628 100644 --- a/config/locales/global_activities/en.yml +++ b/config/locales/global_activities/en.yml @@ -314,6 +314,9 @@ en: edit_image_on_inventory_item_html: "%{user} edited image %{asset_name} on inventory item %{repository_row} in inventory %{repository}: %{action}." edit_wopi_file_on_inventory_item_html: "%{user} edited Office online file %{asset_name} on inventory item %{repository_row} in inventory %{repository}: %{action}." export_inventory_stock_consumption_html: "%{user} exported stock consumption for inventory item(s) %{inventory_items} in inventory %{repository}." + task_step_asset_renamed_html: "%{user} renamed file %{old_name} to %{new_name} on protocol’s step %{step} on task %{my_module}." + protocol_step_asset_renamed_html: "%{user} renamed file %{old_name} to %{new_name} on protocol’s step %{step} in Protocol repository." + result_asset_renamed_html: "%{user} renamed file %{old_name} to %{new_name} on result %{result} on task %{my_module}." activity_name: create_project: "Project created" rename_project: "Project renamed" @@ -585,6 +588,9 @@ en: edit_image_on_inventory_item: "Inventory item image edited" edit_wopi_file_on_inventory_item: "Inventory item wopi file edited" export_inventory_stock_consumption: "Inventory stock consumptions exported" + task_step_asset_renamed: "File attachment on Task step renamed" + protocol_step_asset_renamed: "File attachment on Protocol step renamed" + result_asset_renamed: "File attachment on Task result renamed" activity_group: projects: "Projects" task_results: "Task results" diff --git a/config/routes.rb b/config/routes.rb index da9b01e8e..c0334bed6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1007,7 +1007,6 @@ Rails.application.routes.draw do end member do post :start_editing - patch :rename end end @@ -1026,11 +1025,7 @@ Rails.application.routes.draw do post 'wopi/files/:id', to: 'wopi#post_file_endpoint' end - resources :gene_sequence_assets, only: %i(new create edit update) do - member do - patch :rename - end - end + resources :gene_sequence_assets, only: %i(new create edit update) if Rails.env.development? || ENV['ENABLE_DESIGN_ELEMENTS'] == 'true' resources :design_elements, only: %i(index) do diff --git a/spec/controllers/assets_controller_spec.rb b/spec/controllers/assets_controller_spec.rb index 56d12e4ba..7db9905a5 100644 --- a/spec/controllers/assets_controller_spec.rb +++ b/spec/controllers/assets_controller_spec.rb @@ -23,7 +23,7 @@ describe AssetsController, type: :controller do describe 'POST start_edit' do before do - allow(controller).to receive(:check_edit_permission).and_return(true) + allow(controller).to receive(:check_manage_permission).and_return(true) end let(:action) { post :create_start_edit_image_activity, params: params, format: :json } let!(:params) do