mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-18 01:36:12 +08:00
Add result duplicate action [SCI-8959] (#6019)
This commit is contained in:
parent
abd6e794e9
commit
0bea4a06ef
8 changed files with 107 additions and 19 deletions
|
@ -1,8 +1,10 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class ResultsController < ApplicationController
|
class ResultsController < ApplicationController
|
||||||
|
skip_before_action :verify_authenticity_token, only: %i(create update destroy duplicate)
|
||||||
before_action :load_my_module
|
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
|
before_action :check_destroy_permissions, only: :destroy
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
@ -113,6 +115,16 @@ class ResultsController < ApplicationController
|
||||||
redirect_to archive_my_module_path(@my_module)
|
redirect_to archive_my_module_path(@my_module)
|
||||||
end
|
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
|
private
|
||||||
|
|
||||||
def result_params
|
def result_params
|
||||||
|
|
|
@ -349,7 +349,9 @@
|
||||||
|
|
||||||
},
|
},
|
||||||
duplicateResult() {
|
duplicateResult() {
|
||||||
|
axios.post(this.urls.duplicate_url).then((_) => {
|
||||||
|
this.$emit('duplicated');
|
||||||
|
});
|
||||||
},
|
},
|
||||||
moveElement(position, target_id) {
|
moveElement(position, target_id) {
|
||||||
this.elements.splice(position, 1)
|
this.elements.splice(position, 1)
|
||||||
|
@ -363,8 +365,8 @@
|
||||||
this.$emit('result:move_element', target_id)
|
this.$emit('result:move_element', target_id)
|
||||||
},
|
},
|
||||||
updateName(name) {
|
updateName(name) {
|
||||||
axios.patch(this.urls.update_url, { result: { name: name } }, (_) => {
|
axios.patch(this.urls.update_url, { result: { name: name } }).then((_) => {
|
||||||
this.$emit('resultUpdated')
|
this.$emit('updated');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
:resultToReload="resultToReload"
|
:resultToReload="resultToReload"
|
||||||
@result:elements:loaded="resultToReload = null"
|
@result:elements:loaded="resultToReload = null"
|
||||||
@result:move_element="reloadResult"
|
@result:move_element="reloadResult"
|
||||||
|
@duplicated="loadResults"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -54,6 +54,35 @@ class Result < ApplicationRecord
|
||||||
end
|
end
|
||||||
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
|
def default_view_state
|
||||||
{ 'assets' => { 'sort' => 'new' } }
|
{ 'assets' => { 'sort' => 'new' } }
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,4 +15,22 @@ class ResultText < ApplicationRecord
|
||||||
|
|
||||||
strip_tags(text.truncate(64))
|
strip_tags(text.truncate(64))
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -134,23 +134,44 @@ class Table < ApplicationRecord
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def duplicate(step, user, position = nil)
|
def duplicate(parent, user, position = nil)
|
||||||
|
case parent
|
||||||
|
when Step
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
new_table = step.tables.create!(
|
new_table = parent.tables.create!(
|
||||||
name: name,
|
name: name,
|
||||||
contents: contents.encode('UTF-8', 'UTF-8'),
|
contents: contents.encode('UTF-8', 'UTF-8'),
|
||||||
team: step.protocol.team,
|
team: parent.protocol.team,
|
||||||
created_by: user,
|
created_by: user,
|
||||||
metadata: metadata,
|
metadata: metadata,
|
||||||
last_modified_by: user
|
last_modified_by: user
|
||||||
)
|
)
|
||||||
|
|
||||||
step.step_orderable_elements.create!(
|
parent.step_orderable_elements.create!(
|
||||||
position: position || step.step_orderable_elements.length,
|
position: position || parent.step_orderable_elements.length,
|
||||||
orderable: new_table.step_table
|
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
|
new_table
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -83,6 +83,10 @@ class ResultSerializer < ActiveModel::Serializer
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if can_create_results?(object.my_module)
|
||||||
|
urls_list[:duplicate_url] = duplicate_my_module_result_url(object.my_module, object)
|
||||||
|
end
|
||||||
|
|
||||||
urls_list
|
urls_list
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -538,6 +538,7 @@ Rails.application.routes.draw do
|
||||||
post :upload_attachment
|
post :upload_attachment
|
||||||
post :update_view_state
|
post :update_view_state
|
||||||
post :update_asset_view_mode
|
post :update_asset_view_mode
|
||||||
|
post :duplicate
|
||||||
end
|
end
|
||||||
|
|
||||||
resources :tables, controller: 'result_elements/tables', only: %i(create destroy update) do
|
resources :tables, controller: 'result_elements/tables', only: %i(create destroy update) do
|
||||||
|
|
Loading…
Add table
Reference in a new issue