Add result duplicate action [SCI-8959] (#6019)

This commit is contained in:
artoscinote 2023-08-23 15:05:31 +02:00 committed by GitHub
parent abd6e794e9
commit 0bea4a06ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 107 additions and 19 deletions

View file

@ -1,8 +1,10 @@
# frozen_string_literal: true
class ResultsController < ApplicationController
skip_before_action :verify_authenticity_token, only: %i(create update destroy duplicate)
before_action :load_my_module
before_action :load_vars, only: %i(destroy elements assets upload_attachment update_view_state update_asset_view_mode update)
before_action :load_vars, only: %i(destroy elements assets upload_attachment
update_view_state update_asset_view_mode update duplicate)
before_action :check_destroy_permissions, only: :destroy
def index
@ -113,6 +115,16 @@ class ResultsController < ApplicationController
redirect_to archive_my_module_path(@my_module)
end
def duplicate
ActiveRecord::Base.transaction do
new_result = @result.duplicate(
@my_module, current_user, result_name: "#{@result.name} (1)"
)
render json: new_result, serializer: ResultSerializer, user: current_user
end
end
private
def result_params

View file

@ -349,7 +349,9 @@
},
duplicateResult() {
axios.post(this.urls.duplicate_url).then((_) => {
this.$emit('duplicated');
});
},
moveElement(position, target_id) {
this.elements.splice(position, 1)
@ -363,8 +365,8 @@
this.$emit('result:move_element', target_id)
},
updateName(name) {
axios.patch(this.urls.update_url, { result: { name: name } }, (_) => {
this.$emit('resultUpdated')
axios.patch(this.urls.update_url, { result: { name: name } }).then((_) => {
this.$emit('updated');
});
}
}

View file

@ -14,6 +14,7 @@
:resultToReload="resultToReload"
@result:elements:loaded="resultToReload = null"
@result:move_element="reloadResult"
@duplicated="loadResults"
/>
</div>
</div>

View file

@ -54,6 +54,35 @@ class Result < ApplicationRecord
end
end
def duplicate(my_module, user, result_name: nil)
ActiveRecord::Base.transaction do
new_result = my_module.results.new(
name: result_name || name,
user: user
)
new_result.save!
# Copy texts
result_texts.each do |result_text|
result_text.duplicate(new_result)
end
# Copy assets
assets.each do |asset|
new_asset = asset.dup
new_asset.save!
new_result.assets << new_asset
end
# Copy tables
tables.each do |table|
table.duplicate(new_result, user)
end
new_result
end
end
def default_view_state
{ 'assets' => { 'sort' => 'new' } }
end

View file

@ -15,4 +15,22 @@ class ResultText < ApplicationRecord
strip_tags(text.truncate(64))
end
def duplicate(result, position = nil)
ActiveRecord::Base.transaction do
new_result_text = result.result_texts.create!(
text: text
)
# Copy results tinyMce assets
clone_tinymce_assets(new_result_text, result.my_module.team)
result.result_orderable_elements.create!(
position: position || result.result_orderable_elements.length,
orderable: new_result_text
)
new_result_text
end
end
end

View file

@ -134,23 +134,44 @@ class Table < ApplicationRecord
end
end
def duplicate(step, user, position = nil)
def duplicate(parent, user, position = nil)
case parent
when Step
ActiveRecord::Base.transaction do
new_table = step.tables.create!(
new_table = parent.tables.create!(
name: name,
contents: contents.encode('UTF-8', 'UTF-8'),
team: step.protocol.team,
team: parent.protocol.team,
created_by: user,
metadata: metadata,
last_modified_by: user
)
step.step_orderable_elements.create!(
position: position || step.step_orderable_elements.length,
parent.step_orderable_elements.create!(
position: position || parent.step_orderable_elements.length,
orderable: new_table.step_table
)
new_table
end
when Result
ActiveRecord::Base.transaction do
new_table = parent.tables.create!(
name: name,
contents: contents.encode('UTF-8', 'UTF-8'),
team: parent.my_module.team,
created_by: user,
metadata: metadata,
last_modified_by: user
)
parent.result_orderable_elements.create!(
position: parent.result_orderable_elements.length,
orderable: new_table.result_table
)
new_table
end
end
end
end

View file

@ -83,6 +83,10 @@ class ResultSerializer < ActiveModel::Serializer
})
end
if can_create_results?(object.my_module)
urls_list[:duplicate_url] = duplicate_my_module_result_url(object.my_module, object)
end
urls_list
end
end

View file

@ -538,6 +538,7 @@ Rails.application.routes.draw do
post :upload_attachment
post :update_view_state
post :update_asset_view_mode
post :duplicate
end
resources :tables, controller: 'result_elements/tables', only: %i(create destroy update) do