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

  def create_text_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil, example: nil, default_value: nil)
    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,
      field_id: field_id,
      input_type: nil,
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      example: example,
      default_value: default_value
    }
  end

  def create_textarea_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil, example: nil, default_value: nil)
    render partial: "shared/dynamic_form/fields/textarea_field",
    locals: {
      f: form,
      multiple: is_multiple,
      index: index,
      field_value: value,
      field_name: name,
      field_label: label,
      field_class: html_class,
      field_id: field_id,
      input_type: nil,
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      example: example,
      default_value: default_value
    }
  end

  def create_url_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil, example: nil, default_value: nil)
    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,
      field_id: field_id,
      input_type: "url",
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      example: example,
      default_value: default_value
    }
  end

  def create_email_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil, example: nil, default_value: nil)
    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,
      field_id: field_id,
      input_type: "email",
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      example: example,
      default_value: default_value
    }
  end

  def create_date_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil, example: nil, default_value: nil)
    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,
      field_id: field_id,
      input_type: "date",
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      example: example,
      default_value: default_value
    }
  end

  def create_number_field(form, value, name, label, field_id, required: false, validation: nil, html_class: nil, is_multiple: false, readonly: false, index: 0, ttip: nil)
    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,
      field_id: field_id,
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip
    }
  end

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

  def create_simple_registry_field(form, value, form_prefix, property_name, label, field_id, select_values, locale, required: false, validation: nil, html_class: nil, readonly: false, multiple: false, ttip: nil, default_value: nil, overridable: nil)
    render partial: "shared/dynamic_form/fields/registry/simple",
    locals: {
      f: form,
      selected_value: value,
      form_prefix: form_prefix,
      property_name: property_name,
      field_label: label,
      select_values: select_values,
      locale: locale,
      field_class: html_class,
      field_id: field_id,
      multiple: multiple,
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      default_value: default_value,
      overridable: overridable
    }
  end

  def create_complex_registry_field(form, value, form_prefix, property_name, label, field_id, select_values, locale, parent_id, schema_id, required: false, validation: nil, html_class: nil, readonly: false, multiple: false, ttip: nil, default_value: nil, overridable: nil)
    render partial: "shared/dynamic_form/fields/registry/complex",
    locals: {
      f: form,
      value: value,
      form_prefix: form_prefix,
      property_name: property_name,
      field_label: label,
      select_values: select_values,
      locale: locale,
      parent_id: parent_id,
      schema_id: schema_id,
      field_class: html_class,
      field_id: field_id,
      multiple: multiple,
      readonly: readonly,
      required: required,
      validation: validation,
      ttip: ttip,
      default_value: default_value,
      overridable: overridable
    }
  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

  # Generate a select option "value" depending on the type of registry value
  # if it as a "complex" value, returns the id of the registry value
  # else returns the value (simple enum are save as String most of the time)
  def select_value(registry_value, locale)
    if registry_value.data["value"].present?
      registry_value.data["value"][locale] || registry_value.data["value"]
    else
      registry_value.id
    end
  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)
    formated_data = {}
    schema["properties"].each do |key, prop|
      next if data[key].nil? || key.end_with?("_custom")

      case prop["type"]
      when "integer", "number"
        formated_data[key] = data[key].to_i
      when "boolean"
        formated_data[key] = data[key] == "1"
      when "array"
        next if prop["registry_id"].present? 

        formated_data[key] = data[key].is_a?(Array) ? data[key] : [data[key]]
      when "object"
        next if prop["schema_id"].nil?

        sub_schema = MadmpSchema.find(prop["schema_id"])

        if prop["inputType"].present? && prop["inputType"].eql?("pickOrCreate")
          formated_data[key] = { "dbid" => data[key].to_i }
        elsif prop["registry_id"].present?
          # if the field is overridable, check if there's a custom value
          if prop["overridable"].present? && data["#{key}_custom"].present?
            formated_data[key] = { "custom_value" => data["#{key}_custom"] }
            next
          end

          formated_data[key] = data_reformater(
            sub_schema.schema,
            RegistryValue.find(data[key].to_i).data.merge(
              "id": data[key].to_i
            )
          ) if data[key].present?
        else
          formated_data[key] = data_reformater(
            sub_schema.schema,
            data[key]
          )
        end
      else # type = string
        # if the field is overridable, check if there's a custom value
        if prop["overridable"].present? && data["#{key}_custom"].present?
          formated_data[key] = data["#{key}_custom"]
          next
        end
        formated_data[key] = data[key]
      end

      formated_data[key] = nil if formated_data[key].eql?("")
    end
    formated_data
  end

end