diff --git a/lib/polymorphic_embed/html/helpers.ex b/lib/polymorphic_embed/html/helpers.ex index 7822d46..a91c7f4 100644 --- a/lib/polymorphic_embed/html/helpers.ex +++ b/lib/polymorphic_embed/html/helpers.ex @@ -107,6 +107,7 @@ if Code.ensure_loaded?(Phoenix.HTML) && Code.ensure_loaded?(Phoenix.HTML.Form) d index: if(array?, do: i), errors: errors, data: data, + action: parent_action, params: params, hidden: [{type_field_name, to_string(type)}], options: options diff --git a/test/polymorphic_embed_test.exs b/test/polymorphic_embed_test.exs index 7dced00..bf98a63 100644 --- a/test/polymorphic_embed_test.exs +++ b/test/polymorphic_embed_test.exs @@ -2503,6 +2503,43 @@ defmodule PolymorphicEmbedTest do end describe "polymorphic_embed_inputs_for/1" do + test "errors in form for polymorphic embed and nested embed" do + reminder_module = get_module(Reminder, :polymorphic) + + sms_reminder_attrs = %{ + text: "This is an SMS reminder", + contexts: [ + %{ + __type__: "device", + extra: %{} + } + ] + } + + changeset = + reminder_module + |> struct() + |> reminder_module.changeset(sms_reminder_attrs) + + changeset = %{changeset | action: :insert} + + html_string = + render_component( + &liveview_form_with_inputs_for/1, + %{changeset: changeset, field: :contexts} + ) + + assert String.contains?( + html_string, + "[type: {"can't be blank", [validation: :required]}]" + ) + + assert String.contains?( + html_string, + "[imei: {"can't be blank", [validation: :required]}]" + ) + end + test "generates forms that can be rendered (custom type field/identify_by_fields)" do reminder_module = get_module(Reminder, :polymorphic) @@ -3520,6 +3557,24 @@ defmodule PolymorphicEmbedTest do """ end + defp liveview_form_with_inputs_for(assigns) do + ~H""" + <.form + :let={f} + for={@changeset} + > + <.polymorphic_embed_inputs_for field={f[@field]} :let={sms_form}> + <%= text_input sms_form, :number %> + <%= sms_form.errors |> inspect() %> + <.inputs_for field={sms_form[:extra]} :let={channel_form}> + <%= text_input channel_form, :imei %> + <%= channel_form.errors |> inspect() %> + + + + """ + end + defp polymorphic?(:polymorphic), do: true defp polymorphic?(:not_polymorphic), do: false end diff --git a/test/support/models/polymorphic/reminder/context/device.ex b/test/support/models/polymorphic/reminder/context/device.ex index 31684f8..9ea491d 100644 --- a/test/support/models/polymorphic/reminder/context/device.ex +++ b/test/support/models/polymorphic/reminder/context/device.ex @@ -6,14 +6,13 @@ defmodule PolymorphicEmbed.Reminder.Context.Device do field :ref, :string field :type, :string - embeds_one :extra, Extra do - field :imei, :string - end + embeds_one :extra, PolymorphicEmbed.Reminder.Context.Extra end def changeset(struct, params) do struct |> cast(params, ~w(ref type)a) |> validate_required(~w(type)a) + |> cast_embed(:extra) end end diff --git a/test/support/models/polymorphic/reminder/context/device_no_id.ex b/test/support/models/polymorphic/reminder/context/device_no_id.ex index 3f6f9a5..37b8292 100644 --- a/test/support/models/polymorphic/reminder/context/device_no_id.ex +++ b/test/support/models/polymorphic/reminder/context/device_no_id.ex @@ -8,9 +8,7 @@ defmodule PolymorphicEmbed.Reminder.Context.DeviceNoId do field :ref, :string field :type, :string - embeds_one :extra, Extra do - field :imei, :string - end + embeds_one :extra, PolymorphicEmbed.Reminder.Context end def changeset(struct, params) do diff --git a/test/support/models/polymorphic/reminder/context/extra.ex b/test/support/models/polymorphic/reminder/context/extra.ex new file mode 100644 index 0000000..e054c1d --- /dev/null +++ b/test/support/models/polymorphic/reminder/context/extra.ex @@ -0,0 +1,14 @@ +defmodule PolymorphicEmbed.Reminder.Context.Extra do + use Ecto.Schema + import Ecto.Changeset + + embedded_schema do + field :imei, :string + end + + def changeset(extra, attrs) do + extra + |> cast(attrs, [:imei]) + |> validate_required([:imei]) + end +end