mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-31 16:49:40 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			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
 |