Packages
formex
0.1.4
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/field.ex
defmodule Formex.Field do
import Ecto.Query
alias __MODULE__
@doc """
Defines the Formex.Field struct.
* `:name` - a field name, for example: `:title`
* `:type` - type of field that in most cases will be name of function from `Phoenix.HTML.Form`
* `:value` - the value from struct/params
* `:required` - is field required?
* `:label` - the text label
* `:data` - additional data used by particular field type (eg. `:select_assoc` stores here data
for `<option>`'s)
* `:opts` - options
"""
defstruct name: nil,
# assoc: false,
type: nil,
value: nil,
required: true,
label: "",
data: [],
opts: []
@type t :: %Field{}
@repo Application.get_env(:formex, :repo)
@doc """
Creates a new field.
`type` is, in most cases, the name of function from `Phoenix.HTML.Form`. For now the only
exception is the `:select_assoc`
## Custom types
* `:select_assoc` - creates standard `:select`, but also downloads list of options from Repo.
Example of use for Article with one Category:
```
schema "articles" do
belongs_to :category, App.Category
end
```
```
form
|> add(:select_assoc, :category_id, label: "Category")
```
Formex will find out that `:category_id` refers to App.Category schema and download all rows
from Repo ordered by name. It assumes that Category has field called `name`
## Options
* `:label`
* `:required` - defaults to true
* `:phoenix_opts` - options that will be passed to `Phoenix.HTML.Form`, for example:
```
form
|> add(:textarea, :content, phoenix_opts: [
rows: 4
])
```
"""
def create_field(form, :select_assoc, name, opts) do
name_id = name
name = Regex.replace(~r/_id$/, Atom.to_string(name_id), "") |> String.to_atom
get_options = fn ->
module = form.model.__schema__(:association, name).queryable
query = from e in module,
select: {e.name, e.id},
order_by: e.name
@repo.all(query)
end
%Field{
name: name_id,
type: :select,
value: Map.get(form.struct, name),
label: get_label(name, opts),
required: Keyword.get(opts, :required, true),
data: [
options: get_options.()
],
opts: opts
}
end
def create_field(form, type, name, opts) do
%Field{
name: name,
type: type,
value: Map.get(form.struct, name),
label: get_label(name, opts),
required: Keyword.get(opts, :required, true),
opts: opts
}
end
#
defp get_label(name, opts) do
if opts[:label] do
opts[:label]
else
Atom.to_string name
end
end
end