Sha256: 60566f8f3b1e527bcdc5453163e5bf8bf65a1f612c5bce89742c0fd4332aa428

Contents?: true

Size: 1.96 KB

Versions: 7

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

module Decidim
  module Forms
    # This class holds a Form to answer a questionnaire from Decidim's public page.
    class QuestionnaireForm < Decidim::Form
      include ActiveModel::Validations::Callbacks

      # as questionnaire uses "answers" for the database relationships is
      # important not to use the same word here to avoid querying all the entries, resulting in a high performance penalty
      attribute :responses, Array[AnswerForm]
      attribute :user_group_id, Integer
      attribute :public_participation, Boolean, default: false

      attribute :tos_agreement, Boolean

      before_validation :before_validation

      validates :tos_agreement, allow_nil: false, acceptance: true
      validate :session_token_in_context

      # Private: Create the responses from the questionnaire questions
      #
      # Returns nothing.
      def map_model(model)
        self.responses = model.questions.map do |question|
          AnswerForm.from_model(Decidim::Forms::Answer.new(question:))
        end
      end

      # Add other responses to the context so AnswerForm can validate conditional questions
      def before_validation
        context.responses = attributes[:responses]
      end

      # Public: Splits reponses by step, keeping the separator.
      #
      # Returns an array of steps. Each step is a list of the questions in that
      # step, including the separator.
      def responses_by_step
        @responses_by_step ||=
          begin
            steps = responses.chunk_while do |a, b|
              !a.question.separator? || b.question.separator?
            end.to_a

            steps = [[]] if steps == []
            steps
          end
      end

      def total_steps
        responses_by_step.count
      end

      def session_token_in_context
        return if context&.session_token

        errors.add(:tos_agreement, I18n.t("activemodel.errors.models.questionnaire.request_invalid"))
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
decidim-forms-0.28.4 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.3 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.2 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.1 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.0 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.0.rc5 app/forms/decidim/forms/questionnaire_form.rb
decidim-forms-0.28.0.rc4 app/forms/decidim/forms/questionnaire_form.rb