Merge pull request #2990 from urbanrotnik/ur-sci-5181-add-folders-activities

Add activities for Project Folders [SCI-5181]
This commit is contained in:
Urban Rotnik 2020-12-04 17:51:04 +01:00 committed by GitHub
commit 2c8adc9496
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 141 additions and 14 deletions

View file

@ -26,7 +26,7 @@ class ProjectFoldersController < ApplicationController
respond_to do |format|
format.json do
if project_folder.save
# log_activity()
log_activity(:create_project_folder, project_folder, { project_folder: project_folder.id })
message = t('projects.index.modal_new_project_folder.success_flash',
name: escape_input(project_folder.name))
render json: { message: message }
@ -55,6 +55,18 @@ class ProjectFoldersController < ApplicationController
end
end
def update
folder = current_team.project_folders.find(params[:id])
log_activity(:rename_project_folder, folder, { project_folder: folder.id })
end
def archive
folder = current_team.project_folders.find(params[:id])
log_activity(:archive_project_folder, folder, { project_folder: folder.id })
end
private
def load_current_folder
@ -85,13 +97,34 @@ class ProjectFoldersController < ApplicationController
project_ids = move_params[:movables].collect { |movable| movable[:id] if movable[:type] == 'project' }.compact
return if project_ids.blank?
current_team.projects.where(id: project_ids).each { |p| p.update!(project_folder: destination_folder) }
current_team.projects.where(id: project_ids).each do |project|
source_folder_name = project.project_folder&.name || I18n.t('global_activities.root_folder_level')
project.update!(project_folder: destination_folder)
destination_folder_name = project.project_folder&.name || I18n.t('global_activities.root_folder_level')
log_activity(:move_project, project, { project: project.id,
destination_folder: destination_folder_name,
source_folder: source_folder_name })
end
end
def move_folders(destination_folder)
folder_ids = move_params[:movables].collect { |movable| movable[:id] if movable[:type] == 'project_folder' }.compact
return if folder_ids.blank?
current_team.project_folders.where(id: folder_ids).each { |f| f.update!(parent_folder: destination_folder) }
current_team.project_folders.where(id: folder_ids).each do |folder|
source_folder_name = folder.parent_folder&.name || I18n.t('global_activities.root_folder_level')
folder.update!(parent_folder: destination_folder)
destination_folder_name = folder.parent_folder&.name || I18n.t('global_activities.root_folder_level')
log_activity(:move_project_folder, folder, { project_folder: folder.id,
destination_folder: destination_folder_name,
source_folder: source_folder_name })
end
end
def log_activity(type_of, subject, items = {})
Activities::CreateActivityService
.call(activity_type: type_of, owner: current_user, team: subject.team, subject: subject, message_items: items)
end
end

View file

@ -87,6 +87,8 @@ module GlobalActivitiesHelper
return current_value
when Report
path = reports_path(team: obj.team.id)
when ProjectFolder
path = projects_path
else
return current_value
end

View file

@ -141,6 +141,9 @@ class Activity < ApplicationRecord
when Report
breadcrumbs[:report] = subject.name
generate_breadcrumb(subject.team) if subject.team
when ProjectFolder
breadcrumbs[:project_folder] = subject.name
generate_breadcrumb(subject.team)
end
end

View file

@ -0,0 +1,17 @@
<%= render partial: "global_activities/references/team.html.erb",
locals: { team: team, subject: subject&.team, breadcrumbs: breadcrumbs, values: values, type_of: type_of } %>
<div class="ga-breadcrumb">
<span class="fas fa-folder"></span>
<% if subject %>
<% path = projects_path(team: team) %>
<%= route_to_other_team(path,
team,
subject.name&.truncate(Constants::NAME_TRUNCATION_LENGTH),
title: subject.name) %>
<% else %>
<span title="<%= breadcrumbs['project_folder'] %>">
<%= breadcrumbs['project_folder']&.truncate(Constants::NAME_TRUNCATION_LENGTH) %>
</span>
<% end %>
</div>

View file

@ -124,7 +124,7 @@ class Extends
'MyModule' => :description }
ACTIVITY_SUBJECT_TYPES = %w(
Team RepositoryBase Project Experiment MyModule Result Protocol Report RepositoryRow
Team RepositoryBase Project Experiment MyModule Result Protocol Report RepositoryRow ProjectFolder
).freeze
SEARCHABLE_ACTIVITY_SUBJECT_TYPES = %w(
@ -146,7 +146,7 @@ class Extends
ACTIVITY_MESSAGE_ITEMS_TYPES =
ACTIVITY_SUBJECT_TYPES + %w(
User Tag RepositoryColumn RepositoryRow Step Asset TinyMceAsset
Repository MyModuleStatus RepositorySnapshot ProjectFolder
Repository MyModuleStatus RepositorySnapshot
).freeze
ACTIVITY_TYPES = {
@ -292,12 +292,16 @@ class Extends
restore_inventory: 145,
export_inventory_items_assigned_to_task: 146,
export_inventory_snapshot_items_assigned_to_task: 147,
change_status_on_task_flow: 148, # 149, 150, 151 in AdddOn!
move_project: 158
change_status_on_task_flow: 148, # 149..157 in AdddOn!
move_project: 158,
create_project_folder: 159,
move_project_folder: 160,
rename_project_folder: 161,
archive_project_folder: 162
}
ACTIVITY_GROUPS = {
projects: [*0..7, 32, 33, 34, 95, 108, 65, 109, 158],
projects: [*0..7, 32, 33, 34, 95, 108, 65, 109, *158..162],
task_results: [23, 26, 25, 42, 24, 40, 41, 99, 110, 122, 116, 128],
task: [8, 58, 9, 59, *10..14, 35, 36, 37, 53, 54, *60..63, 138, 139, 140, 64, 66, 106, 126, 120, 132,
*146..148],

View file

@ -176,7 +176,11 @@ en:
export_inventory_items_assigned_to_task_html: "%{user} exported inventory item(s) assigned to task %{my_module} from inventory %{repository}: Live version."
export_inventory_snapshot_items_assigned_to_task_html: "%{user} exported inventory item(s) assigned to task %{my_module} from inventory %{repository_snapshot}: Snapshot of %{created_at}."
change_status_on_task_flow_html: "%{user} changed status from <strong>%{my_module_status_old}</strong> to <strong>%{my_module_status_new}</strong> for task %{my_module}."
move_project_html: "%{user} moved %{project} project to <strong>%{project_folder_dest}</strong> folder from <strong>%{project_folder_src}</strong> folder"
move_project_html: "%{user} moved project %{project} from folder <strong>%{source_folder}</strong> to folder <strong>%{destination_folder}</strong>."
create_project_folder_html: "%{user} created project folder %{project_folder}."
rename_project_folder_html: "%{user} renamed project folder %{project_folder}."
archive_project_folder_html: "%{user} archived project folder %{project_folder}."
move_project_folder_html: "%{user} moved folder %{project_folder} from folder <strong>%{source_folder}</strong> to folder <strong>%{destination_folder}</strong>."
activity_name:
create_project: "Project created"
@ -319,6 +323,10 @@ en:
export_inventory_snapshot_items_assigned_to_task: "Task-assigned inventory items exported (snapshot)"
change_status_on_task_flow: "Task status changed"
move_project: "Project moved"
create_project_folder: "Project folder created"
rename_project_folder: "Project folder renamed"
archive_project_folder: "Project folder archived"
move_project_folder: "Project folder moved"
activity_group:
projects: "Projects"
@ -341,3 +349,5 @@ en:
protocol: "Protocol"
step: "Step"
report: "Report"
root_folder_level: "[Projects]"

View file

@ -303,14 +303,17 @@ Rails.application.routes.draw do
end
end
resources :project_folders, only: %i(new create) do
resources :project_folders, only: %i(create new update) do
member do
post 'archive', to: 'project_folders#archive'
end
get 'cards', to: 'projects#cards'
member do
post 'move_to', to: 'project_folders#move_to', defaults: { format: 'json' }
end
end
get 'project_folders/:project_folder_id', to: 'projects#index', as: :project_folder
get 'project_folders/:project_folder_id', to: 'projects#index', as: :project_folder_projects
resources :experiments, only: %i(edit update) do
member do

View file

@ -4,11 +4,12 @@ require 'rails_helper'
describe ProjectFoldersController, type: :controller do
login_user
render_views
# render_views
let!(:user) { subject.current_user }
let!(:team) { create :team, created_by: user }
let(:user) { subject.current_user }
let(:team) { create :team, created_by: user }
let!(:user_team) { create :user_team, team: team, user: user, role: :admin }
let(:project_folder) { create :project_folder, team: team }
describe 'POST #move_to' do
let!(:project_folder_1) do
@ -51,6 +52,60 @@ describe ProjectFoldersController, type: :controller do
expect(project_folder_3.reload.parent_folders).to(include(project_folder_1))
expect(project_3.reload.project_folder.parent_folder.parent_folder).to(be_eql(project_folder_1))
end
it 'adds 1 move_porject and 1 move_project_folder activity in DB' do
expect { action }.to(change { Activity.where(type_of: :move_project).count }.by(1)
.and(change { Activity.where(type_of: :move_project_folder).count }.by(1)))
end
end
end
describe 'POST create' do
let(:action) { post :create, params: { project_folder: { name: 'My Proejct Folder' } }, format: :json }
it 'calls create activity for creating project folder' do
expect(Activities::CreateActivityService)
.to(receive(:call).with(hash_including(activity_type: :create_project_folder)))
action
end
it 'adds activity in DB' do
expect { action }.to(change { Activity.count }.by(1))
end
it 'adds ProjectFolder in DB' do
expect { action }.to(change { ProjectFolder.count }.by(1))
end
end
describe 'PATCH update' do
let(:action) { patch :update, params: { id: project_folder.id }, format: :json }
it 'calls create activity for creating project folder' do
expect(Activities::CreateActivityService)
.to(receive(:call).with(hash_including(activity_type: :rename_project_folder)))
action
end
it 'adds activity in DB' do
expect { action }.to(change { Activity.count }.by(1))
end
end
describe 'POST archive' do
let(:action) { post :archive, params: { id: project_folder.id }, format: :json }
it 'calls create activity for creating project folder' do
expect(Activities::CreateActivityService)
.to(receive(:call).with(hash_including(activity_type: :archive_project_folder)))
action
end
it 'adds activity in DB' do
expect { action }.to(change { Activity.count }.by(1))
end
end
end