Newer
Older
dmpopidor / app / helpers / dynamic_form_helper.rb
module DynamicFormHelper

  def create_text_field(form, value, name, label, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0)
    render partial: 'shared/dynamic_form/fields/text_field', 
    locals: {
      f: form, 
      multiple: is_multiple,
      index: index,
      field_value: value, 
      field_name: name, 
      field_label: label,
      field_class: html_class,
      input_type: nil,
      readonly: readonly, 
      validation: validation
    }
  end



  def create_url_field(form, value, name, label, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0)
    render partial: 'shared/dynamic_form/fields/text_field', 
    locals: {
      f: form, 
      multiple: is_multiple,
      index: index,
      field_value: value, 
      field_name: name, 
      field_label: label,
      field_class: html_class,
      input_type: 'url',
      readonly: readonly, 
      validation: validation
    }
  end



  def create_email_field(form, value, name, label, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0)
    render partial: 'shared/dynamic_form/fields/text_field', 
    locals: {
      f: form, 
      multiple: is_multiple,
      index: index,
      field_value: value, 
      field_name: name, 
      field_label: label,
      field_class: html_class,
      input_type: 'email',
      readonly: readonly, 
      validation: validation
    }
  end



  def create_date_field(form, value, name, label, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0)
    render partial: 'shared/dynamic_form/fields/text_field', 
    locals: {
      f: form, 
      multiple: is_multiple,
      index: index,
      field_value: value, 
      field_name: name, 
      field_label: label,
      field_class: html_class,
      input_type: 'date',
      readonly: readonly, 
      validation: validation
    }
  end



  def create_number_field(form, value, name, label, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0)
    render partial: 'shared/dynamic_form/fields/number_field', 
    locals: {
      f: form, 
      multiple: is_multiple,
      index: index,
      field_value: value, 
      field_name: name, 
      field_label: label,
      field_class: html_class,
      readonly: readonly, 
      validation: validation
    }
  end



  def create_checkbox_field(form, value, name, label, validation: nil, html_class: nil, readonly: false)
    render partial: 'shared/dynamic_form/fields/checkbox_field', 
    locals: {
      f: form, 
      field_value: value, 
      field_name: name, 
      field_label: label, 
      readonly: readonly, 
      validation: validation
    }
  end

  def create_select_field(form, value, name, label, select_values, validation: nil, html_class: nil, readonly: false)
    render partial: 'shared/dynamic_form/fields/select_field', 
    locals: {
      f: form, 
      selected_value: value, 
      field_name: name,
      field_label: label,
      select_values: select_values,
      field_class: html_class,
      readonly: readonly, 
      validation: validation
    }
  end

  def display_validation_message(validations)
    message = ""
    validations.each do |validation|
      case validation
      when "required"
        message += d_('dmpopidor', 'This property is required.')
      when "pattern"
        message += d_('dmpopidor', 'This property has an invalid format.')
      else 
        message += d_('dmpopidor', 'This property has an unknown problem : %{validation}') % {
          validation: validation
        }
      end
    end
    message
  end

  # Formats the data extract from the structured answer form to valid JSON data
  # This is useful because Rails converts all form data to strings and JSON needs the actual types
  def data_reformater(schema, data)
    schema["properties"].each do |key, prop|
      if data[key] == ""
        data.delete(key)
      else 
        case prop["type"]
        when "integer"
          data[key] = data[key].to_i
        when "boolean"
          data[key] = data[key] == "1"
        when "array"
          data[key] = data[key].kind_of?(Array) ? data[key] : [data[key]]
        when "object"
          if prop['schema_id'].present?
            sub_schema = MadmpSchema.find(prop['schema_id'])
            data[key] = data_reformater(sub_schema.schema, data[key])
          end 
          # if value["dictionnary"]
          #   data[key] = JSON.parse(DictionnaryValue.where(id: data[key]).select(:id, :uri, :label).take.to_json)
          # end
        end
      end 
    end
    data
  end
  
end