ifmeorg/ifme

View on GitHub
app/helpers/moments_form_helper.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true
module MomentsFormHelper
  include MoodsHelper
  include CategoriesHelper
  include StrategiesHelper
  include FormHelper

  def new_moment_props
    new_form_props(moment_form_inputs, moments_path)
  end

  def edit_moment_props
    edit_form_props(moment_form_inputs(true), moment_path(@moment))
  end

  private

  def moment_input_props(field, type, label, group = false)
    { id: "moment_#{field}", type:,
      name: "moment[#{field}]#{group ? '[]' : ''}", label: t(label) }
  end

  def moment_text_input_props(field, type, label, required = false)
    moment_input_props(field, type, label)
      .merge(value: @moment[field] || nil, required:, dark: true)
  end

  def moment_name
    moment_text_input_props('name', 'text', 'common.name', true)
  end

  def moment_why
    props = moment_text_input_props(
      'why', 'textareaTemplate',
      "moments.form.#{@moment.fix.present? ? 'why_legacy' : 'why'}", true
    )

    return props if @moment.fix.present?

    props.merge(options: options_for_templates(current_user.moment_templates))
  end

  def moment_fix
    if @moment.fix.present?
      return moment_text_input_props(
        'fix', 'textarea', 'moments.form.fix_legacy'
      )
    end
    {}
  end

  def quick_create_props(model_relation, form_props)
    model_name = model_relation.name.downcase
    moment_input_props(
      model_name, 'quickCreate', "#{model_name.pluralize}.plural", true
    ).merge(placeholder: t('common.form.search_by_keywords'),
            checkboxes: checkboxes_for(model_relation), formProps: form_props)
  end

  def moment_category
    quick_create_props(@categories, quick_create_category_props)
  end

  def moment_mood
    quick_create_props(@moods, quick_create_mood_props)
  end

  def moment_strategy
    quick_create_props(@strategies, quick_create_strategy_props)
  end

  def moment_comment
    moment_input_props('comment', 'switch', 'comment.allow_comments')
      .merge(value: true, uncheckedValue: false, checked: @moment.comment,
             info: t('comment.hint'), dark: true)
  end

  def moment_publishing(edit)
    { id: 'moment_publishing', type: 'switch',
      label: t('moments.form.draft_question'), dark: true, name: 'publishing',
      value: '0', uncheckedValue: '1',
      checked: edit ? !@moment.published? : @moment.published? }
  end

  def moment_bookmarked
    moment_input_props(
      'bookmarked', 'switch', 'moments.form.bookmarked_question'
    ).merge(
      value: true, uncheckedValue: false,
      checked: params[:bookmarked] ? true : @moment.bookmarked,
      dark: true,
      info: t('moments.form.bookmarked_info')
    )
  end

  def moment_display_resources
    moment_input_props('resource_recommendations', 'switch',
                       'moments.form.resource_recommendations_question')
      .merge(value: true, uncheckedValue: false,
             checked: @moment.resource_recommendations, dark: true)
  end

  def moment_form_inputs(edit = false)
    [
      moment_name, moment_why, moment_fix, moment_category, moment_mood,
      moment_strategy, get_viewers_input(
        @viewers, 'moment', 'moments', @moment
      ), moment_comment, moment_publishing(edit), moment_bookmarked,
      moment_display_resources
    ]
  end

  def checkboxes_for(data)
    data.map do |item|
      {
        id: item.slug, label: item.name, value: item.id,
        checked: data_for(item)&.include?(item.id)
      }
    end
  end

  def data_for(item)
    case item.class.name
    when 'Category'
      @moment.categories.pluck(:id)
    when 'Mood'
      @moment.moods.pluck(:id)
    when 'Strategy'
      @moment.strategies.pluck(:id)
    end
  end

  def options_for_templates(data)
    data.map do |item|
      { id: item.slug, label: item.name, value: item.description }
    end
  end
end