Packages
formex
0.5.2
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Form library for Phoenix with Ecto support
Current section
Files
Jump to
Current section
Files
lib/formex/form_nested.ex
defmodule Formex.FormNested do
alias __MODULE__
alias Formex.Field
alias Formex.Form
defstruct form: nil,
name: nil,
struct_module: nil,
type: nil,
validation: [],
opts: []
@type t :: %FormNested{}
@moduledoc """
```
form
|> add(:user_info, :nested, type: App.UserInfoType, struct_module: App.UserInfo)
```
## Options
* `type` - module that implements `Formex.Type`. Required
* `struct_module` - module of struct, e.g. `App.UserInfo`
"""
@spec start_creating(form :: Form.t, type :: any, name :: Atom.t, opts :: Map.t) :: Form.t
def start_creating(form, type, name, opts) do
submodule = case form.struct_info[name] do
{:nested, submodule} -> submodule
_ -> nil
end
submodule = if !submodule do
Keyword.get(opts, :struct_module) || raise "the :struct_module option is required"
else
submodule
end
%FormNested{
name: name,
struct_module: submodule,
type: type,
validation: Keyword.get(opts, :validation, []),
opts: opts
}
end
@spec finish_creating(form :: Form.t, form_nested :: FormNested.t) :: Form.t
def finish_creating(form, form_nested) do
%{type: type, name: name, struct_module: struct_module} = form_nested
substruct = Field.get_value(form, name)
params = form.params[to_string(name)] || %{}
subform = Formex.Builder.create_form(type, substruct, params, form.opts, struct_module)
form_nested
|> Map.put(:form, subform)
end
end