mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-30 16:08:29 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class ResultTablesController < ApplicationController
 | |
|   include ResultsHelper
 | |
| 
 | |
|   before_action :load_vars, only: [:edit, :update, :download]
 | |
|   before_action :convert_contents_to_utf8, only: [:update]
 | |
| 
 | |
|   before_action :check_manage_permissions, only: %i(edit update)
 | |
|   before_action :check_archive_permissions, only: [:update]
 | |
|   before_action :check_view_permissions, except: %i(edit update)
 | |
| 
 | |
|   def edit
 | |
|     render json: {
 | |
|       html: render_to_string({ partial: 'edit', formats: :html })
 | |
|     }, status: :ok
 | |
|   end
 | |
| 
 | |
|   def update
 | |
|     update_params = result_params
 | |
|     @result.last_modified_by = current_user
 | |
|     @result.table.last_modified_by = current_user
 | |
|     @result.table.team = current_team
 | |
|     @result.assign_attributes(update_params)
 | |
|     @result.table.metadata = JSON.parse(update_params[:table_attributes][:metadata]) if update_params[:table_attributes]
 | |
|     flash_success = t("result_tables.update.success_flash",
 | |
|       module: @my_module.name)
 | |
|     if @result.archived_changed?(from: false, to: true)
 | |
|       saved = @result.archive(current_user)
 | |
|       flash_success = t("result_tables.archive.success_flash",
 | |
|         module: @my_module.name)
 | |
|       if saved
 | |
|         log_activity(:archive_result)
 | |
|       end
 | |
|     elsif @result.archived_changed?(from: true, to: false)
 | |
|       render_403
 | |
|     else
 | |
|       saved = @result.save
 | |
| 
 | |
|       if saved then
 | |
|         log_activity(:edit_result)
 | |
|       end
 | |
|     end
 | |
|     respond_to do |format|
 | |
|       if saved
 | |
|         format.html {
 | |
|           flash[:success] = flash_success
 | |
|           redirect_to results_my_module_path(@my_module)
 | |
|         }
 | |
|         format.json {
 | |
|           render json: {
 | |
|             html: render_to_string(
 | |
|               partial: 'my_modules/result',
 | |
|               locals: { result: @result },
 | |
|               formats: :html
 | |
|             )
 | |
|           }, status: :ok
 | |
|         }
 | |
|       else
 | |
|         format.json {
 | |
|           render json: @result.errors, status: :bad_request
 | |
|         }
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def download
 | |
|     _ = JSON.parse @result_table.table.contents
 | |
|     @table_data = _["data"] || []
 | |
|     data = render_to_string partial: 'download'
 | |
|     send_data data, filename: @result_table.result.name + '.txt',
 | |
|       type: 'plain/text'
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def load_vars
 | |
|     @result_table = ResultTable.find_by_id(params[:id])
 | |
| 
 | |
|     if @result_table
 | |
|       @result = @result_table.result
 | |
|       @my_module = @result.my_module
 | |
|     else
 | |
|       render_404
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def convert_contents_to_utf8
 | |
|     if params.include? :result and
 | |
|       params[:result].include? :table_attributes and
 | |
|       params[:result][:table_attributes].include? :contents then
 | |
|       params[:result][:table_attributes][:contents] =
 | |
|         params[:result][:table_attributes][:contents].encode(Encoding::UTF_8).force_encoding(Encoding::UTF_8)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def check_manage_permissions
 | |
|     render_403 unless can_manage_result?(@result)
 | |
|   end
 | |
| 
 | |
|   def check_archive_permissions
 | |
|     if result_params[:archived].to_s != '' && !can_manage_result?(@result)
 | |
|       render_403
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def check_view_permissions
 | |
|     render_403 unless can_read_result?(@result)
 | |
|   end
 | |
| 
 | |
|   def result_params
 | |
|     params.require(:result).permit(
 | |
|       :name, :archived,
 | |
|       table_attributes: [
 | |
|         :id,
 | |
|         :contents,
 | |
|         :metadata
 | |
|       ]
 | |
|     )
 | |
|   end
 | |
| 
 | |
|   def log_activity(type_of)
 | |
|     Activities::CreateActivityService
 | |
|       .call(activity_type: type_of,
 | |
|             owner: current_user,
 | |
|             subject: @result,
 | |
|             team: @my_module.team,
 | |
|             project: @my_module.project,
 | |
|             message_items: {
 | |
|               result: @result.id,
 | |
|               type_of_result: t('activities.result_type.table')
 | |
|             })
 | |
|   end
 | |
| end
 |