Packages
formex
0.4.9
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_collection.ex
defmodule Formex.FormCollection do
@repo Application.get_env(:formex, :repo)
alias __MODULE__
alias Formex.Field
alias Formex.Form
alias Formex.FormNested
defstruct forms: [],
model: nil,
name: nil,
opts: [],
delete_field: nil,
required: true
@type t :: %FormCollection{}
@spec create(form :: Form.t, type :: any, name :: Atom.t, opts :: Map.t) :: Form.t
def create(form, type, name, opts) do
substructs = Field.get_value(form, name)
{delete_field, opts} = Keyword.pop(opts, :delete_field)
{form, substructs} = if Ecto.assoc_loaded? substructs do
{form, substructs}
else
struct = @repo.preload(form.struct, name)
substructs = Map.get(struct, name)
struct = Map.put(struct, name, substructs)
form = Map.put(form, :struct, struct)
{form, substructs}
end
# substructs = if opts[:filter] do
# Enum.filter(substructs, opts[:filter])
# else
# substructs
# end
submodule = Form.get_assoc_or_embed(form, name).related
params = form.params[to_string(name)] || []
subforms_old = create_existing_subforms(form, name, substructs, params, type, submodule, opts)
subforms_new = create_new_subforms(form, name, params, type, submodule, opts)
form_collection = %FormCollection{
forms: subforms_old ++ subforms_new,
name: name,
model: submodule,
required: Keyword.get(opts, :required, true),
opts: opts,
delete_field: delete_field || :formex_delete
}
{form, form_collection}
end
defp create_existing_subforms(form, name, substructs, params, type, submodule, opts) do
substructs
|> Enum.map(fn substruct ->
{_, subparams} = Enum.find(params, {nil, %{}}, fn {_k, v} ->
id = if is_integer(substruct.id) do
v["id"] |> Integer.parse |> elem(0)
else
v["id"]
end
substruct.id == id
end)
create_subform(form, name, type, substruct, subparams, submodule, opts)
end)
end
defp create_new_subforms(form, name, params, type, submodule, opts) do
params
|> Enum.filter(fn {_key, val} -> !val["id"] end)
|> Enum.map(fn {_key, subparams} ->
substruct = struct(submodule, subparams)
create_subform(form, name, type, substruct, subparams, submodule, opts)
end)
end
defp create_subform(form, name, type, substruct, subparams, submodule, opts) do
subform = Formex.Builder.create_form(type, substruct, subparams, form.opts, submodule)
%FormNested{
form: subform,
name: name,
required: Keyword.get(opts, :required, true),
opts: opts
}
end
end