scinote-web/app/controllers/step_elements/texts_controller.rb

96 lines
3 KiB
Ruby

# frozen_string_literal: true
module StepElements
class TextsController < BaseController
include ApplicationHelper
include StepsActions
before_action :load_step_text, only: %i(update destroy duplicate move)
def create
step_text = @step.step_texts.build
ActiveRecord::Base.transaction do
create_in_step!(@step, step_text)
log_step_activity(:text_added, { text_name: step_text.name })
end
render_step_orderable_element(step_text)
rescue ActiveRecord::RecordInvalid
head :unprocessable_entity
end
def update
old_text = @step_text.text
ActiveRecord::Base.transaction do
@step_text.update!(step_text_params)
TinyMceAsset.update_images(@step_text, params[:tiny_mce_images], current_user)
log_step_activity(:text_edited, { text_name: @step_text.name })
step_text_annotation(@step, @step_text, old_text)
end
render json: @step_text, serializer: StepTextSerializer, user: current_user
rescue ActiveRecord::RecordInvalid
render json: @step_text.errors, status: :unprocessable_entity
end
def move
target = @protocol.steps.find_by(id: params[:target_id])
ActiveRecord::Base.transaction do
@step_text.update!(step: target)
@step_text.step_orderable_element.update!(step: target, position: target.step_orderable_elements.size)
@step.normalize_elements_position
log_step_activity(
:text_moved,
{
user: current_user.id,
text_name: @step_text.name,
step_position_original: @step.position + 1,
step_original: @step.id,
step_position_destination: target.position + 1,
step_destination: target.id
}
)
render json: @step_text, serializer: StepTextSerializer, user: current_user
rescue ActiveRecord::RecordInvalid
render json: @step_text.errors, status: :unprocessable_entity
end
end
def destroy
if @step_text.destroy
log_step_activity(:text_deleted, { text_name: @step_text.name })
head :ok
else
head :unprocessable_entity
end
end
def duplicate
ActiveRecord::Base.transaction do
position = @step_text.step_orderable_element.position
@step.step_orderable_elements.where('position > ?', position).order(position: :desc).each do |element|
element.update(position: element.position + 1)
end
new_step_text = @step_text.duplicate(@step, position + 1)
log_step_activity(:text_duplicated, { text_name: new_step_text.name })
render_step_orderable_element(new_step_text)
end
rescue ActiveRecord::RecordInvalid
head :unprocessable_entity
end
private
def step_text_params
params.require(:text_component).permit(:text, :name)
end
def load_step_text
@step_text = @step.step_texts.find_by(id: params[:id])
return render_404 unless @step_text
end
end
end