diff --git a/app/assets/javascripts/sitewide/file_preview.js b/app/assets/javascripts/sitewide/file_preview.js
index c0b4c1d17..48f2ee033 100644
--- a/app/assets/javascripts/sitewide/file_preview.js
+++ b/app/assets/javascripts/sitewide/file_preview.js
@@ -1,7 +1,8 @@
/* eslint no-underscore-dangle: ["error", { "allowAfterThis": true }]*/
/* eslint no-use-before-define: ["error", { "functions": false }]*/
/* eslint-disable no-underscore-dangle */
-/* global Uint8Array fabric tui animateSpinner Assets I18n PerfectScrollbar*/
+/* global Uint8Array fabric tui animateSpinner */
+/* global Assets I18n PerfectScrollbar refreshProtocolStatusBar */
//= require assets
var FilePreviewModal = (function() {
@@ -448,6 +449,7 @@ var FilePreviewModal = (function() {
if (!readOnly && data.editable) {
modal.find('.file-edit-link').css('display', '');
modal.find('.file-edit-link').off().click(function(ev) {
+ $.post('/files/' + data.id + '/start_edit_image');
ev.preventDefault();
ev.stopPropagation();
modal.modal('hide');
diff --git a/app/controllers/assets_controller.rb b/app/controllers/assets_controller.rb
index 007e4344e..9aecf53eb 100644
--- a/app/controllers/assets_controller.rb
+++ b/app/controllers/assets_controller.rb
@@ -1,5 +1,8 @@
+# frozen_string_literal: true
+
class AssetsController < ApplicationController
include WopiUtil
+ include AssetsActions
# include ActionView::Helpers
include ActionView::Helpers::AssetTagHelper
include ActionView::Helpers::TextHelper
@@ -11,7 +14,7 @@ class AssetsController < ApplicationController
before_action :load_vars, except: :create_wopi_file
before_action :check_read_permission, except: :file_present
- before_action :check_edit_permission, only: :edit
+ before_action :check_edit_permission, only: %i(edit create_start_edit_image_activity)
def file_present
return render_403 unless @asset.team == current_team
@@ -71,12 +74,10 @@ class AssetsController < ApplicationController
'processing-img' => image_tag('medium/processing.gif')
)
else
- response_json.merge!(
- 'processing' => @asset.file.processing?,
- 'preview-icon' => render_to_string(
- partial: 'shared/file_preview_icon.html.erb',
- locals: { asset: @asset }
- )
+ response_json['processing'] = @asset.file.processing?
+ response_json['preview-icon'] = render_to_string(
+ partial: 'shared/file_preview_icon.html.erb',
+ locals: { asset: @asset }
)
end
@@ -155,6 +156,10 @@ class AssetsController < ApplicationController
render layout: false
end
+ def create_start_edit_image_activity
+ create_edit_image_activity(@asset, current_user, :start_editing)
+ end
+
def update_image
@asset = Asset.find(params[:id])
orig_file_size = @asset.file_file_size
@@ -164,6 +169,7 @@ class AssetsController < ApplicationController
@asset.file = params[:image]
@asset.file_file_name = orig_file_name
@asset.save!
+ create_edit_image_activity(@asset, current_user, :finish_editing)
# release previous image space
@asset.team.release_space(orig_file_size)
# Post process file here
diff --git a/app/controllers/concerns/assets_actions.rb b/app/controllers/concerns/assets_actions.rb
new file mode 100644
index 000000000..de32d2f6b
--- /dev/null
+++ b/app/controllers/concerns/assets_actions.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module AssetsActions
+ extend ActiveSupport::Concern
+
+ def create_edit_image_activity(asset, current_user, started_editing)
+ action = if started_editing == :start_editing
+ t('activities.file_editing.started')
+ elsif started_editing == :finish_editing
+ t('activities.file_editing.finished')
+ end
+ if asset.step.class == Step
+ protocol = asset.step.protocol
+ default_step_items =
+ { step: asset.step.id,
+ step_position: { id: asset.step.id, value_for: 'position_plus_one' },
+ asset_name: { id: asset.id, value_for: 'file_file_name' },
+ action: action }
+ if protocol.in_module?
+ project = protocol.my_module.experiment.project
+ team = project.team
+ type_of = :edit_image_on_step
+ message_items = { my_module: protocol.my_module.id }
+ else
+ type_of = :edit_image_on_step_in_repository
+ project = nil
+ team = protocol.team
+ message_items = { protocol: protocol.id }
+ end
+ message_items = default_step_items.merge(message_items)
+ Activities::CreateActivityService
+ .call(activity_type: type_of,
+ owner: current_user,
+ subject: protocol,
+ team: team,
+ project: project,
+ message_items: message_items)
+ elsif asset.result.class == Result
+ my_module = asset.result.my_module
+ Activities::CreateActivityService
+ .call(activity_type: :edit_image_on_result,
+ owner: current_user,
+ subject: asset.result,
+ team: my_module.experiment.project.team,
+ project: my_module.experiment.project,
+ message_items: {
+ result: asset.result.id,
+ asset_name: { id: asset.id, value_for: 'file_file_name' },
+ action: action
+ })
+ end
+ end
+end
diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb
index 2e79014d1..3a85ede69 100644
--- a/config/initializers/extends.rb
+++ b/config/initializers/extends.rb
@@ -218,19 +218,22 @@ class Extends
export_protocol_from_task: 106,
import_inventory_items: 107,
create_tag: 108,
- delete_tag: 109
+ delete_tag: 109,
+ edit_image_on_result: 110,
+ edit_image_on_step: 111,
+ edit_image_on_step_in_repository: 112,
}
ACTIVITY_GROUPS = {
projects: [*0..7, 32, 33, 34, 95, 108, 65, 109],
- task_results: [23, 26, 25, 42, 24, 40, 41, 99],
+ task_results: [23, 26, 25, 42, 24, 40, 41, 99, 110],
task: [8, 58, 9, 59, 10, 11, 12, 13, 14, 35, 36, 37, 53, 54, *60..64, *66..69, 106],
- task_protocol: [15, 22, 16, 18, 19, 20, 21, 17, 38, 39, 100, 45, 46, 47],
+ task_protocol: [15, 22, 16, 18, 19, 20, 21, 17, 38, 39, 100, 111, 45, 46, 47],
task_inventory: [55, 56],
experiment: [*27..31, 57],
reports: [48, 50, 49],
inventories: [70, 71, 105, 72, 73, 74, 102, 75, 76, 77, 78, 96, 107],
- protocol_repository: [80, 103, 89, 87, 79, 90, 91, 88, 85, 86, 84, 81, 82, 83, 101],
+ protocol_repository: [80, 103, 89, 87, 79, 90, 91, 88, 85, 86, 84, 81, 82, 83, 101, 112],
team: [92, 94, 93, 97, 104]
}.freeze
end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 7070094cf..b583e8b8e 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1335,6 +1335,9 @@ en:
wupi_file_editing:
started: "editing started"
finished: "editing finished"
+ file_editing:
+ started: "editing started"
+ finished: "editing finished"
protocols:
my_to_team_message: 'My protocols to Team protocols'
team_to_my_message: 'Team protocols to My protocols'
diff --git a/config/locales/global_activities/en.yml b/config/locales/global_activities/en.yml
index 14e5b2b4f..b2afa22be 100644
--- a/config/locales/global_activities/en.yml
+++ b/config/locales/global_activities/en.yml
@@ -131,6 +131,9 @@ en:
edit_tag_html: "%{user} edited tag %{tag} in project %{project}."
delete_tag_html: "%{user} deleted tag %{tag} in project %{project}."
import_inventory_items_html: "%{user} imported %{num_of_items} inventory item(s) to %{repository}."
+ edit_image_on_result_html: "%{user} edited image %{asset_name} on result %{result}: %{action}."
+ edit_image_on_step_html: "%{user} edited image %{asset_name} on protocol's step %{step_position} %{step} on task %{my_module}: %{action}."
+ edit_image_on_step_in_repository_html: "%{user} edited image %{asset_name} on protocol %{protocol}'s step %{step_position} %{step} in Protocol repository: %{action}."
activity_name:
create_project: "Project created"
@@ -233,6 +236,9 @@ en:
edit_tag: "Tag edited"
delete_tag: "Tag deleted"
import_inventory_items: "Inventory items imported"
+ edit_image_on_result: "Image on result edited"
+ edit_image_on_step: "Image on task step edited"
+ edit_image_on_step_in_repository: "Image on step edited"
activity_group:
projects: "Projects"
diff --git a/config/routes.rb b/config/routes.rb
index 725dbd367..867772d96 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -594,6 +594,7 @@ Rails.application.routes.draw do
post 'files/create_wopi_file',
to: 'assets#create_wopi_file',
as: 'create_wopi_file'
+ post 'files/:id/start_edit_image', to: 'assets#create_start_edit_image_activity', as: 'start_edit_image'
devise_scope :user do
get 'avatar/:id/:style' => 'users/registrations#avatar', as: 'avatar'
diff --git a/spec/controllers/assets_controller_spec.rb b/spec/controllers/assets_controller_spec.rb
new file mode 100644
index 000000000..a4a853bb8
--- /dev/null
+++ b/spec/controllers/assets_controller_spec.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe AssetsController, type: :controller do
+ login_user
+
+ let(:user) { subject.current_user }
+ let!(:team) { create :team, created_by: user }
+ let(:user_team) { create :user_team, :admin, user: user, team: team }
+ let!(:user_project) { create :user_project, :owner, user: user }
+ let(:project) do
+ create :project, team: team, user_projects: [user_project]
+ end
+ let(:experiment) { create :experiment, project: project }
+ let(:my_module) { create :my_module, name: 'test task', experiment: experiment }
+ let(:protocol) do
+ create :protocol, my_module: my_module, team: team, added_by: user
+ end
+ let(:step) { create :step, protocol: protocol, user: user }
+ let(:step_asset_task) { create :step_asset, step: step }
+
+ let(:result) do
+ create :result, name: 'test result', my_module: my_module, user: user
+ end
+ let(:result_asset) { create :result_asset, result: result }
+
+ let(:protocol_in_repository) { create :protocol, :in_public_repository, team: team }
+ let(:step_in_repository) { create :step, protocol: protocol_in_repository, user: user }
+
+ let!(:asset) { create :asset }
+ let(:step_asset_in_repository) { create :step_asset, step: step_in_repository, asset: asset }
+
+ describe 'POST start_edit' do
+ before do
+ allow(controller).to receive(:check_edit_permission).and_return(true)
+ end
+ let(:action) { post :create_start_edit_image_activity, params: params, format: :json }
+ let!(:params) do
+ { id: nil }
+ end
+ it 'calls create activity service (start edit image on step)' do
+ params[:id] = step_asset_task.asset.id
+ expect(Activities::CreateActivityService).to receive(:call)
+ .with(hash_including(activity_type: :edit_image_on_step))
+ action
+ end
+
+ it 'calls create activity service (start edit image on result)' do
+ params[:id] = result_asset.asset.id
+ expect(Activities::CreateActivityService).to receive(:call)
+ .with(hash_including(activity_type: :edit_image_on_result))
+ action
+ end
+
+ it 'calls create activity service (start edit image on step in repository)' do
+ params[:id] = step_asset_in_repository.asset.id
+ user_team
+ expect(Activities::CreateActivityService).to receive(:call)
+ .with(hash_including(activity_type: :edit_image_on_step_in_repository))
+ action
+ end
+
+ it 'adds activity in DB' do
+ params[:id] = step_asset_task.asset.id
+ expect { action }
+ .to(change { Activity.count })
+ end
+ end
+end