Packages
SmartForm is a small DSL built on top of Ecto.Changeset to help you build forms.
Current section
2 Versions
Jump to
Current section
2 Versions
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 | ] |