bmichotte / ProMotion-XLForm

ProMotion-XLForm is a ProMotion plugin for XLForm
MIT License
20 stars 21 forks source link

Problem shoveling a new section into form_data #29

Open eliduke opened 9 years ago

eliduke commented 9 years ago

This one is a bit of a doozy. I'm not sure if this is a problem on my end or simply a limitation of XLForm, but hopefully you can shed some light on this for me. I'll try to break it down as best I can.

I have a collection of settings with the following json structure:

"key": "hide_connections_on_profile",
"name": "Users – Hide User’s Connections list",
"description": "Profile",
"setting": true,
"category": "Privacy",
"label": "Hide my Connections list from my profile"

I go through the list and grab all the uniq categories, then map through those as the the different sections of the form. That is all working flawlessly right now.

def settings
  @categories = @settings.map{ |setting| setting.category}.uniq.sort
  @categories.map do |category|
    @category_of_settings = @settings.select{ |user| user.category == category }
    {
      title: category.upcase,
      cells:
      @category_of_settings.map do |setting|
        {
          name: setting.key,
          title: setting.label,
          type: :check,
          value: setting.setting
        }
      end
    }
  end
end

The problem is that I don't have a save button. Since I am dealing exclusively with loops here, I need to inject the save button at the end. And that's where things are not going well. First, I tried switching the first block to an each, wrapping the whole thing in [ ], with the possibility of conditionally adding a save button.

def settings
  @categories = @settings.map{ |setting| setting.category}.uniq.sort
  [
  @categories.each do |category|
    @category_of_settings = @settings.select{ |user| user.category == category }
    {
      title: category.upcase,
      cells:
      @category_of_settings.map do |setting|
        {
          name: setting.key,
          title: setting.label,
          type: :check,
          value: setting.setting
        }
      end
    }
  end
  ]
end

It compiles just fine, but when I load that screen, I get the following error:

xl_form_patch.rb:76:in `section:': can't convert Symbol into Integer (TypeError)

I tried going back to map and then creating 2 separate methods, settings and save_button and then shoveling them together in a form_data method:

def form_data
  settings << save_button
end  

def settings
  @categories = @settings.map{ |setting| setting.category}.uniq.sort
  @categories.map do |category|
    @category_of_settings = @settings.select{ |user| user.category == category }
    {
      title: category.upcase,
      cells:
      @category_of_settings.map do |setting|
        {
          name: setting.key,
          title: setting.label,
          type: :check,
          value: setting.setting
        }
      end
    }
  end
end

def save_button
  [{
    title: nil,
    cells: [{
      name: :save,
      title: "Save",
      type: :button,
      on_click: -> { save_settings }
    }]
  }]
end

Again, it compiles just fine, but then I get the same error:

xl_form_patch.rb:76:in `section:': can't convert Symbol into Integer (TypeError)

And at this point, I'm at a loss. Not sure if what I'm after is just not possible or if I'm missing some subtly in there somewhere.

eliduke commented 9 years ago

I am working on a solution where I set:

form_options on_save: :'save_settings:'

And that seems to be working, but the returned values is only the elements from the last form section. Is it possible to include all elements from all sections in form_data?

bmichotte commented 9 years ago

That's strange, I just push dynamic_form_screen.rb on which I build the form like you build your. Here I have no problem capture d ecran 2015-11-30 a 20 53 50

I guess your screen is fine (are all your categories presented ?)

Could you test on your save_settings: the value of formValues (this is the original XLForm method)