mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-28 11:14:24 +08:00
b3c2dd75cf
Fix moving result elements bug [SCI-9430]
130 lines
4.3 KiB
Ruby
130 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ResultElements
|
|
class TablesController < BaseController
|
|
before_action :load_table, only: %i(update destroy duplicate move)
|
|
|
|
def create
|
|
predefined_table_dimensions = create_table_params[:tableDimensions].map(&:to_i)
|
|
name = if predefined_table_dimensions[0] == predefined_table_dimensions[1]
|
|
t('protocols.steps.table.default_name',
|
|
position: @result.result_tables.length + 1)
|
|
else
|
|
t('protocols.steps.plate.default_name',
|
|
position: @result.result_tables.length + 1)
|
|
end
|
|
result_table = @result.result_tables.new(table:
|
|
Table.new(
|
|
name: name,
|
|
contents: { data: Array.new(predefined_table_dimensions[0],
|
|
Array.new(predefined_table_dimensions[1], '')) }.to_json,
|
|
metadata: { plateTemplate: create_table_params[:plateTemplate] == 'true' },
|
|
created_by: current_user,
|
|
team: @my_module.team
|
|
))
|
|
|
|
ActiveRecord::Base.transaction do
|
|
create_in_result!(@result, result_table)
|
|
log_result_activity(:result_table_added, { table_name: result_table.table.name })
|
|
end
|
|
|
|
render_result_orderable_element(result_table)
|
|
rescue ActiveRecord::RecordInvalid
|
|
head :unprocessable_entity
|
|
end
|
|
|
|
def update
|
|
ActiveRecord::Base.transaction do
|
|
@table.assign_attributes(table_params.except(:metadata))
|
|
begin
|
|
if table_params[:metadata].present?
|
|
|
|
@table.metadata = if @table.metadata
|
|
@table.metadata.merge(JSON.parse(table_params[:metadata]))
|
|
else
|
|
JSON.parse(table_params[:metadata])
|
|
end
|
|
end
|
|
rescue JSON::ParserError
|
|
@table.metadata = {}
|
|
end
|
|
@table.save!
|
|
log_result_activity(:result_table_edited, { table_name: @table.name })
|
|
end
|
|
|
|
render json: @table, serializer: ResultTableSerializer, user: current_user
|
|
rescue ActiveRecord::RecordInvalid
|
|
head :unprocessable_entity
|
|
end
|
|
|
|
def move
|
|
target = @my_module.results.active.find_by(id: params[:target_id])
|
|
return head(:conflict) unless target
|
|
|
|
result_table = @table.result_table
|
|
|
|
ActiveRecord::Base.transaction do
|
|
result_table.update!(result: target)
|
|
result_table.result_orderable_element.destroy
|
|
new_orderable_element = target.result_orderable_elements.build(orderable: result_table)
|
|
new_orderable_element.insert_at(target.result_orderable_elements.count)
|
|
@result.normalize_elements_position
|
|
|
|
log_result_activity(
|
|
:result_table_moved,
|
|
{
|
|
user: current_user.id,
|
|
table_name: @table.name,
|
|
result_original: @result.id,
|
|
result_destination: target.id
|
|
}
|
|
)
|
|
|
|
render json: @table, serializer: ResultTableSerializer, user: current_user
|
|
rescue ActiveRecord::RecordInvalid
|
|
render json: result_table.errors, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
if @table.destroy
|
|
log_result_activity(:result_table_deleted, { table_name: @table.name })
|
|
head :ok
|
|
else
|
|
head :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def duplicate
|
|
ActiveRecord::Base.transaction do
|
|
position = @table.result_table.result_orderable_element.position
|
|
@result.result_orderable_elements.where('position > ?', position).order(position: :desc).each do |element|
|
|
element.update(position: element.position + 1)
|
|
end
|
|
@table.name += ' (1)'
|
|
new_table = @table.duplicate(@result, current_user, position + 1)
|
|
log_result_activity(:result_table_duplicated, { table_name: new_table.name })
|
|
render_result_orderable_element(new_table.result_table)
|
|
end
|
|
rescue ActiveRecord::RecordInvalid => e
|
|
Rails.logger.error(e.message)
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
head :unprocessable_entity
|
|
end
|
|
|
|
private
|
|
|
|
def table_params
|
|
params.permit(:name, :contents, :metadata)
|
|
end
|
|
|
|
def create_table_params
|
|
params.permit(:plateTemplate, tableDimensions: [])
|
|
end
|
|
|
|
def load_table
|
|
@table = @result.tables.find_by(id: params[:id])
|
|
return render_404 unless @table
|
|
end
|
|
end
|
|
end
|