# 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_step_activity(:table_added, { table_name: step_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_step_activity(: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.find_by(id: params[:target_id]) result_table = @table.result_table ActiveRecord::Base.transaction do result_table.update!(result: target) result_table.result_orderable_element.update!(result: target, position: target.result_orderable_elements.size) @result.normalize_elements_position 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_step_activity(:table_deleted, { table_name: @table.name }) head :ok else head :unprocessable_entity end end def duplicate #ActiveRecord::Base.transaction do # position = @table.step_table.step_orderable_element.position # @step.step_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(@step, current_user, position + 1) # log_step_activity(:table_duplicated, { table_name: new_table.name }) # render_step_orderable_element(new_table.step_table) #end rescue ActiveRecord::RecordInvalid 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