Packages
formex
0.2.0
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
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` 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{}
@doc """
Creates a new field.
`type` is the name of function from `Phoenix.HTML.Form`.
## Options
* `:label`
* `:required` - defaults to true. If set, it will be validated by the
`Ecto.Changeset.validate_required/4`. Also, the template helper will it use to generate
additional `.required` CSS class.
* `:choices` - list of `<option>`s for `:select` and `:multiple_select`
```
form
|> add(:select, :field, options: ["Option 1": 1, "Options 2": 2])
```
* `: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, 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),
data: [
choices: opts[:choices]
],
opts: opts
}
end
@doc false
def get_label(name, opts) do
if opts[:label] do
opts[:label]
else
Atom.to_string name
end
end
end