Packages

SmartForm is a small DSL built on top of Ecto.Changeset to help you build forms.

Current section

2 Versions

Jump to

Compare versions

4 files changed
+42 additions
-11 deletions
  @@ -16,7 +16,7 @@ SmartForm is a hex package to make working with forms in [Phoenix LiveView](http
16 16 defmodule Form do
17 17 use SmartForm
18 18
19 - form do
19 + smart_form do
20 20 field :name, :string, validate: :required
21 21 end
22 22 end
  @@ -2,7 +2,7 @@
2 2 {<<"build_tools">>,[<<"mix">>]}.
3 3 {<<"description">>,
4 4 <<"SmartForm is a small DSL built on top of Ecto.Changeset to help you build forms.">>}.
5 - {<<"elixir">>,<<"~> 1.14">>}.
5 + {<<"elixir">>,<<"~> 1.13">>}.
6 6 {<<"files">>,
7 7 [<<"lib">>,<<"lib/smart_form.ex">>,<<".formatter.exs">>,<<"mix.exs">>,
8 8 <<"README.md">>,<<"LICENSE">>]}.
  @@ -20,4 +20,4 @@
20 20 {<<"optional">>,false},
21 21 {<<"repository">>,<<"hexpm">>},
22 22 {<<"requirement">>,<<">= 3.9.1">>}]]}.
23 - {<<"version">>,<<"0.1.0">>}.
23 + {<<"version">>,<<"0.1.1">>}.
  @@ -1,5 +1,5 @@
1 1 defmodule SmartForm do
2 - defmacro form(do: fields) do
2 + defmacro smart_form(do: fields) do
3 3 fields = name_type_and_opts(fields)
4 4
5 5 quote do
  @@ -21,11 +21,11 @@ defmodule SmartForm do
21 21
22 22 defmacro __using__(_) do
23 23 quote do
24 - import SmartForm, only: [form: 1]
24 + import SmartForm, only: [smart_form: 1]
25 25
26 26 defstruct source: nil, valid?: nil, data: nil
27 27
28 - def new(source, context \\ %{}) do
28 + def new(source \\ %{}, context \\ %{}) do
29 29 # Create a new map with a key for each field and the value from the source
30 30 data =
31 31 __fields()
  @@ -124,7 +124,7 @@ defmodule SmartForm do
124 124 {:validate, validation_function} ->
125 125 value = Ecto.Changeset.get_field(changeset, name)
126 126
127 - validate_change(changeset, name, fn name, value ->
127 + Ecto.Changeset.validate_change(changeset, name, fn name, value ->
128 128 apply(__MODULE__, validation_function, [changeset, name, value])
129 129 end)
130 130
  @@ -134,10 +134,41 @@ defmodule SmartForm do
134 134 end)
135 135
136 136 form
137 + |> Map.put(:form_changeset, changeset)
137 138 |> Map.put(:valid?, changeset.valid?)
138 139 |> Map.put(:errors, changeset.errors)
139 140 |> Map.put(:params, params)
140 141 end
142 +
143 + defimpl Phoenix.HTML.FormData do
144 + @impl true
145 + def to_form(form, options) do
146 + changeset = form |> Map.get(:form_changeset) || @for.form_changeset(form)
147 + options = Keyword.put(options, :as, "form")
148 + form_data = Phoenix.HTML.FormData.to_form(changeset, options)
149 + form_data |> Map.put(:errors, changeset.errors)
150 + end
151 +
152 + @impl true
153 + def to_form(data, form, field, options) do
154 + Phoenix.HTML.FormData.to_form(data, form, field, options)
155 + end
156 +
157 + @impl true
158 + def input_type(data, form, field) do
159 + Phoenix.HTML.FormData.input_type(data, form, field)
160 + end
161 +
162 + @impl true
163 + def input_value(data, form, field) do
164 + Phoenix.HTML.FormData.input_value(data, form, field)
165 + end
166 +
167 + @impl true
168 + def input_validations(data, form, field) do
169 + Phoenix.HTML.FormData.input_validations(data, form, field)
170 + end
171 + end
141 172 end
142 173 end
143 174 end
  @@ -2,21 +2,21 @@ defmodule SmartForm.MixProject do
2 2 use Mix.Project
3 3
4 4 @source_url "https://github.com/joerichsen/smart_form"
5 - @version "0.1.0"
5 + @version "0.1.1"
6 6
7 7 def project do
8 8 [
9 9 app: :smart_form,
10 - version: "0.1.0",
11 - elixir: "~> 1.14",
10 + version: @version,
11 + elixir: "~> 1.13",
12 12 start_permanent: Mix.env() == :prod,
13 13 deps: deps(),
14 + consolidate_protocols: Mix.env() != :test,
14 15
15 16 # Hex
16 17 description:
17 18 "SmartForm is a small DSL built on top of Ecto.Changeset to help you build forms.",
18 19 package: package(),
19 -
20 20 name: "SmartForm",
21 21 docs: docs()
22 22 ]